1NPROC=1 2</$objtype/mkfile 3 4install:V: 5 SYS=`{sed '/^#define._X[123]/d; s/#define.([A-Z0-9_]*).*/\1/' sys.h} 6 for(I in $SYS) { 7 i=`{echo $I|tr A-Z a-z} 8 n=`{sed -n '/[ ]'$I'[ ]/s/.* //p' sys.h} 9 if(~ $i exits) i=_exits 10 {switch($objtype){ 11 case mips 12 echo TEXT $i'(SB)', 1, '$0' 13 echo MOVW R1, '0(FP)' 14 echo MOVW '$'$n, R1 15 echo SYSCALL 16 if(~ $i seek || ~ $i nsec) { 17 echo 'MOVW $-1,R5 18 BNE R1,R5,4(PC) 19 MOVW a+0(FP),R5 20 MOVW R1,0(R5) 21 MOVW R1,4(R5)' 22 } 23 echo RET 24 case mips2 25 echo TEXT $i'(SB)', 1, '$0' 26 echo MOVW R1, '0(FP)' 27 echo MOVW '$'$n, R1 28 echo ADD '$4',R29 29 echo SYSCALL 30 echo ADD '$-4',R29 31 echo RET 32 case spim 33 echo TEXT $i'(SB)', 1, '$0' 34 echo MOVW R1, '0(FP)' 35 echo MOVW '$'$n, R1 36 echo ADD '$4',R29 37 echo SYSCALL 38 echo ADD '$-4',R29 39 if(~ $i seek || ~ $i nsec) { # untested so far - geoff 40 echo 'MOVW $-1,R5 41 BNE R1,R5,4(PC) 42 MOVW a+0(FP),R5 43 MOVW R1,0(R5) 44 MOVW R1,4(R5)' 45 } 46 echo RET 47 case mips64 48 if(~ $i seek || ~ $i nsec) 49 echo TEXT _$i'(SB)', 1, '$0' 50 if not 51 echo TEXT $i'(SB)', 1, '$0' 52 echo MOVV R1, '0(FP)' 53 echo MOVW '$'$n, R1 54 echo ADDV '$8',R29 55 echo SYSCALL 56 echo ADDV '$-8',R29 57 echo RET 58 case spim64 59 if(~ $i seek || ~ $i nsec) 60 echo TEXT _$i'(SB)', 1, '$0' 61 if not 62 echo TEXT $i'(SB)', 1, '$0' 63 echo MOVV R1, '0(FP)' 64 echo MOVW '$'$n, R1 65 echo ADDV '$8',R29 66 echo SYSCALL 67 echo ADDV '$-8',R29 68 echo RET 69 case 386 70 echo TEXT $i'(SB)', 1, '$0' 71 echo MOVL '$'$n, AX 72 echo INT '$'64 73 if(~ $i seek || ~ $i nsec) { 74 echo 'CMPL AX,$-1 75 JNE 4(PC) 76 MOVL a+0(FP),CX 77 MOVL AX,0(CX) 78 MOVL AX,4(CX)' 79 } 80 echo RET 81 case amd64 82 if(~ $i seek) 83 echo TEXT _seek'(SB)', 1, '$0' 84 if not 85 echo TEXT $i'(SB)', 1, '$0' 86 # 87 # For architectures which pass the first argument 88 # in a register, if the system call takes no arguments 89 # there will be no 'a0+0(FP)' reserved on the stack. 90 # 91 if(! ~ $i nsec) 92 echo MOVQ RARG, 'a0+0(FP)' 93 echo MOVQ '$'$n, RARG 94 echo SYSCALL 95 echo RET 96 case sparc 97 echo TEXT $i'(SB)', 1, '$0' 98 echo MOVW R7, '0(FP)' 99 echo MOVW '$'$n, R7 100 echo TA R0 101 if(~ $i seek || ~ $i nsec) { 102 echo 'CMP R7,$-1 103 BNE 4(PC) 104 MOVW a+0(FP),R8 105 MOVW R7,0(R8) 106 MOVW R7,4(R8)' 107 } 108 echo RETURN 109 case arm 110 echo TEXT $i'(SB)', 1, '$0' 111 echo MOVW R0, '0(FP)' 112 echo MOVW '$'$n, R0 113 echo SWI 0 114 if(~ $i seek || ~ $i nsec) { 115 echo 'CMP $-1,R0 116 BNE 4(PC) 117 MOVW a+0(FP),R1 118 MOVW R0,0(R1) 119 MOVW R0,4(R1)' 120 } 121 echo RET 122 case power 123 echo TEXT $i'(SB)', 1, '$0' 124 echo MOVW R3, '0(FP)' 125 echo MOVW '$'$n, R3 126 echo SYSCALL 127 if(~ $i seek || ~ $i nsec) { 128 echo 'CMP R3,$-1 129 BNE 4(PC) 130 MOVW a+0(FP),R8 131 MOVW R3,0(R8) 132 MOVW R3,4(R8)' 133 } 134 echo RETURN 135 case power64 136 if(~ $i seek) 137 echo TEXT _seek'(SB)', 1, '$0' 138 if not 139 echo TEXT $i'(SB)', 1, '$0' 140 echo MOVD R3, '0(FP)' 141 echo MOVW '$'$n, R3 142 echo SYSCALL 143 echo RETURN 144 case riscv 145 echo TEXT $i'(SB)', 1, '$0' 146 echo MOVW R8, '0(FP)' 147 echo MOVW '$'$n, R8 148 echo ECALL 149 if(~ $i seek) { 150 echo 'MOVW $-1, R9 151 BNE R8, R9, 4(PC) 152 MOVW a+0(FP),R9 153 MOVW R8,0(R9) 154 MOVW R8,4(R9)' 155 } 156 if(~ $i nsec) { 157 echo 'MOVW a+0(FP),R10 158 MOVW R8,0(R10) 159 MOVW R9,4(R10)' 160 } 161 echo RET 162 case riscv64 163 if(~ $i seek) 164 echo TEXT _seek'(SB)', 1, '$0' 165 if not 166 echo TEXT $i'(SB)', 1, '$0' 167 # 168 # For architectures which pass the first argument 169 # in a register, if the system call takes no arguments 170 # there will be no 'a0+0(FP)' reserved on the stack. 171 # 172 # jc doesn't widen longs to vlongs when pushing them. 173 # so we have to be careful here to only push longs 174 # for first arguments, where appropriate. 175 # 176 switch ($i) { 177 case nsec 178 ; 179 case bind chdir exec _exits segbrk open create \ 180 brk_ remove notify pipe seek segdetach segfree \ 181 segflush rendezvous unmount semacquire \ 182 semrelease errstr stat wstat await tsemacquire 183 echo MOV R8, '0(FP)' 184 case * 185 echo MOVW R8, '0(FP)' 186 } 187 echo MOV '$'$n, R8 188 echo ECALL 189 echo RET 190 }} > $i.s 191 $AS $i.s 192 } 193 ar vu /$objtype/lib/libc.a *.$O 194 rm -f *.$O *.s 195 196nuke clean:V: 197 rm -f *.[$OS] 198 199installall:V: 200 for(objtype in $CPUS) mk install 201 202update:V: 203 update $UPDATEFLAGS mkfile sys.h 204