svn commit: r220337 - head/sys/boot/i386/boot2

Roman Divacky rdivacky at FreeBSD.org
Mon Apr 4 18:23:56 UTC 2011


Author: rdivacky
Date: Mon Apr  4 18:23:55 2011
New Revision: 220337
URL: http://svn.freebsd.org/changeset/base/220337

Log:
  Build boot2 with -mregparm=3, ie. pass upto 3 arguments via registers.
  This modifies CFLAGS and tweaks sio.S to use the new calling convention.
  The sio_init() and sio_putc() prototypes are modified so that other
  users of this code know the correct calling convention.
  
  This makes the code smaller when compiled with clang.
  
  Reviewed by:    jhb
  Tested by:      me and Freddie Cash <fjwcash gmail com>

Modified:
  head/sys/boot/i386/boot2/Makefile
  head/sys/boot/i386/boot2/lib.h
  head/sys/boot/i386/boot2/sio.S

Modified: head/sys/boot/i386/boot2/Makefile
==============================================================================
--- head/sys/boot/i386/boot2/Makefile	Mon Apr  4 17:44:26 2011	(r220336)
+++ head/sys/boot/i386/boot2/Makefile	Mon Apr  4 18:23:55 2011	(r220337)
@@ -31,6 +31,7 @@ CFLAGS=	-Os \
 	-fno-unit-at-a-time \
 	-mno-align-long-strings \
 	-mrtd \
+	-mregparm=3 \
 	-D${BOOT2_UFS} \
 	-DFLAGS=${BOOT_BOOT1_FLAGS} \
 	-DSIOPRT=${BOOT_COMCONSOLE_PORT} \

Modified: head/sys/boot/i386/boot2/lib.h
==============================================================================
--- head/sys/boot/i386/boot2/lib.h	Mon Apr  4 17:44:26 2011	(r220336)
+++ head/sys/boot/i386/boot2/lib.h	Mon Apr  4 18:23:55 2011	(r220337)
@@ -17,8 +17,8 @@
  * $FreeBSD$
  */
 
-void sio_init(int);
+void sio_init(int) __attribute__((regparm (3)));
 void sio_flush(void);
-void sio_putc(int);
+void sio_putc(int) __attribute__((regparm (3)));
 int sio_getc(void);
 int sio_ischar(void);

Modified: head/sys/boot/i386/boot2/sio.S
==============================================================================
--- head/sys/boot/i386/boot2/sio.S	Mon Apr  4 17:44:26 2011	(r220336)
+++ head/sys/boot/i386/boot2/sio.S	Mon Apr  4 18:23:55 2011	(r220337)
@@ -26,14 +26,14 @@
 
 /* void sio_init(int div) */
 
-sio_init:	movw $SIO_PRT+0x3,%dx		# Data format reg
+sio_init:	pushl %eax
+		movw $SIO_PRT+0x3,%dx		# Data format reg
 		movb $SIO_FMT|0x80,%al		# Set format
 		outb %al,(%dx)			#  and DLAB
-		pushl %edx			# Save
 		subb $0x3,%dl			# Divisor latch reg
-		movl 0x8(%esp),%eax		# Set
+		popl %eax
 		outw %ax,(%dx)			#  BPS
-		popl %edx			# Restore
+		movw $SIO_PRT+0x3,%dx		# Data format reg
 		movb $SIO_FMT,%al		# Clear
 		outb %al,(%dx)			#  DLAB
 		incl %edx			# Modem control reg
@@ -41,7 +41,7 @@ sio_init:	movw $SIO_PRT+0x3,%dx		# Data 
 		outb %al,(%dx)			#  DTR
 		incl %edx			# Line status reg
 		call sio_flush
-		ret $0x4
+		ret
 
 /* void sio_flush(void) */
 
@@ -52,17 +52,18 @@ sio_flush:	call sio_ischar 		# Check for
 
 /* void sio_putc(int c) */
 
-sio_putc:	movw $SIO_PRT+0x5,%dx		# Line status reg
+sio_putc:	pushl %eax
+		movw $SIO_PRT+0x5,%dx		# Line status reg
 		xor %ecx,%ecx			# Timeout
 		movb $0x40,%ch			#  counter
 sio_putc.1:	inb (%dx),%al			# Transmitter
 		testb $0x20,%al 		#  buffer empty?
 		loopz sio_putc.1		# No
 		jz sio_putc.2			# If timeout
-		movb 0x4(%esp,1),%al		# Get character
+		popl %eax                       # Get the character
 		subb $0x5,%dl			# Transmitter hold reg
 		outb %al,(%dx)			# Write character
-sio_putc.2:	ret $0x4			# To caller
+sio_putc.2:	ret				# To caller
 
 /* int sio_getc(void) */
 


More information about the svn-src-all mailing list