-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
vmm: Early virtual memory manager definitions. WIP.
Signed-off-by: TunaCici <[email protected]>
- Loading branch information
Showing
2 changed files
with
121 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,79 @@ | ||
/* | ||
* Virtual memory manager for the ARMv8-A architecture | ||
* | ||
* References: | ||
* https://developer.arm.com/documentation/den0024/a/The-Memory-Management-Unit | ||
* https://github.com/ARM-software/u-boot/blob/master/arch/arm/include/asm/armv8/mmu.h | ||
* https://lowenware.com/blog/aarch64-mmu-programming/ | ||
* | ||
* Author: Tuna CICI | ||
*/ | ||
|
||
#ifndef VIRTUAL_H | ||
#define VIRTUAL_H | ||
|
||
#include <stdint.h> | ||
|
||
#include "Memory/PageDef.h" | ||
|
||
/* Hardware page table definition */ | ||
#define PTE_TYPE_MASK (3 << 0) | ||
#define PTE_TYPE_FAULT (0 << 0) | ||
#define PTE_TYPE_TABLE (3 << 0) | ||
#define PTE_TYPE_PAGE (3 << 0) | ||
#define PTE_TYPE_BLOCK (1 << 0) | ||
#define PTE_TYPE_VALID (1 << 0) | ||
|
||
#define PTE_TABLE_PXN (1UL << 59) | ||
#define PTE_TABLE_XN (1UL << 60) | ||
#define PTE_TABLE_AP (1UL << 61) | ||
#define PTE_TABLE_NS (1UL << 63) | ||
|
||
/* Block */ | ||
#define PTE_BLOCK_MEMTYPE(x) ((x) << 2) | ||
#define PTE_BLOCK_NS (1 << 5) | ||
#define PTE_BLOCK_NON_SHARE (0 << 8) | ||
#define PTE_BLOCK_OUTER_SHARE (2 << 8) | ||
#define PTE_BLOCK_INNER_SHARE (3 << 8) | ||
#define PTE_BLOCK_AF (1 << 10) | ||
#define PTE_BLOCK_NG (1 << 11) | ||
#define PTE_BLOCK_PXN (UL(1) << 53) | ||
#define PTE_BLOCK_UXN (UL(1) << 54) | ||
|
||
/* AttrIndx[2:0] */ | ||
#define PMD_ATTRINDX(t) ((t) << 2) | ||
#define PMD_ATTRINDX_MASK (7 << 2) | ||
#define PMD_ATTRMASK (PTE_BLOCK_PXN | \ | ||
PTE_BLOCK_UXN | \ | ||
PMD_ATTRINDX_MASK | \ | ||
PTE_TYPE_VALID) | ||
|
||
/* TCR flags */ | ||
#define TCR_T0SZ(x) ((64 - (x)) << 0) | ||
#define TCR_IRGN_NC (0 << 8) | ||
#define TCR_IRGN_WBWA (1 << 8) | ||
#define TCR_IRGN_WT (2 << 8) | ||
#define TCR_IRGN_WBNWA (3 << 8) | ||
#define TCR_IRGN_MASK (3 << 8) | ||
#define TCR_ORGN_NC (0 << 10) | ||
#define TCR_ORGN_WBWA (1 << 10) | ||
#define TCR_ORGN_WT (2 << 10) | ||
#define TCR_ORGN_WBNWA (3 << 10) | ||
#define TCR_ORGN_MASK (3 << 10) | ||
#define TCR_SHARED_NON (0 << 12) | ||
#define TCR_SHARED_OUTER (2 << 12) | ||
#define TCR_SHARED_INNER (3 << 12) | ||
#define TCR_TG0_4K (0 << 14) | ||
#define TCR_TG0_64K (1 << 14) | ||
#define TCR_TG0_16K (2 << 14) | ||
#define TCR_EPD1_DISABLE (1 << 23) | ||
|
||
#define TCR_EL1_RSVD (1 << 31) | ||
#define TCR_EL2_RSVD (1 << 31 | 1 << 23) | ||
#define TCR_EL3_RSVD (1 << 31 | 1 << 23) | ||
|
||
inline void init_ttbr(void *ttbr0, void *ttbr1); | ||
inline void init_tcr(void); | ||
inline void init_mair(void); | ||
|
||
#endif /* VIRTUAL_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,42 @@ | ||
/* | ||
* Virtual memory manager for the ARMv8-A architecture | ||
* | ||
* References: | ||
* https://developer.arm.com/documentation/den0024/a/The-Memory-Management-Unit | ||
* https://github.com/ARM-software/u-boot/blob/master/arch/arm/include/asm/armv8/mmu.h | ||
* https://lowenware.com/blog/aarch64-mmu-programming/ | ||
* | ||
* Author: Tuna CICI | ||
*/ | ||
|
||
#include <stdint.h> | ||
|
||
#include "ARM64/Machine.h" | ||
#include "LibKern/Console.h" | ||
|
||
#include "Memory/PageDef.h" | ||
#include "Memory/Virtual.h" | ||
|
||
inline void init_ttbr(void *ttbr0, void *ttbr1) | ||
{ | ||
/* TODO */ | ||
|
||
MRS("TTBR0_EL1", ttbr0); | ||
MRS("TTBR1_EL1", ttbr1); | ||
} | ||
|
||
inline void init_tcr(void) | ||
{ | ||
/* TODO */ | ||
uint64_t tcr_el1 = 0; | ||
|
||
MRS("TCR_EL1", tcr_el1); | ||
} | ||
|
||
inline void init_mair(void) | ||
{ | ||
/* TODO */ | ||
uint64_t mair_el1 = 0; | ||
|
||
MRS("MAIR_EL1", mair_el1); | ||
} |