99 lines
2.4 KiB
C
99 lines
2.4 KiB
C
|
/*
|
||
|
* Copyright (c) 2006-2020, RT-Thread Development Team
|
||
|
*
|
||
|
* SPDX-License-Identifier: Apache-2.0
|
||
|
*
|
||
|
* Change Logs:
|
||
|
* Date Author Notes
|
||
|
* 2020-07-26 lizhirui the first version
|
||
|
*/
|
||
|
#ifndef __MIPS_MMU_H__
|
||
|
#define __MIPS_MMU_H__
|
||
|
|
||
|
typedef enum cpu_mode_t
|
||
|
{
|
||
|
CPU_MODE_KERNEL = 0x00,
|
||
|
CPU_MODE_SUPERVISOR = 0x01,
|
||
|
CPU_MODE_USER = 0x02
|
||
|
}cpu_mode_t;
|
||
|
|
||
|
typedef enum page_mask_enum_t
|
||
|
{
|
||
|
PAGE_MASK_4KB = 0x00,
|
||
|
PAGE_MASK_16KB = 0x03,
|
||
|
PAGE_MASK_64KB = 0x0F,
|
||
|
PAGE_MASK_256KB = 0x3F,
|
||
|
PAGE_MASK_1MB = 0xFF,
|
||
|
PAGE_MASK_4MB = 0x3FF,
|
||
|
PAGE_MASK_16MB = 0xFFF,
|
||
|
PAGE_MASK_64MB = 0x3FFF,
|
||
|
PAGE_MASK_256MB = 0xFFFF,
|
||
|
PAGE_MASK_1GB = 0x3FFFF
|
||
|
}page_mask_enum_t;
|
||
|
|
||
|
typedef struct page_mask_t
|
||
|
{
|
||
|
uint64_t : 11;
|
||
|
uint64_t : 2;
|
||
|
uint64_t mask : 18;
|
||
|
uint64_t : 33;
|
||
|
}page_mask_t;
|
||
|
|
||
|
typedef struct entry_lo_t
|
||
|
{
|
||
|
uint64_t g : 1;
|
||
|
uint64_t v : 1;
|
||
|
uint64_t d : 1;
|
||
|
uint64_t c : 3;
|
||
|
uint64_t pfn : 24;
|
||
|
uint64_t pfnx : 3;
|
||
|
uint64_t : 29;
|
||
|
uint64_t xi : 1;
|
||
|
uint64_t ri : 1;
|
||
|
}entry_lo_t;
|
||
|
|
||
|
typedef struct entry_hi_t
|
||
|
{
|
||
|
uint64_t asid : 8;
|
||
|
uint64_t : 5;
|
||
|
uint64_t vpn2 : 27;
|
||
|
uint64_t : 22;
|
||
|
uint64_t r : 2;
|
||
|
}entry_hi_t;
|
||
|
|
||
|
typedef struct tlb_item_t
|
||
|
{
|
||
|
entry_lo_t entry_lo[2];
|
||
|
entry_hi_t entry_hi;
|
||
|
page_mask_t page_mask;
|
||
|
}tlb_item_t;
|
||
|
|
||
|
#define read_c0_diag() __read_32bit_c0_register($22, 0)
|
||
|
#define write_c0_diag(val) __write_32bit_c0_register($22, 0, val)
|
||
|
#define read_c0_badvaddr() __read_64bit_c0_register($8, 0)
|
||
|
#define read_c0_random() __read_32bit_c0_register($1, 0)
|
||
|
|
||
|
#define reg_type_convert(variable,new_type) *((new_type *)(&variable))
|
||
|
#define lowbit(x) ((x) & (-(x)))
|
||
|
|
||
|
void mmu_init();
|
||
|
void mmu_set_cpu_mode(cpu_mode_t cpu_mode);
|
||
|
cpu_mode_t mmu_get_cpu_mode();
|
||
|
void mmu_clear_tlb();
|
||
|
void mmu_clear_itlb();
|
||
|
uint32_t mmu_get_max_tlb_index();
|
||
|
void mmu_tlb_write_indexed(uint32_t index,tlb_item_t *tlb_item);
|
||
|
void mmu_tlb_write_random(tlb_item_t *tlb_item);
|
||
|
void mmu_tlb_read(uint32_t index,tlb_item_t *tlb_item);
|
||
|
uint32_t mmu_tlb_find(uint64_t vpn,uint32_t asid,uint32_t *index);
|
||
|
void mmu_tlb_item_init(tlb_item_t *tlb_item);
|
||
|
void mmu_set_map(uint64_t vpn,uint64_t ppn,page_mask_enum_t page_mask,uint32_t asid,uint32_t global);
|
||
|
uint32_t mmu_tlb_get_random();
|
||
|
uint32_t mmu_tlb_get_index();
|
||
|
void mmu_tlb_set_index(uint32_t index);
|
||
|
uint32_t mmu_tlb_is_matched();
|
||
|
uint64_t mmu_tlb_get_bad_vaddr();
|
||
|
|
||
|
void tlb_dump();
|
||
|
|
||
|
#endif
|