]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
* grub-core/boot/i386/pc/startup_raw.S [__APPLE__]: Add Apple assembly
authorVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Mon, 28 May 2012 15:51:57 +0000 (17:51 +0200)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Mon, 28 May 2012 15:51:57 +0000 (17:51 +0200)
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.

ChangeLog
grub-core/boot/i386/pc/startup_raw.S
grub-core/commands/i386/pc/drivemap_int13h.S
grub-core/kern/i386/pc/startup.S
grub-core/lib/i386/relocator16.S
grub-core/lib/i386/relocator_common.S
grub-core/mmap/i386/pc/mmap_helper.S

index 8f516f9a26c3cb4b3ba8a88c2247226b683962dd..ab2e16f259c2f8ae385081cc58b0fb7c5ad57b13 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+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__.
index 2147ddeaf3eed7211b9beb874afc07ff3d474051..81c0bc4576a67527fdc8fcb5c98a67456ecb1a32 100644 (file)
@@ -105,7 +105,12 @@ LOCAL (codestart):
        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
@@ -303,8 +308,16 @@ multiboot_entry:
        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
@@ -328,7 +341,11 @@ post_reed_solomon:
 
 #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
@@ -352,5 +369,9 @@ post_reed_solomon:
 
        .p2align 4
 
+#ifdef __APPLE__
+       .zerofill __DATA, __aa_before_bss, decompressor_end, 10, 0
+#else
        .bss
 LOCAL(decompressor_end):
+#endif
index b460cd7b58f284edca22dd9240b41dc95da55983..3c87521b63e1caf734cfd0c3ad9513cdbd90fd2e 100644 (file)
@@ -36,7 +36,12 @@ LOCAL (base):
        /* 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
@@ -62,7 +67,12 @@ not_found:
        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
@@ -85,7 +95,11 @@ norestore:
        popf
        pushf
 
+#ifdef __APPLE__
+       lcall *%cs:LOCAL(oldhandler_offset)
+#else
        lcall *%cs:INT13H_OFFSET (LOCAL (oldhandler))
+#endif
 
        push    %bp
        mov     %sp, %bp
index ca6b1b7c4ea60d5d4df2d6602cf138ced58bcb13..c05b27e965334753afc486a5591e5b26ebc0712c 100644 (file)
@@ -44,6 +44,9 @@
 #include <config.h>
 #include <grub/symbol.h>
 #include <multiboot.h>
+#ifdef __APPLE__
+#include <grub/i386/pc/memory.h>
+#endif
 
        .file   "startup.S"
 
@@ -53,6 +56,9 @@
 start:
 _start:
 __start:
+#ifdef __APPLE__
+LOCAL(start):
+#endif
        .code32
 
        movl    %ecx, (LOCAL(real_to_prot_addr) - _start) (%esi)
@@ -60,7 +66,12 @@ __start:
        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
@@ -84,11 +95,19 @@ LOCAL(cont):
        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 */
@@ -182,6 +201,13 @@ FUNCTION(grub_pxe_call)
 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
index 2b144fb7004cb873d03ee2a7a38fe209ac1005cc..0e2b341a76f1d6b2e5389a82a38c23649496326d 100644 (file)
 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
@@ -75,12 +84,23 @@ VARIABLE(grub_relocator16_start)
 
        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
 
@@ -92,7 +112,12 @@ LOCAL(cont2):
        /* 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
 
@@ -108,7 +133,12 @@ VARIABLE(grub_relocator16_keep_a20_enabled)
 
        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 */
@@ -282,6 +312,9 @@ LOCAL(cs_base_byte3):
        .byte   0, 0x92, 0, 0
 LOCAL(gdt_end):
 
+#ifdef __APPLE__
+LOCAL(relocator16_idt):
+#endif
 VARIABLE(grub_relocator16_idt)
        .word 0
        .long 0
index bd5b53f951b0b048c2b483adc75561818a54401f..8fa95044f81b756966376630798ff0ea73f6d13c 100644 (file)
@@ -42,12 +42,40 @@ LOCAL(base):
        /* %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)
 
@@ -63,6 +91,7 @@ LOCAL(cont0):
        .p2align        4
 LOCAL(gdtdesc):
        .word   LOCAL(gdt_end) - LOCAL(gdt)
+#endif
 LOCAL(gdt_addr):
 #ifdef __x86_64__
        /* Filled by the code. */
index 3302a9a151deed0ab58fa56e949e155cca388eea..8e251a1f891d6003da100fc55ac14a8cdc27b9bd 100644 (file)
@@ -28,7 +28,12 @@ VARIABLE(grub_machine_mmaphook_int12)
        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
 
@@ -53,8 +58,15 @@ LOCAL (e801):
        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
@@ -66,7 +78,11 @@ LOCAL (h88):
        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)
@@ -78,14 +94,24 @@ LOCAL (e820):
        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
@@ -94,7 +120,11 @@ LOCAL (e820):
        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):