@@ -331,7 +331,7 @@ Minipush 1.0
331
331
[ 0.811829] MMU online. Special regions:
332
332
[ 0.812306] 0x00080000 - 0x0008ffff | 64 KiB | C RO PX | Kernel code and RO data
333
333
[ 0.813324] 0x1fff0000 - 0x1fffffff | 64 KiB | Dev RW PXN | Remapped Device MMIO
334
- [ 0.814310] 0x3f000000 - 0x4000ffff | 16 MiB | Dev RW PXN | Device MMIO
334
+ [ 0.814310] 0x3f000000 - 0x4000ffff | 17 MiB | Dev RW PXN | Device MMIO
335
335
[ 0.815198] Current privilege level: EL1
336
336
[ 0.815675] Exception handling state:
337
337
[ 0.816119] Debug: Masked
@@ -1079,28 +1079,61 @@ diff -uNr 09_privilege_level/src/bsp.rs 10_virtual_mem_part1_identity_mapping/sr
1079
1079
#[cfg(any(feature = " bsp_rpi3" , feature = " bsp_rpi4" ))]
1080
1080
mod raspberrypi ;
1081
1081
1082
+ diff - uNr 09_privilege_level / src / common . rs 10_virtual_mem_part1_identity_mapping / src / common . rs
1083
+ --- 09_privilege_level / src / common . rs
1084
+ +++ 10_virtual_mem_part1_identity_mapping / src / common . rs
1085
+ @@ - 0 ,0 + 1 ,22 @@
1086
+ + // SPDX-License-Identifier: MIT OR Apache-2.0
1087
+ + //
1088
+ + // Copyright (c) 2020-2022 Andre Richter <andre.o.richter@gmail.com>
1089
+ +
1090
+ + // ! General purpose code.
1091
+ +
1092
+ + /// Convert a size into human readable format.
1093
+ + pub const fn size_human_readable_ceil (size : usize ) -> (usize , & 'static str ) {
1094
+ + const KIB : usize = 1024 ;
1095
+ + const MIB : usize = 1024 * 1024 ;
1096
+ + const GIB : usize = 1024 * 1024 * 1024 ;
1097
+ +
1098
+ + if (size / GIB ) > 0 {
1099
+ + (size . div_ceil (GIB ), " GiB" )
1100
+ + } else if (size / MIB ) > 0 {
1101
+ + (size . div_ceil (MIB ), " MiB" )
1102
+ + } else if (size / KIB ) > 0 {
1103
+ + (size . div_ceil (KIB ), " KiB" )
1104
+ + } else {
1105
+ + (size , " Byte" )
1106
+ + }
1107
+ + }
1108
+
1082
1109
diff - uNr 09_privilege_level / src / main . rs 10_virtual_mem_part1_identity_mapping / src / main . rs
1083
1110
--- 09_privilege_level / src / main . rs
1084
1111
+++ 10_virtual_mem_part1_identity_mapping / src / main . rs
1085
- @@ - 107 ,7 + 107 ,9 @@
1112
+ @@ - 107 ,18 + 107 ,23 @@
1086
1113
// ! 2. Once finished with architectural setup, the arch code calls `kernel_init()`.
1087
1114
1088
1115
#![allow(clippy:: upper_case_acronyms)]
1089
1116
+ #![allow(incomplete_features)]
1090
1117
#![feature(asm_const)]
1091
1118
+ #![feature(core_intrinsics)]
1092
1119
#![feature(format_args_nl)]
1120
+ + #![feature(int_roundings)]
1093
1121
#![feature(panic_info_message)]
1094
1122
#![feature(trait_alias)]
1095
- @@ - 119 ,6 + 121 ,7 @@
1123
+ #![no_main]
1124
+ #![no_std]
1125
+
1126
+ mod bsp ;
1127
+ + mod common ;
1128
+ mod console ;
1096
1129
mod cpu ;
1097
1130
mod driver ;
1098
1131
mod exception ;
1099
1132
+ mod memory ;
1100
1133
mod panic_wait ;
1101
1134
mod print ;
1102
1135
mod synchronization ;
1103
- @@ - 129 ,9 + 132 ,17 @@
1136
+ @@ - 129 ,9 + 134 ,17 @@
1104
1137
/// # Safety
1105
1138
///
1106
1139
/// - Only a single core must be active and running this function.
@@ -1119,7 +1152,7 @@ diff -uNr 09_privilege_level/src/main.rs 10_virtual_mem_part1_identity_mapping/s
1119
1152
1120
1153
for i in bsp :: driver :: driver_manager (). all_device_drivers (). iter () {
1121
1154
if let Err (x ) = i . init () {
1122
- @@ - 147 ,7 + 158 ,7 @@
1155
+ @@ - 147 ,7 + 160 ,7 @@
1123
1156
1124
1157
/// The main function running after the early init.
1125
1158
fn kernel_main () -> ! {
@@ -1128,7 +1161,7 @@ diff -uNr 09_privilege_level/src/main.rs 10_virtual_mem_part1_identity_mapping/s
1128
1161
use core :: time :: Duration ;
1129
1162
use driver :: interface :: DriverManager ;
1130
1163
use time :: interface :: TimeManager ;
1131
- @@ - 159 ,6 + 170 ,9 @@
1164
+ @@ - 159 ,6 + 172 ,9 @@
1132
1165
);
1133
1166
info! (" Booting on: {}" , bsp :: board_name ());
1134
1167
@@ -1138,7 +1171,7 @@ diff -uNr 09_privilege_level/src/main.rs 10_virtual_mem_part1_identity_mapping/s
1138
1171
let (_ , privilege_level ) = exception :: current_privilege_level ();
1139
1172
info! (" Current privilege level: {}" , privilege_level );
1140
1173
1141
- @@ - 182 ,6 + 196 ,13 @@
1174
+ @@ - 182 ,6 + 198 ,13 @@
1142
1175
info! (" Timer test, spinning for 1 second" );
1143
1176
time :: time_manager (). spin_for (Duration :: from_secs (1 ));
1144
1177
@@ -1175,7 +1208,7 @@ diff -uNr 09_privilege_level/src/memory/mmu/translation_table.rs 10_virtual_mem_
1175
1208
diff - uNr 09_privilege_level / src / memory / mmu . rs 10_virtual_mem_part1_identity_mapping / src / memory / mmu . rs
1176
1209
--- 09_privilege_level / src / memory / mmu . rs
1177
1210
+++ 10_virtual_mem_part1_identity_mapping / src / memory / mmu . rs
1178
- @@ - 0 ,0 + 1 ,264 @@
1211
+ @@ - 0 ,0 + 1 ,253 @@
1179
1212
+ // SPDX-License-Identifier: MIT OR Apache-2.0
1180
1213
+ //
1181
1214
+ // Copyright (c) 2020-2022 Andre Richter <andre.o.richter@gmail.com>
@@ -1198,6 +1231,7 @@ diff -uNr 09_privilege_level/src/memory/mmu.rs 10_virtual_mem_part1_identity_map
1198
1231
+
1199
1232
+ mod translation_table ;
1200
1233
+
1234
+ + use crate :: common;
1201
1235
+ use core :: {fmt, ops :: RangeInclusive };
1202
1236
+
1203
1237
+ // --------------------------------------------------------------------------------------------------
@@ -1357,19 +1391,7 @@ diff -uNr 09_privilege_level/src/memory/mmu.rs 10_virtual_mem_part1_identity_map
1357
1391
+ let end = * (self . virtual_range)(). end ();
1358
1392
+ let size = end - start + 1 ;
1359
1393
+
1360
- + // log2(1024).
1361
- + const KIB_RSHIFT : u32 = 10 ;
1362
- +
1363
- + // log2(1024 * 1024).
1364
- + const MIB_RSHIFT : u32 = 20 ;
1365
- +
1366
- + let (size , unit ) = if (size >> MIB_RSHIFT ) > 0 {
1367
- + (size >> MIB_RSHIFT , " MiB" )
1368
- + } else if (size >> KIB_RSHIFT ) > 0 {
1369
- + (size >> KIB_RSHIFT , " KiB" )
1370
- + } else {
1371
- + (size , " Byte" )
1372
- + };
1394
+ + let (size , unit ) = common :: size_human_readable_ceil (size );
1373
1395
+
1374
1396
+ let attr = match self . attribute_fields. mem_attributes {
1375
1397
+ MemAttributes :: CacheableDRAM => " C" ,
0 commit comments