Module Name: src Committed By: skrll Date: Sat May 1 07:41:24 UTC 2021
Modified Files: src/sys/arch/riscv/include: pmap.h pte.h vmparam.h src/sys/arch/riscv/riscv: pmap_machdep.c Log Message: Fixup some pmap / VM related #defines and code To generate a diff of this commit: cvs rdiff -u -r1.8 -r1.9 src/sys/arch/riscv/include/pmap.h \ src/sys/arch/riscv/include/vmparam.h cvs rdiff -u -r1.5 -r1.6 src/sys/arch/riscv/include/pte.h cvs rdiff -u -r1.6 -r1.7 src/sys/arch/riscv/riscv/pmap_machdep.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/riscv/include/pmap.h diff -u src/sys/arch/riscv/include/pmap.h:1.8 src/sys/arch/riscv/include/pmap.h:1.9 --- src/sys/arch/riscv/include/pmap.h:1.8 Sun Dec 20 16:38:25 2020 +++ src/sys/arch/riscv/include/pmap.h Sat May 1 07:41:24 2021 @@ -1,11 +1,12 @@ -/* $NetBSD: pmap.h,v 1.8 2020/12/20 16:38:25 skrll Exp $ */ +/* $NetBSD: pmap.h,v 1.9 2021/05/01 07:41:24 skrll Exp $ */ /* - * Copyright (c) 2014, 2019 The NetBSD Foundation, Inc. + * Copyright (c) 2014, 2019, 2021 The NetBSD Foundation, Inc. * All rights reserved. * * This code is derived from software contributed to The NetBSD Foundation - * by Matt Thomas (of 3am Software Foundry) and Maxime Villard. + * by Matt Thomas (of 3am Software Foundry), Maxime Villard, and + * Nick Hudson. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -38,6 +39,7 @@ #if !defined(_MODULE) +#include <sys/cdefs.h> #include <sys/types.h> #include <sys/pool.h> #include <sys/evcnt.h> @@ -46,26 +48,35 @@ #include <uvm/pmap/vmpagemd.h> #include <riscv/pte.h> +#include <riscv/sysreg.h> #define PMAP_SEGTABSIZE NPTEPG - -#define NBSEG (PAGE_SIZE * NPTEPG) +#define PMAP_PDETABSIZE NPTEPG #ifdef _LP64 -#define NBXSEG (NBSEG * NSEGPG) -#define XSEGSHIFT (SEGSHIFT + PGSHIFT - 3) -#define XSEGOFSET (PTE_PPN1 | SEGOFSET) -#define SEGSHIFT (PGSHIFT + PGSHIFT - 3) +#define PTPSHIFT 3 +/* This is SV48. */ +//#define SEGLENGTH + SEGSHIFT + SEGSHIFT */ + +/* This is SV39. */ +#define XSEGSHIFT (SEGSHIFT + SEGLENGTH) +#define NBXSEG (1ULL << XSEGSHIFT) +#define XSEGOFSET (NBXSEG - 1) /* byte offset into xsegment */ +#define XSEGLENGTH (PGSHIFT - 3) +#define NXSEGPG (1 << XSEGLENGTH) #else -#define SEGSHIFT (PGSHIFT + PGSHIFT - 2) +#define PTPSHIFT 2 +#define XSEGSHIFT SEGLENGTH #endif -#define SEGOFSET (PTE_PPN0|PAGE_MASK) +#define SEGLENGTH (PGSHIFT - PTPSHIFT) +#define SEGSHIFT (SEGLENGTH + PGSHIFT) +#define NBSEG (1 << SEGSHIFT) /* bytes/segment */ +#define SEGOFSET (NBSEG - 1) /* byte offset into segment */ #define KERNEL_PID 0 #define PMAP_HWPAGEWALKER 1 -#define PMAP_TLB_NUM_PIDS 256 #define PMAP_TLB_MAX 1 #ifdef _LP64 #define PMAP_INVALID_PDETAB_ADDRESS ((pmap_pdetab_t *)(VM_MIN_KERNEL_ADDRESS - PAGE_SIZE)) @@ -74,6 +85,8 @@ #define PMAP_INVALID_PDETAB_ADDRESS ((pmap_pdetab_t *)0xdeadbeef) #define PMAP_INVALID_SEGTAB_ADDRESS ((pmap_segtab_t *)0xdeadbeef) #endif +#define PMAP_TLB_NUM_PIDS (__SHIFTOUT_MASK(SATP_ASID) + 1) +#define PMAP_TLB_BITMAP_LENGTH PMAP_TLB_NUM_PIDS #define PMAP_TLB_FLUSH_ASID_ON_RESET false #define pmap_phys_address(x) (x) @@ -120,9 +133,9 @@ paddr_t pmap_md_direct_mapped_vaddr_to_p vaddr_t pmap_md_direct_map_paddr(paddr_t); void pmap_md_init(void); bool pmap_md_tlb_check_entry(void *, vaddr_t, tlb_asid_t, pt_entry_t); -void pmap_md_page_syncicache(struct vm_page_md *, const kcpuset_t *); -void pmap_md_pdetab_activate(struct pmap *); +void pmap_md_xtab_activate(struct pmap *, struct lwp *); +void pmap_md_xtab_deactivate(struct pmap *); void pmap_md_pdetab_init(struct pmap *); bool pmap_md_ok_to_steal_p(const uvm_physseg_t, size_t); @@ -131,6 +144,9 @@ extern vaddr_t pmap_direct_end; #define PMAP_DIRECT_MAP(pa) (pmap_direct_base + (pa)) #define PMAP_DIRECT_UNMAP(va) ((paddr_t)(va) - pmap_direct_base) +#define MEGAPAGE_TRUNC(x) ((x) & ~SEGOFSET) +#define MEGAPAGE_ROUND(x) MEGAPAGE_TRUNC((x) + SEGOFSET) + #ifdef __PMAP_PRIVATE static inline void pmap_md_page_syncicache(struct vm_page_md *mdpg, const kcpuset_t *kc) @@ -150,7 +166,6 @@ pmap_md_vca_add(struct vm_page_md *mdpg, static inline void pmap_md_vca_remove(struct vm_page_md *mdpg, vaddr_t va) { - } static inline void @@ -164,20 +179,6 @@ pmap_md_tlb_asid_max(void) return PMAP_TLB_NUM_PIDS - 1; } -static inline void -pmap_md_xtab_activate(struct pmap *pm, struct lwp *l) -{ - - /* nothing */ -} - -static inline void -pmap_md_xtab_deactivate(struct pmap *pm) -{ - - /* nothing */ -} - #endif /* __PMAP_PRIVATE */ #endif /* _KERNEL */ Index: src/sys/arch/riscv/include/vmparam.h diff -u src/sys/arch/riscv/include/vmparam.h:1.8 src/sys/arch/riscv/include/vmparam.h:1.9 --- src/sys/arch/riscv/include/vmparam.h:1.8 Fri Feb 26 02:18:29 2021 +++ src/sys/arch/riscv/include/vmparam.h Sat May 1 07:41:24 2021 @@ -1,11 +1,11 @@ -/* $NetBSD: vmparam.h,v 1.8 2021/02/26 02:18:29 simonb Exp $ */ +/* $NetBSD: vmparam.h,v 1.9 2021/05/01 07:41:24 skrll Exp $ */ /*- - * Copyright (c) 2014 The NetBSD Foundation, Inc. + * Copyright (c) 2014, 2020 The NetBSD Foundation, Inc. * All rights reserved. * * This code is derived from software contributed to The NetBSD Foundation - * by Matt Thomas of 3am Software Foundry. + * by Matt Thomas of 3am Software Foundry, and Nick Hudson. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -42,6 +42,10 @@ * Machine dependent VM constants for RISCV. */ +/* + * We use a 4K page on both RV64 and RV32 systems. + * Override PAGE_* definitions to compile-time constants. + */ #define PAGE_SHIFT PGSHIFT #define PAGE_SIZE (1 << PAGE_SHIFT) #define PAGE_MASK (PAGE_SIZE - 1) @@ -105,17 +109,43 @@ */ #define VM_MIN_ADDRESS ((vaddr_t)0x00000000) #ifdef _LP64 /* Sv39 */ +/* + * kernel virtual space layout: + * 0xffff_ffc0_0000_0000 - 64GiB KERNEL VM Space (inc. text/data/bss) + * (0xffff_ffc0_4000_0000 +1GiB) KERNEL VM start of KVA + * (0xffff_ffd0_0000_0000 64GiB) reserved + * 0xffff_ffe0_0000_0000 - 128GiB direct mapping + */ #define VM_MAXUSER_ADDRESS ((vaddr_t)0x0000004000000000 - 16 * PAGE_SIZE) #define VM_MIN_KERNEL_ADDRESS ((vaddr_t)0xffffffc000000000) -#define VM_MAX_KERNEL_ADDRESS ((vaddr_t)0xffffffd000000000) /* MIN + 64GB */ +#define VM_MAX_KERNEL_ADDRESS ((vaddr_t)0xffffffd000000000) + #else /* Sv32 */ #define VM_MAXUSER_ADDRESS ((vaddr_t)-0x7fffffff-1)/* 0xffffffff80000000 */ #define VM_MIN_KERNEL_ADDRESS ((vaddr_t)-0x7fffffff-1)/* 0xffffffff80000000 */ #define VM_MAX_KERNEL_ADDRESS ((vaddr_t)-0x40000000) /* 0xffffffffc0000000 */ + #endif +#define VM_KERNEL_VM_BASE VM_MIN_KERNEL_ADDRESS +#define VM_KERNEL_VM_SIZE 0x2000000 /* 32 MiB (8 / 16 megapages) */ + #define VM_MAX_ADDRESS VM_MAXUSER_ADDRESS #define VM_MAXUSER_ADDRESS32 ((vaddr_t)(1UL << 31))/* 0x0000000080000000 */ +#ifdef _LP64 +/* + * Since we have the address space, we map all of physical memory (RAM) + * using block page table entries. + */ +#define RISCV_DIRECTMAP_MASK ((vaddr_t) 0xffffffe000000000L) +#define RISCV_DIRECTMAP_SIZE (-RISCV_DIRECTMAP_MASK) /* 128GiB */ +#define RISCV_DIRECTMAP_START RISCV_DIRECTMAP_MASK +#define RISCV_DIRECTMAP_END (RISCV_DIRECTMAP_START + RISCV_DIRECTMAP_SIZE) +#define RISCV_KVA_P(va) (((vaddr_t) (va) & RISCV_DIRECTMAP_MASK) != 0) +#define RISCV_PA_TO_KVA(pa) ((vaddr_t) ((pa) | RISCV_DIRECTMAP_START)) +#define RISCV_KVA_TO_PA(va) ((paddr_t) ((va) & ~RISCV_DIRECTMAP_MASK)) +#endif + /* * The address to which unspecified mapping requests default */ @@ -139,7 +169,7 @@ #define VM_PHYSSEG_MAX 1 #endif #if VM_PHYSSEG_MAX == 1 -#define VM_PHYSSEG_STRAT VM_PSTRAT_LINEAR +#define VM_PHYSSEG_STRAT VM_PSTRAT_BIGFIRST #else #define VM_PHYSSEG_STRAT VM_PSTRAT_BSEARCH #endif Index: src/sys/arch/riscv/include/pte.h diff -u src/sys/arch/riscv/include/pte.h:1.5 src/sys/arch/riscv/include/pte.h:1.6 --- src/sys/arch/riscv/include/pte.h:1.5 Sun Nov 1 19:47:46 2020 +++ src/sys/arch/riscv/include/pte.h Sat May 1 07:41:24 2021 @@ -1,11 +1,12 @@ -/* $NetBSD: pte.h,v 1.5 2020/11/01 19:47:46 skrll Exp $ */ +/* $NetBSD: pte.h,v 1.6 2021/05/01 07:41:24 skrll Exp $ */ /* - * Copyright (c) 2014, 2019 The NetBSD Foundation, Inc. + * Copyright (c) 2014, 2019, 2021 The NetBSD Foundation, Inc. * All rights reserved. * * This code is derived from software contributed to The NetBSD Foundation - * by Matt Thomas (of 3am Software Foundry) and Maxime Villard. + * by Matt Thomas (of 3am Software Foundry), Maxime Villard, and + * Nick Hudson. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -56,7 +57,8 @@ typedef __uint32_t pd_entry_t; #define NPDEPG NPTEPG /* Software PTE bits. */ -#define PTE_WIRED __BIT(8) +#define PTE_RSW __BITS(9,8) +#define PTE_WIRED __BIT(9) /* Hardware PTE bits. */ // These are hardware defined bits @@ -69,6 +71,11 @@ typedef __uint32_t pd_entry_t; #define PTE_R __BIT(1) // Read #define PTE_V __BIT(0) // Valid +#define PTE_HARDWIRED (PTE_A | PTE_D) +#define PTE_KERN (PTE_V | PTE_G) +#define PTE_RW (PTE_R | PTE_W) +#define PTE_RX (PTE_R | PTE_X) + #define PA_TO_PTE(pa) (((pa) >> PAGE_SHIFT) << PTE_PPN_SHIFT) #define PTE_TO_PA(pte) (((pte) >> PTE_PPN_SHIFT) << PAGE_SHIFT) @@ -91,6 +98,12 @@ typedef __uint32_t pd_entry_t; #define pl1_i(va) (((va) >> L1_SHIFT) & Ln_ADDR_MASK) #define pl0_i(va) (((va) >> L0_SHIFT) & Ln_ADDR_MASK) +static inline const size_t +pte_index(vaddr_t va) +{ + return ((va >> PGSHIFT) & (NPTEPG - 1)); +} + static inline bool pte_valid_p(pt_entry_t pte) { @@ -136,7 +149,7 @@ pte_unwire_entry(pt_entry_t pte) static inline paddr_t pte_to_paddr(pt_entry_t pte) { - return pte & ~PAGE_MASK; + return PTE_TO_PA(pte); } static inline pt_entry_t @@ -224,7 +237,7 @@ pte_make_kenter_pa(paddr_t pa, struct vm { pt_entry_t pte = (pt_entry_t)PA_TO_PTE(pa); - pte |= PTE_WIRED | PTE_V; + pte |= PTE_WIRED | PTE_G | PTE_V; pte |= pte_flag_bits(NULL, flags, true); pte |= pte_prot_bits(NULL, prot, true); /* pretend unmanaged */ @@ -237,6 +250,59 @@ pte_set(pt_entry_t *ptep, pt_entry_t pte *ptep = pte; } +static inline pd_entry_t +pte_invalid_pde(void) +{ + return 0; +} + +static inline pd_entry_t +pte_pde_pdetab(paddr_t pa, bool kernel_p) +{ + return PTE_V | (pa >> PAGE_SHIFT) << L2_SHIFT; +} + +static inline pd_entry_t +pte_pde_ptpage(paddr_t pa, bool kernel_p) +{ + return PTE_V | PTE_X | PTE_W | PTE_R | (pa >> PAGE_SHIFT) << L2_SHIFT; +} + +static inline bool +pte_pde_valid_p(pd_entry_t pde) +{ + return (pde & (PTE_X | PTE_W | PTE_R)) == 0; +} + +static inline paddr_t +pte_pde_to_paddr(pd_entry_t pde) +{ + return pte_to_paddr((pt_entry_t)pde); +} + +static inline pd_entry_t +pte_pde_cas(pd_entry_t *pdep, pd_entry_t opde, pt_entry_t npde) +{ +#ifdef MULTIPROCESSOR +#ifdef _LP64 + return atomic_cas_64(pdep, opde, npde); +#else + return atomic_cas_32(pdep, opde, npde); +#endif +#else + *pdep = npde; + return 0; +#endif +} + +static inline void +pte_pde_set(pd_entry_t *pdep, pd_entry_t npde) +{ + + *pdep = npde; +} + + static inline pt_entry_t pte_value(pt_entry_t pte) { Index: src/sys/arch/riscv/riscv/pmap_machdep.c diff -u src/sys/arch/riscv/riscv/pmap_machdep.c:1.6 src/sys/arch/riscv/riscv/pmap_machdep.c:1.7 --- src/sys/arch/riscv/riscv/pmap_machdep.c:1.6 Sat Mar 14 16:12:16 2020 +++ src/sys/arch/riscv/riscv/pmap_machdep.c Sat May 1 07:41:24 2021 @@ -1,11 +1,12 @@ -/* $NetBSD: pmap_machdep.c,v 1.6 2020/03/14 16:12:16 skrll Exp $ */ +/* $NetBSD: pmap_machdep.c,v 1.7 2021/05/01 07:41:24 skrll Exp $ */ /* - * Copyright (c) 2014, 2019 The NetBSD Foundation, Inc. + * Copyright (c) 2014, 2019, 2021 The NetBSD Foundation, Inc. * All rights reserved. * * This code is derived from software contributed to The NetBSD Foundation - * by Matt Thomas (of 3am Software Foundry) and Maxime Villard. + * by Matt Thomas (of 3am Software Foundry), Maxime Villard, and + * Nick Hudson. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -33,7 +34,7 @@ #include <sys/cdefs.h> -__RCSID("$NetBSD: pmap_machdep.c,v 1.6 2020/03/14 16:12:16 skrll Exp $"); +__RCSID("$NetBSD: pmap_machdep.c,v 1.7 2021/05/01 07:41:24 skrll Exp $"); #include <sys/param.h> @@ -143,12 +144,17 @@ pmap_md_tlb_check_entry(void *ctx, vaddr } void -pmap_md_pdetab_activate(struct pmap *pmap) +pmap_md_xtab_activate(struct pmap *pmap, struct lwp *l) { __asm("csrw\tsptbr, %0" :: "r"(pmap->pm_md.md_ptbr)); } void +pmap_md_xtab_deactivate(struct pmap *pmap) +{ +} + +void pmap_md_pdetab_init(struct pmap *pmap) { pmap->pm_md.md_pdetab[NPDEPG-1] = pmap_kernel()->pm_md.md_pdetab[NPDEPG-1];