git: e967ace28f4b - stable/13 - Implement suword16() for the 32/64-bit PowerPC architecture.
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Fri, 07 Jan 2022 13:30:57 UTC
The branch stable/13 has been updated by hselasky: URL: https://cgit.FreeBSD.org/src/commit/?id=e967ace28f4b38e0667c53769d984220590c8fd4 commit e967ace28f4b38e0667c53769d984220590c8fd4 Author: Hans Petter Selasky <hselasky@FreeBSD.org> AuthorDate: 2021-12-19 11:19:53 +0000 Commit: Hans Petter Selasky <hselasky@FreeBSD.org> CommitDate: 2022-01-07 13:25:17 +0000 Implement suword16() for the 32/64-bit PowerPC architecture. Sponsored by: NVIDIA Networking (cherry picked from commit e98efdd973560e66557f3ab46ca10376acb3c583) (cherry picked from commit eb771bf6f496538d2f621780702200f5390ff435) --- sys/powerpc/powerpc/copyinout.c | 31 +++++++++++++++++++++++++++++++ sys/powerpc/powerpc/support.S | 8 ++++++++ 2 files changed, 39 insertions(+) diff --git a/sys/powerpc/powerpc/copyinout.c b/sys/powerpc/powerpc/copyinout.c index 1528accc0e0e..f6720e8ba09e 100644 --- a/sys/powerpc/powerpc/copyinout.c +++ b/sys/powerpc/powerpc/copyinout.c @@ -99,6 +99,8 @@ int copyout_remap(const void *kaddr, void *udaddr, size_t len); int copyout_direct(const void *kaddr, void *udaddr, size_t len); int copyin_remap(const void *uaddr, void *kaddr, size_t len); int copyin_direct(const void *uaddr, void *kaddr, size_t len); +int suword16_remap(volatile void *addr, int word); +int suword16_direct(volatile void *addr, int word); int suword32_remap(volatile void *addr, int word); int suword32_direct(volatile void *addr, int word); int suword_remap(volatile void *addr, long word); @@ -139,6 +141,7 @@ DEFINE_COPY_FUNC(int, copyinstr, (const void *, void *, size_t, size_t *)) DEFINE_COPY_FUNC(int, copyin, (const void *, void *, size_t)) DEFINE_COPY_FUNC(int, copyout, (const void *, void *, size_t)) DEFINE_COPY_FUNC(int, suword, (volatile void *, long)) +DEFINE_COPY_FUNC(int, suword16, (volatile void *, int)) DEFINE_COPY_FUNC(int, suword32, (volatile void *, int)) DEFINE_COPY_FUNC(int, suword64, (volatile void *, int64_t)) DEFINE_COPY_FUNC(int, fubyte, (volatile const void *)) @@ -314,6 +317,34 @@ REMAP(subyte)(volatile void *addr, int byte) return (0); } +int +REMAP(suword16)(volatile void *addr, int word) +{ + struct thread *td; + pmap_t pm; + jmp_buf env; + int16_t *p; + + td = curthread; + pm = &td->td_proc->p_vmspace->vm_pmap; + + td->td_pcb->pcb_onfault = &env; + if (setjmp(env)) { + td->td_pcb->pcb_onfault = NULL; + return (-1); + } + + if (pmap_map_user_ptr(pm, addr, (void **)&p, sizeof(*p), NULL)) { + td->td_pcb->pcb_onfault = NULL; + return (-1); + } + + *p = (int16_t)word; + + td->td_pcb->pcb_onfault = NULL; + return (0); +} + #ifdef __powerpc64__ int REMAP(suword32)(volatile void *addr, int word) diff --git a/sys/powerpc/powerpc/support.S b/sys/powerpc/powerpc/support.S index 10d3192972d5..89dccd558014 100644 --- a/sys/powerpc/powerpc/support.S +++ b/sys/powerpc/powerpc/support.S @@ -401,6 +401,14 @@ ENTRY_DIRECT(suword) END_DIRECT(suword) #endif +ENTRY_DIRECT(suword16) + PROLOGUE + SET_FUSUFAULT(%r3, %r7) + sth %r4, 0(%r3) + CLEAR_FAULT(%r7) + EPILOGUE +END_DIRECT(suword16) + ENTRY_DIRECT(suword32) PROLOGUE SET_FUSUFAULT(%r3, %r7)