Browse Source

mksys utility from NxM.

this works and builds code that clang, at least, can assemble.

The little trick we do is put the system call into r9, the 6th argument.

This works very well, because then a system call is two instructions:
movq $syscallnumber, %r9
sysenter

Because we don't need to shuffle arguments around to fit the artificial
convention that the syscallno has to be the first argument. It does not.

This REQUIRES fixing the kernel system call code, but that can come later
when we can actually compile. Again, NxM can give us what we need.

Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
Ronald G. Minnich 9 years ago
parent
commit
e9c584a236
4 changed files with 14 additions and 165 deletions
  1. 3 2
      NOTES.rminnich
  2. 6 146
      sys/src/libc/9syscall/mkfile
  3. 1 0
      util/.gitignore
  4. 4 17
      util/mksys.go

+ 3 - 2
NOTES.rminnich

@@ -1,7 +1,8 @@
+# These notes are also a script.
 # I want to try building with clang.
-sudo mkdir /amd64
+sudo mkdir -p /amd64
 sudo  mount --bind amd64/ /amd64/
 sudo  mount --bind sys /sys
 sudo mount --bind `which rc` /bin/sh
-sudo mount --bind /amd64/mkfile.clank /amd64/mkfile
+sudo mount --bind /amd64/mkfile.clang /amd64/mkfile
 

+ 6 - 146
sys/src/libc/9syscall/mkfile

@@ -2,159 +2,19 @@ MKSHELL=$PLAN9/bin/rc
 NPROC=1
 <$ROOT/$objtype/mkfile
 
+# Note that mksys needs to be in your path, somewhere.
 install:V:
-	SYS=`{sed '/^#define._X[123]/d; s/#define.([A-Z0-9_]*).*/\1/' sys.h}
-	for(I in $SYS) {
-		i=`{echo $I|tr A-Z a-z}
-		n=`{sed -n '/[ 	]'$I'[ 	]/s/.*	//p' sys.h}
-		if(~ $i exits) i=_exits
-		{switch($objtype){
-		case mips
-			echo TEXT $i'(SB)', 1, '$0'
-			echo MOVW R1, '0(FP)'
-			echo MOVW '$'$n, R1
-			echo SYSCALL
-			if(~ $i seek || ~ $i nsec) {
-				echo 'MOVW $-1,R5
-				BNE R1,R5,4(PC)
-				MOVW a+0(FP),R5
-				MOVW R1,0(R5)
-				MOVW R1,4(R5)'
-			}
-			echo RET
-		case mips2
-			echo TEXT $i'(SB)', 1, '$0'
-			echo MOVW R1, '0(FP)'
-			echo MOVW '$'$n, R1
-			echo ADD '$4',R29
-			echo SYSCALL
-			echo ADD '$-4',R29
-			echo RET
-		case spim
-			echo TEXT $i'(SB)', 1, '$0'
-			echo MOVW R1, '0(FP)'
-			echo MOVW '$'$n, R1
-			echo ADD '$4',R29
-			echo SYSCALL
-			echo ADD '$-4',R29
-			if(~ $i seek || ~ $i nsec) {	# untested so far - geoff
-				echo 'MOVW $-1,R5
-				BNE R1,R5,4(PC)
-				MOVW a+0(FP),R5
-				MOVW R1,0(R5)
-				MOVW R1,4(R5)'
-			}
-			echo RET
-		case 386
-			echo TEXT $i'(SB)', 1, '$0'
-			echo MOVL '$'$n, AX
-			echo INT '$'64
-			if(~ $i seek || ~ $i nsec) {
-				echo 'CMPL AX,$-1
-				JNE 4(PC)
-				MOVL a+0(FP),CX
-				MOVL AX,0(CX)
-				MOVL AX,4(CX)'
-			}
-			echo RET
-		case amd64
-			#if(~ $i seek)
-			#	echo TEXT _seek'(SB)', 1, '$0'
-			#if not
-			#	echo TEXT $i'(SB)', 1, '$0'
-			#
-			# For architectures which pass the first argument
-			# in a register, if the system call takes no arguments
-			# there will be no 'a0+0(FP)' reserved on the stack.
-			#
-			#if(! ~ $i nsec)
-			#	echo MOVQ RARG, 'a0+0(FP)'
-			#echo MOVQ '$'$n, RARG
-			#echo SYSCALL
-			#echo RET
-			echo .text
-			if(~ $i seek){
-				echo .globl _seek
-				echo _seek:
-				}
-                        echo .globl $i
-                        echo $i:
-                        echo '  'pushq %rdi
-                        echo '  'pushq %rsi
-                        echo '  'pushq %rdx
-                        echo '  'pushq %rcx
-			echo '  'pushq %r8
-			echo '  'pushq %r9
-                        echo '  pushq 72(%rsp)'         # arg 5
-                        echo '  pushq 72(%rsp)'         # arg 4
-                        echo '  pushq 72(%rsp)'         # arg 3
-                        echo '  pushq 72(%rsp)'         # arg 2
-                        echo '  pushq 72(%rsp)'         # arg 1
-                        echo '  pushq 72(%rsp)'         # arg PC
-			if(! ~ $i nsec)
-				echo '  movq %rax, 16(%rsp)'
-                        echo '  'movq '$'$n, %rax
-			echo '  syscall'
-                        echo '  'addq '$'48, %rsp       # align argument
-                        echo '  'popq %r9
-                        echo '  'popq %r8
-                        echo '  'popq %rcx
-                        echo '  'popq %rdx
-			echo '  'popq %rsi
-			echo '  'popq %rdi
-                        echo '  'ret	
-		case sparc
-			echo TEXT $i'(SB)', 1, '$0'
-			echo MOVW R7, '0(FP)'
-			echo MOVW '$'$n, R7
-			echo TA R0
-			if(~ $i seek || ~ $i nsec) {
-				echo 'CMP R7,$-1
-				BNE 4(PC)
-				MOVW a+0(FP),R8
-				MOVW R7,0(R8)
-				MOVW R7,4(R8)'
-			}
-			echo RETURN
-		case arm
-			echo TEXT $i'(SB)', 1, '$0'
-			echo MOVW R0, '0(FP)'
-			echo MOVW '$'$n, R0
-			echo SWI 0
-			if(~ $i seek || ~ $i nsec) {
-				echo 'CMP $-1,R0
-				BNE 4(PC)
-				MOVW a+0(FP),R1
-				MOVW R0,0(R1)
-				MOVW R0,4(R1)'
-			}
-			echo RET
-		case power
-			echo TEXT $i'(SB)', 1, '$0'
-			echo MOVW R3, '0(FP)'
-			echo MOVW '$'$n, R3
-			echo SYSCALL
-			if(~ $i seek || ~ $i nsec) {
-				echo 'CMP R3,$-1
-				BNE 4(PC)
-				MOVW a+0(FP),R8
-				MOVW R3,0(R8)
-				MOVW R3,4(R8)'
-			}
-			echo RETURN
-		}} > $i.s
-#		$AS $i.s
-		$AS -o $i.$O $i.s
-	}
-#	ar vu /$objtype/lib/libc.a *.$O
-	ar rv $ROOT/$objtype/lib/libc.a *.$O
+	mksys $objtype
+	$(AS) *.s
+	ar rvu $NXM/$objtype/lib/libc.a *.$O
 	rm -f *.$O *.s
 
 nuke clean:V:
-	rm -f *.[$OS]
+	rm -f *.[$OS] *.s
 
 installall:V:
 	for(objtype in $CPUS) mk install
 
 update:V:
 	update $UPDATEFLAGS mkfile sys.h
+

+ 1 - 0
util/.gitignore

@@ -0,0 +1 @@
+/mksys

+ 4 - 17
util/mksys.go

@@ -24,7 +24,7 @@ func main(){
 	}
 	lines := strings.Split(string(s), "\n")
 	for _, line := range lines {
-		ass := "TEXT "
+		ass := ".globl "
 		ll := strings.Fields(line)
 		if len(ll) < 3 {
 			continue
@@ -37,22 +37,9 @@ func main(){
 		if name == "seek" {
 			name = "_" + name
 		}
-		ass = ass + fmt.Sprintf("%s(SB), 1, $0\n", name)
-		if (name != "nanotime"){
-			ass = ass + "\tMOVQ RARG, a0+0(FP)\n"
-		}
-		ass = ass + "\tMOVQ $"+ll[2]+",RARG\n"
-		/* 
-		 * N.B. we should only move the # required,
-		 * rather than the worst case.
-		 */
-		ass = ass + "\tMOVQ $0xc000,AX\n"
-		ass = ass + "\tMOVQ a0+0x0(FP), DI\n"
-		ass = ass + "\tMOVQ a1+0x8(FP), SI\n"
-		ass = ass + "\tMOVQ a2+0x10(FP), DX\n"
-		ass = ass + "\tMOVQ a3+0x18(FP), R10\n"
-		ass = ass + "\tMOVQ a4+0x20(FP), R8\n"
-
+		ass = ass + fmt.Sprintf("%v\n%v: ", name, name)
+		ass = ass + "\tMOVQ $"+ll[2]
+		ass = ass + ",%r9  // Put the system call into arg 6, which is never used on Plan 9. minimizes work on system calls\n"
 		ass = ass + "\tSYSCALL\n\tRET\n"
 		err = ioutil.WriteFile(filename, []byte(ass), 0666)
 		if err != nil {