From 305e7980d871a9d5cddaf87d538ceee57ad6f94b Mon Sep 17 00:00:00 2001 From: Gabriel Majeri <gabriel.majeri6@gmail.com> Date: Wed, 11 Oct 2017 15:59:14 +0300 Subject: [PATCH] Update to bitflags 1.0 --- Cargo.lock | 8 +++++- Cargo.toml | 2 +- src/acpi/dmar/mod.rs | 5 ++-- src/acpi/hpet.rs | 5 ++-- src/acpi/madt.rs | 5 ++-- src/acpi/mod.rs | 7 ++--- src/acpi/rsdp.rs | 5 ++-- src/arch/x86_64/device/local_apic.rs | 5 ++-- src/arch/x86_64/idt.rs | 22 ++++++++-------- src/arch/x86_64/paging/entry.rs | 24 ++++++++--------- src/arch/x86_64/paging/mapper.rs | 6 ++--- src/arch/x86_64/paging/mod.rs | 32 +++++++++++------------ src/arch/x86_64/paging/table.rs | 8 +++--- src/arch/x86_64/start.rs | 5 ++-- src/context/memory.rs | 4 +-- src/devices/uart_16550.rs | 26 +++++++++---------- src/scheme/user.rs | 7 ++--- src/syscall/driver.rs | 9 ++++--- src/syscall/process.rs | 39 ++++++++++++++-------------- src/syscall/validate.rs | 9 ++++--- 20 files changed, 125 insertions(+), 108 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 47dc461e..a00081d6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3,7 +3,7 @@ name = "kernel" version = "0.1.0" dependencies = [ "alloc_kernel 0.1.0", - "bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "goblin 0.0.10 (registry+https://github.com/rust-lang/crates.io-index)", "raw-cpuid 3.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "redox_syscall 0.1.31", @@ -24,6 +24,11 @@ name = "bitflags" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "bitflags" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "gcc" version = "0.3.54" @@ -92,6 +97,7 @@ dependencies = [ [metadata] "checksum bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aad18937a628ec6abcd26d1489012cc0e18c21798210f491af69ded9b881106d" +"checksum bitflags 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f5cde24d1b2e2216a726368b2363a273739c91f4e3eb4e0dd12d672d396ad989" "checksum gcc 0.3.54 (registry+https://github.com/rust-lang/crates.io-index)" = "5e33ec290da0d127825013597dbdfc28bee4964690c7ce1166cbc2a7bd08b1bb" "checksum goblin 0.0.10 (registry+https://github.com/rust-lang/crates.io-index)" = "81af14056c25d33759862c5ae2035452acb1255bfb1b16db57819f183921e259" "checksum linked_list_allocator 0.4.1 (git+https://github.com/redox-os/linked-list-allocator.git)" = "<none>" diff --git a/Cargo.toml b/Cargo.toml index 7f19647c..ced4ed7a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,7 +10,7 @@ crate-type = ["staticlib"] [dependencies] alloc_kernel = { path = "alloc_kernel" } -bitflags = "0.7" +bitflags = "1" spin = "0.4" raw-cpuid = "3.0" redox_syscall = { path = "syscall" } diff --git a/src/acpi/dmar/mod.rs b/src/acpi/dmar/mod.rs index d83c5056..11687181 100644 --- a/src/acpi/dmar/mod.rs +++ b/src/acpi/dmar/mod.rs @@ -3,7 +3,8 @@ use core::mem; use super::sdt::Sdt; use self::drhd::Drhd; use memory::Frame; -use paging::{entry, ActivePageTable, PhysicalAddress}; +use paging::{ActivePageTable, PhysicalAddress}; +use paging::entry::EntryFlags; use super::{find_sdt, load_table, get_sdt_signature}; @@ -93,7 +94,7 @@ pub struct DmarDrhd { impl DmarDrhd { pub fn get(&self, active_table: &mut ActivePageTable) -> &'static mut Drhd { - let result = active_table.identity_map(Frame::containing_address(PhysicalAddress::new(self.base as usize)), entry::PRESENT | entry::WRITABLE | entry::NO_EXECUTE); + let result = active_table.identity_map(Frame::containing_address(PhysicalAddress::new(self.base as usize)), EntryFlags::PRESENT | EntryFlags::WRITABLE | EntryFlags::NO_EXECUTE); result.flush(active_table); unsafe { &mut *(self.base as *mut Drhd) } } diff --git a/src/acpi/hpet.rs b/src/acpi/hpet.rs index 551eb097..73d15be3 100644 --- a/src/acpi/hpet.rs +++ b/src/acpi/hpet.rs @@ -3,7 +3,8 @@ use core::{mem, ptr}; use core::intrinsics::{volatile_load, volatile_store}; use memory::Frame; -use paging::{entry, ActivePageTable, PhysicalAddress, Page, VirtualAddress}; +use paging::{ActivePageTable, PhysicalAddress, Page, VirtualAddress}; +use paging::entry::EntryFlags; use super::sdt::Sdt; use super::{ACPI_TABLE, find_sdt, load_table, get_sdt_signature}; @@ -68,7 +69,7 @@ impl GenericAddressStructure { pub unsafe fn init(&self, active_table: &mut ActivePageTable) { let page = Page::containing_address(VirtualAddress::new(self.address as usize)); let frame = Frame::containing_address(PhysicalAddress::new(self.address as usize)); - let result = active_table.map_to(page, frame, entry::PRESENT | entry::WRITABLE | entry::NO_EXECUTE); + let result = active_table.map_to(page, frame, EntryFlags::PRESENT | EntryFlags::WRITABLE | EntryFlags::NO_EXECUTE); result.flush(active_table); } diff --git a/src/acpi/madt.rs b/src/acpi/madt.rs index f22e56ec..28f76715 100644 --- a/src/acpi/madt.rs +++ b/src/acpi/madt.rs @@ -1,7 +1,8 @@ use core::mem; use memory::{allocate_frames, Frame}; -use paging::{entry, ActivePageTable, Page, PhysicalAddress, VirtualAddress}; +use paging::{ActivePageTable, Page, PhysicalAddress, VirtualAddress}; +use paging::entry::EntryFlags; use super::sdt::Sdt; use super::{AP_STARTUP, TRAMPOLINE, find_sdt, load_table, get_sdt_signature}; @@ -49,7 +50,7 @@ impl Madt { let trampoline_page = Page::containing_address(VirtualAddress::new(TRAMPOLINE)); // Map trampoline - let result = active_table.map_to(trampoline_page, trampoline_frame, entry::PRESENT | entry::WRITABLE); + let result = active_table.map_to(trampoline_page, trampoline_frame, EntryFlags::PRESENT | EntryFlags::WRITABLE); result.flush(active_table); for madt_entry in madt.iter() { diff --git a/src/acpi/mod.rs b/src/acpi/mod.rs index 7d8a1a4c..8439cc7a 100644 --- a/src/acpi/mod.rs +++ b/src/acpi/mod.rs @@ -13,7 +13,8 @@ use spin::RwLock; use stop::kstop; use memory::Frame; -use paging::{entry, ActivePageTable, Page, PhysicalAddress, VirtualAddress}; +use paging::{ActivePageTable, Page, PhysicalAddress, VirtualAddress}; +use paging::entry::EntryFlags; use self::dmar::Dmar; use self::fadt::Fadt; @@ -46,7 +47,7 @@ fn get_sdt(sdt_address: usize, active_table: &mut ActivePageTable) -> &'static S let page = Page::containing_address(VirtualAddress::new(sdt_address)); if active_table.translate_page(page).is_none() { let frame = Frame::containing_address(PhysicalAddress::new(page.start_address().get())); - let result = active_table.map_to(page, frame, entry::PRESENT | entry::NO_EXECUTE); + let result = active_table.map_to(page, frame, EntryFlags::PRESENT | EntryFlags::NO_EXECUTE); result.flush(active_table); } } @@ -60,7 +61,7 @@ fn get_sdt(sdt_address: usize, active_table: &mut ActivePageTable) -> &'static S for page in Page::range_inclusive(start_page, end_page) { if active_table.translate_page(page).is_none() { let frame = Frame::containing_address(PhysicalAddress::new(page.start_address().get())); - let result = active_table.map_to(page, frame, entry::PRESENT | entry::NO_EXECUTE); + let result = active_table.map_to(page, frame, EntryFlags::PRESENT | EntryFlags::NO_EXECUTE); result.flush(active_table); } } diff --git a/src/acpi/rsdp.rs b/src/acpi/rsdp.rs index 9dfa5a93..3e135c71 100644 --- a/src/acpi/rsdp.rs +++ b/src/acpi/rsdp.rs @@ -1,5 +1,6 @@ use memory::Frame; -use paging::{entry, ActivePageTable, Page, PhysicalAddress, VirtualAddress}; +use paging::{ActivePageTable, Page, PhysicalAddress, VirtualAddress}; +use paging::entry::EntryFlags; /// RSDP #[derive(Copy, Clone, Debug)] @@ -28,7 +29,7 @@ impl RSDP { let end_frame = Frame::containing_address(PhysicalAddress::new(end_addr)); for frame in Frame::range_inclusive(start_frame, end_frame) { let page = Page::containing_address(VirtualAddress::new(frame.start_address().get())); - let result = active_table.map_to(page, frame, entry::PRESENT | entry::NO_EXECUTE); + let result = active_table.map_to(page, frame, EntryFlags::PRESENT | EntryFlags::NO_EXECUTE); result.flush(active_table); } } diff --git a/src/arch/x86_64/device/local_apic.rs b/src/arch/x86_64/device/local_apic.rs index d55bc3b7..251e748d 100644 --- a/src/arch/x86_64/device/local_apic.rs +++ b/src/arch/x86_64/device/local_apic.rs @@ -3,7 +3,8 @@ use x86::cpuid::CpuId; use x86::msr::*; use memory::Frame; -use paging::{entry, ActivePageTable, PhysicalAddress, Page, VirtualAddress}; +use paging::{ActivePageTable, PhysicalAddress, Page, VirtualAddress}; +use paging::entry::EntryFlags; pub static mut LOCAL_APIC: LocalApic = LocalApic { address: 0, @@ -32,7 +33,7 @@ impl LocalApic { if ! self.x2 { let page = Page::containing_address(VirtualAddress::new(self.address)); let frame = Frame::containing_address(PhysicalAddress::new(self.address - ::KERNEL_OFFSET)); - let result = active_table.map_to(page, frame, entry::PRESENT | entry::WRITABLE | entry::NO_EXECUTE); + let result = active_table.map_to(page, frame, EntryFlags::PRESENT | EntryFlags::WRITABLE | EntryFlags::NO_EXECUTE); result.flush(active_table); } diff --git a/src/arch/x86_64/idt.rs b/src/arch/x86_64/idt.rs index a53eaf5a..ef507329 100644 --- a/src/arch/x86_64/idt.rs +++ b/src/arch/x86_64/idt.rs @@ -63,21 +63,21 @@ pub unsafe fn init() { // Set syscall function IDT[0x80].set_func(syscall::syscall); - IDT[0x80].set_flags(IDT_PRESENT | IDT_RING_3 | IDT_INTERRUPT); + IDT[0x80].set_flags(IdtFlags::PRESENT | IdtFlags::RING_3 | IdtFlags::INTERRUPT); dtables::lidt(&IDTR); } bitflags! { - pub flags IdtFlags: u8 { - const IDT_PRESENT = 1 << 7, - const IDT_RING_0 = 0 << 5, - const IDT_RING_1 = 1 << 5, - const IDT_RING_2 = 2 << 5, - const IDT_RING_3 = 3 << 5, - const IDT_SS = 1 << 4, - const IDT_INTERRUPT = 0xE, - const IDT_TRAP = 0xF, + pub struct IdtFlags: u8 { + const PRESENT = 1 << 7; + const RING_0 = 0 << 5; + const RING_1 = 1 << 5; + const RING_2 = 2 << 5; + const RING_3 = 3 << 5; + const SS = 1 << 4; + const INTERRUPT = 0xE; + const TRAP = 0xF; } } @@ -119,7 +119,7 @@ impl IdtEntry { // A function to set the offset more easily pub fn set_func(&mut self, func: unsafe extern fn()) { - self.set_flags(IDT_PRESENT | IDT_RING_0 | IDT_INTERRUPT); + self.set_flags(IdtFlags::PRESENT | IdtFlags::RING_0 | IdtFlags::INTERRUPT); self.set_offset(8, func as usize); } } diff --git a/src/arch/x86_64/paging/entry.rs b/src/arch/x86_64/paging/entry.rs index aecf6474..16738194 100644 --- a/src/arch/x86_64/paging/entry.rs +++ b/src/arch/x86_64/paging/entry.rs @@ -9,17 +9,17 @@ use super::PhysicalAddress; pub struct Entry(u64); bitflags! { - pub flags EntryFlags: u64 { - const PRESENT = 1 << 0, - const WRITABLE = 1 << 1, - const USER_ACCESSIBLE = 1 << 2, - const WRITE_THROUGH = 1 << 3, - const NO_CACHE = 1 << 4, - const ACCESSED = 1 << 5, - const DIRTY = 1 << 6, - const HUGE_PAGE = 1 << 7, - const GLOBAL = 1 << 8, - const NO_EXECUTE = 1 << 63, + pub struct EntryFlags: u64 { + const PRESENT = 1 << 0; + const WRITABLE = 1 << 1; + const USER_ACCESSIBLE = 1 << 2; + const WRITE_THROUGH = 1 << 3; + const NO_CACHE = 1 << 4; + const ACCESSED = 1 << 5; + const DIRTY = 1 << 6; + const HUGE_PAGE = 1 << 7; + const GLOBAL = 1 << 8; + const NO_EXECUTE = 1 << 63; } } @@ -48,7 +48,7 @@ impl Entry { /// Get the associated frame, if available pub fn pointed_frame(&self) -> Option<Frame> { - if self.flags().contains(PRESENT) { + if self.flags().contains(EntryFlags::PRESENT) { Some(Frame::containing_address(self.address())) } else { None diff --git a/src/arch/x86_64/paging/mapper.rs b/src/arch/x86_64/paging/mapper.rs index 610683c9..79b9f360 100644 --- a/src/arch/x86_64/paging/mapper.rs +++ b/src/arch/x86_64/paging/mapper.rs @@ -4,7 +4,7 @@ use core::ptr::Unique; use memory::{allocate_frames, deallocate_frames, Frame}; use super::{ActivePageTable, Page, PAGE_SIZE, PhysicalAddress, VirtualAddress}; -use super::entry::{self, EntryFlags}; +use super::entry::EntryFlags; use super::table::{self, Table, Level4}; /// In order to enforce correct paging operations in the kernel, these types @@ -107,7 +107,7 @@ impl Mapper { page.start_address().get(), p1[page.p1_index()].address().get(), p1[page.p1_index()].flags(), frame.start_address().get(), flags); - p1[page.p1_index()].set(frame, flags | entry::PRESENT); + p1[page.p1_index()].set(frame, flags | EntryFlags::PRESENT); MapperFlush::new(page) } @@ -123,7 +123,7 @@ impl Mapper { let p2 = p3.next_table_mut(page.p3_index()).expect("failed to remap: no p2"); let p1 = p2.next_table_mut(page.p2_index()).expect("failed to remap: no p1"); let frame = p1[page.p1_index()].pointed_frame().expect("failed to remap: not mapped"); - p1[page.p1_index()].set(frame, flags | entry::PRESENT); + p1[page.p1_index()].set(frame, flags | EntryFlags::PRESENT); MapperFlush::new(page) } diff --git a/src/arch/x86_64/paging/mod.rs b/src/arch/x86_64/paging/mod.rs index caebefd4..d4096dfc 100644 --- a/src/arch/x86_64/paging/mod.rs +++ b/src/arch/x86_64/paging/mod.rs @@ -7,7 +7,7 @@ use x86::{msr, tlb}; use memory::{allocate_frames, Frame}; -use self::entry::{EntryFlags, PRESENT, GLOBAL, WRITABLE, NO_EXECUTE}; +use self::entry::EntryFlags; use self::mapper::Mapper; use self::temporary_page::TemporaryPage; @@ -124,7 +124,7 @@ pub unsafe fn init(cpu_id: usize, kernel_start: usize, kernel_end: usize, stack_ let end_frame = Frame::containing_address(PhysicalAddress::new(stack_end - ::KERNEL_OFFSET - 1)); for frame in Frame::range_inclusive(start_frame, end_frame) { let page = Page::containing_address(VirtualAddress::new(frame.start_address().get() + ::KERNEL_OFFSET)); - let result = mapper.map_to(page, frame, PRESENT | GLOBAL | NO_EXECUTE | WRITABLE); + let result = mapper.map_to(page, frame, EntryFlags::PRESENT | EntryFlags::GLOBAL | EntryFlags::NO_EXECUTE | EntryFlags::WRITABLE); // The flush can be ignored as this is not the active table. See later active_table.switch unsafe { result.ignore(); } } @@ -147,22 +147,22 @@ pub unsafe fn init(cpu_id: usize, kernel_start: usize, kernel_end: usize, stack_ let flags = if in_section!(text) { // Remap text read-only - PRESENT | GLOBAL + EntryFlags::PRESENT | EntryFlags::GLOBAL } else if in_section!(rodata) { // Remap rodata read-only, no execute - PRESENT | GLOBAL | NO_EXECUTE + EntryFlags::PRESENT | EntryFlags::GLOBAL | EntryFlags::NO_EXECUTE } else if in_section!(data) { // Remap data writable, no execute - PRESENT | GLOBAL | NO_EXECUTE | WRITABLE + EntryFlags::PRESENT | EntryFlags::GLOBAL | EntryFlags::NO_EXECUTE | EntryFlags::WRITABLE } else if in_section!(tdata) { // Remap tdata master read-only, no execute - PRESENT | GLOBAL | NO_EXECUTE + EntryFlags::PRESENT | EntryFlags::GLOBAL | EntryFlags::NO_EXECUTE } else if in_section!(bss) { // Remap bss writable, no execute - PRESENT | GLOBAL | NO_EXECUTE | WRITABLE + EntryFlags::PRESENT | EntryFlags::GLOBAL | EntryFlags::NO_EXECUTE | EntryFlags::WRITABLE } else { // Remap anything else read-only, no execute - PRESENT | GLOBAL | NO_EXECUTE + EntryFlags::PRESENT | EntryFlags::GLOBAL | EntryFlags::NO_EXECUTE }; let page = Page::containing_address(VirtualAddress::new(virt_addr)); @@ -182,7 +182,7 @@ pub unsafe fn init(cpu_id: usize, kernel_start: usize, kernel_end: usize, stack_ let start_page = Page::containing_address(VirtualAddress::new(start)); let end_page = Page::containing_address(VirtualAddress::new(end - 1)); for page in Page::range_inclusive(start_page, end_page) { - let result = mapper.map(page, PRESENT | GLOBAL | NO_EXECUTE | WRITABLE); + let result = mapper.map(page, EntryFlags::PRESENT | EntryFlags::GLOBAL | EntryFlags::NO_EXECUTE | EntryFlags::WRITABLE); // The flush can be ignored as this is not the active table. See later active_table.switch result.ignore(); } @@ -227,7 +227,7 @@ pub unsafe fn init_ap(cpu_id: usize, bsp_table: usize, stack_start: usize, stack let start_page = Page::containing_address(VirtualAddress::new(start)); let end_page = Page::containing_address(VirtualAddress::new(end - 1)); for page in Page::range_inclusive(start_page, end_page) { - let result = mapper.map(page, PRESENT | GLOBAL | NO_EXECUTE | WRITABLE); + let result = mapper.map(page, EntryFlags::PRESENT | EntryFlags::GLOBAL | EntryFlags::NO_EXECUTE | EntryFlags::WRITABLE); // The flush can be ignored as this is not the active table. See later active_table.switch result.ignore(); } @@ -247,7 +247,7 @@ pub unsafe fn init_ap(cpu_id: usize, bsp_table: usize, stack_start: usize, stack }; // Remap stack writable, no execute - remap(stack_start - ::KERNEL_OFFSET, stack_end - ::KERNEL_OFFSET, PRESENT | GLOBAL | NO_EXECUTE | WRITABLE); + remap(stack_start - ::KERNEL_OFFSET, stack_end - ::KERNEL_OFFSET, EntryFlags::PRESENT | EntryFlags::GLOBAL | EntryFlags::NO_EXECUTE | EntryFlags::WRITABLE); }); // This switches the active table, which is setup by the bootloader, to a correct table @@ -313,17 +313,17 @@ impl ActivePageTable { let backup = Frame::containing_address(PhysicalAddress::new(unsafe { controlregs::cr3() as usize })); // map temporary_page to current p4 table - let p4_table = temporary_page.map_table_frame(backup.clone(), PRESENT | WRITABLE | NO_EXECUTE, self); + let p4_table = temporary_page.map_table_frame(backup.clone(), EntryFlags::PRESENT | EntryFlags::WRITABLE | EntryFlags::NO_EXECUTE, self); // overwrite recursive mapping - self.p4_mut()[511].set(table.p4_frame.clone(), PRESENT | WRITABLE | NO_EXECUTE); + self.p4_mut()[511].set(table.p4_frame.clone(), EntryFlags::PRESENT | EntryFlags::WRITABLE | EntryFlags::NO_EXECUTE); self.flush_all(); // execute f in the new context f(self); // restore recursive mapping to original p4 table - p4_table[511].set(backup, PRESENT | WRITABLE | NO_EXECUTE); + p4_table[511].set(backup, EntryFlags::PRESENT | EntryFlags::WRITABLE | EntryFlags::NO_EXECUTE); self.flush_all(); } @@ -343,11 +343,11 @@ pub struct InactivePageTable { impl InactivePageTable { pub fn new(frame: Frame, active_table: &mut ActivePageTable, temporary_page: &mut TemporaryPage) -> InactivePageTable { { - let table = temporary_page.map_table_frame(frame.clone(), PRESENT | WRITABLE | NO_EXECUTE, active_table); + let table = temporary_page.map_table_frame(frame.clone(), EntryFlags::PRESENT | EntryFlags::WRITABLE | EntryFlags::NO_EXECUTE, active_table); // now we are able to zero the table table.zero(); // set up recursive mapping for the table - table[511].set(frame.clone(), PRESENT | WRITABLE | NO_EXECUTE); + table[511].set(frame.clone(), EntryFlags::PRESENT | EntryFlags::WRITABLE | EntryFlags::NO_EXECUTE); } temporary_page.unmap(active_table); diff --git a/src/arch/x86_64/paging/table.rs b/src/arch/x86_64/paging/table.rs index f97f268e..4e9ae6dd 100644 --- a/src/arch/x86_64/paging/table.rs +++ b/src/arch/x86_64/paging/table.rs @@ -6,7 +6,7 @@ use core::ops::{Index, IndexMut}; use memory::allocate_frames; -use super::entry::*; +use super::entry::{EntryFlags, Entry}; use super::ENTRY_COUNT; pub const P4: *mut Table<Level4> = 0xffff_ffff_ffff_f000 as *mut _; @@ -73,10 +73,10 @@ impl<L> Table<L> where L: HierarchicalLevel { pub fn next_table_create(&mut self, index: usize) -> &mut Table<L::NextLevel> { if self.next_table(index).is_none() { - assert!(!self[index].flags().contains(HUGE_PAGE), + assert!(!self[index].flags().contains(EntryFlags::HUGE_PAGE), "next_table_create does not support huge pages"); let frame = allocate_frames(1).expect("no frames available"); - self[index].set(frame, PRESENT | WRITABLE | USER_ACCESSIBLE /* Allow users to go down the page table, implement permissions at the page level */); + self[index].set(frame, EntryFlags::PRESENT | EntryFlags::WRITABLE | EntryFlags::USER_ACCESSIBLE /* Allow users to go down the page table, implement permissions at the page level */); self.next_table_mut(index).unwrap().zero(); } self.next_table_mut(index).unwrap() @@ -84,7 +84,7 @@ impl<L> Table<L> where L: HierarchicalLevel { fn next_table_address(&self, index: usize) -> Option<usize> { let entry_flags = self[index].flags(); - if entry_flags.contains(PRESENT) && !entry_flags.contains(HUGE_PAGE) { + if entry_flags.contains(EntryFlags::PRESENT) && !entry_flags.contains(EntryFlags::HUGE_PAGE) { let table_address = self as *const _ as usize; Some((table_address << 9) | (index << 12)) } else { diff --git a/src/arch/x86_64/start.rs b/src/arch/x86_64/start.rs index 8c70df82..66125752 100644 --- a/src/arch/x86_64/start.rs +++ b/src/arch/x86_64/start.rs @@ -13,7 +13,8 @@ use gdt; use idt; use interrupt; use memory; -use paging::{self, entry, Page, VirtualAddress}; +use paging::{self, Page, VirtualAddress}; +use paging::entry::EntryFlags; use paging::mapper::MapperFlushAll; /// Test of zero values in BSS. @@ -104,7 +105,7 @@ pub unsafe extern fn kstart(args_ptr: *const KernelArgs) -> ! { let heap_start_page = Page::containing_address(VirtualAddress::new(::KERNEL_HEAP_OFFSET)); let heap_end_page = Page::containing_address(VirtualAddress::new(::KERNEL_HEAP_OFFSET + ::KERNEL_HEAP_SIZE-1)); for page in Page::range_inclusive(heap_start_page, heap_end_page) { - let result = active_table.map(page, entry::PRESENT | entry::GLOBAL | entry::WRITABLE | entry::NO_EXECUTE); + let result = active_table.map(page, EntryFlags::PRESENT | EntryFlags::GLOBAL | EntryFlags::WRITABLE | EntryFlags::NO_EXECUTE); flush_all.consume(result); } diff --git a/src/context/memory.rs b/src/context/memory.rs index 67798c61..ebf60d53 100644 --- a/src/context/memory.rs +++ b/src/context/memory.rs @@ -5,7 +5,7 @@ use spin::Mutex; use memory::Frame; use paging::{ActivePageTable, InactivePageTable, Page, PageIter, PhysicalAddress, VirtualAddress}; -use paging::entry::{self, EntryFlags}; +use paging::entry::EntryFlags; use paging::mapper::MapperFlushAll; use paging::temporary_page::TemporaryPage; @@ -212,7 +212,7 @@ impl Memory { flush_all.flush(&mut active_table); if clear { - assert!(self.flags.contains(entry::WRITABLE)); + assert!(self.flags.contains(EntryFlags::WRITABLE)); unsafe { intrinsics::write_bytes(self.start_address().get() as *mut u8, 0, self.size); } diff --git a/src/devices/uart_16550.rs b/src/devices/uart_16550.rs index 8dfb356d..5c8cd5b7 100644 --- a/src/devices/uart_16550.rs +++ b/src/devices/uart_16550.rs @@ -5,21 +5,21 @@ use syscall::io::{Io, Pio, Mmio, ReadOnly}; bitflags! { /// Interrupt enable flags - flags IntEnFlags: u8 { - const RECEIVED = 1, - const SENT = 1 << 1, - const ERRORED = 1 << 2, - const STATUS_CHANGE = 1 << 3, + struct IntEnFlags: u8 { + const RECEIVED = 1; + const SENT = 1 << 1; + const ERRORED = 1 << 2; + const STATUS_CHANGE = 1 << 3; // 4 to 7 are unused } } bitflags! { /// Line status flags - flags LineStsFlags: u8 { - const INPUT_FULL = 1, + struct LineStsFlags: u8 { + const INPUT_FULL = 1; // 1 to 4 unknown - const OUTPUT_EMPTY = 1 << 5, + const OUTPUT_EMPTY = 1 << 5; // 6 and 7 unknown } } @@ -88,7 +88,7 @@ impl<T: Io<Value = u8>> SerialPort<T> { } pub fn receive(&mut self) { - while self.line_sts().contains(INPUT_FULL) { + while self.line_sts().contains(LineStsFlags::INPUT_FULL) { debug_input(self.data.read()); } } @@ -96,15 +96,15 @@ impl<T: Io<Value = u8>> SerialPort<T> { pub fn send(&mut self, data: u8) { match data { 8 | 0x7F => { - while ! self.line_sts().contains(OUTPUT_EMPTY) {} + while ! self.line_sts().contains(LineStsFlags::OUTPUT_EMPTY) {} self.data.write(8); - while ! self.line_sts().contains(OUTPUT_EMPTY) {} + while ! self.line_sts().contains(LineStsFlags::OUTPUT_EMPTY) {} self.data.write(b' '); - while ! self.line_sts().contains(OUTPUT_EMPTY) {} + while ! self.line_sts().contains(LineStsFlags::OUTPUT_EMPTY) {} self.data.write(8); }, _ => { - while ! self.line_sts().contains(OUTPUT_EMPTY) {} + while ! self.line_sts().contains(LineStsFlags::OUTPUT_EMPTY) {} self.data.write(data); } } diff --git a/src/scheme/user.rs b/src/scheme/user.rs index 82ef64b4..1a389afe 100644 --- a/src/scheme/user.rs +++ b/src/scheme/user.rs @@ -5,7 +5,8 @@ use core::sync::atomic::{AtomicU64, Ordering}; use core::{mem, slice, usize}; use spin::{Mutex, RwLock}; -use paging::{InactivePageTable, Page, VirtualAddress, entry}; +use paging::{InactivePageTable, Page, VirtualAddress}; +use paging::entry::EntryFlags; use paging::temporary_page::TemporaryPage; use context::{self, Context}; use context::memory::Grant; @@ -100,9 +101,9 @@ impl UserInner { let full_size = ((offset + size + 4095)/4096) * 4096; let mut to_address = ::USER_GRANT_OFFSET; - let mut flags = entry::PRESENT | entry::NO_EXECUTE | entry::USER_ACCESSIBLE; + let mut flags = EntryFlags::PRESENT | EntryFlags::NO_EXECUTE | EntryFlags::USER_ACCESSIBLE; if writable { - flags |= entry::WRITABLE; + flags |= EntryFlags::WRITABLE; } for i in 0 .. grants.len() { diff --git a/src/syscall/driver.rs b/src/syscall/driver.rs index 30f44921..5ccfa47c 100644 --- a/src/syscall/driver.rs +++ b/src/syscall/driver.rs @@ -1,6 +1,7 @@ use interrupt::syscall::SyscallStack; use memory::{allocate_frames, deallocate_frames, Frame}; -use paging::{entry, ActivePageTable, PhysicalAddress, VirtualAddress}; +use paging::{ActivePageTable, PhysicalAddress, VirtualAddress}; +use paging::entry::EntryFlags; use context; use context::memory::Grant; use syscall::error::{Error, EFAULT, EINVAL, ENOMEM, EPERM, ESRCH, Result}; @@ -61,12 +62,12 @@ pub fn physmap(physical_address: usize, size: usize, flags: usize) -> Result<usi let full_size = ((offset + size + 4095)/4096) * 4096; let mut to_address = ::USER_GRANT_OFFSET; - let mut entry_flags = entry::PRESENT | entry::NO_EXECUTE | entry::USER_ACCESSIBLE; + let mut entry_flags = EntryFlags::PRESENT | EntryFlags::NO_EXECUTE | EntryFlags::USER_ACCESSIBLE; if flags & MAP_WRITE == MAP_WRITE { - entry_flags |= entry::WRITABLE; + entry_flags |= EntryFlags::WRITABLE; } if flags & MAP_WRITE_COMBINE == MAP_WRITE_COMBINE { - entry_flags |= entry::HUGE_PAGE; + entry_flags |= EntryFlags::HUGE_PAGE; } for i in 0 .. grants.len() { diff --git a/src/syscall/process.rs b/src/syscall/process.rs index 8a56b24f..4832d05f 100644 --- a/src/syscall/process.rs +++ b/src/syscall/process.rs @@ -8,7 +8,8 @@ use core::ops::DerefMut; use spin::Mutex; use memory::allocate_frames; -use paging::{ActivePageTable, InactivePageTable, Page, VirtualAddress, entry}; +use paging::{ActivePageTable, InactivePageTable, Page, VirtualAddress}; +use paging::entry::EntryFlags; use paging::temporary_page::TemporaryPage; use start::usermode; use interrupt; @@ -145,7 +146,7 @@ pub fn clone(flags: usize, stack_base: usize) -> Result<ContextId> { let mut new_memory = context::memory::Memory::new( VirtualAddress::new(memory.start_address().get() + ::USER_TMP_OFFSET), memory.size(), - entry::PRESENT | entry::NO_EXECUTE | entry::WRITABLE, + EntryFlags::PRESENT | EntryFlags::NO_EXECUTE | EntryFlags::WRITABLE, false ); @@ -165,7 +166,7 @@ pub fn clone(flags: usize, stack_base: usize) -> Result<ContextId> { let mut new_heap = context::memory::Memory::new( VirtualAddress::new(::USER_TMP_HEAP_OFFSET), heap.size(), - entry::PRESENT | entry::NO_EXECUTE | entry::WRITABLE, + EntryFlags::PRESENT | EntryFlags::NO_EXECUTE | EntryFlags::WRITABLE, false ); @@ -185,7 +186,7 @@ pub fn clone(flags: usize, stack_base: usize) -> Result<ContextId> { let mut new_stack = context::memory::Memory::new( VirtualAddress::new(::USER_TMP_STACK_OFFSET), stack.size(), - entry::PRESENT | entry::NO_EXECUTE | entry::WRITABLE, + EntryFlags::PRESENT | EntryFlags::NO_EXECUTE | EntryFlags::WRITABLE, false ); @@ -203,7 +204,7 @@ pub fn clone(flags: usize, stack_base: usize) -> Result<ContextId> { let mut new_sigstack = context::memory::Memory::new( VirtualAddress::new(::USER_TMP_SIGSTACK_OFFSET), sigstack.size(), - entry::PRESENT | entry::NO_EXECUTE | entry::WRITABLE, + EntryFlags::PRESENT | EntryFlags::NO_EXECUTE | EntryFlags::WRITABLE, false ); @@ -224,7 +225,7 @@ pub fn clone(flags: usize, stack_base: usize) -> Result<ContextId> { mem: context::memory::Memory::new( VirtualAddress::new(::USER_TMP_TLS_OFFSET), tls.mem.size(), - entry::PRESENT | entry::NO_EXECUTE | entry::WRITABLE, + EntryFlags::PRESENT | EntryFlags::NO_EXECUTE | EntryFlags::WRITABLE, true ), offset: tls.offset, @@ -418,7 +419,7 @@ pub fn clone(flags: usize, stack_base: usize) -> Result<ContextId> { for page in Page::range_inclusive(start_page, end_page) { let frame = active_table.translate_page(page).expect("kernel percpu not mapped"); active_table.with(&mut new_table, &mut temporary_page, |mapper| { - let result = mapper.map_to(page, frame, entry::PRESENT | entry::NO_EXECUTE | entry::WRITABLE); + let result = mapper.map_to(page, frame, EntryFlags::PRESENT | EntryFlags::NO_EXECUTE | EntryFlags::WRITABLE); // Ignore result due to operating on inactive table unsafe { result.ignore(); } }); @@ -634,7 +635,7 @@ pub fn exec(path: &[u8], arg_ptrs: &[[usize; 2]]) -> Result<usize> { let mut memory = context::memory::Memory::new( VirtualAddress::new(vaddr as usize), segment.p_memsz as usize + voff as usize, - entry::NO_EXECUTE | entry::WRITABLE, + EntryFlags::NO_EXECUTE | EntryFlags::WRITABLE, true ); @@ -645,17 +646,17 @@ pub fn exec(path: &[u8], arg_ptrs: &[[usize; 2]]) -> Result<usize> { segment.p_filesz as usize); } - let mut flags = entry::NO_EXECUTE | entry::USER_ACCESSIBLE; + let mut flags = EntryFlags::NO_EXECUTE | EntryFlags::USER_ACCESSIBLE; if segment.p_flags & program_header::PF_R == program_header::PF_R { - flags.insert(entry::PRESENT); + flags.insert(EntryFlags::PRESENT); } // W ^ X. If it is executable, do not allow it to be writable, even if requested if segment.p_flags & program_header::PF_X == program_header::PF_X { - flags.remove(entry::NO_EXECUTE); + flags.remove(EntryFlags::NO_EXECUTE); } else if segment.p_flags & program_header::PF_W == program_header::PF_W { - flags.insert(entry::WRITABLE); + flags.insert(EntryFlags::WRITABLE); } memory.remap(flags); @@ -665,7 +666,7 @@ pub fn exec(path: &[u8], arg_ptrs: &[[usize; 2]]) -> Result<usize> { let memory = context::memory::Memory::new( VirtualAddress::new(::USER_TCB_OFFSET), 4096, - entry::NO_EXECUTE | entry::WRITABLE | entry::USER_ACCESSIBLE, + EntryFlags::NO_EXECUTE | EntryFlags::WRITABLE | EntryFlags::USER_ACCESSIBLE, true ); let rounded_size = ((segment.p_memsz + 4095)/4096) * 4096; @@ -688,7 +689,7 @@ pub fn exec(path: &[u8], arg_ptrs: &[[usize; 2]]) -> Result<usize> { context.heap = Some(context::memory::Memory::new( VirtualAddress::new(::USER_HEAP_OFFSET), 0, - entry::NO_EXECUTE | entry::WRITABLE | entry::USER_ACCESSIBLE, + EntryFlags::NO_EXECUTE | EntryFlags::WRITABLE | EntryFlags::USER_ACCESSIBLE, true ).to_shared()); @@ -696,7 +697,7 @@ pub fn exec(path: &[u8], arg_ptrs: &[[usize; 2]]) -> Result<usize> { context.stack = Some(context::memory::Memory::new( VirtualAddress::new(::USER_STACK_OFFSET), ::USER_STACK_SIZE, - entry::NO_EXECUTE | entry::WRITABLE | entry::USER_ACCESSIBLE, + EntryFlags::NO_EXECUTE | EntryFlags::WRITABLE | EntryFlags::USER_ACCESSIBLE, true )); @@ -704,7 +705,7 @@ pub fn exec(path: &[u8], arg_ptrs: &[[usize; 2]]) -> Result<usize> { context.sigstack = Some(context::memory::Memory::new( VirtualAddress::new(::USER_SIGSTACK_OFFSET), ::USER_SIGSTACK_SIZE, - entry::NO_EXECUTE | entry::WRITABLE | entry::USER_ACCESSIBLE, + EntryFlags::NO_EXECUTE | EntryFlags::WRITABLE | EntryFlags::USER_ACCESSIBLE, true )); @@ -716,7 +717,7 @@ pub fn exec(path: &[u8], arg_ptrs: &[[usize; 2]]) -> Result<usize> { mem: context::memory::Memory::new( VirtualAddress::new(::USER_TLS_OFFSET), size, - entry::NO_EXECUTE | entry::WRITABLE | entry::USER_ACCESSIBLE, + EntryFlags::NO_EXECUTE | EntryFlags::WRITABLE | EntryFlags::USER_ACCESSIBLE, true ), offset: offset, @@ -747,7 +748,7 @@ pub fn exec(path: &[u8], arg_ptrs: &[[usize; 2]]) -> Result<usize> { let mut memory = context::memory::Memory::new( VirtualAddress::new(::USER_ARG_OFFSET), arg_size, - entry::NO_EXECUTE | entry::WRITABLE, + EntryFlags::NO_EXECUTE | EntryFlags::WRITABLE, true ); @@ -762,7 +763,7 @@ pub fn exec(path: &[u8], arg_ptrs: &[[usize; 2]]) -> Result<usize> { arg_offset += arg.len(); } - memory.remap(entry::NO_EXECUTE | entry::USER_ACCESSIBLE); + memory.remap(EntryFlags::NO_EXECUTE | EntryFlags::USER_ACCESSIBLE); context.image.push(memory.to_shared()); } diff --git a/src/syscall/validate.rs b/src/syscall/validate.rs index 89747843..9186b905 100644 --- a/src/syscall/validate.rs +++ b/src/syscall/validate.rs @@ -1,9 +1,10 @@ use core::{mem, slice}; -use paging::{ActivePageTable, Page, VirtualAddress, entry}; +use paging::{ActivePageTable, Page, VirtualAddress}; +use paging::entry::EntryFlags; use syscall::error::*; -fn validate(address: usize, size: usize, flags: entry::EntryFlags) -> Result<()> { +fn validate(address: usize, size: usize, flags: EntryFlags) -> Result<()> { let active_table = unsafe { ActivePageTable::new() }; let start_page = Page::containing_address(VirtualAddress::new(address)); @@ -28,7 +29,7 @@ pub fn validate_slice<T>(ptr: *const T, len: usize) -> Result<&'static [T]> { if len == 0 { Ok(&[]) } else { - validate(ptr as usize, len * mem::size_of::<T>(), entry::PRESENT /* TODO | entry::USER_ACCESSIBLE */)?; + validate(ptr as usize, len * mem::size_of::<T>(), EntryFlags::PRESENT /* TODO | EntryFlags::USER_ACCESSIBLE */)?; Ok(unsafe { slice::from_raw_parts(ptr, len) }) } } @@ -38,7 +39,7 @@ pub fn validate_slice_mut<T>(ptr: *mut T, len: usize) -> Result<&'static mut [T] if len == 0 { Ok(&mut []) } else { - validate(ptr as usize, len * mem::size_of::<T>(), entry::PRESENT | entry::WRITABLE /* TODO | entry::USER_ACCESSIBLE */)?; + validate(ptr as usize, len * mem::size_of::<T>(), EntryFlags::PRESENT | EntryFlags::WRITABLE /* TODO | EntryFlags::USER_ACCESSIBLE */)?; Ok(unsafe { slice::from_raw_parts_mut(ptr, len) }) } } -- GitLab