diff options
author | jake <jake@FreeBSD.org> | 2001-11-18 02:47:26 +0000 |
---|---|---|
committer | jake <jake@FreeBSD.org> | 2001-11-18 02:47:26 +0000 |
commit | 53d54e923ab07cecbaedc641a03827feefaa2f03 (patch) | |
tree | 2d933e07fc74a25a4a8fb6c7f425208f6dd83827 /sys | |
parent | e5b1654f2fc9530a46359812c88d5df5b50f1a59 (diff) | |
download | FreeBSD-src-53d54e923ab07cecbaedc641a03827feefaa2f03.zip FreeBSD-src-53d54e923ab07cecbaedc641a03827feefaa2f03.tar.gz |
1. Implement ascopyto() and ascopyfrom() for copying to an alternate address
space from kernel space and from an alternate address space to kernel
space.
2. Remove the unused and unprototyped physcopy() and physzero() and replace
with the more versatile ascopy() and aszero(), inspired by the above.
These can be used to copy and zero physical pages of memory without mapping
them into kernel space first.
3. Use magic numbers for the offsets in the jmpbuf structure like other
platforms.
4. Use SET.
Submitted by: tmm (1, 4)
Diffstat (limited to 'sys')
-rw-r--r-- | sys/sparc64/include/cpufunc.h | 2 | ||||
-rw-r--r-- | sys/sparc64/sparc64/support.S | 72 | ||||
-rw-r--r-- | sys/sparc64/sparc64/support.s | 72 |
3 files changed, 94 insertions, 52 deletions
diff --git a/sys/sparc64/include/cpufunc.h b/sys/sparc64/include/cpufunc.h index 8ce80db..18f06b5 100644 --- a/sys/sparc64/include/cpufunc.h +++ b/sys/sparc64/include/cpufunc.h @@ -178,8 +178,10 @@ critical_exit(critical_t pil) wrpr(pil, pil, 0); } +void ascopy(u_long asi, vm_offset_t src, vm_offset_t dst, size_t len); void ascopyfrom(u_long sasi, vm_offset_t src, caddr_t dst, size_t len); void ascopyto(caddr_t src, u_long dasi, vm_offset_t dst, size_t len); +void aszero(u_long asi, vm_offset_t dst, size_t len); /* * Ultrasparc II doesn't implement popc in hardware. Suck. diff --git a/sys/sparc64/sparc64/support.S b/sys/sparc64/sparc64/support.S index 8def136..deef68e 100644 --- a/sys/sparc64/sparc64/support.S +++ b/sys/sparc64/sparc64/support.S @@ -84,7 +84,7 @@ /* * ASI independent implementation of memset(3). - * Used to implement bzero(), memset() and physzero(). + * Used to implement bzero(), memset() and aszero(). * * If the pattern is non-zero, duplicate it to fill 64 bits. * Store bytes until dst is 8-byte aligned, then store 8 bytes. @@ -142,14 +142,14 @@ /* * ASI independent implementation of memcpy(3). - * Used to implement bcopy(), copyin(), copyout(), memcpy(), and physcopy(). + * Used to implement bcopy(), copyin(), copyout(), memcpy(), ascopy(), + * ascopyfrom() and ascopyto(). * * Transfer bytes until dst is 8-byte aligned. If src is then also 8 byte * aligned, transfer 8 bytes, otherwise finish with bytes. The unaligned * case could be optimized, but it is expected that this is the uncommon * case and of questionable value. The code to do so is also rather large - * and ugly. - * It has yet to be determined how much unrolling is beneficial. + * and ugly. It has yet to be determined how much unrolling is beneficial. * * XXX bcopy() must also check for overlap. This is stupid. * XXX bcopy() should be implemented as @@ -208,7 +208,7 @@ 6: #define CATCH_SETUP(label) \ - setx label, %g2, %g1 ; \ + SET(label, %g2, %g1) ; \ ldx [PCPU(CURTHREAD)], %g6 ; \ ldx [%g6 + TD_PCB], %g6 ; \ stx %g1, [%g6 + PCB_ONFAULT] ; @@ -262,8 +262,8 @@ END(bcmp) /* * void bcopy(const void *src, void *dst, size_t len) */ -ENTRY(ovbcopy) ENTRY(bcopy) +ENTRY(ovbcopy) /* * Check for overlap, and copy backwards if so. */ @@ -306,24 +306,44 @@ ENTRY(bzero) END(bzero) /* - * void physzero(vm_offset_t pa, size_t len) + * void ascopy(u_long asi, vm_offset_t src, vm_offset_t dst, size_t len) + */ +ENTRY(ascopy) + wr %o0, 0, %asi + _MEMCPY(%o2, %o1, %o3, a, %asi, a, %asi) + retl + nop +END(ascopy) + +/* + * void ascopyfrom(u_long sasi, vm_offset_t src, caddr_t dst, size_t len) + */ +ENTRY(ascopyfrom) + wr %o0, 0, %asi + _MEMCPY(%o2, %o1, %o3, E, E, a, %asi) + retl + nop +END(ascopyfrom) + +/* + * void ascopyto(caddr_t src, u_long dasi, vm_offset_t dst, size_t len) */ -ENTRY(physzero) - wr %g0, ASI_PHYS_USE_EC, %asi - _MEMSET(%o0, %g0, %o1, a, %asi) +ENTRY(ascopyto) + wr %o1, 0, %asi + _MEMCPY(%o2, %o0, %o3, a, %asi, E, E) retl nop -END(physzero) +END(ascopyto) /* - * void physcopy(vm_offset_t src, vm_offset_t dst, size_t len) + * void aszero(u_long asi, vm_offset_t pa, size_t len) */ -ENTRY(physcopy) - wr %g0, ASI_PHYS_USE_EC, %asi - _MEMCPY(%o1, %o0, %o2, a, %asi, a, %asi) +ENTRY(aszero) + wr %o0, 0, %asi + _MEMSET(%o1, %g0, %o2, a, %asi) retl nop -END(physcopy) +END(aszero) /* * void *memcpy(void *dst, const void *src, size_t len) @@ -566,13 +586,13 @@ ENTRY(longjmp) set 1, %g3 movrz %o1, %o1, %g3 mov %o0, %g1 - ldx [%g1 + JB_FP], %g2 + ldx [%g1 + 0x10], %g2 1: cmp %fp, %g2 bl,a,pt %xcc, 1b restore bne,pn %xcc, 2f - ldx [%g1 + JB_SP], %o2 - ldx [%g1 + JB_PC], %o3 + ldx [%g1 + 0x0], %o2 + ldx [%g1 + 0x8], %o3 cmp %o2, %sp blt,pn %xcc, 2f movge %xcc, %o2, %sp @@ -582,9 +602,9 @@ ENTRY(longjmp) END(longjmp) ENTRY(setjmp) - stx %sp, [%o0 + JB_SP] - stx %o7, [%o0 + JB_PC] - stx %fp, [%o0 + JB_FP] + stx %sp, [%o0 + 0x0] + stx %o7, [%o0 + 0x8] + stx %fp, [%o0 + 0x10] retl clr %o0 END(setjmp) @@ -594,7 +614,7 @@ END(setjmp) */ ENTRY(openfirmware) save %sp, -CCFSZ, %sp - setx ofw_vec, %l7, %l6 + SET(ofw_vec, %l7, %l6) ldx [%l6], %l6 rdpr %pil, %l7 wrpr %g0, PIL_TICK, %pil @@ -612,12 +632,12 @@ ENTRY(openfirmware_exit) save %sp, -CCFSZ, %sp flushw wrpr %g0, PIL_TICK, %pil - setx ofw_tba, %l7, %l5 + SET(ofw_tba, %l7, %l5) ldx [%l5], %l5 wrpr %l5, 0, %tba ! restore the ofw trap table - setx ofw_vec, %l7, %l6 + SET(ofw_vec, %l7, %l6) ldx [%l6], %l6 - setx kstack0 + KSTACK_PAGES * PAGE_SIZE - PCB_SIZEOF, %l7, %l0 + SET(kstack0 + KSTACK_PAGES * PAGE_SIZE - PCB_SIZEOF, %l7, %l0) sub %l0, SPOFF, %fp ! setup a stack in a locked page sub %l0, SPOFF + CCFSZ, %sp mov AA_DMMU_PCXR, %l3 ! set context 0 diff --git a/sys/sparc64/sparc64/support.s b/sys/sparc64/sparc64/support.s index 8def136..deef68e 100644 --- a/sys/sparc64/sparc64/support.s +++ b/sys/sparc64/sparc64/support.s @@ -84,7 +84,7 @@ /* * ASI independent implementation of memset(3). - * Used to implement bzero(), memset() and physzero(). + * Used to implement bzero(), memset() and aszero(). * * If the pattern is non-zero, duplicate it to fill 64 bits. * Store bytes until dst is 8-byte aligned, then store 8 bytes. @@ -142,14 +142,14 @@ /* * ASI independent implementation of memcpy(3). - * Used to implement bcopy(), copyin(), copyout(), memcpy(), and physcopy(). + * Used to implement bcopy(), copyin(), copyout(), memcpy(), ascopy(), + * ascopyfrom() and ascopyto(). * * Transfer bytes until dst is 8-byte aligned. If src is then also 8 byte * aligned, transfer 8 bytes, otherwise finish with bytes. The unaligned * case could be optimized, but it is expected that this is the uncommon * case and of questionable value. The code to do so is also rather large - * and ugly. - * It has yet to be determined how much unrolling is beneficial. + * and ugly. It has yet to be determined how much unrolling is beneficial. * * XXX bcopy() must also check for overlap. This is stupid. * XXX bcopy() should be implemented as @@ -208,7 +208,7 @@ 6: #define CATCH_SETUP(label) \ - setx label, %g2, %g1 ; \ + SET(label, %g2, %g1) ; \ ldx [PCPU(CURTHREAD)], %g6 ; \ ldx [%g6 + TD_PCB], %g6 ; \ stx %g1, [%g6 + PCB_ONFAULT] ; @@ -262,8 +262,8 @@ END(bcmp) /* * void bcopy(const void *src, void *dst, size_t len) */ -ENTRY(ovbcopy) ENTRY(bcopy) +ENTRY(ovbcopy) /* * Check for overlap, and copy backwards if so. */ @@ -306,24 +306,44 @@ ENTRY(bzero) END(bzero) /* - * void physzero(vm_offset_t pa, size_t len) + * void ascopy(u_long asi, vm_offset_t src, vm_offset_t dst, size_t len) + */ +ENTRY(ascopy) + wr %o0, 0, %asi + _MEMCPY(%o2, %o1, %o3, a, %asi, a, %asi) + retl + nop +END(ascopy) + +/* + * void ascopyfrom(u_long sasi, vm_offset_t src, caddr_t dst, size_t len) + */ +ENTRY(ascopyfrom) + wr %o0, 0, %asi + _MEMCPY(%o2, %o1, %o3, E, E, a, %asi) + retl + nop +END(ascopyfrom) + +/* + * void ascopyto(caddr_t src, u_long dasi, vm_offset_t dst, size_t len) */ -ENTRY(physzero) - wr %g0, ASI_PHYS_USE_EC, %asi - _MEMSET(%o0, %g0, %o1, a, %asi) +ENTRY(ascopyto) + wr %o1, 0, %asi + _MEMCPY(%o2, %o0, %o3, a, %asi, E, E) retl nop -END(physzero) +END(ascopyto) /* - * void physcopy(vm_offset_t src, vm_offset_t dst, size_t len) + * void aszero(u_long asi, vm_offset_t pa, size_t len) */ -ENTRY(physcopy) - wr %g0, ASI_PHYS_USE_EC, %asi - _MEMCPY(%o1, %o0, %o2, a, %asi, a, %asi) +ENTRY(aszero) + wr %o0, 0, %asi + _MEMSET(%o1, %g0, %o2, a, %asi) retl nop -END(physcopy) +END(aszero) /* * void *memcpy(void *dst, const void *src, size_t len) @@ -566,13 +586,13 @@ ENTRY(longjmp) set 1, %g3 movrz %o1, %o1, %g3 mov %o0, %g1 - ldx [%g1 + JB_FP], %g2 + ldx [%g1 + 0x10], %g2 1: cmp %fp, %g2 bl,a,pt %xcc, 1b restore bne,pn %xcc, 2f - ldx [%g1 + JB_SP], %o2 - ldx [%g1 + JB_PC], %o3 + ldx [%g1 + 0x0], %o2 + ldx [%g1 + 0x8], %o3 cmp %o2, %sp blt,pn %xcc, 2f movge %xcc, %o2, %sp @@ -582,9 +602,9 @@ ENTRY(longjmp) END(longjmp) ENTRY(setjmp) - stx %sp, [%o0 + JB_SP] - stx %o7, [%o0 + JB_PC] - stx %fp, [%o0 + JB_FP] + stx %sp, [%o0 + 0x0] + stx %o7, [%o0 + 0x8] + stx %fp, [%o0 + 0x10] retl clr %o0 END(setjmp) @@ -594,7 +614,7 @@ END(setjmp) */ ENTRY(openfirmware) save %sp, -CCFSZ, %sp - setx ofw_vec, %l7, %l6 + SET(ofw_vec, %l7, %l6) ldx [%l6], %l6 rdpr %pil, %l7 wrpr %g0, PIL_TICK, %pil @@ -612,12 +632,12 @@ ENTRY(openfirmware_exit) save %sp, -CCFSZ, %sp flushw wrpr %g0, PIL_TICK, %pil - setx ofw_tba, %l7, %l5 + SET(ofw_tba, %l7, %l5) ldx [%l5], %l5 wrpr %l5, 0, %tba ! restore the ofw trap table - setx ofw_vec, %l7, %l6 + SET(ofw_vec, %l7, %l6) ldx [%l6], %l6 - setx kstack0 + KSTACK_PAGES * PAGE_SIZE - PCB_SIZEOF, %l7, %l0 + SET(kstack0 + KSTACK_PAGES * PAGE_SIZE - PCB_SIZEOF, %l7, %l0) sub %l0, SPOFF, %fp ! setup a stack in a locked page sub %l0, SPOFF + CCFSZ, %sp mov AA_DMMU_PCXR, %l3 ! set context 0 |