]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
2009-06-04 Vladimir Serbinenko <phcoder@gmail.com>
authorphcoder <phcoder@localhost>
Thu, 4 Jun 2009 21:21:31 +0000 (21:21 +0000)
committerphcoder <phcoder@localhost>
Thu, 4 Jun 2009 21:21:31 +0000 (21:21 +0000)
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

ChangeLog
loader/i386/linux_trampoline.S
loader/i386/xnu_helper.S

index 03b8f64c8652150cb50ebae9f685bceccd552cb3..63ef8c2e56c6e3aca6369ee4819a68025b769cb4 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -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
index eddaaf28f0dcb324516ab7833fcdbdbdfed36288..e2cd6ec274684d1a9927c1145593d2d0e0585e63 100644 (file)
@@ -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
 
index ad9c8f63152627d9bc7199fb15908880c4bfc3ab..229c8fe435124501076a8df6577c39cc5e1f5cae 100644 (file)
@@ -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