2009-06-04 Vladimir Serbinenko <phcoder@gmail.com>
Address in trampolines based on 32-bit registers when compiled with Apple's CC * loader/i386/xnu_helper.S [APPLE_CC]: use 32-bit registers for addresses * loader/i386/linux_trampoline.S [APPLE_CC]: likewise
This commit is contained in:
parent
6c68847712
commit
e93cdc3db1
3 changed files with 45 additions and 0 deletions
|
@ -1,3 +1,12 @@
|
|||
2009-06-04 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
Address in trampolines based on 32-bit registers when compiled
|
||||
with Apple's CC
|
||||
|
||||
* loader/i386/xnu_helper.S [APPLE_CC]: use 32-bit registers
|
||||
for addresses
|
||||
* loader/i386/linux_trampoline.S [APPLE_CC]: likewise
|
||||
|
||||
2009-06-04 Vladimir Serbinenko <phcoder@gmail.com>
|
||||
|
||||
Avoid aliases when compiling with Apple's CC for PCBIOS machine
|
||||
|
|
|
@ -30,7 +30,22 @@ VARIABLE(grub_linux_trampoline_start)
|
|||
call base
|
||||
base:
|
||||
pop %rsi
|
||||
|
||||
#ifdef APPLE_CC
|
||||
lea (cont1 - base) (%esi, 1), %rax
|
||||
mov %eax, (jump_vector - base) (%esi, 1)
|
||||
|
||||
lea (gdt - base) (%esi, 1), %rax
|
||||
mov %rax, (gdtaddr - base) (%esi, 1)
|
||||
|
||||
/* Switch to compatibility mode. */
|
||||
|
||||
lidt (idtdesc - base) (%esi, 1)
|
||||
lgdt (gdtdesc - base) (%esi, 1)
|
||||
|
||||
/* Update %cs. Thanks to David Miller for pointing this mistake out. */
|
||||
ljmp *(jump_vector - base) (%esi, 1)
|
||||
#else
|
||||
lea (cont1 - base) (%rsi, 1), %rax
|
||||
mov %eax, (jump_vector - base) (%rsi, 1)
|
||||
|
||||
|
@ -44,6 +59,8 @@ base:
|
|||
|
||||
/* Update %cs. Thanks to David Miller for pointing this mistake out. */
|
||||
ljmp *(jump_vector - base) (%rsi, 1)
|
||||
#endif
|
||||
|
||||
cont1:
|
||||
.code32
|
||||
|
||||
|
|
|
@ -94,11 +94,28 @@ VARIABLE(grub_xnu_heap_size)
|
|||
movsl
|
||||
|
||||
mov %rax, %rsi
|
||||
#ifdef APPLE_CC
|
||||
add $(cont0-base), %eax
|
||||
#else
|
||||
add $(cont0-base), %rax
|
||||
#endif
|
||||
jmp *%rax
|
||||
|
||||
cont0:
|
||||
#ifdef APPLE_CC
|
||||
lea (cont1 - base) (%esi, 1), %eax
|
||||
mov %eax, (jump_vector - base) (%esi, 1)
|
||||
|
||||
lea (gdt - base) (%esi, 1), %eax
|
||||
mov %eax, (gdt_addr - base) (%esi, 1)
|
||||
|
||||
/* Switch to compatibility mode. */
|
||||
|
||||
lgdt (gdtdesc - base) (%esi, 1)
|
||||
|
||||
/* Update %cs. Thanks to David Miller for pointing this mistake out. */
|
||||
ljmp *(jump_vector - base) (%esi,1)
|
||||
#else
|
||||
lea (cont1 - base) (%rsi, 1), %rax
|
||||
mov %eax, (jump_vector - base) (%rsi, 1)
|
||||
|
||||
|
@ -111,6 +128,8 @@ cont0:
|
|||
|
||||
/* Update %cs. Thanks to David Miller for pointing this mistake out. */
|
||||
ljmp *(jump_vector - base) (%rsi, 1)
|
||||
#endif
|
||||
|
||||
cont1:
|
||||
.code32
|
||||
|
||||
|
|
Loading…
Reference in a new issue