[BACK]Return to pmap_machdep.c CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / sys / arch / riscv / riscv

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>