Skip to content

Commit fe5c0c1

Browse files
gmacdorangecms
authored andcommitted
Fix small mapping issues, update toolchain
Signed-off-by: Graham MacDonald <[email protected]>
1 parent 4f56ee9 commit fe5c0c1

File tree

8 files changed

+119
-72
lines changed

8 files changed

+119
-72
lines changed

.vscode/settings.json

+5-1
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,9 @@
55
"xtask",
66
"check",
77
"--json"
8-
]
8+
],
9+
"lldb.displayFormat": "auto",
10+
"lldb.showDisassembly": "auto",
11+
"lldb.dereferencePointers": true,
12+
"lldb.consoleMode": "commands"
913
}

aarch64/lib/kernel.ld

+9-11
Original file line numberDiff line numberDiff line change
@@ -11,25 +11,23 @@ SECTIONS {
1111
boottext = .;
1212
.text.boot : ALIGN(4096) {
1313
*(.boottext .bootdata)
14-
. = ALIGN(4096);
15-
eboottext = .;
16-
. = ALIGN(2097152);
17-
esys = .;
1814
}
15+
. = ALIGN(4096);
16+
eboottext = .;
1917

2018
text = .;
2119
.text : ALIGN(4096) {
2220
*(.text* .stub .gnu.linkonce.t.*)
23-
. = ALIGN(2097152);
24-
etext = .;
2521
}
22+
. = ALIGN(4096);
23+
etext = .;
2624

2725
rodata = .;
2826
.rodata : ALIGN(4096) {
2927
*(.rodata* .gnu.linkonce.r.*)
30-
. = ALIGN(2097152);
31-
erodata = .;
3228
}
29+
. = ALIGN(4096);
30+
erodata = .;
3331

3432
data = .;
3533
.data : ALIGN(4096) {
@@ -41,14 +39,15 @@ SECTIONS {
4139
.got.plt : ALIGN(4096) {
4240
*(.got.plt)
4341
}
42+
. = ALIGN(4096);
4443
edata = .;
4544

4645
bss = .;
4746
.bss : ALIGN(4096) {
4847
*(.bss*)
4948
*(COMMON)
50-
. = ALIGN(2097152);
5149
}
50+
. = ALIGN(4096);
5251
ebss = .;
5352

5453
/* Reserve section for early pagetables. Align to 2MiB to allow us to map
@@ -59,9 +58,8 @@ SECTIONS {
5958
early_pagetables = .;
6059
. += 2 * 1024 * 1024;
6160
eearly_pagetables = .;
62-
61+
6362
end = .;
64-
PROVIDE(end = .);
6563

6664
/DISCARD/ : {
6765
*(.eh_frame .note.GNU-stack)

aarch64/src/kmem.rs

+65-6
Original file line numberDiff line numberDiff line change
@@ -3,37 +3,96 @@ use port::mem::{PhysAddr, PhysRange};
33

44
// These map to definitions in kernel.ld
55
extern "C" {
6+
static eboottext: [u64; 0];
7+
static text: [u64; 0];
68
static etext: [u64; 0];
9+
static rodata: [u64; 0];
710
static erodata: [u64; 0];
11+
static data: [u64; 0];
12+
static edata: [u64; 0];
13+
static bss: [u64; 0];
814
static ebss: [u64; 0];
15+
static end: [u64; 0];
916
static early_pagetables: [u64; 0];
1017
static eearly_pagetables: [u64; 0];
1118
}
1219

13-
pub fn text_addr() -> usize {
20+
fn base_addr() -> usize {
1421
0xffff_8000_0000_0000
1522
}
1623

17-
pub fn etext_addr() -> usize {
24+
fn eboottext_addr() -> usize {
25+
unsafe { eboottext.as_ptr().addr() }
26+
}
27+
28+
fn text_addr() -> usize {
29+
unsafe { text.as_ptr().addr() }
30+
}
31+
32+
fn etext_addr() -> usize {
1833
unsafe { etext.as_ptr().addr() }
1934
}
2035

21-
pub fn erodata_addr() -> usize {
36+
fn rodata_addr() -> usize {
37+
unsafe { rodata.as_ptr().addr() }
38+
}
39+
40+
fn erodata_addr() -> usize {
2241
unsafe { erodata.as_ptr().addr() }
2342
}
2443

25-
pub fn ebss_addr() -> usize {
44+
fn data_addr() -> usize {
45+
unsafe { data.as_ptr().addr() }
46+
}
47+
48+
fn edata_addr() -> usize {
49+
unsafe { edata.as_ptr().addr() }
50+
}
51+
52+
fn bss_addr() -> usize {
53+
unsafe { bss.as_ptr().addr() }
54+
}
55+
56+
fn ebss_addr() -> usize {
2657
unsafe { ebss.as_ptr().addr() }
2758
}
2859

29-
pub fn early_pagetables_addr() -> usize {
60+
fn end_addr() -> usize {
61+
unsafe { end.as_ptr().addr() }
62+
}
63+
64+
fn early_pagetables_addr() -> usize {
3065
unsafe { early_pagetables.as_ptr().addr() }
3166
}
3267

33-
pub fn eearly_pagetables_addr() -> usize {
68+
fn eearly_pagetables_addr() -> usize {
3469
unsafe { eearly_pagetables.as_ptr().addr() }
3570
}
3671

72+
pub fn boottext_range() -> PhysRange {
73+
PhysRange(from_virt_to_physaddr(base_addr())..from_virt_to_physaddr(eboottext_addr()))
74+
}
75+
76+
pub fn text_range() -> PhysRange {
77+
PhysRange(from_virt_to_physaddr(text_addr())..from_virt_to_physaddr(etext_addr()))
78+
}
79+
80+
pub fn rodata_range() -> PhysRange {
81+
PhysRange(from_virt_to_physaddr(rodata_addr())..from_virt_to_physaddr(erodata_addr()))
82+
}
83+
84+
pub fn data_range() -> PhysRange {
85+
PhysRange(from_virt_to_physaddr(data_addr())..from_virt_to_physaddr(edata_addr()))
86+
}
87+
88+
pub fn bss_range() -> PhysRange {
89+
PhysRange(from_virt_to_physaddr(bss_addr())..from_virt_to_physaddr(ebss_addr()))
90+
}
91+
92+
pub fn total_kernel_range() -> PhysRange {
93+
PhysRange(from_virt_to_physaddr(base_addr())..from_virt_to_physaddr(end_addr()))
94+
}
95+
3796
pub const fn physaddr_as_virt(pa: PhysAddr) -> usize {
3897
(pa.addr() as usize).wrapping_add(KZERO)
3998
}

aarch64/src/main.rs

+18-26
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
#![cfg_attr(not(test), no_main)]
55
#![feature(alloc_error_handler)]
66
#![feature(core_intrinsics)]
7-
#![feature(strict_provenance)]
87
#![feature(sync_unsafe_cell)]
98
#![forbid(unsafe_op_in_unsafe_fn)]
109

@@ -22,8 +21,8 @@ mod vm;
2221

2322
use crate::kmem::from_virt_to_physaddr;
2423
use crate::vm::kernel_root;
25-
use core::ffi::c_void;
2624
use core::ptr;
25+
use kmem::{boottext_range, bss_range, data_range, rodata_range, text_range, total_kernel_range};
2726
use port::fdt::DeviceTree;
2827
use port::mem::PhysRange;
2928
use port::println;
@@ -34,35 +33,20 @@ core::arch::global_asm!(include_str!("l.S"));
3433

3534
static mut KPGTBL: PageTable = PageTable::empty();
3635

37-
unsafe fn print_memory_range(name: &str, start: &*const c_void, end: &*const c_void) {
38-
let start = start as *const _ as u64;
39-
let end = end as *const _ as u64;
40-
let size = end - start;
41-
println!(" {name}{start:#x}..{end:#x} ({size:#x})");
36+
unsafe fn print_memory_range(name: &str, range: &PhysRange) {
37+
let size = range.size();
38+
println!(" {name}{range} ({size:#x})");
4239
}
4340

4441
fn print_binary_sections() {
45-
extern "C" {
46-
static boottext: *const c_void;
47-
static eboottext: *const c_void;
48-
static text: *const c_void;
49-
static etext: *const c_void;
50-
static rodata: *const c_void;
51-
static erodata: *const c_void;
52-
static data: *const c_void;
53-
static edata: *const c_void;
54-
static bss: *const c_void;
55-
static end: *const c_void;
56-
}
57-
5842
println!("Binary sections:");
5943
unsafe {
60-
print_memory_range("boottext:\t", &boottext, &eboottext);
61-
print_memory_range("text:\t\t", &text, &etext);
62-
print_memory_range("rodata:\t", &rodata, &erodata);
63-
print_memory_range("data:\t\t", &data, &edata);
64-
print_memory_range("bss:\t\t", &bss, &end);
65-
print_memory_range("total:\t", &boottext, &end);
44+
print_memory_range("boottext:\t", &boottext_range());
45+
print_memory_range("text:\t\t", &text_range());
46+
print_memory_range("rodata:\t", &rodata_range());
47+
print_memory_range("data:\t\t", &data_range());
48+
print_memory_range("bss:\t\t", &bss_range());
49+
print_memory_range("total:\t", &total_kernel_range());
6650
}
6751
}
6852

@@ -141,6 +125,14 @@ pub extern "C" fn main9(dtb_va: usize) {
141125

142126
print_memory_info();
143127

128+
if let Ok(page) = pagealloc::allocate() {
129+
println!("page addr: {:#016x}", page.data().as_ptr() as *const _ as u64);
130+
131+
//let mapped_range =
132+
// let kpgtable = unsafe { &mut *ptr::addr_of_mut!(KPGTBL) };
133+
// kpgtable.map_phys_range(range, *flags, *page_size).expect("dynamic mapping failed");
134+
}
135+
144136
kernel_root().print_recursive_tables();
145137

146138
println!("looping now");

aarch64/src/vm.rs

+14-24
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22

33
use crate::{
44
kmem::{
5-
ebss_addr, erodata_addr, etext_addr, from_ptr_to_physaddr, from_virt_to_physaddr,
6-
physaddr_as_ptr_mut, physaddr_as_virt, text_addr,
5+
boottext_range, bss_range, data_range, from_ptr_to_physaddr, physaddr_as_ptr_mut,
6+
physaddr_as_virt, rodata_range, text_range,
77
},
88
pagealloc,
99
registers::rpi_mmio,
@@ -48,6 +48,10 @@ impl Page4K {
4848
core::intrinsics::volatile_set_memory(&mut self.0, 0u8, 1);
4949
}
5050
}
51+
52+
pub fn data(&mut self) -> &mut [u8] {
53+
&mut self.0
54+
}
5155
}
5256

5357
#[derive(Debug, IntoPrimitive, FromPrimitive)]
@@ -485,24 +489,16 @@ pub unsafe fn init(kpage_table: &mut PageTable, dtb_range: PhysRange, available_
485489

486490
// TODO leave the first page unmapped to catch null pointer dereferences in unsafe code
487491
let custom_map = {
488-
let text_range =
489-
PhysRange(from_virt_to_physaddr(text_addr())..from_virt_to_physaddr(etext_addr()));
490-
let data_range = PhysRange::with_len(
491-
from_virt_to_physaddr(etext_addr()).addr(),
492-
erodata_addr() - etext_addr(),
493-
);
494-
let bss_range = PhysRange::with_len(
495-
from_virt_to_physaddr(erodata_addr()).addr(),
496-
ebss_addr() - erodata_addr(),
497-
);
498-
492+
let text_range = boottext_range().add(&text_range());
493+
let data_range = rodata_range().add(&data_range());
494+
let bss_range = bss_range();
499495
let mmio_range = rpi_mmio().expect("mmio base detect failed");
500496

501497
let mut map = [
502498
("DTB", dtb_range, Entry::ro_kernel_data(), PageSize::Page4K),
503-
("Kernel Text", text_range, Entry::ro_kernel_text(), PageSize::Page2M),
504-
("Kernel Data", data_range, Entry::ro_kernel_data(), PageSize::Page2M),
505-
("Kernel BSS", bss_range, Entry::rw_kernel_data(), PageSize::Page2M),
499+
("Kernel Text", text_range, Entry::ro_kernel_text(), PageSize::Page4K),
500+
("Kernel Data", data_range, Entry::rw_kernel_data(), PageSize::Page4K),
501+
("Kernel BSS", bss_range, Entry::rw_kernel_data(), PageSize::Page4K),
506502
("MMIO", mmio_range, Entry::ro_kernel_device(), PageSize::Page2M),
507503
];
508504
map.sort_by_key(|a| a.1.start());
@@ -515,14 +511,8 @@ pub unsafe fn init(kpage_table: &mut PageTable, dtb_range: PhysRange, available_
515511
kpage_table.map_phys_range(range, *flags, *page_size).expect("init mapping failed");
516512

517513
println!(
518-
" {:14}{:#018x}..{:#018x} to {:#018x}..{:#018x} flags: {:?} page_size: {:?}",
519-
name,
520-
range.start().addr(),
521-
range.end().addr(),
522-
mapped_range.0,
523-
mapped_range.1,
524-
flags,
525-
page_size
514+
" {:14}{} to {:#018x}..{:#018x} flags: {:?} page_size: {:?}",
515+
name, range, mapped_range.0, mapped_range.1, flags, page_size
526516
);
527517
}
528518

port/src/lib.rs

-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
#![feature(allocator_api)]
55
#![feature(maybe_uninit_slice)]
66
#![feature(step_trait)]
7-
#![feature(strict_provenance)]
87
#![forbid(unsafe_op_in_unsafe_fn)]
98

109
extern crate alloc;

port/src/mem.rs

+5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use crate::fdt::RegBlock;
22
use core::{
3+
cmp::{max, min},
34
fmt,
45
iter::{Step, StepBy},
56
ops::{self, Range},
@@ -145,6 +146,10 @@ impl PhysRange {
145146
let endpa = self.end().round_up(step_size as u64);
146147
(startpa..endpa).step_by(step_size)
147148
}
149+
150+
pub fn add(&self, other: &PhysRange) -> Self {
151+
Self(min(self.0.start, other.0.start)..max(self.0.end, other.0.end))
152+
}
148153
}
149154

150155
impl fmt::Display for PhysRange {

rust-toolchain.toml

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
[toolchain]
2-
channel = "nightly-2024-10-15"
3-
components = [ "rustfmt", "rust-src", "clippy", "llvm-tools" ]
2+
channel = "nightly-2024-10-23"
3+
components = ["rustfmt", "rust-src", "clippy", "llvm-tools"]
44
targets = [
55
"aarch64-unknown-none",
66
"riscv64gc-unknown-none-elf",
7-
"x86_64-unknown-none"
7+
"x86_64-unknown-none",
88
]

0 commit comments

Comments
 (0)