Skip to content

Commit 9b41fc7

Browse files
committed
fix palloc pfree bitmap
1 parent f50f305 commit 9b41fc7

File tree

6 files changed

+65
-45
lines changed

6 files changed

+65
-45
lines changed

crates/arch-x86_64/src/vmm.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -569,6 +569,7 @@ pub enum TryMapSizedError<T: PageSize> {
569569
Overflow,
570570
NotAligned,
571571
MapToError(MapToError<T>),
572+
WrongSize,
572573
}
573574

574575
fn try_map_sized<T>(
@@ -647,10 +648,8 @@ where
647648
// hyperion_log::debug!("already not mapped");
648649
Ok(())
649650
}
650-
Err(_err) => {
651-
// hyperion_log::error!("{err:?}");
652-
panic!("{_err:?}");
653-
}
651+
Err(UnmapError::ParentEntryHugePage) => Err(TryMapSizedError::WrongSize),
652+
Err(_err) => panic!("{_err:?}"),
654653
}
655654
}
656655

crates/kernel/src/panic.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use core::panic::PanicInfo;
55
#[cfg(not(test))]
66
#[panic_handler]
77
fn panic_handler(info: &PanicInfo) -> ! {
8-
hyperion_log::println!("Kernel CPU {info}");
8+
hyperion_log::error!("Kernel CPU {info}");
99
// hyperion_backtrace::print_backtrace();
1010
hyperion_arch::done();
1111
}

crates/kernel/src/syscall.rs

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -191,15 +191,24 @@ pub fn palloc(args: &mut SyscallRegs) -> Result<usize> {
191191
}
192192

193193
let frames = pmm::PFA.alloc(pages);
194+
195+
// debug!(
196+
// "mapping [{:?}..{:?}] to {:?}",
197+
// VirtAddr::new(alloc_bottom as _),
198+
// VirtAddr::new(alloc_top as _),
199+
// frames.physical_addr(),
200+
// );
194201
active.address_space.page_map.map(
195202
VirtAddr::new(alloc_bottom as _)..VirtAddr::new(alloc_top as _),
196203
frames.physical_addr(),
197204
PageTableFlags::PRESENT | PageTableFlags::WRITABLE | PageTableFlags::USER_ACCESSIBLE,
198205
);
199206

200-
let page_bottom = alloc_bottom / 0x1000;
207+
let page_bottom = frames.physical_addr().as_u64() as usize / 0x1000;
201208
for page in page_bottom..page_bottom + pages {
202-
allocs.set(page, true).unwrap();
209+
if allocs.set(page, true).is_none() {
210+
panic!("alloc set page:{page} len:{}", allocs.len());
211+
}
203212
}
204213

205214
return Ok(alloc_bottom);
@@ -220,7 +229,11 @@ pub fn pfree(args: &mut SyscallRegs) -> Result<usize> {
220229
let active = hyperion_scheduler::process();
221230
let mut allocs = active.allocs.bitmap();
222231

223-
let page_bottom = alloc_bottom.as_u64() as usize / 0x1000;
232+
let Some(palloc) = active.address_space.page_map.virt_to_phys(alloc_bottom) else {
233+
return Err(Error::INVALID_ADDRESS);
234+
};
235+
236+
let page_bottom = palloc.as_u64() as usize / 0x1000;
224237
for page in page_bottom..page_bottom + pages {
225238
if !allocs.get(page).unwrap() {
226239
return Err(Error::INVALID_ALLOC);
@@ -229,10 +242,6 @@ pub fn pfree(args: &mut SyscallRegs) -> Result<usize> {
229242
allocs.set(page, false).unwrap();
230243
}
231244

232-
let Some(palloc) = active.address_space.page_map.virt_to_phys(alloc_bottom) else {
233-
return Err(Error::INVALID_ADDRESS);
234-
};
235-
236245
let frames = unsafe { PageFrame::new(palloc, pages) };
237246
pmm::PFA.free(frames);
238247
active

crates/kshell/src/shell.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -594,9 +594,9 @@ impl Shell {
594594
.collect();
595595
let args = &args[..];
596596

597-
hyperion_log::debug!("spawning \"{name}\" with args {args:?}");
597+
hyperion_log::trace!("spawning \"{name}\" with args {args:?}");
598598

599-
hyperion_log::debug!(
599+
hyperion_log::trace!(
600600
"ELF file from: {}",
601601
env!("CARGO_BIN_FILE_HYPERION_SAMPLE_ELF")
602602
);
@@ -609,7 +609,7 @@ impl Shell {
609609
hyperion_log::debug!("entry point missing");
610610
}
611611
});
612-
hyperion_log::debug!("spawning {name} done (PID:{pid})");
612+
hyperion_log::trace!("spawning {name} done (PID:{pid})");
613613
pid
614614
}
615615

crates/sample-elf/src/main.rs

Lines changed: 39 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,15 @@
66

77
extern crate alloc;
88

9-
use alloc::boxed::Box;
9+
use alloc::{boxed::Box, format};
1010
use core::{
1111
alloc::GlobalAlloc,
1212
fmt::{self, Write},
1313
ptr::NonNull,
1414
};
1515

1616
use hyperion_syscall::{
17+
err::Result,
1718
net::{Protocol, SocketDomain, SocketType},
1819
*,
1920
};
@@ -24,43 +25,54 @@ mod io; // partial std::io
2425

2526
//
2627

27-
pub fn main(_args: CliArgs) {
28-
// println!("sample app main");
29-
// println!("args: {args:?}");
30-
31-
// for i in 1..13 {
32-
// if i == 2 || i == 8 {
33-
// continue;
34-
// }
35-
// println!("{:?}", unsafe { syscall_0(i) });
36-
// }
28+
fn run_server() -> Result<()> {
29+
let server = socket(SocketDomain::LOCAL, SocketType::STREAM, Protocol::LOCAL)?;
30+
bind(server, "/dev/server.sock")?;
3731

38-
spawn(|| {
39-
let server = socket(SocketDomain::LOCAL, SocketType::STREAM, Protocol::LOCAL).unwrap();
32+
rename("local server")?;
4033

41-
bind(server, "/dev/server.sock").unwrap();
34+
loop {
35+
let conn = accept(server)?;
36+
println!("connected");
4237

43-
let conn = accept(server).unwrap();
38+
let mut i = 0usize;
39+
spawn(move || loop {
40+
let msg = format!("Hello {i}");
41+
i += 1;
42+
send(conn, msg.as_bytes(), 0).unwrap();
43+
});
44+
}
45+
}
4446

45-
println!("connected");
47+
fn run_client() -> Result<()> {
48+
let client = socket(SocketDomain::LOCAL, SocketType::STREAM, Protocol::LOCAL)?;
49+
connect(client, "/dev/server.sock")?;
4650

47-
send(conn, b"Hello", 0).unwrap();
48-
});
51+
rename("local client")?;
4952

50-
// wait for the server to be up
51-
nanosleep(50_000_000);
53+
println!("connected");
5254

53-
let client = socket(SocketDomain::LOCAL, SocketType::STREAM, Protocol::LOCAL).unwrap();
55+
loop {
56+
let mut buf = [0u8; 64];
57+
let len = recv(client, &mut buf, 0)?;
5458

55-
connect(client, "/dev/server.sock").unwrap();
59+
println!("got `{:?}`", core::str::from_utf8(&buf[..len]));
60+
}
5661

57-
println!("connected");
62+
Ok(())
63+
}
5864

59-
let mut buf = [0u8; 64];
60-
let len = recv(client, &mut buf, 0).unwrap();
61-
assert_eq!(&buf[..len], b"Hello");
65+
pub fn main(_args: CliArgs) {
66+
let mut i = 0usize;
67+
loop {
68+
let msg = format!("Hello {i}");
69+
i += 1;
70+
println!("{msg}");
71+
}
6272

63-
println!("got `{:?}`", core::str::from_utf8(&buf[..len]));
73+
if run_server().is_err() {
74+
run_client().unwrap();
75+
}
6476

6577
/* match args.iter().next().expect("arg0 to be present") {
6678
// busybox style single binary 'coreutils'

crates/scheduler/src/task.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ use alloc::{
33
boxed::Box,
44
collections::BTreeMap,
55
sync::{Arc, Weak},
6+
vec,
67
vec::Vec,
78
};
89
use core::{
@@ -122,9 +123,8 @@ impl PageAllocs {
122123
pub fn bitmap(&self) -> MutexGuard<Bitmap<'static>> {
123124
self.bitmap
124125
.call_once(|| {
125-
let bitmap_alloc: Vec<u8> = (0..pmm::PFA.bitmap_len() / 8).map(|_| 0u8).collect();
126-
let bitmap_alloc = Vec::leak(bitmap_alloc); // TODO: free
127-
Mutex::new(Bitmap::new(bitmap_alloc))
126+
let bitmap_alloc = vec![0u8; pmm::PFA.bitmap_len() / 8];
127+
Mutex::new(Bitmap::new(Vec::leak(bitmap_alloc)))
128128
})
129129
.lock()
130130
}

0 commit comments

Comments
 (0)