// Copyright 2022 hrpccs // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. typedef unsigned int uint32; typedef uint32 pte_t; typedef uint32* pagetable_t; #define PGSIZE 4096 // bytes per page #define PGSHIFT 12 // bits of offset within a page #define PGROUNDUP(sz) (((sz)+PGSIZE-1) & ~(PGSIZE-1)) #define PGROUNDDOWN(a) (((a)) & ~(PGSIZE-1)) #define PTE_V (1L << 0) // valid #define PTE_R (1L << 1) #define PTE_W (1L << 2) #define PTE_X (1L << 3) #define PTE_U (1L << 4) // 1 -> user can access // shift a physical address to the right place for a PTE. #define PA2PTE(pa) ((((uint32)pa) >> 12) << 10) #define PTE2PA(pte) (((pte) >> 10) << 12) #define PTE_FLAGS(pte) ((pte) & 0x3FF) // extract the two 10-bit page table indices from a virtual address. #define PXMASK 0x3FF // 10 bits #define PXSHIFT(level) (PGSHIFT+(10*(level))) #define PX(level, va) ((((uint32) (va)) >> PXSHIFT(level)) & PXMASK) #define MAXVA (1L << (10 + 10 + 12))