copyinout.c (212715) | copyinout.c (214574) |
---|---|
1/*- 2 * Copyright (C) 2002 Benno Rice 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 40 unchanged lines hidden (view full) --- 49 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 50 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 51 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 52 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 53 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 54 */ 55 56#include <sys/cdefs.h> | 1/*- 2 * Copyright (C) 2002 Benno Rice 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 40 unchanged lines hidden (view full) --- 49 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 50 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 51 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 52 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 53 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 54 */ 55 56#include <sys/cdefs.h> |
57__FBSDID("$FreeBSD: head/sys/powerpc/aim/copyinout.c 212715 2010-09-16 00:22:25Z nwhitehorn $"); | 57__FBSDID("$FreeBSD: head/sys/powerpc/aim/copyinout.c 214574 2010-10-30 23:07:30Z nwhitehorn $"); |
58 59#include <sys/param.h> 60#include <sys/lock.h> 61#include <sys/mutex.h> 62#include <sys/systm.h> 63#include <sys/proc.h> 64 65#include <vm/vm.h> --- 10 unchanged lines hidden (view full) --- 76 * Makes sure that the right segment of userspace is mapped in. 77 */ 78 79#ifdef __powerpc64__ 80static __inline void 81set_user_sr(pmap_t pm, const void *addr) 82{ 83 struct slb *slb; | 58 59#include <sys/param.h> 60#include <sys/lock.h> 61#include <sys/mutex.h> 62#include <sys/systm.h> 63#include <sys/proc.h> 64 65#include <vm/vm.h> --- 10 unchanged lines hidden (view full) --- 76 * Makes sure that the right segment of userspace is mapped in. 77 */ 78 79#ifdef __powerpc64__ 80static __inline void 81set_user_sr(pmap_t pm, const void *addr) 82{ 83 struct slb *slb; |
84 register_t esid, vsid, slb1, slb2; | 84 register_t slbv; |
85 | 85 |
86 esid = USER_ADDR >> ADDR_SR_SHFT; 87 | |
88 /* Try lockless look-up first */ 89 slb = user_va_to_slb_entry(pm, (vm_offset_t)addr); 90 91 if (slb == NULL) { 92 /* If it isn't there, we need to pre-fault the VSID */ 93 PMAP_LOCK(pm); | 86 /* Try lockless look-up first */ 87 slb = user_va_to_slb_entry(pm, (vm_offset_t)addr); 88 89 if (slb == NULL) { 90 /* If it isn't there, we need to pre-fault the VSID */ 91 PMAP_LOCK(pm); |
94 vsid = va_to_vsid(pm, (vm_offset_t)addr); | 92 slbv = va_to_vsid(pm, (vm_offset_t)addr) << SLBV_VSID_SHIFT; |
95 PMAP_UNLOCK(pm); 96 } else { | 93 PMAP_UNLOCK(pm); 94 } else { |
97 vsid = slb->slbv >> SLBV_VSID_SHIFT; | 95 slbv = slb->slbv; |
98 } 99 | 96 } 97 |
100 slb1 = vsid << SLBV_VSID_SHIFT; 101 slb2 = (esid << SLBE_ESID_SHIFT) | SLBE_VALID | USER_SR; | 98 /* If we have already set this VSID, we can just return */ 99 if (curthread->td_pcb->pcb_cpu.aim.usr_vsid == slbv) 100 return; |
102 | 101 |
102 __asm __volatile ("isync; slbie %0; slbmte %1, %2; isync" :: 103 "r"(USER_ADDR), "r"(slbv), "r"(USER_SLB_SLBE)); |
|
103 curthread->td_pcb->pcb_cpu.aim.usr_segm = 104 (uintptr_t)addr >> ADDR_SR_SHFT; | 104 curthread->td_pcb->pcb_cpu.aim.usr_segm = 105 (uintptr_t)addr >> ADDR_SR_SHFT; |
105 __asm __volatile ("slbie %0; slbmte %1, %2" :: "r"(esid << 28), 106 "r"(slb1), "r"(slb2)); 107 isync(); | 106 curthread->td_pcb->pcb_cpu.aim.usr_vsid = slbv; |
108} 109#else 110static __inline void 111set_user_sr(pmap_t pm, const void *addr) 112{ 113 register_t vsid; 114 115 vsid = va_to_vsid(pm, (vm_offset_t)addr); 116 | 107} 108#else 109static __inline void 110set_user_sr(pmap_t pm, const void *addr) 111{ 112 register_t vsid; 113 114 vsid = va_to_vsid(pm, (vm_offset_t)addr); 115 |
117 isync(); 118 __asm __volatile ("mtsr %0,%1" :: "n"(USER_SR), "r"(vsid)); 119 isync(); | 116 /* If we have already set this VSID, we can just return */ 117 if (curthread->td_pcb->pcb_cpu.aim.usr_vsid == vsid) 118 return; 119 120 __asm __volatile ("sync; mtsr %0,%1; sync; isync" :: "n"(USER_SR), 121 "r"(vsid)); 122 curthread->td_pcb->pcb_cpu.aim.usr_vsid = vsid; |
120} 121#endif 122 123int 124copyout(const void *kaddr, void *udaddr, size_t len) 125{ 126 struct thread *td; 127 pmap_t pm; --- 383 unchanged lines hidden --- | 123} 124#endif 125 126int 127copyout(const void *kaddr, void *udaddr, size_t len) 128{ 129 struct thread *td; 130 pmap_t pm; --- 383 unchanged lines hidden --- |