55#include <stdbigos/string.h>
66
77#include "bootstrap_memory_services.h"
8- #include "bootstrap_panic.h"
98
109//===============================
1110//=== INTERNAL ====
1211//===============================
1312
1413static virtual_memory_scheme_t s_active_vms = VMS_BARE ;
15- static phisical_memory_region_t s_page_mem_regs [5 ] = {0 };
14+ static physical_memory_region_t s_page_mem_regs [5 ] = {0 };
1615
1716static inline reg_t create_satp (virtual_memory_scheme_t vms , u16 asid , ppn_t ppn ) {
1817 return ((u64 )((vms == -1 ? 0 : vms + 8 )) << 60 ) | ((u64 )asid << 44 ) | ((u64 )ppn & 0xfffffffffff );
@@ -37,37 +36,25 @@ static inline void read_page_table_entry(u64 pte, u8* flagsOUT, u8* rswOUT, ppn_
3736 if (ppnOUT ) * ppnOUT = (pte >> 10 ) & 0xfffffffffff ;
3837}
3938
40- static bool add_to_vpn_reg (u64 vpn_reg [], u32 * inx , u64 val , u64 size ) {
41- for (u32 i = 0 ; i < * inx ; ++ i ) {
42- if (vpn_reg [i ] == val ) return true;
43- }
44- vpn_reg [(* inx )++ ] = val ;
45- if (* inx >= size ) return false;
46- return true;
47- }
48-
4939ppn_t get_page_frame (page_size_t ps ) {
5040 static u64 number_of_allocated_pages [PAGE_SIZE_AMOUNT ] = {0 };
51- return (u64 )(s_page_mem_regs [ps ].address + number_of_allocated_pages [ps ] * (0x1000 << (9 * ps ))) >> 12 ;
41+ return (u64 )(s_page_mem_regs [ps ].address + ( number_of_allocated_pages [ps ]++ ) * (( 4 * kiB ) << (9 * ps ))) >> 12 ;
5242}
5343
5444static void page_table_add_entry (u64 root_pt_ppn , page_size_t ps , vpn_t vpn , ppn_t ppn , bool R , bool W , bool X ) {
5545 u16 vpn_slice [5 ] = {
56- (vpn >> 9 * 0 ) & 0x1ff ,
57- (vpn >> 9 * 1 ) & 0x1ff ,
58- (vpn >> 9 * 2 ) & 0x1ff ,
59- (vpn >> 9 * 3 ) & 0x1ff ,
60- (vpn >> 9 * 4 ) & 0x1ff ,
46+ (vpn >> 9 * 0 ) & 0x1ff , (vpn >> 9 * 1 ) & 0x1ff , (vpn >> 9 * 2 ) & 0x1ff ,
47+ (vpn >> 9 * 3 ) & 0x1ff , (vpn >> 9 * 4 ) & 0x1ff ,
6148 };
62- u64 (* current_page )[512 ] = (u64 (* )[512 ])(root_pt_ppn << 12 );
49+ u64 (* current_page )[512 ] = (u64 (* )[512 ])(root_pt_ppn << 12 );
6350 for (i8 lvl = s_active_vms + 2 ; lvl >= ps ; -- lvl ) {
6451 u8 flags = 0 ;
6552 ppn_t current_ppn = 0 ;
6653 u64 * current_pte = & (* current_page )[vpn_slice [lvl ]];
6754 read_page_table_entry (* current_pte , & flags , nullptr , & current_ppn );
6855 if ((flags & PTEF_V ) == 0 ) {
6956 current_ppn = get_page_frame (PAGE_SIZE_4kB );
70- memset ((void * )(current_ppn << 12 ), 0 , 0x1000 );
57+ memset ((void * )(current_ppn << 12 ), 0 , 4 * kiB );
7158 * current_pte = create_page_table_entry (PTEF_V | PTEF_G , 0 , current_ppn );
7259 }
7360 current_page = (u64 (* )[512 ])(current_ppn << 12 );
@@ -79,26 +66,31 @@ static void page_table_add_entry(u64 root_pt_ppn, page_size_t ps, vpn_t vpn, ppn
7966 (* current_page )[vpn_slice [ps ]] = create_page_table_entry (flags , 0 , ppn );
8067}
8168
69+ static bool add_to_vpn_reg (u64 vpn_reg [], u32 * inx , u64 val , u64 size ) {
70+ for (u32 i = 0 ; i < * inx ; ++ i ) {
71+ if (vpn_reg [i ] == val ) return true;
72+ }
73+ vpn_reg [(* inx )++ ] = val ;
74+ if (* inx >= size ) return false;
75+ return true;
76+ }
77+
8278//===============================
8379//=== !!! INTERNAL !!! ====
8480//===============================
8581
86- void init_boot_page_table_managment (virtual_memory_scheme_t vms ) {
82+ u16 initialize_virtual_memory (virtual_memory_scheme_t vms ) {
8783 s_active_vms = vms ;
88- }
89-
90- void set_page_memory_regions (phisical_memory_region_t mem_regions [5 ]) {
91- memcpy (s_page_mem_regs , mem_regions , 5 * sizeof (phisical_memory_region_t ));
92- const char * page_names [] = {"kilo" , "mega" , "giga" , "tera" , "peta" };
93- DEBUG_PRINTF ("[i] page memory region set:\n" );
94- for (u8 i = 0 ; i < 5 ; ++ i ) {
95- DEBUG_PRINTF ("\t[i] %s page to: %lx, size: %lu\n" , page_names [i ], (u64 )mem_regions [i ].address ,
96- mem_regions [i ].size );
97- }
84+ reg_t satp = create_satp (VMS_BARE , UINT16_MAX , 0 );
85+ CSR_WRITE (satp , satp );
86+ satp = CSR_READ (satp );
87+ u16 asid_max_val = 0 ;
88+ read_satp (satp , nullptr , & asid_max_val , nullptr );
89+ return asid_max_val ;
9890}
9991
10092required_memory_space_t calc_required_memory_for_page_table (region_t * regions , u64 regions_amount ) {
101- constexpr u32 vpn_reg_size = 1024 ;
93+ constexpr u32 vpn_reg_size = 256 ;
10294 u64 vpn_reg [vpn_reg_size ] = {0 };
10395 u32 vpn_reg_inx = 0 ;
10496 u32 max_vpn_reg_inx = 0 ;
@@ -111,17 +103,17 @@ required_memory_space_t calc_required_memory_for_page_table(region_t* regions, u
111103 u32 new_vpn_reg_inx = 0 ;
112104 for (u32 i = 0 ; i < vpn_reg_inx ; ++ i )
113105 if (!add_to_vpn_reg (new_vpn_reg , & new_vpn_reg_inx , vpn_reg [i ] >> 9 , vpn_reg_size ))
114- return (required_memory_space_t ){{0 }, .error = true };
106+ return (required_memory_space_t ){{0 }, .error = ERR_CRITICAL_INTERNAL_FAILURE };
115107 page_amounts [PAGE_SIZE_4kB ] += new_vpn_reg_inx ;
116108 for (u64 i = 0 ; i < regions_amount ; ++ i ) {
117109 if (regions [i ].ps == lvl ) {
118110 u64 size_left = regions [i ].size ;
119111 u64 curr_addr = regions [i ].addr ;
120- const u64 size_dif = 0x1000 << (9 * lvl );
112+ const u64 size_dif = ( 4 * kiB ) << (9 * lvl );
121113 while (size_left > 0 ) {
122114 u32 old_inx = new_vpn_reg_inx ;
123115 if (!add_to_vpn_reg (new_vpn_reg , & new_vpn_reg_inx , curr_addr >> (12 + 9 * lvl ), vpn_reg_size ))
124- return (required_memory_space_t ){{0 }, .error = true };
116+ return (required_memory_space_t ){{0 }, .error = ERR_CRITICAL_INTERNAL_FAILURE };
125117 if (old_inx == new_vpn_reg_inx ) {
126118 DEBUG_PRINTF ("overaping mem regions, i: %lu page: %lu\n" , i ,
127119 (curr_addr - regions [i ].addr ) / size_dif );
@@ -136,31 +128,32 @@ required_memory_space_t calc_required_memory_for_page_table(region_t* regions, u
136128 vpn_reg_inx = new_vpn_reg_inx ;
137129 memcpy (vpn_reg , new_vpn_reg , new_vpn_reg_inx * sizeof (u64 ));
138130 }
139- required_memory_space_t ret = {{0 }, false };
131+ required_memory_space_t ret = {{0 }, ERR_NONE };
140132 memcpy (ret .require_page_amounts , page_amounts , sizeof (page_amounts ));
141133 return ret ;
142134}
143135
144- u16 initialize_virtual_memory () {
145- reg_t satp = create_satp (VMS_BARE , UINT16_MAX , 0 );
146- CSR_WRITE (satp , satp );
147- satp = CSR_READ (satp );
148- u16 asid_max_val = 0 ;
149- read_satp (satp , nullptr , & asid_max_val , nullptr );
150- return asid_max_val ;
136+ void set_page_memory_regions (physical_memory_region_t mem_regions [5 ]) {
137+ memcpy (s_page_mem_regs , mem_regions , 5 * sizeof (physical_memory_region_t ));
138+ const char * page_names [] = {"kilo" , "mega" , "giga" , "tera" , "peta" };
139+ DEBUG_PRINTF ("[i] page memory region set:\n" );
140+ for (u8 i = 0 ; i < 5 ; ++ i ) {
141+ DEBUG_PRINTF ("\t[i] %s page to: 0x%lx, size: %lu\n" , page_names [i ], (u64 )mem_regions [i ].address ,
142+ mem_regions [i ].size );
143+ }
151144}
152145
153146ppn_t create_page_table (region_t regions [], u64 regions_amount ) {
154147 ppn_t root_ppn = get_page_frame (PAGE_SIZE_4kB );
155- memset ((void * )(root_ppn << 12 ), 0 , 0x1000 );
148+ memset ((void * )(root_ppn << 12 ), 0 , ( 4 * kiB ) );
156149 for (u64 i = 0 ; i < regions_amount ; ++ i ) {
157150 u64 size_left = regions [i ].size ;
158151 u64 curr_addr = regions [i ].addr ;
159152 u64 map_addr = regions [i ].map_address ;
160153 while (size_left > 0 ) {
161154 ppn_t use_ppn = (regions [i ].mapped ) ? (map_addr >> 12 ) : get_page_frame (regions [i ].ps );
162155 page_table_add_entry (root_ppn , regions [i ].ps , curr_addr >> 12 , use_ppn , 1 , 1 , 1 );
163- const u64 size_dif = 0x1000 << (9 * regions [i ].ps );
156+ const u64 size_dif = ( 4 * kiB ) << (9 * regions [i ].ps );
164157 if (regions [i ].mapped ) map_addr += size_dif ;
165158 curr_addr += size_dif ;
166159 if (size_left < size_dif ) size_left = size_dif ;
0 commit comments