Update x86_64 crate from 0.14.12 to 0.15.0 (#590)

* Bump x86_64 crate from 0.14.12 to 0.15.0

* Update VirtAddr offset type

* Replace GDT add_entry by append

* Update IDT index type

* Update CR2 read type

* Use Option<InterruptStackFrameValue> for process stack frame
This commit is contained in:
Vincent Ollivier 2024-03-06 09:00:20 +01:00 committed by GitHub
parent f2f64c4512
commit 84d4d2edf4
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 45 additions and 40 deletions

16
Cargo.lock generated
View File

@ -317,7 +317,7 @@ dependencies = [
"time",
"uart_16550",
"vte",
"x86_64",
"x86_64 0.15.0",
]
[[package]]
@ -397,7 +397,7 @@ version = "0.10.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cb844b5b01db1e0b17938685738f113bfc903846f18932b378bc0eabfa40e194"
dependencies = [
"x86_64",
"x86_64 0.14.12",
]
[[package]]
@ -805,3 +805,15 @@ dependencies = [
"rustversion",
"volatile",
]
[[package]]
name = "x86_64"
version = "0.15.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cd9b58dbbd61248db1d7d5b7068fbe91b042e889361fe79fb4fd16a12daa66d3"
dependencies = [
"bit_field",
"bitflags 2.4.1",
"rustversion",
"volatile",
]

View File

@ -41,7 +41,7 @@ spin = "0.9.8"
time = { version = "0.2.27", default-features = false }
uart_16550 = "0.3.0"
vte = "0.13.0"
x86_64 = "0.14.12"
x86_64 = "0.15.0"
[package.metadata.bootloader]
physical-memory-offset = "0xFFFF800000000000"

View File

@ -17,19 +17,19 @@ lazy_static! {
let mut tss = TaskStateSegment::new();
tss.privilege_stack_table[0] = {
static mut STACK: [u8; STACK_SIZE] = [0; STACK_SIZE];
VirtAddr::from_ptr(unsafe { &STACK }) + STACK_SIZE
VirtAddr::from_ptr(unsafe { &STACK }) + STACK_SIZE as u64
};
tss.interrupt_stack_table[DOUBLE_FAULT_IST as usize] = {
static mut STACK: [u8; STACK_SIZE] = [0; STACK_SIZE];
VirtAddr::from_ptr(unsafe { &STACK }) + STACK_SIZE
VirtAddr::from_ptr(unsafe { &STACK }) + STACK_SIZE as u64
};
tss.interrupt_stack_table[PAGE_FAULT_IST as usize] = {
static mut STACK: [u8; STACK_SIZE] = [0; STACK_SIZE];
VirtAddr::from_ptr(unsafe { &STACK }) + STACK_SIZE
VirtAddr::from_ptr(unsafe { &STACK }) + STACK_SIZE as u64
};
tss.interrupt_stack_table[GENERAL_PROTECTION_FAULT_IST as usize] = {
static mut STACK: [u8; STACK_SIZE] = [0; STACK_SIZE];
VirtAddr::from_ptr(unsafe { &STACK }) + STACK_SIZE
VirtAddr::from_ptr(unsafe { &STACK }) + STACK_SIZE as u64
};
tss
};
@ -39,11 +39,11 @@ lazy_static! {
pub static ref GDT: (GlobalDescriptorTable, Selectors) = {
let mut gdt = GlobalDescriptorTable::new();
let tss = gdt.add_entry(Descriptor::tss_segment(&TSS));
let code = gdt.add_entry(Descriptor::kernel_code_segment());
let data = gdt.add_entry(Descriptor::kernel_data_segment());
let user_code = gdt.add_entry(Descriptor::user_code_segment());
let user_data = gdt.add_entry(Descriptor::user_data_segment());
let tss = gdt.append(Descriptor::tss_segment(&TSS));
let code = gdt.append(Descriptor::kernel_code_segment());
let data = gdt.append(Descriptor::kernel_data_segment());
let user_code = gdt.append(Descriptor::user_code_segment());
let user_data = gdt.append(Descriptor::user_data_segment());
(
gdt,

View File

@ -55,22 +55,22 @@ lazy_static! {
set_handler_fn(core::mem::transmute(f)).
set_privilege_level(x86_64::PrivilegeLevel::Ring3);
}
idt[interrupt_index(0) as usize].set_handler_fn(irq0_handler);
idt[interrupt_index(1) as usize].set_handler_fn(irq1_handler);
idt[interrupt_index(2) as usize].set_handler_fn(irq2_handler);
idt[interrupt_index(3) as usize].set_handler_fn(irq3_handler);
idt[interrupt_index(4) as usize].set_handler_fn(irq4_handler);
idt[interrupt_index(5) as usize].set_handler_fn(irq5_handler);
idt[interrupt_index(6) as usize].set_handler_fn(irq6_handler);
idt[interrupt_index(7) as usize].set_handler_fn(irq7_handler);
idt[interrupt_index(8) as usize].set_handler_fn(irq8_handler);
idt[interrupt_index(9) as usize].set_handler_fn(irq9_handler);
idt[interrupt_index(10) as usize].set_handler_fn(irq10_handler);
idt[interrupt_index(11) as usize].set_handler_fn(irq11_handler);
idt[interrupt_index(12) as usize].set_handler_fn(irq12_handler);
idt[interrupt_index(13) as usize].set_handler_fn(irq13_handler);
idt[interrupt_index(14) as usize].set_handler_fn(irq14_handler);
idt[interrupt_index(15) as usize].set_handler_fn(irq15_handler);
idt[interrupt_index(0)].set_handler_fn(irq0_handler);
idt[interrupt_index(1)].set_handler_fn(irq1_handler);
idt[interrupt_index(2)].set_handler_fn(irq2_handler);
idt[interrupt_index(3)].set_handler_fn(irq3_handler);
idt[interrupt_index(4)].set_handler_fn(irq4_handler);
idt[interrupt_index(5)].set_handler_fn(irq5_handler);
idt[interrupt_index(6)].set_handler_fn(irq6_handler);
idt[interrupt_index(7)].set_handler_fn(irq7_handler);
idt[interrupt_index(8)].set_handler_fn(irq8_handler);
idt[interrupt_index(9)].set_handler_fn(irq9_handler);
idt[interrupt_index(10)].set_handler_fn(irq10_handler);
idt[interrupt_index(11)].set_handler_fn(irq11_handler);
idt[interrupt_index(12)].set_handler_fn(irq12_handler);
idt[interrupt_index(13)].set_handler_fn(irq13_handler);
idt[interrupt_index(14)].set_handler_fn(irq14_handler);
idt[interrupt_index(15)].set_handler_fn(irq15_handler);
idt
};
}
@ -127,7 +127,7 @@ extern "x86-interrupt" fn page_fault_handler(
error_code: PageFaultErrorCode,
) {
//debug!("EXCEPTION: PAGE FAULT ({:?})", error_code);
let addr = Cr2::read().as_u64();
let addr = Cr2::read().unwrap().as_u64();
let page_table = unsafe { sys::process::page_table() };
let phys_mem_offset = unsafe { sys::mem::PHYS_MEM_OFFSET.unwrap() };

View File

@ -213,13 +213,13 @@ pub fn set_registers(regs: Registers) {
pub fn stack_frame() -> InterruptStackFrameValue {
let table = PROCESS_TABLE.read();
let proc = &table[id()];
proc.stack_frame
proc.stack_frame.unwrap()
}
pub fn set_stack_frame(stack_frame: InterruptStackFrameValue) {
let mut table = PROCESS_TABLE.write();
let proc = &mut table[id()];
proc.stack_frame = stack_frame;
proc.stack_frame = Some(stack_frame);
}
pub fn exit() {
@ -286,7 +286,7 @@ pub struct Process {
stack_addr: u64,
entry_point_addr: u64,
page_table_frame: PhysFrame,
stack_frame: InterruptStackFrameValue,
stack_frame: Option<InterruptStackFrameValue>,
registers: Registers,
data: ProcessData,
allocator: Arc<LockedHeap>,
@ -294,20 +294,13 @@ pub struct Process {
impl Process {
pub fn new() -> Self {
let isf = InterruptStackFrameValue {
instruction_pointer: VirtAddr::new(0),
code_segment: 0,
cpu_flags: 0,
stack_pointer: VirtAddr::new(0),
stack_segment: 0,
};
Self {
id: 0,
parent_id: 0,
code_addr: 0,
stack_addr: 0,
entry_point_addr: 0,
stack_frame: isf,
stack_frame: None,
page_table_frame: Cr3::read().0,
registers: Registers::default(),
data: ProcessData::new("/", None),