Skip to content

Commit 2e9fe88

Browse files
authoredFeb 2, 2024
Merge pull request #409 from rust-osdev/no-execute
Set `NO_EXECUTE` flag for all writable memory regions
2 parents e15e779 + e27698f commit 2e9fe88

File tree

2 files changed

+12
-7
lines changed

2 files changed

+12
-7
lines changed
 

‎bios/stage-4/src/main.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,9 @@ pub extern "C" fn _start(info: &mut BiosInfo) -> ! {
7878
bootloader_page_table
7979
.identity_map(
8080
frame,
81-
PageTableFlags::PRESENT | PageTableFlags::WRITABLE,
81+
PageTableFlags::PRESENT
82+
| PageTableFlags::WRITABLE
83+
| PageTableFlags::NO_EXECUTE,
8284
&mut frame_allocator,
8385
)
8486
.unwrap()

‎common/src/lib.rs

+9-6
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ where
225225
let frame = frame_allocator
226226
.allocate_frame()
227227
.expect("frame allocation failed when mapping a kernel stack");
228-
let flags = PageTableFlags::PRESENT | PageTableFlags::WRITABLE;
228+
let flags = PageTableFlags::PRESENT | PageTableFlags::WRITABLE | PageTableFlags::NO_EXECUTE;
229229
match unsafe { kernel_page_table.map_to(page, frame, flags, frame_allocator) } {
230230
Ok(tlb) => tlb.flush(),
231231
Err(err) => panic!("failed to map page {:?}: {:?}", page, err),
@@ -278,7 +278,8 @@ where
278278
PhysFrame::range_inclusive(framebuffer_start_frame, framebuffer_end_frame).enumerate()
279279
{
280280
let page = start_page + u64::from_usize(i);
281-
let flags = PageTableFlags::PRESENT | PageTableFlags::WRITABLE;
281+
let flags =
282+
PageTableFlags::PRESENT | PageTableFlags::WRITABLE | PageTableFlags::NO_EXECUTE;
282283
match unsafe { kernel_page_table.map_to(page, frame, flags, frame_allocator) } {
283284
Ok(tlb) => tlb.flush(),
284285
Err(err) => panic!(
@@ -306,7 +307,7 @@ where
306307
let ramdisk_page_count = (system_info.ramdisk_len - 1) / Size4KiB::SIZE;
307308
let ramdisk_physical_end_page = ramdisk_physical_start_page + ramdisk_page_count;
308309

309-
let flags = PageTableFlags::PRESENT | PageTableFlags::WRITABLE;
310+
let flags = PageTableFlags::PRESENT | PageTableFlags::WRITABLE | PageTableFlags::NO_EXECUTE;
310311
for (i, frame) in
311312
PhysFrame::range_inclusive(ramdisk_physical_start_page, ramdisk_physical_end_page)
312313
.enumerate()
@@ -339,7 +340,8 @@ where
339340

340341
for frame in PhysFrame::range_inclusive(start_frame, end_frame) {
341342
let page = Page::containing_address(offset + frame.start_address().as_u64());
342-
let flags = PageTableFlags::PRESENT | PageTableFlags::WRITABLE;
343+
let flags =
344+
PageTableFlags::PRESENT | PageTableFlags::WRITABLE | PageTableFlags::NO_EXECUTE;
343345
match unsafe { kernel_page_table.map_to(page, frame, flags, frame_allocator) } {
344346
Ok(tlb) => tlb.ignore(),
345347
Err(err) => panic!(
@@ -380,7 +382,7 @@ where
380382
u16::from(index)
381383
);
382384
}
383-
let flags = PageTableFlags::PRESENT | PageTableFlags::WRITABLE;
385+
let flags = PageTableFlags::PRESENT | PageTableFlags::WRITABLE | PageTableFlags::NO_EXECUTE;
384386
entry.set_frame(page_tables.kernel_level_4_frame, flags);
385387

386388
Some(index)
@@ -481,7 +483,8 @@ where
481483
let start_page = Page::containing_address(boot_info_addr);
482484
let end_page = Page::containing_address(memory_map_regions_end - 1u64);
483485
for page in Page::range_inclusive(start_page, end_page) {
484-
let flags = PageTableFlags::PRESENT | PageTableFlags::WRITABLE;
486+
let flags =
487+
PageTableFlags::PRESENT | PageTableFlags::WRITABLE | PageTableFlags::NO_EXECUTE;
485488
let frame = frame_allocator
486489
.allocate_frame()
487490
.expect("frame allocation for boot info failed");

0 commit comments

Comments
 (0)
Please sign in to comment.