]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
2002-12-28 Yoshinori K. Okuji <okuji@enbug.org>
authorokuji <okuji@localhost>
Sat, 28 Dec 2002 07:16:30 +0000 (07:16 +0000)
committerokuji <okuji@localhost>
Sat, 28 Dec 2002 07:16:30 +0000 (07:16 +0000)
Use -mrtd and -mregparm=3 to reduce the generated code sizes.
This means that any missing prototypes could be fatal. Also, you
must take care when writing assembly code. See the comments at
the beginning of startup.S, for more details.

* kern/i386/pc/startup.S (pupa_halt): Modified for the new
compilation mechanism.
(pupa_chainloader_real_boot): Likewise.
(pupa_biosdisk_rw_int13_extensions): Likewise.
(pupa_biosdisk_rw_standard): Likewise.
(pupa_biosdisk_check_int13_extensions): Likewise.
(pupa_biosdisk_get_diskinfo_int13_extensions): Likewise.
(pupa_biosdisk_get_diskinfo_standard): Likewise.
(pupa_get_memsize): Likewise.
(pupa_get_mmap_entry): Likewise.
(pupa_console_putchar): Likewise.
(pupa_console_setcursor): Likewise.
(pupa_getrtsecs): Use pushl instead of push.

* kern/i386/pc/init.c (pupa_machine_init): Use the scratch
memory instead of the stack for a mmap entry, because some
BIOSes may ignore the maximum size and overflow.

* conf/i386-pc.rmk (COMMON_CFLAGS): Added -mrtd and -mregparm=3.

* genmk.rb (PModule#rule): Compile automatically generated
sources with module-specific CFLAGS as well as other sources.

ChangeLog
NEWS
conf/i386-pc.mk
conf/i386-pc.rmk
genmk.rb
kern/i386/pc/init.c
kern/i386/pc/startup.S

index 7fd12f9639482205118d56dc7f4541fe72ed7e04..e531142ec3752da376d12bd909e51b75882fe688 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,33 @@
+2002-12-28  Yoshinori K. Okuji  <okuji@enbug.org>
+
+       Use -mrtd and -mregparm=3 to reduce the generated code sizes.
+       This means that any missing prototypes could be fatal. Also, you
+       must take care when writing assembly code. See the comments at
+       the beginning of startup.S, for more details.
+       
+       * kern/i386/pc/startup.S (pupa_halt): Modified for the new
+       compilation mechanism.
+       (pupa_chainloader_real_boot): Likewise.
+       (pupa_biosdisk_rw_int13_extensions): Likewise.
+       (pupa_biosdisk_rw_standard): Likewise.
+       (pupa_biosdisk_check_int13_extensions): Likewise.
+       (pupa_biosdisk_get_diskinfo_int13_extensions): Likewise.
+       (pupa_biosdisk_get_diskinfo_standard): Likewise.
+       (pupa_get_memsize): Likewise.
+       (pupa_get_mmap_entry): Likewise.
+       (pupa_console_putchar): Likewise.
+       (pupa_console_setcursor): Likewise.
+       (pupa_getrtsecs): Use pushl instead of push.
+
+       * kern/i386/pc/init.c (pupa_machine_init): Use the scratch
+       memory instead of the stack for a mmap entry, because some
+       BIOSes may ignore the maximum size and overflow.
+
+       * conf/i386-pc.rmk (COMMON_CFLAGS): Added -mrtd and -mregparm=3.
+
+       * genmk.rb (PModule#rule): Compile automatically generated
+       sources with module-specific CFLAGS as well as other sources.
+
 2002-12-27  Yoshinori K. Okuji  <okuji@enbug.org>
 
        * configure.ac: Check ld.
diff --git a/NEWS b/NEWS
index 032e2dd75f12354864b3e7d67683fde0b5f9005e..e026778a491cf7a603f3b2dbc775fe72822a5124 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -2,6 +2,11 @@ New in 0.7:
 
 * Problems in cross-compiling PUPA are fixed.
 
+* Use -mrtd and -mregparm=3 to reduce the generated code sizes.        This
+  means that any missing prototypes could be fatal. Also, you must take
+  care when writing assembly code. See the comments at the beginning of
+  startup.S, for more details.
+
 New in 0.6 - 2002-12-27, Yoshinori K. Okuji:
 
 * The chainloader and the FAT filesystem are modularized.
index ee4880b775b0837118f3b7f267a20991c4f4cf42..0f0575457996d724f8007e84a82af8a7dcb78b81 100644 (file)
@@ -1,7 +1,7 @@
 # -*- makefile -*-
 
 COMMON_ASFLAGS = -nostdinc -fno-builtin
-COMMON_CFLAGS = -fno-builtin
+COMMON_CFLAGS = -fno-builtin -mrtd -mregparm=3
 
 # Images.
 pkgdata_IMAGES = boot.img diskboot.img kernel.img
@@ -312,7 +312,7 @@ pre-chain.o: chain_mod-loader_i386_pc_chainloader.o
        $(LD) -r -o $@ $^
 
 mod-chain.o: mod-chain.c
-       $(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<
+       $(CC) $(CPPFLAGS) $(CFLAGS) $(chain_mod_CFLAGS) -c -o $@ $<
 
 mod-chain.c: moddep.lst genmodsrc.sh
        sh $(srcdir)/genmodsrc.sh 'chain' $< > $@ || (rm -f $@; exit 1)
@@ -351,7 +351,7 @@ pre-fat.o: fat_mod-fs_fat.o
        $(LD) -r -o $@ $^
 
 mod-fat.o: mod-fat.c
-       $(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<
+       $(CC) $(CPPFLAGS) $(CFLAGS) $(fat_mod_CFLAGS) -c -o $@ $<
 
 mod-fat.c: moddep.lst genmodsrc.sh
        sh $(srcdir)/genmodsrc.sh 'fat' $< > $@ || (rm -f $@; exit 1)
index 9f72c7e46696ff136bdb95f3d0359312fb1dc2fa..b5a503914944ed5e84cd7a29cfe5f1a3f98c794e 100644 (file)
@@ -1,7 +1,7 @@
 # -*- makefile -*-
 
 COMMON_ASFLAGS = -nostdinc -fno-builtin
-COMMON_CFLAGS = -fno-builtin
+COMMON_CFLAGS = -fno-builtin -mrtd -mregparm=3
 
 # Images.
 pkgdata_IMAGES = boot.img diskboot.img kernel.img
index 7c621b97002aa414cc4eee1852f993e57af90394..96516e7bab8ab922274ca04f98137d5443b73b37 100644 (file)
--- a/genmk.rb
+++ b/genmk.rb
@@ -125,7 +125,7 @@ UNDSYMFILES += #{undsym}
        $(LD) -r -o $@ $^
 
 #{mod_obj}: #{mod_src}
-       $(CC) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<
+       $(CC) $(CPPFLAGS) $(CFLAGS) $(#{prefix}_CFLAGS) -c -o $@ $<
 
 #{mod_src}: moddep.lst genmodsrc.sh
        sh $(srcdir)/genmodsrc.sh '#{mod_name}' $< > $@ || (rm -f $@; exit 1)
index 589696e696deacbe0a7f39e6a350f63f8f7dd8aa..012ec99a44bdb356c564039c46f2512883412704 100644 (file)
@@ -30,7 +30,8 @@ void
 pupa_machine_init (void)
 {
   pupa_uint32_t cont;
-  struct pupa_machine_mmap_entry entry;
+  struct pupa_machine_mmap_entry *entry
+    = (struct pupa_machine_mmap_entry *) PUPA_MEMORY_MACHINE_SCRATCH_ADDR;
   pupa_size_t lower_mem = (pupa_get_memsize (0) << 10);
   pupa_addr_t end_addr = pupa_get_end_addr ();
 
@@ -53,31 +54,31 @@ pupa_machine_init (void)
                       PUPA_MEMORY_MACHINE_RESERVED_START - end_addr);
 
   /* Check if pupa_get_mmap_entry works.  */
-  cont = pupa_get_mmap_entry (&entry, 0);
+  cont = pupa_get_mmap_entry (entry, 0);
 
-  if (entry.size)
+  if (entry->size)
     do
       {
        /* Avoid the lower memory.  */
-       if (entry.addr < 0x100000)
+       if (entry->addr < 0x100000)
          {
-           if (entry.len <= 0x100000 - entry.addr)
+           if (entry->len <= 0x100000 - entry->addr)
              goto next;
 
-           entry.len -= 0x100000 - entry.addr;
-           entry.addr = 0x100000;
+           entry->len -= 0x100000 - entry->addr;
+           entry->addr = 0x100000;
          }
        
        /* Ignore >4GB.  */
-       if (entry.addr <= 0xFFFFFFFF && entry.type == 1)
+       if (entry->addr <= 0xFFFFFFFF && entry->type == 1)
          {
            pupa_addr_t addr;
            pupa_size_t len;
 
-           addr = (pupa_addr_t) entry.addr;
-           len = ((addr + entry.len > 0xFFFFFFFF)
+           addr = (pupa_addr_t) entry->addr;
+           len = ((addr + entry->len > 0xFFFFFFFF)
                   ? 0xFFFFFFFF - addr
-                  : (pupa_size_t) entry.len);
+                  : (pupa_size_t) entry->len);
            pupa_mm_init_region ((void *) addr, len);
          }
        
@@ -85,9 +86,9 @@ pupa_machine_init (void)
        if (! cont)
          break;
        
-       cont = pupa_get_mmap_entry (&entry, cont);
+       cont = pupa_get_mmap_entry (entry, cont);
       }
-    while (entry.size);
+    while (entry->size);
   else
     {
       pupa_uint32_t eisa_mmap = pupa_get_eisa_mmap ();
index ecc97f3f7da6247a86de0221b60bb4aab6b3522b..aaabdc307c8b5c74eb58c79e09635c3da9194220 100644 (file)
 {  1, 1, 1, 0, 0, 0, 0, 1, 1,  1,  1,  1,  1,  1,  1,  1,  1 }
  */
 
+/*
+ * Note: PUPA is compiled with the options -mrtd and -mregparm=3.
+ *       So the first three arguments are passed in %eax, %edx, and %ecx,
+ *       respectively, and if a function has a fixed number of arguments
+ *       and the number if greater than three, the function must return
+ *       with "ret $N" where N is ((the number of arguments) - 3) * 4.
+ */
+
 #include <config.h>
 #include <pupa/symbol.h>
 #include <pupa/boot.h>
@@ -203,9 +211,6 @@ FUNCTION(pupa_reboot)
  * APM even if it is available.
  */
 FUNCTION(pupa_halt)
-       /* get the argument */
-       movl    4(%esp), %eax
-       
        /* see if zero */
        testl   %eax, %eax
        jnz     EXT_C(pupa_stop)
@@ -256,16 +261,16 @@ FUNCTION(pupa_halt)
  */
 
 FUNCTION(pupa_chainloader_real_boot)
-       /* no need to save anything, just use %esp */
+       /* no need to save anything */
 
        /* ESI must point to a partition table entry */
-       movl    8(%esp), %esi
+       movl    %edx, %esi
 
        /* set up to pass boot drive */
-       movl    4(%esp), %edx
+       movl    %eax, %edx
 
        /* Turn off Gate A20 */
-       pushl   $0
+       xorl    %eax, %eax
        call    EXT_C(pupa_gate_a20)
        
        call    prot_to_real
@@ -398,21 +403,15 @@ realcseg:
 
 FUNCTION(pupa_biosdisk_rw_int13_extensions)
        pushl   %ebp
-       movl    %esp, %ebp
-
        pushl   %esi
 
        /* compute the address of disk_address_packet */
-       movl    0x10(%ebp), %eax
-       movw    %ax, %si
-       xorw    %ax, %ax
-       shrl    $4, %eax
-       movw    %ax, %cx        /* save the segment to cx */
+       movw    %cx, %si
+       xorw    %cx, %cx
+       shrl    $4, %ecx        /* save the segment to cx */
 
-       /* drive */
-       movb    0xc(%ebp), %dl
        /* ah */
-       movb    0x8(%ebp), %dh
+       movb    %al, %dh
        /* enter real mode */
        call    prot_to_real
        
@@ -453,21 +452,24 @@ FUNCTION(pupa_biosdisk_rw_standard)
        pushl   %esi
 
        /* set up CHS information */
-       movl    0x10(%ebp), %eax
-       movb    %al, %ch
-       movb    0x18(%ebp), %al
-       shlb    $2, %al
-       shrw    $2, %ax
-       movb    %al, %cl
-       movb    0x14(%ebp), %dh
-       /* drive */
-       movb    0xc(%ebp), %dl
-       /* segment */
-       movw    0x20(%ebp), %bx
-       /* save nsec and ah to %di */
-       movb    0x8(%ebp), %ah
-       movb    0x1c(%ebp), %al
+
+       /* set %ch to low eight bits of cylinder */
+       xchgb   %cl, %ch
+       /* set bits 6-7 of %cl to high two bits of cylinder */
+       shlb    $6, %cl
+       /* set bits 0-5 of %cl to sector */
+       addb    0xc(%ebp), %cl
+       /* set %dh to head */
+       movb    0x8(%ebp), %dh
+       /* set %ah to AH */
+       movb    %al, %ah
+       /* set %al to NSEC */
+       movb    0x10(%ebp), %al
+       /* save %ax in %di */
        movw    %ax, %di
+       /* save SEGMENT in %bx */
+       movw    0x14(%ebp), %bx
+               
        /* enter real mode */
        call    prot_to_real
 
@@ -503,7 +505,7 @@ FUNCTION(pupa_biosdisk_rw_standard)
        popl    %ebx
        popl    %ebp
 
-       ret
+       ret     $(4 * 4)
 
 
 /*
@@ -515,12 +517,10 @@ FUNCTION(pupa_biosdisk_rw_standard)
 
 FUNCTION(pupa_biosdisk_check_int13_extensions)
        pushl   %ebp
-       movl    %esp, %ebp
-
        pushl   %ebx
 
        /* drive */
-       movb    0x8(%ebp), %dl
+       movb    %al, %dl
        /* enter real mode */
        call    prot_to_real
 
@@ -564,19 +564,16 @@ FUNCTION(pupa_biosdisk_check_int13_extensions)
 
 FUNCTION(pupa_biosdisk_get_diskinfo_int13_extensions)
        pushl   %ebp
-       movl    %esp, %ebp
-
        pushl   %ebx
        pushl   %esi
 
        /* compute the address of drive parameters */
-       movl    0xc(%ebp), %eax
-       movw    %ax, %si
-       xorw    %ax, %ax
-       shrl    $4, %eax
-       movw    %ax, %bx        /* save the segment into %bx */
+       movw    %dx, %si
+       xorw    %dx, %dx
+       shrl    $4, %edx
+       movw    %dx, %bx        /* save the segment into %bx */
        /* drive */
-       movb    0x8(%ebp), %dl
+       movb    %al, %dl
        /* enter real mode */
        call    prot_to_real
 
@@ -613,13 +610,17 @@ FUNCTION(pupa_biosdisk_get_diskinfo_int13_extensions)
 
 FUNCTION(pupa_biosdisk_get_diskinfo_standard)
        pushl   %ebp
-       movl    %esp, %ebp
-
        pushl   %ebx
        pushl   %edi
 
+       /* push CYLINDERS */
+       pushl   %edx
+       /* push HEADS */
+       pushl   %ecx
+       /* SECTORS is on the stack */
+       
        /* drive */
-       movb    0x8(%ebp), %dl
+       movb    %al, %dl
        /* enter real mode */
        call    prot_to_real
 
@@ -640,31 +641,26 @@ FUNCTION(pupa_biosdisk_get_diskinfo_standard)
        DATA32  call    real_to_prot
        .code32
 
-       /* restore %ebp */
-       leal    0x8(%esp), %ebp
-       
-       /* heads */
+       /* pop HEADS */
+       popl    %edi
        movb    %dh, %al
-       incl    %eax            /* the number of heads is counted from zero */
-       movl    0x10(%ebp), %edi
+       incl    %eax    /* the number of heads is counted from zero */
        movl    %eax, (%edi)
 
-       /* sectors */
-       xorl    %eax, %eax
-       movb    %cl, %al
-       andb    $0x3f, %al
-       movl    0x14(%ebp), %edi
-       movl    %eax, (%edi)
-
-       /* cylinders */
-       shrb    $6, %cl
-       movb    %cl, %ah
+       /* pop CYLINDERS */
+       popl    %edi
        movb    %ch, %al
-       incl    %eax            /* the number of cylinders is 
-                                  counted from zero */
-       movl    0xc(%ebp), %edi
+       movb    %cl, %ah
+       shrb    $6, %ah /* the number of cylinders is counted from zero */
+       incl    %eax
        movl    %eax, (%edi)
 
+       /* SECTORS */
+       movl    0x10(%esp), %edi
+       andb    $0x3f, %cl
+       movzbl  %cl, %eax
+       movl    %eax, (%edi)
+       
        xorl    %eax, %eax
        movb    %bl, %al        /* return value in %eax */
 
@@ -672,7 +668,7 @@ FUNCTION(pupa_biosdisk_get_diskinfo_standard)
        popl    %ebx
        popl    %ebp
 
-       ret
+       ret     $4
 
 
 /*
@@ -724,14 +720,13 @@ FUNCTION(pupa_biosdisk_get_num_floppies)
 
 FUNCTION(pupa_get_memsize)
        pushl   %ebp
-       pushl   %ebx
 
-       movl    0xc(%esp), %ebx
+       movl    %eax, %edx
 
        call    prot_to_real    /* enter real mode */
        .code16
 
-       testl   %ebx, %ebx
+       testl   %edx, %edx
        jnz     xext
 
        int     $0x12
@@ -742,13 +737,13 @@ xext:
        int     $0x15
 
 xdone:
-       movw    %ax, %bx
+       movw    %ax, %dx
 
        DATA32  call    real_to_prot
        .code32
 
-       movw    %bx, %ax
-       popl    %ebx
+       movw    %dx, %ax
+
        popl    %ebp
        ret
 
@@ -802,13 +797,12 @@ xnoteisa:
  */
 
 FUNCTION(pupa_get_mmap_entry)
-       push    %ebp
-       push    %ebx
-       push    %edi
-       push    %esi
+       pusha
 
+       /* push ADDR */
+       pushl   %eax
+       
        /* place address (+4) in ES:DI */
-       movl    0x14(%esp), %eax
        addl    $4, %eax
        movl    %eax, %edi
        andl    $0xf, %edi
@@ -816,7 +810,7 @@ FUNCTION(pupa_get_mmap_entry)
        movl    %eax, %esi
 
        /* set continuation value */
-       movl    0x18(%esp), %ebx
+       movl    %edx, %ebx
 
        /* set default maximum buffer size */
        movl    $0x14, %ecx
@@ -851,17 +845,14 @@ xsmap:
        DATA32  call    real_to_prot
        .code32
 
-       /* write length of buffer (zero if error) into "addr" */
-       movl    0x14(%esp), %eax
+       /* write length of buffer (zero if error) into ADDR */
+       popl    %eax
        movl    %ecx, (%eax)
 
        /* set return value to continuation */
        movl    %ebx, %eax
 
-       pop     %esi
-       pop     %edi
-       pop     %ebx
-       pop     %ebp
+       popa
        ret
 
        
@@ -937,7 +928,7 @@ gloop2ret:
  * support setting a background attribute.
  */
 FUNCTION(pupa_console_putchar)
-       movl    0x4(%esp), %edx
+       movl    %eax, %edx
        pusha
        movb    EXT_C(pupa_console_cur_color), %bl
        
@@ -1122,8 +1113,8 @@ FUNCTION(pupa_console_gotoxy)
        pushl   %ebp
        pushl   %ebx                    /* save EBX */
 
-       movb    0xc(%esp), %dl           /* %dl = x */
-       movb    0x10(%esp), %dh          /* %dh = y */
+       movb    %dl, %dh        /* %dh = y */
+       movb    %al, %dl        /* %dl = x */
 
        call    prot_to_real
        .code16
@@ -1195,9 +1186,12 @@ console_cursor_shape:
        .word   0
        
 FUNCTION(pupa_console_setcursor)
-       push    %ebp
-       push    %ebx
+       pushl   %ebp
+       pushl   %ebx
 
+       /* push ON */
+       pushl   %eax
+       
        /* check if the standard cursor shape has already been saved */
        movw    console_cursor_shape, %ax
        testw   %ax, %ax
@@ -1217,8 +1211,8 @@ FUNCTION(pupa_console_setcursor)
 1:
        /* set %cx to the designated cursor shape */
        movw    $0x2000, %cx
-       movl    0xc(%esp), %ebx
-       testl   %ebx, %ebx
+       popl    %eax
+       testl   %eax, %eax
        jz      2f
        movw    console_cursor_shape, %cx
 2:     
@@ -1254,7 +1248,7 @@ FUNCTION(pupa_console_setcursor)
  *                          that it isn't running)
  */
 FUNCTION(pupa_getrtsecs)
-       push    %ebp
+       pushl   %ebp
 
        call    prot_to_real    /* enter real mode */
        .code16
@@ -1272,7 +1266,7 @@ gottime:
 
        movb    %dh, %al
 
-       pop     %ebp
+       popl    %ebp
        ret