mirror of
https://github.com/handsomezhuzhu/2025-yatcpu.git
synced 2026-02-20 20:10:14 +00:00
44 lines
1.4 KiB
C
44 lines
1.4 KiB
C
// 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))
|