We were trashing non-volatile register ebx in the arch_call_{init,term}()
functions. Weird things could happen due to that. E.g. application crashes when unloading add-ons. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15994 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
5fb1a4102a
commit
bae7848e66
@ -17,13 +17,21 @@ arch_call_init(image_t *image)
|
||||
// This calls the init code in crti.S (in glue/arch/x86/)
|
||||
// It would have been too easy to just call this function with its arguments
|
||||
// on the stack, so Be went the ugly way. Once more.
|
||||
asm("mov %0, %%ebx; call *%1" : : "g"(image->id), "g"(image->init_routine));
|
||||
asm("push %%ebx;"
|
||||
"mov %0, %%ebx;"
|
||||
"call *%1;"
|
||||
"pop %%ebx"
|
||||
: : "g"(image->id), "g"(image->init_routine));
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
arch_call_term(image_t *image)
|
||||
{
|
||||
asm("mov %0, %%ebx; call *%1" : : "g"(image->id), "g"(image->term_routine));
|
||||
asm("push %%ebx;"
|
||||
"mov %0, %%ebx;"
|
||||
"call *%1;"
|
||||
"pop %%ebx"
|
||||
: : "g"(image->id), "g"(image->term_routine));
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user