Annotation of src/sys/arch/riscv/riscv/pmap_machdep.c, Revision 1.2.22.1
1.1 matt 1: /*-
2: * Copyright (c) 2014 The NetBSD Foundation, Inc.
3: * All rights reserved.
4: *
5: * This code is derived from software contributed to The NetBSD Foundation
6: * by Matt Thomas of 3am Software Foundry.
7: *
8: * Redistribution and use in source and binary forms, with or without
9: * modification, are permitted provided that the following conditions
10: * are met:
11: * 1. Redistributions of source code must retain the above copyright
12: * notice, this list of conditions and the following disclaimer.
13: * 2. Redistributions in binary form must reproduce the above copyright
14: * notice, this list of conditions and the following disclaimer in the
15: * documentation and/or other materials provided with the distribution.
16: *
17: * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
18: * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
19: * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
20: * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
21: * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22: * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23: * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24: * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25: * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26: * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27: * POSSIBILITY OF SUCH DAMAGE.
28: */
29:
30: #define __PMAP_PRIVATE
31:
32: #include <sys/cdefs.h>
33:
1.2.22.1! christos 34: __RCSID("$NetBSD: pmap_machdep.c,v 1.3 2019/06/01 12:42:28 maxv Exp $");
1.1 matt 35:
36: #include <sys/param.h>
37:
38: #include <uvm/uvm.h>
39:
40: #include <riscv/locore.h>
41:
42: int riscv_poolpage_vmfreelist = VM_FREELIST_DEFAULT;
43:
44: void
45: pmap_zero_page(paddr_t pa)
46: {
47: #ifdef POOL_PHYSTOV
48: memset((void *)POOL_PHYSTOV(pa), 0, PAGE_SIZE);
49: #else
50: #error FIX pmap_zero_page!
51: #endif
52: }
53:
54: void
55: pmap_copy_page(paddr_t src, paddr_t dst)
56: {
57: #ifdef POOL_PHYSTOV
58: memcpy((void *)POOL_PHYSTOV(dst), (const void *)POOL_PHYSTOV(src),
59: PAGE_SIZE);
60: #else
61: #error FIX pmap_copy_page!
62: #endif
63: }
64:
65: struct vm_page *
66: pmap_md_alloc_poolpage(int flags)
67: {
68: if (riscv_poolpage_vmfreelist != VM_FREELIST_DEFAULT)
69: return uvm_pagealloc_strat(NULL, 0, NULL, flags,
70: UVM_PGA_STRAT_ONLY, riscv_poolpage_vmfreelist);
71:
72: return uvm_pagealloc(NULL, 0, NULL, flags);
73: }
74:
75: vaddr_t
76: pmap_md_map_poolpage(paddr_t pa, vsize_t len)
77: {
78: return POOL_PHYSTOV(pa);
79: }
80:
81: void
82: pmap_md_unmap_poolpage(vaddr_t pa, vsize_t len)
83: {
84: /* nothing to do */
85: }
86:
87: bool
88: pmap_md_direct_mapped_vaddr_p(vaddr_t va)
89: {
90: return VM_MAX_KERNEL_ADDRESS <= va && (intptr_t) va < 0;
91: }
92:
93: bool
94: pmap_md_io_vaddr_p(vaddr_t va)
95: {
96: return false;
97: }
98:
99: paddr_t
100: pmap_md_direct_mapped_vaddr_to_paddr(vaddr_t va)
101: {
102: KASSERT(VM_MAX_KERNEL_ADDRESS <= va && (intptr_t) va < 0);
1.2.22.1! christos 103: const pmap_pdetab_t *ptb = pmap_kernel()->pm_md.md_pdetab;
1.1 matt 104: pd_entry_t pde;
105:
106: #ifdef _LP64
107: pde = ptb->pde_pde[(va >> XSEGSHIFT) & (NPDEPG-1)];
108: if ((pde & PTE_V) == 0) {
109: return -(paddr_t)1;
110: }
111: if ((pde & PTE_T) == 0) {
112: return pde & ~XSEGOFSET;
113: }
114: ptb = (const pmap_pdetab_t *)POOL_PHYSTOV(pte_pde_to_paddr(pde));
115: #endif
116: pde = ptb->pde_pde[(va >> SEGSHIFT) & (NPDEPG-1)];
117: if ((pde & PTE_V) == 0) {
118: return -(paddr_t)1;
119: }
120: if ((pde & PTE_T) == 0) {
121: return pde & ~SEGOFSET;
122: }
123: return -(paddr_t)1;
124: }
125:
126: vaddr_t
127: pmap_md_direct_map_paddr(paddr_t pa)
128: {
129: return POOL_PHYSTOV(pa);
130: }
131:
132: void
133: pmap_md_init(void)
134: {
135: pmap_tlb_info_evcnt_attach(&pmap_tlb0_info);
136: }
137:
138: bool
1.2.22.1! christos 139: pmap_md_ok_to_steal_p(const uvm_physseg_t bank, size_t npgs)
! 140: {
! 141: return true;
! 142: }
! 143:
! 144: bool
1.1 matt 145: pmap_md_tlb_check_entry(void *ctx, vaddr_t va, tlb_asid_t asid, pt_entry_t pte)
146: {
147: return false;
148: }
149:
150: void
151: pmap_md_pdetab_activate(struct pmap *pmap)
152: {
1.2 matt 153: __asm("csrw\tsptbr, %0" :: "r"(pmap->pm_md.md_ptbr));
1.1 matt 154: }
155:
156: void
157: pmap_md_pdetab_init(struct pmap *pmap)
158: {
1.2.22.1! christos 159: pmap->pm_md.md_pdetab[NPDEPG-1] = pmap_kernel()->pm_md.md_pdetab[NPDEPG-1];
1.1 matt 160: pmap->pm_md.md_ptbr =
1.2.22.1! christos 161: pmap_md_direct_mapped_vaddr_to_paddr((vaddr_t)pmap->pm_md.md_pdetab);
1.1 matt 162: }
163:
164: // TLB mainenance routines
165:
166: tlb_asid_t
167: tlb_get_asid(void)
168: {
169: return riscvreg_asid_read();
170: }
171:
172: void
173: tlb_set_asid(tlb_asid_t asid)
174: {
175: riscvreg_asid_write(asid);
176: }
177:
178: #if 0
179: void tlb_invalidate_all(void);
180: void tlb_invalidate_globals(void);
181: #endif
182: void
183: tlb_invalidate_asids(tlb_asid_t lo, tlb_asid_t hi)
184: {
1.2 matt 185: __asm __volatile("sfence.vm" ::: "memory");
1.1 matt 186: }
187: void
188: tlb_invalidate_addr(vaddr_t va, tlb_asid_t asid)
189: {
1.2 matt 190: __asm __volatile("sfence.vm" ::: "memory");
1.1 matt 191: }
192:
193: bool
194: tlb_update_addr(vaddr_t va, tlb_asid_t asid, pt_entry_t pte, bool insert_p)
195: {
1.2 matt 196: __asm __volatile("sfence.vm" ::: "memory");
1.1 matt 197: return false;
198: }
199:
200: u_int
201: tlb_record_asids(u_long *ptr)
202: {
203: memset(ptr, 0xff, PMAP_TLB_NUM_PIDS / (8 * sizeof(u_long)));
204: ptr[0] = -2UL;
205: return PMAP_TLB_NUM_PIDS - 1;
206: }
207:
208: #if 0
209: void tlb_enter_addr(size_t, const struct tlbmask *);
210: void tlb_read_entry(size_t, struct tlbmask *);
211: void tlb_write_entry(size_t, const struct tlbmask *);
212: void tlb_walk(void *, bool (*)(void *, vaddr_t, tlb_asid_t, pt_entry_t));
213: void tlb_dump(void (*)(const char *, ...));
214: #endif
CVSweb <webmaster@jp.NetBSD.org>