diff --git a/ChangeLog b/ChangeLog index 7fd12f963..e531142ec 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,33 @@ +2002-12-28 Yoshinori K. Okuji + + 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 * configure.ac: Check ld. diff --git a/NEWS b/NEWS index 032e2dd75..e026778a4 100644 --- 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. diff --git a/conf/i386-pc.mk b/conf/i386-pc.mk index ee4880b77..0f0575457 100644 --- a/conf/i386-pc.mk +++ b/conf/i386-pc.mk @@ -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) diff --git a/conf/i386-pc.rmk b/conf/i386-pc.rmk index 9f72c7e46..b5a503914 100644 --- a/conf/i386-pc.rmk +++ b/conf/i386-pc.rmk @@ -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 diff --git a/genmk.rb b/genmk.rb index 7c621b970..96516e7ba 100644 --- 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) diff --git a/kern/i386/pc/init.c b/kern/i386/pc/init.c index 589696e69..012ec99a4 100644 --- a/kern/i386/pc/init.c +++ b/kern/i386/pc/init.c @@ -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 (); diff --git a/kern/i386/pc/startup.S b/kern/i386/pc/startup.S index ecc97f3f7..aaabdc307 100644 --- a/kern/i386/pc/startup.S +++ b/kern/i386/pc/startup.S @@ -35,6 +35,14 @@ { 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 #include #include @@ -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