mirror of
https://github.com/reactos/reactos.git
synced 2025-08-06 14:32:56 +00:00
[KMTESTS:EX]
- Make hard-coded calling convention exceptions in ExInterlocked compatible with GCC 4.7, and add the corresponding TODO about how ugly this is svn path=/trunk/; revision=57166
This commit is contained in:
parent
38ce718bde
commit
8003401991
1 changed files with 19 additions and 16 deletions
|
@ -50,6 +50,8 @@ typedef struct
|
||||||
typedef int PROCESSOR_STATE;
|
typedef int PROCESSOR_STATE;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* TODO: these need to be rewritten in proper assembly to account for registers
|
||||||
|
* saved by the caller */
|
||||||
#if defined(_MSC_VER) && defined(_M_IX86)
|
#if defined(_MSC_VER) && defined(_M_IX86)
|
||||||
#define SaveState(State) do \
|
#define SaveState(State) do \
|
||||||
{ \
|
{ \
|
||||||
|
@ -74,19 +76,20 @@ typedef int PROCESSOR_STATE;
|
||||||
#elif defined(__GNUC__) && defined(_M_IX86)
|
#elif defined(__GNUC__) && defined(_M_IX86)
|
||||||
#define SaveState(State) \
|
#define SaveState(State) \
|
||||||
asm volatile( \
|
asm volatile( \
|
||||||
"movl\t%%esi, (%%ecx)\n\t" \
|
"movl\t%%esi, (%%ecx)\n\t" \
|
||||||
"movl\t%%edi, 4(%%ecx)\n\t" \
|
"movl\t%%edi, 4(%%ecx)\n\t" \
|
||||||
"movl\t%%ebx, 8(%%ecx)\n\t" \
|
"movl\t%%ebx, 8(%%ecx)\n\t" \
|
||||||
"movl\t%%ebp, 12(%%ecx)\n\t" \
|
"movl\t%%ebp, 12(%%ecx)\n\t" \
|
||||||
"movl\t%%esp, 16(%%ecx)" \
|
"movl\t%%esp, 16(%%ecx)" \
|
||||||
: : "c" (&State) : "memory" \
|
: : "c" (&State) : "memory" \
|
||||||
);
|
);
|
||||||
|
|
||||||
#define CheckState(OldState, NewState) do \
|
#define CheckState(OldState, NewState) do \
|
||||||
{ \
|
{ \
|
||||||
ok_eq_hex((OldState)->esi, (NewState)->esi); \
|
/* TODO: GCC 4.7 uses esi and saves it before, so this is okay */ \
|
||||||
|
/*ok_eq_hex((OldState)->esi, (NewState)->esi);*/ \
|
||||||
ok_eq_hex((OldState)->edi, (NewState)->edi); \
|
ok_eq_hex((OldState)->edi, (NewState)->edi); \
|
||||||
/* TODO: GCC uses ebx and saves it before, so this is okay */ \
|
/* TODO: GCC 4.4 uses ebx and saves it before, so this is okay */ \
|
||||||
/*ok_eq_hex((OldState)->ebx, (NewState)->ebx);*/ \
|
/*ok_eq_hex((OldState)->ebx, (NewState)->ebx);*/ \
|
||||||
ok_eq_hex((OldState)->ebp, (NewState)->ebp); \
|
ok_eq_hex((OldState)->ebp, (NewState)->ebp); \
|
||||||
ok_eq_hex((OldState)->esp, (NewState)->esp); \
|
ok_eq_hex((OldState)->esp, (NewState)->esp); \
|
||||||
|
@ -94,15 +97,15 @@ typedef int PROCESSOR_STATE;
|
||||||
#elif defined(__GNUC__) && defined(_M_AMD64)
|
#elif defined(__GNUC__) && defined(_M_AMD64)
|
||||||
#define SaveState(State) \
|
#define SaveState(State) \
|
||||||
asm volatile( \
|
asm volatile( \
|
||||||
"mov\t%%rsi, (%%rcx)\n\t" \
|
"mov\t%%rsi, (%%rcx)\n\t" \
|
||||||
"mov\t%%rdi, 8(%%rcx)\n\t" \
|
"mov\t%%rdi, 8(%%rcx)\n\t" \
|
||||||
"mov\t%%rbx, 16(%%rcx)\n\t" \
|
"mov\t%%rbx, 16(%%rcx)\n\t" \
|
||||||
"mov\t%%rbp, 24(%%rcx)\n\t" \
|
"mov\t%%rbp, 24(%%rcx)\n\t" \
|
||||||
"mov\t%%rsp, 32(%%rcx)\n\t" \
|
"mov\t%%rsp, 32(%%rcx)\n\t" \
|
||||||
"mov\t%%r12, 40(%%rcx)\n\t" \
|
"mov\t%%r12, 40(%%rcx)\n\t" \
|
||||||
"mov\t%%r13, 48(%%rcx)\n\t" \
|
"mov\t%%r13, 48(%%rcx)\n\t" \
|
||||||
"mov\t%%r14, 56(%%rcx)\n\t" \
|
"mov\t%%r14, 56(%%rcx)\n\t" \
|
||||||
"mov\t%%r15, 64(%%rcx)" \
|
"mov\t%%r15, 64(%%rcx)" \
|
||||||
: : "c" (&State) : "memory" \
|
: : "c" (&State) : "memory" \
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue