version.
* grub-core/commands/i386/pc/drivemap_int13h.S [__APPLE__]: Likewise.
* grub-core/kern/i386/pc/startup.S [__APPLE__]: Likewise.
* grub-core/lib/i386/relocator16.S [__APPLE__]: Likewise.
* grub-core/lib/i386/relocator_common.S [__APPLE__]: Likewise.
* grub-core/mmap/i386/pc/mmap_helper.S [__APPLE__]: Likewise.
+2012-05-28 Vladimir Serbinenko <phcoder@gmail.com>
+
+ * grub-core/boot/i386/pc/startup_raw.S [__APPLE__]: Add Apple assembly
+ version.
+ * grub-core/commands/i386/pc/drivemap_int13h.S [__APPLE__]: Likewise.
+ * grub-core/kern/i386/pc/startup.S [__APPLE__]: Likewise.
+ * grub-core/lib/i386/relocator16.S [__APPLE__]: Likewise.
+ * grub-core/lib/i386/relocator_common.S [__APPLE__]: Likewise.
+ * grub-core/mmap/i386/pc/mmap_helper.S [__APPLE__]: Likewise.
+
2012-05-28 Vladimir Serbinenko <phcoder@gmail.com>
* grub-core/efiemu/runtime/efiemu.c: Replace APPLE_CC with __APPLE__.
call grub_gate_a20
movl LOCAL(compressed_size), %edx
+#ifdef __APPLE__
+ addl $decompressor_end, %edx
+ subl $(LOCAL(reed_solomon_part)), %edx
+#else
addl $(LOCAL(decompressor_end) - LOCAL(reed_solomon_part)), %edx
+#endif
movl reed_solomon_redundancy, %ecx
leal LOCAL(reed_solomon_part), %eax
cld
movl %ebp, %esp
/* relocate the code */
+#ifdef __APPLE__
+ LOCAL(compressed_size_offset) = LOCAL(compressed_size) - LOCAL(base)
+ movl $0x200, %ecx
+ addl $decompressor_end, %ecx
+ subl $LOCAL(base), %ecx
+ addl LOCAL(compressed_size_offset) + 0x100000 + 0x200, %ecx
+#else
movl $(LOCAL(decompressor_end) - _start + 0x200), %ecx
addl LOCAL(compressed_size) - _start + 0x100000 + 0x200, %ecx
+#endif
movl $0x100000, %esi
movl $GRUB_BOOT_MACHINE_KERNEL_ADDR, %edi
cld
#ifdef ENABLE_LZMA
movl $GRUB_MEMORY_MACHINE_DECOMPRESSION_ADDR, %edi
+#ifdef __APPLE__
+ movl $decompressor_end, %esi
+#else
movl $LOCAL(decompressor_end), %esi
+#endif
pushl %edi
movl LOCAL (uncompressed_size), %ecx
leal (%edi, %ecx), %ebx
.p2align 4
+#ifdef __APPLE__
+ .zerofill __DATA, __aa_before_bss, decompressor_end, 10, 0
+#else
.bss
LOCAL(decompressor_end):
+#endif
/* Map the drive number (always in DL). */
push %ax
push %bx
+#ifdef __APPLE__
+ LOCAL(mapstart_offset) = INT13H_OFFSET(LOCAL (mapstart))
+ movw $LOCAL(mapstart_offset), %bx
+#else
movw $INT13H_OFFSET(LOCAL (mapstart)), %bx
+#endif
more_remaining:
movw %cs:(%bx), %ax
popf
pushf
+#ifdef __APPLE__
+ LOCAL(oldhandler_offset) = INT13H_OFFSET (LOCAL (oldhandler))
+ lcall *%cs:LOCAL(oldhandler_offset)
+#else
lcall *%cs:INT13H_OFFSET (LOCAL (oldhandler))
+#endif
push %bp
mov %sp, %bp
popf
pushf
+#ifdef __APPLE__
+ lcall *%cs:LOCAL(oldhandler_offset)
+#else
lcall *%cs:INT13H_OFFSET (LOCAL (oldhandler))
+#endif
push %bp
mov %sp, %bp
#include <config.h>
#include <grub/symbol.h>
#include <multiboot.h>
+#ifdef __APPLE__
+#include <grub/i386/pc/memory.h>
+#endif
.file "startup.S"
start:
_start:
__start:
+#ifdef __APPLE__
+LOCAL(start):
+#endif
.code32
movl %ecx, (LOCAL(real_to_prot_addr) - _start) (%esi)
movl %eax, (EXT_C(grub_realidt) - _start) (%esi)
/* copy back the decompressed part (except the modules) */
+#ifdef __APPLE__
+ movl $EXT_C(_edata), %ecx
+ subl $LOCAL(start), %ecx
+#else
movl $(_edata - _start), %ecx
+#endif
movl $(_start), %edi
rep
movsb
movsb
#endif
+#ifdef __APPLE__
+ /* clean out the bss */
+ movl $EXT_C(_edata), %edi
+
+ /* compute the bss length */
+ movl $GRUB_MEMORY_MACHINE_SCRATCH_ADDR, %ecx
+#else
/* clean out the bss */
movl $BSS_START_SYMBOL, %edi
/* compute the bss length */
movl $END_SYMBOL, %ecx
+#endif
subl %edi, %ecx
/* clean out */
VARIABLE(grub_realidt)
.long 0
+#ifdef __APPLE__
+ .globl EXT_C(_edata)
+ .globl EXT_C(grub_boot_device)
+ .zerofill __DATA, __aa_before_bss, EXT_C(_edata), 1, 0
+ .zerofill __DATA, __bss, EXT_C(grub_boot_device), 4, 2
+#else
.bss
VARIABLE(grub_boot_device)
.long 0
+#endif
VARIABLE(grub_relocator16_start)
PREAMBLE
+#ifdef __APPLE__
+ LOCAL(cs_base_bytes12_offset) = LOCAL (cs_base_bytes12) - LOCAL (base)
+ LOCAL(cs_base_byte3_offset) = LOCAL (cs_base_byte3) - LOCAL (base)
+ movl %esi, %eax
+ movw %ax, (LOCAL(cs_base_bytes12_offset)) (RSI, 1)
+ shrl $16, %eax
+ movb %al, (LOCAL (cs_base_byte3_offset)) (RSI, 1)
+#else
movl %esi, %eax
movw %ax, (LOCAL (cs_base_bytes12) - LOCAL (base)) (RSI, 1)
shrl $16, %eax
movb %al, (LOCAL (cs_base_byte3) - LOCAL (base)) (RSI, 1)
+#endif
RELOAD_GDT
.code32
movl %esi, %eax
shrl $4, %eax
+#ifdef __APPLE_
+ LOCAL(segment_offset) = LOCAL (segment) - LOCAL (base)
+ LOCAL(idt_offset) = LOCAL(relocator16_idt) - LOCAL (base)
+ LOCAL(cont2_offset) = LOCAL (cont2) - LOCAL(base)
+ movw %ax, LOCAL(segment_offset) (%esi, 1)
+ lidt LOCAL(idt_offset) (%esi, 1)
+
+ /* jump to a 16 bit segment */
+ ljmp $PSEUDO_REAL_CSEG, $(LOCAL(cont2_offset))
+#else
movw %ax, (LOCAL (segment) - LOCAL (base)) (%esi, 1)
lidt (EXT_C(grub_relocator16_idt) - LOCAL (base)) (%esi, 1)
/* jump to a 16 bit segment */
ljmp $PSEUDO_REAL_CSEG, $(LOCAL (cont2) - LOCAL(base))
+#endif
LOCAL(cont2):
.code16
/* flush prefetch queue, reload %cs */
/* ljmp */
.byte 0xea
+#ifdef __APPLE__
+ LOCAL(cont3_offset) = LOCAL(cont3) - LOCAL(base)
+ .word LOCAL(cont3_offset)
+#else
.word LOCAL(cont3)-LOCAL(base)
+#endif
LOCAL(segment):
.word 0
movw %cs, %ax
movw %ax, %ss
+#ifdef __APPLE__
+ LOCAL(relocator16_end_offset) = LOCAL(relocator16_end) - LOCAL(base)
+ leaw LOCAL(relocator16_end_offset), %sp
+#else
leaw LOCAL(relocator16_end) - LOCAL(base), %sp
+#endif
addw $GRUB_RELOCATOR16_STACK_SIZE, %sp
/* second, try a BIOS call */
.byte 0, 0x92, 0, 0
LOCAL(gdt_end):
+#ifdef __APPLE__
+LOCAL(relocator16_idt):
+#endif
VARIABLE(grub_relocator16_idt)
.word 0
.long 0
/* %rax contains now our new 'base'. */
mov RAX, RSI
+#ifdef __APPLE__
+ LOCAL(cont0_offset) = LOCAL(cont0) - LOCAL(base)
+ add $LOCAL(cont0_offset), RAX
+#else
add $(LOCAL(cont0) - LOCAL(base)), RAX
+#endif
jmp *RAX
LOCAL(cont0):
.endm
.macro RELOAD_GDT
+#ifdef __APPLE__
+ LOCAL(cont1_offset) = LOCAL(cont1) - LOCAL(base)
+ LOCAL(jump_vector_offset) = LOCAL(jump_vector) - LOCAL(base)
+ LOCAL(gdt_offset) = LOCAL(gdt) - LOCAL(base)
+ LOCAL(gdt_addr_offset) = LOCAL(gdt_addr) - LOCAL(base)
+ LOCAL(gdtdesc_offset) = LOCAL(gdt_addr) - LOCAL(base)
+
+ lea LOCAL(cont1_offset) (RSI, 1), RAX
+ movl %eax, LOCAL(jump_vector_offset) (RSI, 1)
+
+ lea LOCAL(gdt_offset) (RSI, 1), RAX
+ mov RAX, (LOCAL(gdt_addr_offset)) (RSI, 1)
+
+ /* Switch to compatibility mode. */
+ lgdt (LOCAL(gdtdesc_offset)) (RSI, 1)
+
+ /* Update %cs. */
+ ljmp *(LOCAL(jump_vector_offset)) (RSI, 1)
+ .p2align 4
+LOCAL(gdtdesc):
+ LOCAL(gdtsize) = LOCAL(gdt_end) - LOCAL(gdt)
+ .word LOCAL(gdtsize)
+#else
lea (LOCAL(cont1) - LOCAL(base)) (RSI, 1), RAX
movl %eax, (LOCAL(jump_vector) - LOCAL(base)) (RSI, 1)
.p2align 4
LOCAL(gdtdesc):
.word LOCAL(gdt_end) - LOCAL(gdt)
+#endif
LOCAL(gdt_addr):
#ifdef __x86_64__
/* Filled by the code. */
push %ds
push %cs
pop %ds
+#ifdef __APPLE__
+ LOCAL(kblow_offset) = DS (LOCAL (kblow))
+ movw LOCAL(kblow_offset), %ax
+#else
movw DS (LOCAL (kblow)), %ax
+#endif
pop %ds
iret
push %ds
push %cs
pop %ds
+#ifdef __APPLE__
+ LOCAL(kbin16mb_offset) = DS (LOCAL (kbin16mb))
+ LOCAL(m64kbin4gb_offset) = DS (LOCAL (m64kbin4gb))
+ movw LOCAL(kbin16mb_offset), %ax
+ movw LOCAL(m64kbin4gb_offset), %bx
+#else
movw DS (LOCAL (kbin16mb)), %ax
movw DS (LOCAL (m64kbin4gb)), %bx
+#endif
movw %ax, %cx
movw %bx, %dx
pop %ds
push %ds
push %cs
pop %ds
+#ifdef __APPLE__
+ movw LOCAL(kbin16mb_offset), %ax
+#else
movw DS (LOCAL (kbin16mb)), %ax
+#endif
pop %ds
clc
jmp LOCAL (iret_cf)
pop %ds
cmpw $20, %cx
jb LOCAL (errexit)
+#ifdef __APPLE__
+ LOCAL(mmap_num_offset) = DS (LOCAL (mmap_num))
+ cmpw LOCAL(mmap_num_offset), %bx
+#else
cmpw DS (LOCAL (mmap_num)), %bx
+#endif
jae LOCAL (errexit)
cmp $0x534d4150, %edx
jne LOCAL (errexit)
push %si
push %di
movw $20, %cx
+#ifdef __APPLE__
+ LOCAL(mmaphook_map_offset) = DS(LOCAL (mmaphook_mmap))
+ movw $LOCAL(mmaphook_map_offset), %si
+#else
movw $(DS(LOCAL (mmaphook_mmap))), %si
+#endif
mov %bx, %ax
imul $20, %ax
add %ax, %si
pop %si
movl $20, %ecx
inc %bx
+#ifdef __APPLE__
+ cmpw LOCAL(mmap_num_offset), %bx
+#else
cmpw DS(LOCAL (mmap_num)), %bx
+#endif
jb LOCAL (noclean)
xor %bx, %bx
LOCAL (noclean):