From 2134146bb6f77d3ef757b224693238e5ee2629aa Mon Sep 17 00:00:00 2001 From: Andre Richter Date: Sun, 24 Nov 2019 22:04:34 +0100 Subject: [PATCH] Clean up mmu.rs --- 11_virtual_memory/README.md | 82 +++++++----------- 11_virtual_memory/kernel | Bin 147064 -> 147056 bytes 11_virtual_memory/src/arch/aarch64/mmu.rs | 80 +++++++---------- 12_cpu_exceptions_part1/README.md | 20 ++--- 12_cpu_exceptions_part1/kernel | Bin 151424 -> 151392 bytes 12_cpu_exceptions_part1/kernel8.img | Bin 65560 -> 65560 bytes .../src/arch/aarch64/mmu.rs | 80 +++++++---------- 7 files changed, 107 insertions(+), 155 deletions(-) diff --git a/11_virtual_memory/README.md b/11_virtual_memory/README.md index 4d8b8d01..df126ca8 100644 --- a/11_virtual_memory/README.md +++ b/11_virtual_memory/README.md @@ -265,7 +265,7 @@ make chainbot diff -uNr 10_privilege_level/src/arch/aarch64/mmu.rs 11_virtual_memory/src/arch/aarch64/mmu.rs --- 10_privilege_level/src/arch/aarch64/mmu.rs +++ 11_virtual_memory/src/arch/aarch64/mmu.rs -@@ -0,0 +1,316 @@ +@@ -0,0 +1,300 @@ +// SPDX-License-Identifier: MIT +// +// Copyright (c) 2018-2019 Andre Richter @@ -347,18 +347,22 @@ diff -uNr 10_privilege_level/src/arch/aarch64/mmu.rs 11_virtual_memory/src/arch/ + ] +} + -+// Two newtypes for added type safety, so that you cannot accidentally place a TableDescriptor into -+// a PageDescriptor slot in `struct PageTables`, and vice versa. ++const SIXTYFOUR_KIB_SHIFT: usize = 16; // log2(64 * 1024) ++const FIVETWELVE_MIB_SHIFT: usize = 29; // log2(512 * 1024 * 1024) ++ ++/// A table descriptor for 64 KiB aperture. ++/// ++/// The output points to the next table. +#[derive(Copy, Clone)] +#[repr(transparent)] -+struct RawTableDescriptor(u64); ++struct TableDescriptor(u64); + ++/// A page descriptor with 64 KiB aperture. ++/// ++/// The output points to physical memory. +#[derive(Copy, Clone)] +#[repr(transparent)] -+struct RawPageDescriptor(u64); -+ -+const SIXTYFOUR_KIB_SHIFT: usize = 16; // log2(64 * 1024) -+const FIVETWELVE_MIB_SHIFT: usize = 29; // log2(512 * 1024 * 1024) ++struct PageDescriptor(u64); + +/// Big monolithic struct for storing the page tables. Individual levels must be 64 KiB aligned, +/// hence the "reverse" order of appearance. @@ -366,9 +370,9 @@ diff -uNr 10_privilege_level/src/arch/aarch64/mmu.rs 11_virtual_memory/src/arch/ +#[repr(align(65536))] +struct PageTables { + // Page descriptors, covering 64 KiB windows per entry. -+ lvl3: [[RawPageDescriptor; 8192]; N], ++ lvl3: [[PageDescriptor; 8192]; N], + // Table descriptors, covering 512 MiB windows. -+ lvl2: [RawTableDescriptor; N], ++ lvl2: [TableDescriptor; N], +} + +/// Usually evaluates to 1 GiB for RPi3 and 4 GiB for RPi 4. @@ -378,8 +382,8 @@ diff -uNr 10_privilege_level/src/arch/aarch64/mmu.rs 11_virtual_memory/src/arch/ +/// +/// Supposed to land in `.bss`. Therefore, ensure that they boil down to all "0" entries. +static mut TABLES: PageTables<{ ENTRIES_512_MIB }> = PageTables { -+ lvl3: [[RawPageDescriptor(0); 8192]; ENTRIES_512_MIB], -+ lvl2: [RawTableDescriptor(0); ENTRIES_512_MIB], ++ lvl3: [[PageDescriptor(0); 8192]; ENTRIES_512_MIB], ++ lvl2: [TableDescriptor(0); ENTRIES_512_MIB], +}; + +trait BaseAddr { @@ -397,24 +401,15 @@ diff -uNr 10_privilege_level/src/arch/aarch64/mmu.rs 11_virtual_memory/src/arch/ + } +} + -+/// A descriptor pointing to the next page table. -+struct TableDescriptor(register::FieldValue); -+ -+impl TableDescriptor { -+ fn new(next_lvl_table_addr: usize) -> TableDescriptor { ++impl convert::From for TableDescriptor { ++ fn from(next_lvl_table_addr: usize) -> Self { + let shifted = next_lvl_table_addr >> SIXTYFOUR_KIB_SHIFT; ++ let val = (STAGE1_TABLE_DESCRIPTOR::VALID::True ++ + STAGE1_TABLE_DESCRIPTOR::TYPE::Table ++ + STAGE1_TABLE_DESCRIPTOR::NEXT_LEVEL_TABLE_ADDR_64KiB.val(shifted as u64)) ++ .value; + -+ TableDescriptor( -+ STAGE1_TABLE_DESCRIPTOR::VALID::True -+ + STAGE1_TABLE_DESCRIPTOR::TYPE::Table -+ + STAGE1_TABLE_DESCRIPTOR::NEXT_LEVEL_TABLE_ADDR_64KiB.val(shifted as u64), -+ ) -+ } -+} -+ -+impl convert::From for RawTableDescriptor { -+ fn from(desc: TableDescriptor) -> Self { -+ RawTableDescriptor(desc.0.value) ++ TableDescriptor(val) + } +} + @@ -452,28 +447,17 @@ diff -uNr 10_privilege_level/src/arch/aarch64/mmu.rs 11_virtual_memory/src/arch/ + } +} + -+/// A page descriptor with 64 KiB aperture. -+/// -+/// The output points to physical memory. -+struct PageDescriptor(register::FieldValue); -+ +impl PageDescriptor { + fn new(output_addr: usize, attribute_fields: AttributeFields) -> PageDescriptor { + let shifted = output_addr >> SIXTYFOUR_KIB_SHIFT; -+ -+ PageDescriptor( -+ STAGE1_PAGE_DESCRIPTOR::VALID::True -+ + STAGE1_PAGE_DESCRIPTOR::AF::True -+ + attribute_fields.into() -+ + STAGE1_PAGE_DESCRIPTOR::TYPE::Table -+ + STAGE1_PAGE_DESCRIPTOR::OUTPUT_ADDR_64KiB.val(shifted as u64), -+ ) -+ } -+} -+ -+impl convert::From for RawPageDescriptor { -+ fn from(desc: PageDescriptor) -> Self { -+ RawPageDescriptor(desc.0.value) ++ let val = (STAGE1_PAGE_DESCRIPTOR::VALID::True ++ + STAGE1_PAGE_DESCRIPTOR::AF::True ++ + attribute_fields.into() ++ + STAGE1_PAGE_DESCRIPTOR::TYPE::Table ++ + STAGE1_PAGE_DESCRIPTOR::OUTPUT_ADDR_64KiB.val(shifted as u64)) ++ .value; ++ ++ PageDescriptor(val) + } +} + @@ -505,7 +489,7 @@ diff -uNr 10_privilege_level/src/arch/aarch64/mmu.rs 11_virtual_memory/src/arch/ +/// - Modifies a `static mut`. Ensure it only happens from here. +unsafe fn populate_pt_entries() -> Result<(), &'static str> { + for (l2_nr, l2_entry) in TABLES.lvl2.iter_mut().enumerate() { -+ *l2_entry = TableDescriptor::new(TABLES.lvl3[l2_nr].base_addr_usize()).into(); ++ *l2_entry = TABLES.lvl3[l2_nr].base_addr_usize().into(); + + for (l3_nr, l3_entry) in TABLES.lvl3[l2_nr].iter_mut().enumerate() { + let virt_addr = (l2_nr << FIVETWELVE_MIB_SHIFT) + (l3_nr << SIXTYFOUR_KIB_SHIFT); @@ -513,7 +497,7 @@ diff -uNr 10_privilege_level/src/arch/aarch64/mmu.rs 11_virtual_memory/src/arch/ + let (output_addr, attribute_fields) = + bsp::virt_mem_layout().get_virt_addr_properties(virt_addr)?; + -+ *l3_entry = PageDescriptor::new(output_addr, attribute_fields).into(); ++ *l3_entry = PageDescriptor::new(output_addr, attribute_fields); + } + } + diff --git a/11_virtual_memory/kernel b/11_virtual_memory/kernel index a319a0bd74bfb09b01afe0ac568767bf17959580..5d93985302ea1fca150b9636d79332d957d69f22 100755 GIT binary patch delta 2968 zcma);U2GIp6vyv9)OOph(CxO}-L^oBC@s`wW_EXWM<8~su;HWFiVtF{?b45sP+{8# zQWGOIkr+Q>SOXps>qmo$0Ut~go5jcj4F+N&q>UO2ezm~|;)7}93sL+yckUg-Od4<= zdeZYdAOCaj+&g>gwr}CK?|2i>jW!=^=9A5Eq?yyGiDwpU!~Uw2{&Qv0 zKgOm1R**3cz-C*eze>80T^6i#_?8g;^`m4YwO>tXGMY$=rR?OT+9oZ_dHf^P$EVH=b` zL}QEb94QUT|2j^T(Rj7^Wf^2hccA<~-OHGdm8vjl5||d)(H(x=Jysfr${~XnNHUh{w0+VZWf?))%_&-`M)9dOw4wI1NBN!hP0D`) z^HeVKWVPJjIn_0;a2%%y^BuM+EcjtR&%UW%lEHv%TBRgDQ6X1rziM5gY8+SoL&`5i zi)Tjphdurt*=%|_9Oe9N?5rStd(}>88QC)|OR#rvRNx;K?oc?Q@L{_Yc9cMIn^0M% z{L)O@23YG3XZ582ciV853%mVqU?4!vnpeoRa`1v0=pv>A&>gvMpAF6yR=Kn1@UsA9 z^lNrBXFV(3_$TEb@%V3`UP(>EBwxH1ef2W!3n`W5Fe~sSg`KL-`qX1y;N{NNs7W=I zJ%dvM9|*~b*lJna+5K@`B+LuaT*1a5bn_`34U+SQ_-{3y3ql3|(+pFmjR;=~0b-Xmo1G-~rSLqgG9~#?ueDStn*i>U;G|cNvz0z9P+-G!xQX zlIFTJze%$UJ8MW*$TpD;_VEDr@h*2)14k(;VktcB!L2wUa7JP8=m-mI31z}nRa(b9(ni@)T48_8jj!RTz*r{_k%Q^T+0Q&q2s}rxk@&PSmF-u!0p|sd+ckk5 z_pHhz7^tOHsi>v(p7yY9m?oyrsSBsUqf72DXB{5@yZCA?e8h)PucHk;iupQvD~}b< z)QL}Z7U%0p&PDpLSJHKJN-f1^rM4UcD+#|$p9_H*eeJ~4W&dUDSxgH&P{UZo9avE| zf~6m32R}JC#6x6zcJ06uJtQ21WeHKHW<7Ct}&GX{OA0 z!boKGel4Y02`e#R#`I)Viw+JRem=T{7?wSF=wS4o1@yZWIP!lg7U{&fR$NOZ%+!FX8D`pv{l{C#*GNq?zUE4G{#XU=?DV8Xq;R`yf z!{>Ck8q{dN^rV)E8zjJp$Bk4RA2s0elAtRFO?6J)r7|f%TQc)P6Ig}W7<}(LNt;+W SzZu3jytNX?wm?1o-2NA|P_SJ9 delta 2954 zcma);Yitx%6vyv9)OPz2cKcv=`lJQ11zhH_uTfIF0@eyB8!&-LQnoA&YK0aJHbGMw zW7HT7Ym|e=2bB*5jZqSDYkW3A2?nJNm{c^e1U|qAOq=+@L_T=#+&c*~RB=A+>73uW z=lsuoO{cF1{<pg+g@nnC)!}Bxa*g>i~(@Au_D04GYO7itV;Sv%cTEpF8zO# zp98ST4(YE};q5q63}HT8C@p~`=PNNCfKKiD?K1kxeKJ}Fv(-2ffaQESP6QyV#T_@W z$VzY2J;+N5rxi~5a3>msace0ALfd?7Lm^uVCA_O$3Fue+kWvr~dW9`j{*3awQWhxx zt9ZPO+H1hmWzb0`R8GPcI&cmPuu>H!O&g{KUhce6TdTZn#c`kZ7EBRfoL% zEG+?$e=;cjMJjpG9E1vp^5@W~fNC*HjAuRhAamdCt47DSxZ-&&NEa z(;lgj3qGZ)#uT=3j4*%LF@@<0*uk?0)TZfE%Bz*cH$!q(cc>C2D#r!o-=+LQw0P<& zW&CcRf4eL;J{R_Jeh4!`(ziv$>YcLDh)luW#bJS`6ke~ertn@TRaf3ADP)!@Ak9%{ zTLbHO(49W%|HCny^+&w^gBS`?wWagqWVv`+b@U^qL(r{Va$Y%`ZuE}6fS-q;)A-Ig zW1MYm@Zukof6(W@ibf?BZ6x_(U*ziLu#>8jJ(v~vjKXeKcY<0lFYqRJZB(ba8hswe z1l}2z9kC{v++F^oI766!CCxc(u7YlU5{IkEc~!hM;b;{EImdhr9mc6Di0~%oZ*F0z znp_>#bUu&x=J#Gq6Vp}~3l*I8sj5m7TZ01vk5UifvguzVMY+?pA4dc}TPyLP!tUrw zoFL3II8y@=~g;}?@LpV=8QB` z()=k+DQ4!AtOmzuhI2T8eYnKzbYJ2pFilh&a1wL2=nk)}XK)})EB^{kP}IQ)rSDwljX>lPG1G!g`q&0E zh-sUZ>i&nkL*K!yz(-W=%Zt7E80H23Sm7_1c<~7w6Zi{-w?w^o3}*y(4_&{nu~XQr zk?i#v$-ZKGhn~ZXVEZ&EqT7+P3d_rX$6?~yTXpj6xR@?l=edl>1-?WZNPJ?M8eO6A zV!SBu-A+zm2Yi##fuUNlT(u-@+{e~pnwW9HxxF}B;L|mw{Of)GBlvPH9OX}=QAca} zJm%|YKfY8rRwq8$IlNd;a=xbzd?odINX^9xrFJfc8VJ8g6Cp68ubz0eIKPZ-#k9bW z&1Wol16Gvn#Q}ji9q1qv*D!s&Zg|RZMBp%Ck^H=>?f!GojS~W2Q`o&NURN2`A#bEc zK9Xi08uX?;K$nBaq0!#38 zGrU){C>J%b@h-YnhFZV|Loa;Y0*@ErH!ZNRkhv2+Evhz5J04G@Qn9#|N*Ir%rlGbjx=XIN!e|1*Ut+qgM}VHK`Mp^W3R1~lWN z2K-cICR3)Z+eVVs$DrT1ox&9+oSGGEwxAW;EeQM@)n^6Ywt`*w*@9mK`SIHdpR9nx LoWFsYc4+zsWACZ- diff --git a/11_virtual_memory/src/arch/aarch64/mmu.rs b/11_virtual_memory/src/arch/aarch64/mmu.rs index a81e68de..34d5f71e 100644 --- a/11_virtual_memory/src/arch/aarch64/mmu.rs +++ b/11_virtual_memory/src/arch/aarch64/mmu.rs @@ -79,18 +79,22 @@ register_bitfields! {u64, ] } -// Two newtypes for added type safety, so that you cannot accidentally place a TableDescriptor into -// a PageDescriptor slot in `struct PageTables`, and vice versa. +const SIXTYFOUR_KIB_SHIFT: usize = 16; // log2(64 * 1024) +const FIVETWELVE_MIB_SHIFT: usize = 29; // log2(512 * 1024 * 1024) + +/// A table descriptor for 64 KiB aperture. +/// +/// The output points to the next table. #[derive(Copy, Clone)] #[repr(transparent)] -struct RawTableDescriptor(u64); +struct TableDescriptor(u64); +/// A page descriptor with 64 KiB aperture. +/// +/// The output points to physical memory. #[derive(Copy, Clone)] #[repr(transparent)] -struct RawPageDescriptor(u64); - -const SIXTYFOUR_KIB_SHIFT: usize = 16; // log2(64 * 1024) -const FIVETWELVE_MIB_SHIFT: usize = 29; // log2(512 * 1024 * 1024) +struct PageDescriptor(u64); /// Big monolithic struct for storing the page tables. Individual levels must be 64 KiB aligned, /// hence the "reverse" order of appearance. @@ -98,9 +102,9 @@ const FIVETWELVE_MIB_SHIFT: usize = 29; // log2(512 * 1024 * 1024) #[repr(align(65536))] struct PageTables { // Page descriptors, covering 64 KiB windows per entry. - lvl3: [[RawPageDescriptor; 8192]; N], + lvl3: [[PageDescriptor; 8192]; N], // Table descriptors, covering 512 MiB windows. - lvl2: [RawTableDescriptor; N], + lvl2: [TableDescriptor; N], } /// Usually evaluates to 1 GiB for RPi3 and 4 GiB for RPi 4. @@ -110,8 +114,8 @@ const ENTRIES_512_MIB: usize = bsp::addr_space_size() >> FIVETWELVE_MIB_SHIFT; /// /// Supposed to land in `.bss`. Therefore, ensure that they boil down to all "0" entries. static mut TABLES: PageTables<{ ENTRIES_512_MIB }> = PageTables { - lvl3: [[RawPageDescriptor(0); 8192]; ENTRIES_512_MIB], - lvl2: [RawTableDescriptor(0); ENTRIES_512_MIB], + lvl3: [[PageDescriptor(0); 8192]; ENTRIES_512_MIB], + lvl2: [TableDescriptor(0); ENTRIES_512_MIB], }; trait BaseAddr { @@ -129,24 +133,15 @@ impl BaseAddr for [T; N] { } } -/// A descriptor pointing to the next page table. -struct TableDescriptor(register::FieldValue); - -impl TableDescriptor { - fn new(next_lvl_table_addr: usize) -> TableDescriptor { +impl convert::From for TableDescriptor { + fn from(next_lvl_table_addr: usize) -> Self { let shifted = next_lvl_table_addr >> SIXTYFOUR_KIB_SHIFT; + let val = (STAGE1_TABLE_DESCRIPTOR::VALID::True + + STAGE1_TABLE_DESCRIPTOR::TYPE::Table + + STAGE1_TABLE_DESCRIPTOR::NEXT_LEVEL_TABLE_ADDR_64KiB.val(shifted as u64)) + .value; - TableDescriptor( - STAGE1_TABLE_DESCRIPTOR::VALID::True - + STAGE1_TABLE_DESCRIPTOR::TYPE::Table - + STAGE1_TABLE_DESCRIPTOR::NEXT_LEVEL_TABLE_ADDR_64KiB.val(shifted as u64), - ) - } -} - -impl convert::From for RawTableDescriptor { - fn from(desc: TableDescriptor) -> Self { - RawTableDescriptor(desc.0.value) + TableDescriptor(val) } } @@ -184,28 +179,17 @@ impl convert::From } } -/// A page descriptor with 64 KiB aperture. -/// -/// The output points to physical memory. -struct PageDescriptor(register::FieldValue); - impl PageDescriptor { fn new(output_addr: usize, attribute_fields: AttributeFields) -> PageDescriptor { let shifted = output_addr >> SIXTYFOUR_KIB_SHIFT; - - PageDescriptor( - STAGE1_PAGE_DESCRIPTOR::VALID::True - + STAGE1_PAGE_DESCRIPTOR::AF::True - + attribute_fields.into() - + STAGE1_PAGE_DESCRIPTOR::TYPE::Table - + STAGE1_PAGE_DESCRIPTOR::OUTPUT_ADDR_64KiB.val(shifted as u64), - ) - } -} - -impl convert::From for RawPageDescriptor { - fn from(desc: PageDescriptor) -> Self { - RawPageDescriptor(desc.0.value) + let val = (STAGE1_PAGE_DESCRIPTOR::VALID::True + + STAGE1_PAGE_DESCRIPTOR::AF::True + + attribute_fields.into() + + STAGE1_PAGE_DESCRIPTOR::TYPE::Table + + STAGE1_PAGE_DESCRIPTOR::OUTPUT_ADDR_64KiB.val(shifted as u64)) + .value; + + PageDescriptor(val) } } @@ -237,7 +221,7 @@ fn set_up_mair() { /// - Modifies a `static mut`. Ensure it only happens from here. unsafe fn populate_pt_entries() -> Result<(), &'static str> { for (l2_nr, l2_entry) in TABLES.lvl2.iter_mut().enumerate() { - *l2_entry = TableDescriptor::new(TABLES.lvl3[l2_nr].base_addr_usize()).into(); + *l2_entry = TABLES.lvl3[l2_nr].base_addr_usize().into(); for (l3_nr, l3_entry) in TABLES.lvl3[l2_nr].iter_mut().enumerate() { let virt_addr = (l2_nr << FIVETWELVE_MIB_SHIFT) + (l3_nr << SIXTYFOUR_KIB_SHIFT); @@ -245,7 +229,7 @@ unsafe fn populate_pt_entries() -> Result<(), &'static str> { let (output_addr, attribute_fields) = bsp::virt_mem_layout().get_virt_addr_properties(virt_addr)?; - *l3_entry = PageDescriptor::new(output_addr, attribute_fields).into(); + *l3_entry = PageDescriptor::new(output_addr, attribute_fields); } } diff --git a/12_cpu_exceptions_part1/README.md b/12_cpu_exceptions_part1/README.md index d0874c53..fda1281f 100644 --- a/12_cpu_exceptions_part1/README.md +++ b/12_cpu_exceptions_part1/README.md @@ -459,9 +459,9 @@ General purpose register: ## Diff to previous ```diff -diff -uNr 11_virtual_memory/src/arch/aarch64/exception.rs 12_exceptions_part1/src/arch/aarch64/exception.rs +diff -uNr 11_virtual_memory/src/arch/aarch64/exception.rs 12_cpu_exceptions_part1/src/arch/aarch64/exception.rs --- 11_virtual_memory/src/arch/aarch64/exception.rs -+++ 12_exceptions_part1/src/arch/aarch64/exception.rs ++++ 12_cpu_exceptions_part1/src/arch/aarch64/exception.rs @@ -4,12 +4,248 @@ //! Exception handling. @@ -713,9 +713,9 @@ diff -uNr 11_virtual_memory/src/arch/aarch64/exception.rs 12_exceptions_part1/sr fn daif_field() -> register::Field; } -diff -uNr 11_virtual_memory/src/arch/aarch64/exception.S 12_exceptions_part1/src/arch/aarch64/exception.S +diff -uNr 11_virtual_memory/src/arch/aarch64/exception.S 12_cpu_exceptions_part1/src/arch/aarch64/exception.S --- 11_virtual_memory/src/arch/aarch64/exception.S -+++ 12_exceptions_part1/src/arch/aarch64/exception.S ++++ 12_cpu_exceptions_part1/src/arch/aarch64/exception.S @@ -0,0 +1,135 @@ +// SPDX-License-Identifier: MIT +// @@ -853,9 +853,9 @@ diff -uNr 11_virtual_memory/src/arch/aarch64/exception.S 12_exceptions_part1/src + + eret -diff -uNr 11_virtual_memory/src/arch/aarch64.rs 12_exceptions_part1/src/arch/aarch64.rs +diff -uNr 11_virtual_memory/src/arch/aarch64.rs 12_cpu_exceptions_part1/src/arch/aarch64.rs --- 11_virtual_memory/src/arch/aarch64.rs -+++ 12_exceptions_part1/src/arch/aarch64.rs ++++ 12_cpu_exceptions_part1/src/arch/aarch64.rs @@ -106,6 +106,15 @@ } } @@ -873,9 +873,9 @@ diff -uNr 11_virtual_memory/src/arch/aarch64.rs 12_exceptions_part1/src/arch/aar pub fn mmu() -> &'static impl interface::mm::MMU { &MMU -diff -uNr 11_virtual_memory/src/bsp.rs 12_exceptions_part1/src/bsp.rs +diff -uNr 11_virtual_memory/src/bsp.rs 12_cpu_exceptions_part1/src/bsp.rs --- 11_virtual_memory/src/bsp.rs -+++ 12_exceptions_part1/src/bsp.rs ++++ 12_cpu_exceptions_part1/src/bsp.rs @@ -4,7 +4,7 @@ //! Conditional exporting of Board Support Packages. @@ -886,9 +886,9 @@ diff -uNr 11_virtual_memory/src/bsp.rs 12_exceptions_part1/src/bsp.rs #[cfg(any(feature = "bsp_rpi3", feature = "bsp_rpi4"))] mod rpi; -diff -uNr 11_virtual_memory/src/main.rs 12_exceptions_part1/src/main.rs +diff -uNr 11_virtual_memory/src/main.rs 12_cpu_exceptions_part1/src/main.rs --- 11_virtual_memory/src/main.rs -+++ 12_exceptions_part1/src/main.rs ++++ 12_cpu_exceptions_part1/src/main.rs @@ -22,6 +22,7 @@ #![allow(incomplete_features)] #![feature(const_generics)] diff --git a/12_cpu_exceptions_part1/kernel b/12_cpu_exceptions_part1/kernel index 238fb8087c45bd77c24c20fbac21a3bd1c312109..f0b221c2ad7559ee3e77b6bea22f0f7f24146eb5 100755 GIT binary patch delta 7288 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 diff --git a/12_cpu_exceptions_part1/kernel8.img b/12_cpu_exceptions_part1/kernel8.img index 79e5ec6c1815bf2c037f2cd44c4a2b4d148e10b9..4b51eea0c2df70ae09543cfa7b86a4b593b31e9d 100755 GIT binary patch delta 2062 zcmZux4Qx|Y6u#%ac73ni*t)jsI=XdZ)U6u?W`S8JS+|+MHceRDL;!dfJ_Rbo^Yh>LMzj6Vo!)Hqy}!h%YGxC*nL*Pn^Om)!Sm&b{Zm z-*?V;-=3gmPf)Y7kwdv?zKs`Wimpw(#4UcWas+Z%Z!s(Wx-ouT*}`HX zP{M*fR-B3B@>5~(Svi$(FM8-*k85*g&)DS_lch}j zC4tyXYIo-}*#~8Dt&4}EXN-n~jfCG)T%4JZ%~NARe?f7+Wbi z#*jy&?Xg*LUnzs)BrpY&azjvphRN9=>(#I=P-A%>Qs zL-08c7uCQCj1@Ux7TO%6MG;x#Q6gOmQ9!5{N>$r{xZnn{f;tp;tRnNRD*hA}psQqr zOIrM`BvzOm~jtiG^s;`4c83=n> z=KjYnRkPS71Tjw;?Q16`zqNtTlm1H)9%>>*BeS1}IoRlQzz$sRT*8ey9CE(UeV#G1 zi?&@Os>e7JFO9wK3qRAbOWvP}-%9gI$re_!y?4f< zl096jWtUrl1uUjy;=3n0PN$PY+`3&QryiyfEC=~h{b8?1!Bu6B?q+FspA1S^219sQ z$Ak=~Q~MgcV&IXQ$<0KeyTN<8=dXBxB$~@fiu|Ttn3Y@Ut)tV^^dy?!L3{K2^@1o) zGxQS9_wl$jfzxVGahh(?`M*GIhW`Mu$#~!s0#b^DK2^Spz46#69xE$#7Lv$KR82Qk z*vt<2l=T%XWqUiw`nWtXpaPZldI zpys#9EKr^5%Gh*Q%o9teWt%6)*>qP(vN_R|p6l_z?3+qwO_gq}`zDZoC7UO1tz8nR zE*1~urh%w-(?B=jjPi63h%n6)J(wcz=q><^%Ev4M&979Bq7uBZDJiMV%gZZbw17QJRr@85V` z3v7xktbal~v~;Hpj-zOO(RRZ|KaZOp!bv>Gv1-kI(ziAlFW+5=18Z_%0N-0PPdb^1 zSa!ALyY47RrltYX-@8)r1F7!&&^4$_eNUVta{f~*Z(J9tw_cvQ|regZ*C~l U*#4+XqbKR5Y3_@h>#W}K57cFqvH$=8 delta 1985 zcmZ`&drVVj6#ve>E%&wsp|qv6R0=|cf<{rXcFb5HMi93^OEw>KS{fG~aRJ#fl`*Qz zri@JeJZuGm4#?x-gymF(3a-ohByB#=;&&#Oc(GZZh`Wwrs|@n|zP^`_A)s z&e`LY?eWTXm2&&1)3WJYw?G>=b64`{Z+YfL38X!Zq3q z2=X8o8^Ft5%ftJSlUOBCvDw!(JOK3Q_$$|L>;|00t%vjY5f^|Du!66Hwb;*hfeTm2 zdLakLWyd*q29L?}xw|U-McxBnV{6QtoJT-GaKlcl5eDF8oGJEd@>QgLa1O~&V*#WS zuak5OI3ykf0b3Ql@IB5{9)SSfRQAGq*sSUT4;o^-;8{Ew+Y1_85!Va1a6Il9e2GV= zG{HW!#+w1KG(LrSSr$4%oF9auEi7$X+j7!Lc1!!mcOk9_cIi+Y09m^o}PabF! z%eEt7smU$ShmD*sI3)K4c|wD^Bor(L8f@f!0*)tyP3EdC-0v!MsuzVFsNJB%hw4>u z4l5GPa0(mPejF*=4`W~AJgzDqe@$En&1lgS#Jwt|EGM=>UYApb>ov<*UGNKy0V?pi z#wG=+E$7_%xJFwFCiH1@)oP~UO(C}Joa3~v+3ZTepS824>gaWOi4T;_oId)vDb@A2 z99Qa!)ITuTp^L(=PjwCBQC*q(0z=m(M$rb7>nbXeiW$MrCFQCQOK(%6Zx)5?1hyuv zQoqkoqKcyFqN@WRCKanUO0r@UohrDtVyV7N?PjQ#WfqRp5aX)DgZg6iGKLOv5mZ~D zb-jQg{Sugug~>KeNKV?%$;hXy|BfqTwmPlpbFeLW6J(>@&;$zHVlaz!tWTwW-EEwa z))SiOknXHqc5RW`rCLqT@oR1j^5z`r#KVT=vhbzE_)_2#qXAO;Y&4jq@QJL!Ze@wS zTNyGcvKmVsrEVWeDTM-@X{t|RZLVWNb!S?gqT*ubFe~~=*6IOMA0*(qsmI_a)TJJR zGuWS60DcUmnjsDi<_oDFfhI9UHW$>$tPW>Loda}uF3^>%NE7DOtp8T0T?R8+(+9Xa zGQ5+19{RCwS^*rz(P?I8KQ3b<=N52VMk+@E4`onTh4#$lb10ih#ih=A7L5UrJo z-Dja%zf#afj?mh->UaOeoBfa28fPmX9HFIh#|c}UBUDDZoeM0EP?E#zv@Udn+ShuW zn|FDg+Xp{(4)Y`=_9S1gt<4=f%b7+7w4^e~=4g;xbR#G@LS`_H1PQ}bj*y-C9Om^c ze*2JuN)H?#5hncq2`BsQy~?m`50J`X-Vu_Fr@?>n+49GYGbbKZSl%Nel{xWDo;Uf| z$jLo7)1R-A^s@*JoUOk$Y2+fOX_J_cvXhv|2Jv#v5r^H1_okceZQO^QA}IVKsQmo` zp&}SB?JaiD>e_;_CKgIdvE$yBKPD>Wj8jFL*D1NPlI{(+@n%+rMY8!CW6I7LG?D{O zMNJN4$v85NCH_3q@H0O?OwYEoM7-<`dr#w3k*gPm^A5#x?ff0$+CNCw0GVU~?ymbZ*e zREjLo&luC1LQ~u0)p{DyrzR%!5^ahgZw&MHd7#-kTbYy>L!~BZo<95)aj=$OAxCC!Shr~-BdT8rM0WBKCB6D7M0P>s~R&9KbKhW)XR*$RKv zm{;{8pJ^1aaPd?;T$KP1@O0HIJ~oW#c6*YohRE%9^en+bk6tl*Mg(;P t+#bEs+HH;ePAW~F-8qrlf#`d6VE_6onPG3?q(CIR$uLU-KQ`EQ`~y2qe{%o; diff --git a/12_cpu_exceptions_part1/src/arch/aarch64/mmu.rs b/12_cpu_exceptions_part1/src/arch/aarch64/mmu.rs index a81e68de..34d5f71e 100644 --- a/12_cpu_exceptions_part1/src/arch/aarch64/mmu.rs +++ b/12_cpu_exceptions_part1/src/arch/aarch64/mmu.rs @@ -79,18 +79,22 @@ register_bitfields! {u64, ] } -// Two newtypes for added type safety, so that you cannot accidentally place a TableDescriptor into -// a PageDescriptor slot in `struct PageTables`, and vice versa. +const SIXTYFOUR_KIB_SHIFT: usize = 16; // log2(64 * 1024) +const FIVETWELVE_MIB_SHIFT: usize = 29; // log2(512 * 1024 * 1024) + +/// A table descriptor for 64 KiB aperture. +/// +/// The output points to the next table. #[derive(Copy, Clone)] #[repr(transparent)] -struct RawTableDescriptor(u64); +struct TableDescriptor(u64); +/// A page descriptor with 64 KiB aperture. +/// +/// The output points to physical memory. #[derive(Copy, Clone)] #[repr(transparent)] -struct RawPageDescriptor(u64); - -const SIXTYFOUR_KIB_SHIFT: usize = 16; // log2(64 * 1024) -const FIVETWELVE_MIB_SHIFT: usize = 29; // log2(512 * 1024 * 1024) +struct PageDescriptor(u64); /// Big monolithic struct for storing the page tables. Individual levels must be 64 KiB aligned, /// hence the "reverse" order of appearance. @@ -98,9 +102,9 @@ const FIVETWELVE_MIB_SHIFT: usize = 29; // log2(512 * 1024 * 1024) #[repr(align(65536))] struct PageTables { // Page descriptors, covering 64 KiB windows per entry. - lvl3: [[RawPageDescriptor; 8192]; N], + lvl3: [[PageDescriptor; 8192]; N], // Table descriptors, covering 512 MiB windows. - lvl2: [RawTableDescriptor; N], + lvl2: [TableDescriptor; N], } /// Usually evaluates to 1 GiB for RPi3 and 4 GiB for RPi 4. @@ -110,8 +114,8 @@ const ENTRIES_512_MIB: usize = bsp::addr_space_size() >> FIVETWELVE_MIB_SHIFT; /// /// Supposed to land in `.bss`. Therefore, ensure that they boil down to all "0" entries. static mut TABLES: PageTables<{ ENTRIES_512_MIB }> = PageTables { - lvl3: [[RawPageDescriptor(0); 8192]; ENTRIES_512_MIB], - lvl2: [RawTableDescriptor(0); ENTRIES_512_MIB], + lvl3: [[PageDescriptor(0); 8192]; ENTRIES_512_MIB], + lvl2: [TableDescriptor(0); ENTRIES_512_MIB], }; trait BaseAddr { @@ -129,24 +133,15 @@ impl BaseAddr for [T; N] { } } -/// A descriptor pointing to the next page table. -struct TableDescriptor(register::FieldValue); - -impl TableDescriptor { - fn new(next_lvl_table_addr: usize) -> TableDescriptor { +impl convert::From for TableDescriptor { + fn from(next_lvl_table_addr: usize) -> Self { let shifted = next_lvl_table_addr >> SIXTYFOUR_KIB_SHIFT; + let val = (STAGE1_TABLE_DESCRIPTOR::VALID::True + + STAGE1_TABLE_DESCRIPTOR::TYPE::Table + + STAGE1_TABLE_DESCRIPTOR::NEXT_LEVEL_TABLE_ADDR_64KiB.val(shifted as u64)) + .value; - TableDescriptor( - STAGE1_TABLE_DESCRIPTOR::VALID::True - + STAGE1_TABLE_DESCRIPTOR::TYPE::Table - + STAGE1_TABLE_DESCRIPTOR::NEXT_LEVEL_TABLE_ADDR_64KiB.val(shifted as u64), - ) - } -} - -impl convert::From for RawTableDescriptor { - fn from(desc: TableDescriptor) -> Self { - RawTableDescriptor(desc.0.value) + TableDescriptor(val) } } @@ -184,28 +179,17 @@ impl convert::From } } -/// A page descriptor with 64 KiB aperture. -/// -/// The output points to physical memory. -struct PageDescriptor(register::FieldValue); - impl PageDescriptor { fn new(output_addr: usize, attribute_fields: AttributeFields) -> PageDescriptor { let shifted = output_addr >> SIXTYFOUR_KIB_SHIFT; - - PageDescriptor( - STAGE1_PAGE_DESCRIPTOR::VALID::True - + STAGE1_PAGE_DESCRIPTOR::AF::True - + attribute_fields.into() - + STAGE1_PAGE_DESCRIPTOR::TYPE::Table - + STAGE1_PAGE_DESCRIPTOR::OUTPUT_ADDR_64KiB.val(shifted as u64), - ) - } -} - -impl convert::From for RawPageDescriptor { - fn from(desc: PageDescriptor) -> Self { - RawPageDescriptor(desc.0.value) + let val = (STAGE1_PAGE_DESCRIPTOR::VALID::True + + STAGE1_PAGE_DESCRIPTOR::AF::True + + attribute_fields.into() + + STAGE1_PAGE_DESCRIPTOR::TYPE::Table + + STAGE1_PAGE_DESCRIPTOR::OUTPUT_ADDR_64KiB.val(shifted as u64)) + .value; + + PageDescriptor(val) } } @@ -237,7 +221,7 @@ fn set_up_mair() { /// - Modifies a `static mut`. Ensure it only happens from here. unsafe fn populate_pt_entries() -> Result<(), &'static str> { for (l2_nr, l2_entry) in TABLES.lvl2.iter_mut().enumerate() { - *l2_entry = TableDescriptor::new(TABLES.lvl3[l2_nr].base_addr_usize()).into(); + *l2_entry = TABLES.lvl3[l2_nr].base_addr_usize().into(); for (l3_nr, l3_entry) in TABLES.lvl3[l2_nr].iter_mut().enumerate() { let virt_addr = (l2_nr << FIVETWELVE_MIB_SHIFT) + (l3_nr << SIXTYFOUR_KIB_SHIFT); @@ -245,7 +229,7 @@ unsafe fn populate_pt_entries() -> Result<(), &'static str> { let (output_addr, attribute_fields) = bsp::virt_mem_layout().get_virt_addr_properties(virt_addr)?; - *l3_entry = PageDescriptor::new(output_addr, attribute_fields).into(); + *l3_entry = PageDescriptor::new(output_addr, attribute_fields); } }