[2253] 2009-06-04 Vladimir Serbinenko <[email protected]>

Vladimir Serbinenko <[email protected]>
Newsgroups gmane.comp.boot-loaders.grub.cvs
Message-ID <[email protected]>
Revision: 2253
          http://svn.sv.gnu.org/viewvc/?view=rev&root=grub&revision=2253
Author:   phcoder
Date:     2009-06-04 20:01:19 +0000 (Thu, 04 Jun 2009)
Log Message:
-----------
2009-06-04  Vladimir Serbinenko  <[email protected]>

	Absolute addressing through constant with Apple's cc

	* kern/i386/pc/startup.S: Define necessary constants
	and address through it when using ABS with Apple's CC
	* boot/i386/pc/diskboot.S: likewise
	* boot/i386/pc/boot.S: likewise
	* boot/i386/pc/lnxboot.S: likewise
	* boot/i386/pc/cdboot.S: likewise
	* mmap/i386/pc/mmap_helper.S: likewise
	* commands/i386/pc/drivemap_int13h.S: likewise

Modified Paths:
--------------
    trunk/grub2/ChangeLog
    trunk/grub2/boot/i386/pc/boot.S
    trunk/grub2/boot/i386/pc/cdboot.S
    trunk/grub2/boot/i386/pc/diskboot.S
    trunk/grub2/boot/i386/pc/lnxboot.S
    trunk/grub2/commands/i386/pc/drivemap_int13h.S
    trunk/grub2/kern/i386/pc/startup.S
    trunk/grub2/mmap/i386/pc/mmap_helper.S

Modified: trunk/grub2/ChangeLog
===================================================================
--- trunk/grub2/ChangeLog	2009-06-04 19:53:52 UTC (rev 2252)
+++ trunk/grub2/ChangeLog	2009-06-04 20:01:19 UTC (rev 2253)
@@ -1,5 +1,18 @@
 2009-06-04  Vladimir Serbinenko  <[email protected]>
 
+	Absolute addressing through constant with Apple's cc
+
+	* kern/i386/pc/startup.S: Define necessary constants
+	and address through it when using ABS with Apple's CC
+	* boot/i386/pc/diskboot.S: likewise
+	* boot/i386/pc/boot.S: likewise
+	* boot/i386/pc/lnxboot.S: likewise
+	* boot/i386/pc/cdboot.S: likewise
+	* mmap/i386/pc/mmap_helper.S: likewise
+	* commands/i386/pc/drivemap_int13h.S: likewise
+
+2009-06-04  Vladimir Serbinenko  <[email protected]>
+
 	Check if compiler is apple cc
 
 	* Makefile.in (ASFLAGS): new variable

Modified: trunk/grub2/boot/i386/pc/boot.S
===================================================================
--- trunk/grub2/boot/i386/pc/boot.S	2009-06-04 19:53:52 UTC (rev 2252)
+++ trunk/grub2/boot/i386/pc/boot.S	2009-06-04 20:01:19 UTC (rev 2253)
@@ -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 @@
 	 * 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 @@
 	 *  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 @@
 	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 @@
 	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 @@
 
 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 @@
 	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 @@
         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 @@
  *  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 */

Modified: trunk/grub2/boot/i386/pc/cdboot.S
===================================================================
--- trunk/grub2/boot/i386/pc/cdboot.S	2009-06-04 19:53:52 UTC (rev 2252)
+++ trunk/grub2/boot/i386/pc/cdboot.S	2009-06-04 20:01:19 UTC (rev 2253)
@@ -67,8 +67,15 @@
 	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 @@
 	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

Modified: trunk/grub2/boot/i386/pc/diskboot.S
===================================================================
--- trunk/grub2/boot/i386/pc/diskboot.S	2009-06-04 19:53:52 UTC (rev 2252)
+++ trunk/grub2/boot/i386/pc/diskboot.S	2009-06-04 20:01:19 UTC (rev 2253)
@@ -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 @@
 	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

Modified: trunk/grub2/boot/i386/pc/lnxboot.S
===================================================================
--- trunk/grub2/boot/i386/pc/lnxboot.S	2009-06-04 19:53:52 UTC (rev 2252)
+++ trunk/grub2/boot/i386/pc/lnxboot.S	2009-06-04 20:01:19 UTC (rev 2253)
@@ -123,8 +123,15 @@
 
 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 @@
 
 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 @@
 	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 @@
 	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 @@
 	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 @@
 	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 @@
 	movw	$(gdt - start), %si
 	movb	$0x87, %ah
 	shrw	$1, %cx
+#endif
 
 	int	$0x15
 
@@ -257,7 +314,12 @@
 	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:

Modified: trunk/grub2/commands/i386/pc/drivemap_int13h.S
===================================================================
--- trunk/grub2/commands/i386/pc/drivemap_int13h.S	2009-06-04 19:53:52 UTC (rev 2252)
+++ trunk/grub2/commands/i386/pc/drivemap_int13h.S	2009-06-04 20:01:19 UTC (rev 2253)
@@ -30,7 +30,12 @@
 	/* 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

Modified: trunk/grub2/kern/i386/pc/startup.S
===================================================================
--- trunk/grub2/kern/i386/pc/startup.S	2009-06-04 19:53:52 UTC (rev 2252)
+++ trunk/grub2/kern/i386/pc/startup.S	2009-06-04 20:01:19 UTC (rev 2253)
@@ -69,7 +69,12 @@
 	/*
 	 *  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 @@
 	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 @@
 	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 @@
 	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 */

Modified: trunk/grub2/mmap/i386/pc/mmap_helper.S
===================================================================
--- trunk/grub2/mmap/i386/pc/mmap_helper.S	2009-06-04 19:53:52 UTC (rev 2252)
+++ trunk/grub2/mmap/i386/pc/mmap_helper.S	2009-06-04 20:01:19 UTC (rev 2253)
@@ -28,7 +28,12 @@
 	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 @@
 	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 @@
 	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 @@
 	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:
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.