#include "assym.h"
#include <sys/syscall.h>
#include <machine/asm.h>
#include <sys/errno.h>
.text
.align 2
ENTRY(copyin)
RETGUARD_SETUP(copy, x15)
cbnz x2, 1f
mov x0, 0
RETGUARD_CHECK(copy, x15)
ret
1:
adds x3, x0, x2
b.cs .Laddrfault
tst x3, #(1ULL << 63)
b.ne .Laddrfault
mrs x3, tpidr_el1
ldr x3, [x3, #(CI_CURPCB)]
ldr x4, [x3, #(PCB_ONFAULT)]
adr x5, .Lcopyfault
str x5, [x3, #(PCB_ONFAULT)]
cmp x2, #16
b.lo .Lcopyin1
2: ldtr x6, [x0]
ldtr x7, [x0, #8]
stp x6, x7, [x1], #16
add x0, x0, #16
sub x2, x2, #16
cmp x2, #16
b.hs 2b
.Lcopyin1:
cbz x2, .Lcopyin0
3: ldtrb w6, [x0]
strb w6, [x1], #1
add x0, x0, #1
sub x2, x2, #1
cbnz x2, 3b
.Lcopyin0:
str x4, [x3, #(PCB_ONFAULT)]
mov x0, xzr
RETGUARD_CHECK(copy, x15)
ret
.Lcopyfault:
str x4, [x3, #(PCB_ONFAULT)]
.Laddrfault:
mov x0, #EFAULT
RETGUARD_CHECK(copy, x15)
ret
ENTRY(copyin32)
RETGUARD_SETUP(copy, x15)
tst x0, #0x3
b.ne .Laddrfault
tst x0, #(1ULL << 63)
b.ne .Laddrfault
mrs x3, tpidr_el1
ldr x3, [x3, #(CI_CURPCB)]
ldr x4, [x3, #(PCB_ONFAULT)]
adr x5, .Lcopyfault
str x5, [x3, #(PCB_ONFAULT)]
ldtr w6, [x0]
str w6, [x1]
str x4, [x3, #(PCB_ONFAULT)]
mov x0, xzr
RETGUARD_CHECK(copy, x15)
ret
ENTRY(copyout)
RETGUARD_SETUP(copy, x15)
cbnz x2, 1f
mov x0, 0
RETGUARD_CHECK(copy, x15)
ret
1:
adds x3, x1, x2
b.cs .Laddrfault
tst x3, #(1ULL << 63)
b.ne .Laddrfault
mrs x3, tpidr_el1
ldr x3, [x3, #(CI_CURPCB)]
ldr x4, [x3, #(PCB_ONFAULT)]
adr x5, .Lcopyfault
str x5, [x3, #(PCB_ONFAULT)]
cmp x2, #16
b.lo .Lcopyout1
2: ldp x6, x7, [x0], #16
sttr x6, [x1]
sttr x7, [x1, #8]
add x1, x1, #16
sub x2, x2, #16
cmp x2, #16
b.hs 2b
.Lcopyout1:
cbz x2, .Lcopyout0
3: ldrb w6, [x0], #1
sttrb w6, [x1]
add x1, x1, #1
sub x2, x2, #1
cbnz x2, 3b
.Lcopyout0:
str x4, [x3, #(PCB_ONFAULT)]
mov x0, xzr
RETGUARD_CHECK(copy, x15)
ret
ENTRY(kcopy)
RETGUARD_SETUP(copy, x15)
cbnz x2, 1f
mov x0, 0
RETGUARD_CHECK(copy, x15)
ret
1:
mrs x3, tpidr_el1
ldr x3, [x3, #(CI_CURPCB)]
ldr x4, [x3, #(PCB_ONFAULT)]
adr x5, .Lcopyfault
str x5, [x3, #(PCB_ONFAULT)]
cmp x2, #16
b.lo .Lkcopy8
2: ldp x6, x7, [x0], #16
stp x6, x7, [x1], #16
sub x2, x2, #16
cmp x2, #16
b.hs 2b
.Lkcopy8:
tbz x2, #3, .Lkcopy4
ldr x6, [x0], #8
str x6, [x1], #8
sub x2, x2, #8
.Lkcopy4:
tbz x2, #2, .Lkcopy1
ldr w6, [x0], #4
str w6, [x1], #4
sub x2, x2, #4
.Lkcopy1:
cbz x2, .Lkcopy0
3: ldrb w6, [x0], #1
strb w6, [x1], #1
sub x2, x2, #1
cbnz x2, 3b
.Lkcopy0:
str x4, [x3, #(PCB_ONFAULT)]
mov x0, xzr
RETGUARD_CHECK(copy, x15)
ret