#include <sys/errno.h>
#include <sys/syscall.h>
#include <machine/param.h>
#include <machine/asm.h>
#include <machine/cpu.h>
#include <mips64/mips_cpu.h>
#include <machine/regnum.h>
#include <machine/cpustate.h>
#include <machine/trap.h>
#include "assym.h"
.set mips3
.set noreorder # Noreorder is default style!
.globl onfault_table
.data
.align 3
onfault_table:
PTR_VAL 0 # invalid index number
PTR_VAL _copyerr
PTR_VAL _kcopyerr
#if defined(DDB) || defined(DEBUG)
PTR_VAL kt_ddberr
#else
PTR_VAL 0
#endif
.text
.globl sigcode
sigcode:
PTR_ADDU a0, sp, 4*REGSZ # address of sigcontext
LI v0, SYS_sigreturn # sigreturn(scp)
.globl sigcodecall
sigcodecall:
syscall
.globl sigcoderet
sigcoderet:
.globl esigcode
esigcode:
.globl sigfill
sigfill:
teq zero, zero, 0x52
esigfill:
.data
.globl sigfillsiz
sigfillsiz:
.long esigfill - sigfill
.text
LEAF(copystr, 0)
beq a2, zero, 9f
move t2, a2 # Save the number of bytes
move v0, zero
1:
lbu t0, 0(a0)
PTR_SUBU a2, a2, 1
sb t0, 0(a1)
PTR_ADDU a0, a0, 1
beq t0, zero, 2f
PTR_ADDU a1, a1, 1
bne a2, zero, 1b
NOP
9:
LI v0, ENAMETOOLONG # String is longer than maxlength
2:
beq a3, zero, 3f
PTR_SUBU a2, t2, a2 # Compute length copied
REG_S a2, 0(a3)
3:
j ra
NOP
END(copystr)
LEAF(mem_zero_page, 0)
LI v0, PAGE_SIZE
1:
PTR_SUBU v0, 8
sd zero, 0(a0)
bne zero, v0, 1b
PTR_ADDU a0, 8
jr ra
NOP
END(mem_zero_page)
NON_LEAF(_copyinstr, FRAMESZ(CF_SZ), ra)
PTR_SUBU sp, sp, FRAMESZ(CF_SZ)
.mask 0x80000000, (CF_RA_OFFS - FRAMESZ(CF_SZ))
PTR_S ra, CF_RA_OFFS(sp)
blt a0, zero, _copyerr # make sure address is in user space
LI v0, KT_COPYERR
GET_CPU_INFO(t1, t0)
PTR_L t3, CI_CURPROCPADDR(t1)
jal copystr
sw v0, PCB_ONFAULT(t3)
PTR_L ra, CF_RA_OFFS(sp)
GET_CPU_INFO(t1, t0)
PTR_L t3, CI_CURPROCPADDR(t1)
sw zero, PCB_ONFAULT(t3)
PTR_ADDU sp, sp, FRAMESZ(CF_SZ)
j ra
NOP
END(_copyinstr)
NON_LEAF(copyoutstr, FRAMESZ(CF_SZ), ra)
PTR_SUBU sp, sp, FRAMESZ(CF_SZ)
.mask 0x80000000, (CF_RA_OFFS - FRAMESZ(CF_SZ))
PTR_S ra, CF_RA_OFFS(sp)
blt a1, zero, _copyerr # make sure address is in user space
LI v0, KT_COPYERR
GET_CPU_INFO(t1, t0)
PTR_L t3, CI_CURPROCPADDR(t1)
jal copystr
sw v0, PCB_ONFAULT(t3)
PTR_L ra, CF_RA_OFFS(sp)
GET_CPU_INFO(t1, t0)
PTR_L t3, CI_CURPROCPADDR(t1)
sw zero, PCB_ONFAULT(t3)
PTR_ADDU sp, sp, FRAMESZ(CF_SZ)
j ra
NOP
END(copyoutstr)
NON_LEAF(_copyin, FRAMESZ(CF_SZ), ra)
PTR_SUBU sp, sp, FRAMESZ(CF_SZ)
.mask 0x80000000, (CF_RA_OFFS - FRAMESZ(CF_SZ))
PTR_S ra, CF_RA_OFFS(sp)
blt a0, zero, _copyerr # make sure address is in user space
li v0, KT_COPYERR
GET_CPU_INFO(t1, t0)
PTR_L t3, CI_CURPROCPADDR(t1)
jal bcopy
sw v0, PCB_ONFAULT(t3)
PTR_L ra, CF_RA_OFFS(sp)
GET_CPU_INFO(t1, t0)
PTR_L t3, CI_CURPROCPADDR(t1)
sw zero, PCB_ONFAULT(t3)
PTR_ADDU sp, sp, FRAMESZ(CF_SZ)
j ra
move v0, zero
END(_copyin)
NON_LEAF(copyout, FRAMESZ(CF_SZ), ra)
PTR_SUBU sp, sp, FRAMESZ(CF_SZ)
.mask 0x80000000, (CF_RA_OFFS - FRAMESZ(CF_SZ))
PTR_S ra, CF_RA_OFFS(sp)
blt a1, zero, _copyerr # make sure address is in user space
li v0, KT_COPYERR
GET_CPU_INFO(t1, t0)
PTR_L t3, CI_CURPROCPADDR(t1)
jal bcopy
sw v0, PCB_ONFAULT(t3)
PTR_L ra, CF_RA_OFFS(sp)
GET_CPU_INFO(t1, t0)
PTR_L t3, CI_CURPROCPADDR(t1)
sw zero, PCB_ONFAULT(t3)
PTR_ADDU sp, sp, FRAMESZ(CF_SZ)
j ra
move v0, zero
END(copyout)
NON_LEAF(copyin32, FRAMESZ(CF_SZ), ra)
PTR_SUBU sp, sp, FRAMESZ(CF_SZ)
.mask 0x80000000, (CF_RA_OFFS - FRAMESZ(CF_SZ))
PTR_S ra, CF_RA_OFFS(sp)
blt a0, zero, _copyerr # make sure address is in user space
li v0, KT_COPYERR
GET_CPU_INFO(t1, t0)
PTR_L t3, CI_CURPROCPADDR(t1)
sw v0, PCB_ONFAULT(t3)
lw v1, 0(a0)
sw v1, 0(a1)
sw zero, PCB_ONFAULT(t3)
PTR_ADDU sp, sp, FRAMESZ(CF_SZ)
j ra
move v0, zero
END(copyin32)
_copyerr:
PTR_L ra, CF_RA_OFFS(sp)
GET_CPU_INFO(t1, t0)
PTR_L t3, CI_CURPROCPADDR(t1)
sw zero, PCB_ONFAULT(t3)
PTR_ADDU sp, sp, FRAMESZ(CF_SZ)
j ra
li v0, EFAULT # return error
NON_LEAF(kcopy, FRAMESZ(CF_SZ + REGSZ), ra)
PTR_SUBU sp, sp, FRAMESZ(CF_SZ + REGSZ)
.mask 0x80000000, (CF_RA_OFFS - FRAMESZ(CF_SZ + REGSZ))
PTR_S ra, CF_RA_OFFS + REGSZ(sp)
GET_CPU_INFO(t1, t0)
PTR_L t3, CI_CURPROCPADDR(t1)
lw v1, PCB_ONFAULT(t3)
li v0, KT_KCOPYERR
PTR_S v1, CF_ARGSZ(sp) # save old pcb_onfault
jal bcopy
sw v0, PCB_ONFAULT(t3)
PTR_L v0, CF_ARGSZ(sp)
GET_CPU_INFO(t1, t0)
PTR_L t3, CI_CURPROCPADDR(t1)
PTR_L ra, CF_RA_OFFS + REGSZ(sp)
sw v0, PCB_ONFAULT(t3)
PTR_ADDU sp, sp, FRAMESZ(CF_SZ + REGSZ)
j ra
move v0, zero
END(kcopy)
_kcopyerr:
PTR_L v0, CF_ARGSZ(sp)
GET_CPU_INFO(t1, t0)
PTR_L t3, CI_CURPROCPADDR(t1)
PTR_L ra, CF_RA_OFFS + REGSZ(sp)
sw v0, PCB_ONFAULT(t3)
PTR_ADDU sp, sp, FRAMESZ(CF_SZ + REGSZ)
j ra
li v0, EFAULT # return error