diff --git a/boot/i386/pc/boot.S b/boot/i386/pc/boot.S index fc31f5a..c22dccd 100644 --- a/boot/i386/pc/boot.S +++ b/boot/i386/pc/boot.S @@ -30,7 +30,11 @@ #define ABS(x) (x-_start+0x7c00) /* Print message string */ +#ifdef APPLE_CC +#define MSG(x) x ## _abs = ABS(x); movw $x ## _abs, %si; call message +#else #define MSG(x) movw $ABS(x), %si; call message +#endif .file "boot.S" @@ -125,7 +129,12 @@ boot_drive_check: * ljmp to the next instruction because some bogus BIOSes * jump to 07C0:0000 instead of 0000:7C00. */ +#ifdef APPLE_CC + real_start_abs = ABS(real_start) + ljmp $0, $(real_start_abs) +#else ljmp $0, $ABS(real_start) +#endif real_start: @@ -143,7 +152,12 @@ real_start: * Check if we have a forced disk reference here */ /* assign root_drive at the same time */ - movw ABS(boot_drive), %ax +#ifdef APPLE_CC + boot_drive_abs = ABS (boot_drive) + movw boot_drive_abs, %ax +#else + movw ABS(boot_drive), %ax +#endif movb %ah, %dh cmpb $0xff, %al je 1f @@ -156,7 +170,12 @@ real_start: MSG(notification_string) /* set %si to the disk address packet */ +#ifdef APPLE_CC + disk_address_packet_abs = ABS (disk_address_packet) + movw $disk_address_packet_abs, %si +#else movw $ABS(disk_address_packet), %si +#endif /* do not probe LBA if the drive is a floppy */ testb $GRUB_BOOT_MACHINE_BIOS_HD_FLAG, %dl @@ -197,10 +216,18 @@ lba_mode: movw $0x0010, (%si) /* the absolute address */ +#ifdef APPLE_CC + kernel_sector_abs = ABS (kernel_sector) + movl (kernel_sector_abs), %ebx + movl %ebx, 8(%si) + movl (kernel_sector_abs + 4), %ebx + movl %ebx, 12(%si) +#else movl ABS(kernel_sector), %ebx movl %ebx, 8(%si) movl ABS(kernel_sector + 4), %ebx movl %ebx, 12(%si) +#endif /* the segment of buffer address */ movw $GRUB_BOOT_MACHINE_BUFFER_SEG, 6(%si) @@ -267,12 +294,22 @@ final_init: setup_sectors: /* load logical sector start (top half) */ +#ifdef APPLE_CC + kernel_sector_abs = ABS (kernel_sector) + movl (kernel_sector_abs + 4), %eax +#else movl ABS(kernel_sector + 4), %eax +#endif + orl %eax, %eax jnz geometry_error /* load logical sector start (bottom half) */ +#ifdef APPLE_CC + movl (kernel_sector_abs), %eax +#else movl ABS(kernel_sector), %eax +#endif /* zero %edx */ xorl %edx, %edx @@ -336,7 +373,12 @@ setup_sectors: movw %es, %bx copy_buffer: +#ifdef APPLE_CC + kernel_segment_abs = ABS (kernel_segment) + movw (kernel_segment_abs), %es +#else movw ABS(kernel_segment), %es +#endif /* * We need to save %cx and %si because the startup code in @@ -360,7 +402,12 @@ copy_buffer: popw %dx /* boot kernel */ +#ifdef APPLE_CC + kernel_address_abs = ABS (kernel_address) + jmp *(kernel_address_abs) +#else jmp *(kernel_address) +#endif /* END OF MAIN LOOP */ @@ -446,7 +493,12 @@ floppy_probe: * Perform floppy probe. */ +#ifdef APPLE_CC + probe_values_abs = ABS (probe_values) + movw $(probe_values_abs-1), %si +#else movw $ABS(probe_values-1), %si +#endif probe_loop: /* reset floppy controller INT 13h AH=0 */ diff --git a/boot/i386/pc/cdboot.S b/boot/i386/pc/cdboot.S index 133f8de..b32f82c 100644 --- a/boot/i386/pc/cdboot.S +++ b/boot/i386/pc/cdboot.S @@ -67,8 +67,15 @@ bi_reserved: movw %ax, %ds movw %ax, %es +#ifdef APPLE_CC + err_noboot_msg_abs = 0x7C00 + err_noboot_msg - start + movw $err_noboot_msg_abs, %si + bi_length_dif = bi_length - next + movl %cs:bi_length_dif(%bx), %ecx +#else movw $(0x7C00 + err_noboot_msg - start), %si movl %cs: bi_length - next(%bx), %ecx +#endif orl %ecx, %ecx jz fail @@ -152,7 +159,12 @@ read_cdrom: ret cdrom_fail: +#ifdef APPLE_CC + err_cdfail_msg_abs = 0x7C00 + err_cdfail_msg - start + movw $(err_cdfail_msg_abs), %si +#else movw $(0x7C00 + err_cdfail_msg - start), %si +#endif fail: movb $0x0e, %ah diff --git a/boot/i386/pc/diskboot.S b/boot/i386/pc/diskboot.S index 0c8e75d..f29ddaa 100644 --- a/boot/i386/pc/diskboot.S +++ b/boot/i386/pc/diskboot.S @@ -28,7 +28,11 @@ #define ABS(x) (x-_start+GRUB_BOOT_MACHINE_KERNEL_ADDR) /* Print message string */ +#ifdef APPLE_CC +#define MSG(x) x ## _abs = ABS(x); mov $x ## _abs, %esi; call message +#else #define MSG(x) movw $ABS(x), %si; call message +#endif .file "diskboot.S" @@ -61,7 +65,12 @@ _start: popw %si /* this sets up for the first run through "bootloop" */ +#ifdef APPLE_CC + firstlist_off_abs = ABS (firstlist - GRUB_BOOT_MACHINE_LIST_SIZE) + movl $firstlist_off_abs, %edi +#else movw $ABS(firstlist - GRUB_BOOT_MACHINE_LIST_SIZE), %di +#endif /* save the sector number of the second sector in %ebp */ movl (%di), %ebp diff --git a/boot/i386/pc/lnxboot.S b/boot/i386/pc/lnxboot.S index e7f55df..0db6826 100644 --- a/boot/i386/pc/lnxboot.S +++ b/boot/i386/pc/lnxboot.S @@ -123,8 +123,15 @@ data_leng: linux_init: +#ifdef APPLE_CC + reg_edx_rel = reg_edx - start + code32_start_rel = code32_start - start + movw %cs:(reg_edx_rel), %dx + movl %cs:(code32_start_rel), %ebp +#else movw %cs:(reg_edx - start), %dx movl %cs:(code32_start - start), %ebp +#endif linux_next: @@ -132,12 +139,22 @@ linux_next: normalize: popw %bx +#ifdef APPLE_CC + normalize_rel = normalize - start + subw $(normalize_rel), %bx +#else subw $(normalize - start), %bx +#endif shrw $4, %bx movw %cs, %ax addw %bx, %ax pushw %ax +#ifdef APPLE_CC + real_code_rel = real_code - start + pushw $(real_code_rel) +#else pushw $(real_code - start) +#endif lret /* Jump to real_code. */ real_code: @@ -164,7 +181,12 @@ real_code: rep movsl +#ifdef APPLE_CC + real_code_2_rel = real_code_2 - start + ljmp $(CODE_ADDR >> 4), $(real_code_2_rel) +#else ljmp $(CODE_ADDR >> 4), $(real_code_2 - start) +#endif real_code_2: @@ -189,8 +211,15 @@ real_code_2: cmpl $MULTIBOOT_MAGIC, %ss:(DATA_ADDR + GRUB_KERNEL_MACHINE_DATA_END) jz 1f +#ifdef APPLE_CC + ramdisk_image_rel = ramdisk_image - start + ramdisk_size_rel = ramdisk_size - start + movl (ramdisk_image_rel), %esi + movl (ramdisk_size_rel), %ecx +#else movl (ramdisk_image - start), %esi movl (ramdisk_size - start), %ecx +#endif movl $(DATA_ADDR - 0x200), %edi jmp 2f @@ -205,7 +234,12 @@ real_code_2: movsbl %dh, %eax movl %eax, %ss:(DATA_ADDR + GRUB_KERNEL_MACHINE_INSTALL_DOS_PART) +#ifdef APPLE_CC + reg_edx_rel = reg_edx - start + movsbl (reg_edx_rel + 2), %eax +#else movsbl (reg_edx + 2 - start), %eax +#endif movl %eax, %ss:(DATA_ADDR + GRUB_KERNEL_MACHINE_INSTALL_BSD_PART) movb $0xFF, %dh @@ -234,6 +268,28 @@ move_memory: pushl %ecx movl %esi, %eax +#ifdef APPLE_CC + gdt_src1_rel = gdt_src1 - start + gdt_src2_rel = gdt_src2 - start + gdt_dst1_rel = gdt_dst1 - start + gdt_dst2_rel = gdt_dst2 - start + gdt_rel = gdt - start + + movw %si, (gdt_src1_rel) + shrl $16, %eax + movb %al, (gdt_src1_rel + 2) + movb %ah, (gdt_src2_rel) + + movl %edi, %eax + movw %di, (gdt_dst1_rel) + shrl $16, %eax + movb %al, (gdt_dst1_rel + 2) + movb %ah, (gdt_dst2_rel) + + movw $(gdt_rel), %si + movb $0x87, %ah + shrw $1, %cx +#else movw %si, (gdt_src1 - start) shrl $16, %eax movb %al, (gdt_src1 + 2 - start) @@ -248,6 +304,7 @@ move_memory: movw $(gdt - start), %si movb $0x87, %ah shrw $1, %cx +#endif int $0x15 @@ -257,7 +314,12 @@ move_memory: popl %esi jnc 2f +#ifdef APPLE_CC + err_int15_msg_rel = err_int15_msg - start + movw $(err_int15_msg_rel), %si +#else movw $(err_int15_msg - start), %si +#endif jmp fail 2: diff --git a/commands/i386/pc/drivemap_int13h.S b/commands/i386/pc/drivemap_int13h.S index 23b7302..7a3e8e7 100644 --- a/commands/i386/pc/drivemap_int13h.S +++ b/commands/i386/pc/drivemap_int13h.S @@ -30,7 +30,12 @@ FUNCTION(grub_drivemap_handler) /* Map the drive number (always in DL). */ push %ax push %bx +#ifdef APPLE_CC + grub_drivemap_mapstart_ofs = INT13H_OFFSET(EXT_C(grub_drivemap_mapstart)) + movw $grub_drivemap_mapstart_ofs, %bx +#else movw $INT13H_OFFSET(EXT_C(grub_drivemap_mapstart)), %bx +#endif more_remaining: movw %cs:(%bx), %ax diff --git a/kern/i386/pc/startup.S b/kern/i386/pc/startup.S index fc83c4c..23f84ed 100644 --- a/kern/i386/pc/startup.S +++ b/kern/i386/pc/startup.S @@ -69,7 +69,12 @@ _start: /* * Guarantee that "main" is loaded at 0x0:0x8200. */ +#ifdef APPLE_CC + codestart_abs = ABS(codestart) - 0x10000 + ljmp $0, $(codestart_abs) +#else ljmp $0, $ABS(codestart) +#endif /* * Compatibility version number @@ -249,12 +254,24 @@ codestart: movsb #endif +#ifdef APPLE_CC + /* clean out the bss */ + bss_start_abs = ABS (bss_start) + bss_end_abs = ABS (bss_end) + + movl bss_start_abs, %edi + + /* compute the bss length */ + movl bss_end_abs, %ecx + subl %edi, %ecx +#else /* clean out the bss */ movl $BSS_START_SYMBOL, %edi /* compute the bss length */ movl $END_SYMBOL, %ecx subl %edi, %ecx +#endif /* clean out */ xorl %eax, %eax @@ -293,7 +310,13 @@ real_to_prot: cli /* load the GDT register */ +#ifdef APPLE_CC + mov %cs, %ax + mov %ax, %ds + DATA32 ADDR32 lgdt gdtdesc +#else DATA32 ADDR32 lgdt %cs:gdtdesc +#endif /* turn on protected mode */ movl %cr0, %eax @@ -1223,7 +1246,12 @@ translate_keycode: pushw %bx pushw %si +#ifdef APPLE_CC + translation_table_abs = ABS (translation_table) - 0x10000 + movw $(translation_table_abs), %si +#else movw $ABS(translation_table), %si +#endif 1: lodsw /* check if this is the end */ diff --git a/mmap/i386/pc/mmap_helper.S b/mmap/i386/pc/mmap_helper.S index ab7c0d2..f153f1c 100644 --- a/mmap/i386/pc/mmap_helper.S +++ b/mmap/i386/pc/mmap_helper.S @@ -28,7 +28,12 @@ VARIABLE(grub_machine_mmaphook_int12) push %ds push %cs pop %ds +#ifdef APPLE_CC + grub_machine_mmaphook_kblow_rel = DS (EXT_C (grub_machine_mmaphook_kblow)) + movw (grub_machine_mmaphook_kblow_rel), %ax +#else movw DS (EXT_C (grub_machine_mmaphook_kblow)), %ax +#endif pop %ds iret @@ -53,8 +58,15 @@ e801: push %ds push %cs pop %ds +#ifdef APPLE_CC + grub_machine_mmaphook_kbin16mb_rel = DS (EXT_C (grub_machine_mmaphook_kbin16mb)) + grub_machine_mmaphook_64kbin4gb_rel = DS (EXT_C (grub_machine_mmaphook_64kbin4gb)) + movw (grub_machine_mmaphook_kbin16mb_rel), %ax + movw (grub_machine_mmaphook_64kbin4gb_rel), %bx +#else movw DS (EXT_C (grub_machine_mmaphook_kbin16mb)), %ax movw DS (EXT_C (grub_machine_mmaphook_64kbin4gb)), %bx +#endif movw %ax, %cx movw %bx, %dx pop %ds @@ -66,26 +78,42 @@ h88: push %ds push %cs pop %ds +#ifdef APPLE_CC + movw (grub_machine_mmaphook_kbin16mb_rel), %ax +#else movw DS (EXT_C (grub_machine_mmaphook_kbin16mb)), %ax +#endif pop %ds clc iret e820: +#ifdef APPLE_CC + mmaphook_mmap_rel = DS(mmaphook_mmap) + mmaphook_mmap_num_rel = DS(EXT_C(grub_machine_mmaphook_mmap_num)) +#endif popf push %ds push %cs pop %ds cmpw $20, %cx jb errexit +#ifdef APPLE_CC + cmpw (mmaphook_mmap_num_rel), %bx +#else cmpw DS (EXT_C (grub_machine_mmaphook_mmap_num)), %bx +#endif jae errexit cmp $0x534d4150, %edx jne errexit push %si push %di movw $20, %cx +#ifdef APPLE_CC + movl $(mmaphook_mmap_rel), %esi +#else movw $(DS(mmaphook_mmap)), %si +#endif mov %bx, %ax imul $20, %ax add %ax, %si @@ -94,7 +122,11 @@ e820: pop %si movl $20, %ecx inc %bx +#ifdef APPLE_CC + cmpw (mmaphook_mmap_num_rel), %bx +#else cmpw DS(EXT_C(grub_machine_mmaphook_mmap_num)), %bx +#endif jb noclean xor %bx, %bx noclean: