Deleted Added
full compact
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 ---