+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
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)
/* Update %cs. Thanks to David Miller for pointing this mistake out. */
ljmp *(jump_vector - base) (%rsi, 1)
+#endif
+
cont1:
.code32
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)
/* Update %cs. Thanks to David Miller for pointing this mistake out. */
ljmp *(jump_vector - base) (%rsi, 1)
+#endif
+
cont1:
.code32