summaryrefslogtreecommitdiffstats
path: root/sys/sparc64/include/pv.h
diff options
context:
space:
mode:
authorjake <jake@FreeBSD.org>2001-07-31 06:05:05 +0000
committerjake <jake@FreeBSD.org>2001-07-31 06:05:05 +0000
commitfb7edc502f41d82771205b77ec72ec6f85c7992a (patch)
tree09518e5a462c7f369bd3cbd7d956ad24588b2a9b /sys/sparc64/include/pv.h
parent489876bc4dc75168229017bfd4c2a43ec2711417 (diff)
downloadFreeBSD-src-fb7edc502f41d82771205b77ec72ec6f85c7992a.zip
FreeBSD-src-fb7edc502f41d82771205b77ec72ec6f85c7992a.tar.gz
Flesh out the sparc64 port considerably. This contains:
- mostly complete kernel pmap support, and tested but currently turned off userland pmap support - low level assembly language trap, context switching and support code - fully implemented atomic.h and supporting cpufunc.h - some support for kernel debugging with ddb - various header tweaks and filling out of machine dependent structures
Diffstat (limited to 'sys/sparc64/include/pv.h')
-rw-r--r--sys/sparc64/include/pv.h175
1 files changed, 175 insertions, 0 deletions
diff --git a/sys/sparc64/include/pv.h b/sys/sparc64/include/pv.h
new file mode 100644
index 0000000..e36d3f8
--- /dev/null
+++ b/sys/sparc64/include/pv.h
@@ -0,0 +1,175 @@
+/*-
+ * Copyright (c) 2001 Jake Burkholder.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _MACHINE_PV_H_
+#define _MACHINE_PV_H_
+
+#define PV_LOCK()
+#define PV_UNLOCK()
+
+#define ST_TTE offsetof(struct stte, st_tte)
+#define ST_NEXT offsetof(struct stte, st_next)
+#define ST_PREV offsetof(struct stte, st_prev)
+
+#define TTE_DATA offsetof(struct tte, tte_data)
+#define TTE_TAG offsetof(struct tte, tte_tag)
+
+#define PV_OFF(pa) ((vm_offset_t)(pa) - avail_start)
+#define PV_INDEX(pa) (PV_OFF(pa) >> PAGE_SHIFT)
+#define PV_SHIFT (3)
+
+#define casxp(pa, exp, src) \
+ casxa((vm_offset_t *)pa, exp, src, ASI_PHYS_USE_EC)
+#define ldxp(pa) ldxa(pa, ASI_PHYS_USE_EC)
+#define stxp(pa, val) stxa(pa, ASI_PHYS_USE_EC, val)
+
+extern vm_offset_t pv_table;
+extern u_long pv_generation;
+
+static __inline vm_offset_t
+pv_lookup(vm_offset_t pa)
+{
+ return (pv_table + (PV_INDEX(pa) << PV_SHIFT));
+}
+
+static __inline vm_offset_t
+pv_get_first(vm_offset_t pvh)
+{
+ return (ldxp(pvh));
+}
+
+static __inline vm_offset_t
+pv_get_next(vm_offset_t pstp)
+{
+ return (ldxp(pstp + ST_NEXT));
+}
+
+static __inline vm_offset_t
+pv_get_prev(vm_offset_t pstp)
+{
+ return (ldxp(pstp + ST_PREV));
+}
+
+static __inline u_long
+pv_get_tte_data(vm_offset_t pstp)
+{
+ return (ldxp(pstp + ST_TTE + TTE_DATA));
+}
+
+static __inline u_long
+pv_get_tte_tag(vm_offset_t pstp)
+{
+ return (ldxp(pstp + ST_TTE + TTE_TAG));
+}
+
+#define pv_get_tte(pstp) ({ \
+ struct tte __tte; \
+ __tte.tte_tag = pv_get_tte_tag(pstp); \
+ __tte.tte_data = pv_get_tte_data(pstp); \
+ __tte; \
+})
+
+static __inline void
+pv_set_first(vm_offset_t pvh, vm_offset_t first)
+{
+ stxp(pvh, first);
+}
+
+static __inline void
+pv_set_next(vm_offset_t pstp, vm_offset_t next)
+{
+ stxp(pstp + ST_NEXT, next);
+}
+
+static __inline void
+pv_set_prev(vm_offset_t pstp, vm_offset_t prev)
+{
+ stxp(pstp + ST_PREV, prev);
+}
+
+static __inline void
+pv_remove_phys(vm_offset_t pstp)
+{
+ vm_offset_t pv_next;
+ vm_offset_t pv_prev;
+
+ pv_next = pv_get_next(pstp);
+ pv_prev = pv_get_prev(pstp);
+ if (pv_next != 0)
+ pv_set_prev(pv_next, pv_prev);
+ stxp(pv_prev, pv_next);
+}
+
+static __inline void
+pv_bit_clear(vm_offset_t pstp, u_long bits)
+{
+ vm_offset_t dp;
+ vm_offset_t d1;
+ vm_offset_t d2;
+ vm_offset_t d3;
+
+ dp = pstp + ST_TTE + TTE_DATA;
+ for (d1 = ldxp(dp);; d1 = d3) {
+ d2 = d1 & ~bits;
+ d3 = casxp(dp, d1, d2);
+ if (d1 == d3)
+ break;
+ }
+}
+
+static __inline void
+pv_bit_set(vm_offset_t pstp, u_long bits)
+{
+ vm_offset_t dp;
+ vm_offset_t d1;
+ vm_offset_t d2;
+ vm_offset_t d3;
+
+ dp = pstp + ST_TTE + TTE_DATA;
+ for (d1 = ldxp(dp);; d1 = d3) {
+ d2 = d1 | bits;
+ d3 = casxp(dp, d1, d2);
+ if (d1 == d3)
+ break;
+ }
+}
+
+static __inline int
+pv_bit_test(vm_offset_t pstp, u_long bits)
+{
+ vm_offset_t dp;
+
+ dp = pstp + ST_TTE + TTE_DATA;
+ return ((casxp(dp, 0, 0) & bits) != 0);
+}
+
+void pv_dump(vm_offset_t pvh);
+void pv_insert(pmap_t pm, vm_offset_t pa, vm_offset_t va, struct stte *stp);
+void pv_remove_virt(struct stte *stp);
+
+#endif /* !_MACHINE_PV_H_ */
OpenPOWER on IntegriCloud