From 4ac48b5f1ec70c7feb8f76e0e902fab1dfcbcc77 Mon Sep 17 00:00:00 2001 From: Danny Milosavljevic Date: Sat, 24 Apr 2021 01:37:28 +0200 Subject: [PATCH 01/13] Rome: Init all the text output drivers automatically. Signed-off-by: Danny Milosavljevic --- src/mainboard/amd/romecrb/src/mainboard.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/mainboard/amd/romecrb/src/mainboard.rs b/src/mainboard/amd/romecrb/src/mainboard.rs index aa56303cb3..386a4cb391 100644 --- a/src/mainboard/amd/romecrb/src/mainboard.rs +++ b/src/mainboard/amd/romecrb/src/mainboard.rs @@ -182,6 +182,10 @@ impl Driver for MainBoard { // IOHC::IOAPIC_BASE_ADDR_LO smn_write(0x13B1_02f0, 0xFEC0_0001); + for driver in self.text_output_drivers().iter_mut() { + driver.init()?; + } + Ok(()) } } From 919a140f42f8a87ff5cb214ce04a7de86a583e74 Mon Sep 17 00:00:00 2001 From: Danny Milosavljevic Date: Fri, 23 Apr 2021 23:49:14 +0200 Subject: [PATCH 02/13] Rome: Add default IDT (for testing). Signed-off-by: Danny Milosavljevic --- src/mainboard/amd/romecrb/Cargo.lock | 16 ++++++++++ src/mainboard/amd/romecrb/Cargo.toml | 5 ++++ src/mainboard/amd/romecrb/src/interrupts.rs | 33 +++++++++++++++++++++ src/mainboard/amd/romecrb/src/main.rs | 9 ++++++ 4 files changed, 63 insertions(+) create mode 100644 src/mainboard/amd/romecrb/src/interrupts.rs diff --git a/src/mainboard/amd/romecrb/Cargo.lock b/src/mainboard/amd/romecrb/Cargo.lock index d4981dea4f..21ccfc214f 100644 --- a/src/mainboard/amd/romecrb/Cargo.lock +++ b/src/mainboard/amd/romecrb/Cargo.lock @@ -168,6 +168,15 @@ dependencies = [ "stable_deref_trait", ] +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +dependencies = [ + "spin", +] + [[package]] name = "model" version = "0.1.0" @@ -269,6 +278,7 @@ dependencies = [ "cpu", "df", "heapless 0.4.4", + "lazy_static", "model", "payloads", "postcard", @@ -324,6 +334,12 @@ dependencies = [ "vcell", ] +[[package]] +name = "spin" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" + [[package]] name = "stable_deref_trait" version = "1.1.1" diff --git a/src/mainboard/amd/romecrb/Cargo.toml b/src/mainboard/amd/romecrb/Cargo.toml index 8b668b2941..b6e7839db4 100644 --- a/src/mainboard/amd/romecrb/Cargo.toml +++ b/src/mainboard/amd/romecrb/Cargo.toml @@ -25,8 +25,13 @@ register = "0.3.2" static-ref = "0.1.1" postcard = "0.4.3" vcell = "0.1.2" +# TODO: 0.13.2 ? x86_64 = "0.12.2" +[dependencies.lazy_static] +version = "1.0" +features = ["spin_no_std"] + [dependencies.uart] path = "../../../drivers/uart" features = ["i8250", "debug_port", "amdmmio"] diff --git a/src/mainboard/amd/romecrb/src/interrupts.rs b/src/mainboard/amd/romecrb/src/interrupts.rs new file mode 100644 index 0000000000..169a46c098 --- /dev/null +++ b/src/mainboard/amd/romecrb/src/interrupts.rs @@ -0,0 +1,33 @@ +#![feature(llvm_asm)] + +use x86_64::structures::idt::InterruptDescriptorTable; +use x86_64::structures::idt::InterruptStackFrame; +use lazy_static::lazy_static; + +unsafe fn outl(port: u16, val: u32) { + llvm_asm!("outl %eax, %dx" :: "{dx}"(port), "{al}"(val)); +} + +extern "x86-interrupt" fn breakpoint_handler(stack_frame: &mut InterruptStackFrame) { + unsafe { + outl(0x80, 0x11); + } + panic!("Exception: Breakpoint.\r\n{:#?}", stack_frame); +} + +extern "x86-interrupt" fn double_fault_handler(stack_frame: &mut InterruptStackFrame, _error_code: u64) -> ! { + panic!("Exception: Double fault.\r\n{:#?}", stack_frame); +} + +lazy_static! { + static ref IDT: InterruptDescriptorTable = { + let mut idt = InterruptDescriptorTable::new(); + idt.breakpoint.set_handler_fn(breakpoint_handler); + idt.double_fault.set_handler_fn(double_fault_handler); + idt + }; +} + +pub fn init_idt() { + IDT.load(); +} diff --git a/src/mainboard/amd/romecrb/src/main.rs b/src/mainboard/amd/romecrb/src/main.rs index 435ad79973..8edf7b73d2 100644 --- a/src/mainboard/amd/romecrb/src/main.rs +++ b/src/mainboard/amd/romecrb/src/main.rs @@ -3,6 +3,7 @@ #![no_std] #![no_main] #![feature(global_asm)] +#![feature(abi_x86_interrupt)] use arch::ioport::IOPort; use boot::boot; @@ -26,6 +27,8 @@ mod c00; use c00::c00; use wrappers::DoD; use x86_64::registers::model_specific::Msr; +mod interrupts; +use interrupts::init_idt; use core::ptr; @@ -128,6 +131,12 @@ fn start_bootstrap_core(fdt_address: usize) -> ! { } let w = &mut print::WriteToDyn::new(console); + init_idt(); + + /*unsafe { + llvm_asm!("int3" :::: "volatile"); + }*/ + // Logging. smnhack(w, 0x13B1_02F4, 0x00000000u32); smnhack(w, 0x13B1_02F0, 0xc9280001u32); From fd3ba7f0fa38f741a95985774a717f91a9fa7cbe Mon Sep 17 00:00:00 2001 From: Danny Milosavljevic Date: Thu, 15 Apr 2021 21:43:01 +0200 Subject: [PATCH 03/13] Rome: Try avoiding lazy_static for now. Signed-off-by: Danny Milosavljevic --- src/mainboard/amd/romecrb/src/interrupts.rs | 30 ++++++++++++++------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/src/mainboard/amd/romecrb/src/interrupts.rs b/src/mainboard/amd/romecrb/src/interrupts.rs index 169a46c098..71164cf29e 100644 --- a/src/mainboard/amd/romecrb/src/interrupts.rs +++ b/src/mainboard/amd/romecrb/src/interrupts.rs @@ -1,8 +1,8 @@ #![feature(llvm_asm)] +use lazy_static::lazy_static; use x86_64::structures::idt::InterruptDescriptorTable; use x86_64::structures::idt::InterruptStackFrame; -use lazy_static::lazy_static; unsafe fn outl(port: u16, val: u32) { llvm_asm!("outl %eax, %dx" :: "{dx}"(port), "{al}"(val)); @@ -19,15 +19,27 @@ extern "x86-interrupt" fn double_fault_handler(stack_frame: &mut InterruptStackF panic!("Exception: Double fault.\r\n{:#?}", stack_frame); } -lazy_static! { - static ref IDT: InterruptDescriptorTable = { - let mut idt = InterruptDescriptorTable::new(); - idt.breakpoint.set_handler_fn(breakpoint_handler); - idt.double_fault.set_handler_fn(double_fault_handler); - idt - }; +extern "x86-interrupt" fn divide_error_handler(stack_frame: &mut InterruptStackFrame) { + panic!("Exception: Division by zero.\r\n{:#?}", stack_frame); } +//lazy_static! { +// static ref IDT: InterruptDescriptorTable = { +// let mut idt = InterruptDescriptorTable::new(); +// idt.breakpoint.set_handler_fn(breakpoint_handler); +// idt.double_fault.set_handler_fn(double_fault_handler); +// idt.divide_error.set_handler_fn(divide_error_handler); +// idt +// }; +//} + pub fn init_idt() { - IDT.load(); + // IDT.load(); + unsafe { + let mut idt = 0x100000 as *mut InterruptDescriptorTable; + (*idt).breakpoint.set_handler_fn(breakpoint_handler); + (*idt).double_fault.set_handler_fn(double_fault_handler); + (*idt).divide_error.set_handler_fn(divide_error_handler); + (*idt).load(); + } } From c288d36ba5755fd2ae982da3ea6c89afc539217c Mon Sep 17 00:00:00 2001 From: Danny Milosavljevic Date: Thu, 15 Apr 2021 23:08:40 +0200 Subject: [PATCH 04/13] Rome: Add interrupt handler. Signed-off-by: Danny Milosavljevic --- src/mainboard/amd/romecrb/src/interrupts.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/mainboard/amd/romecrb/src/interrupts.rs b/src/mainboard/amd/romecrb/src/interrupts.rs index 71164cf29e..e088158ed9 100644 --- a/src/mainboard/amd/romecrb/src/interrupts.rs +++ b/src/mainboard/amd/romecrb/src/interrupts.rs @@ -23,6 +23,10 @@ extern "x86-interrupt" fn divide_error_handler(stack_frame: &mut InterruptStackF panic!("Exception: Division by zero.\r\n{:#?}", stack_frame); } +extern "x86-interrupt" fn interrupt_handler(stack_frame: &mut InterruptStackFrame) { + panic!("Interrupt.\r\n{:#?}", stack_frame); +} + //lazy_static! { // static ref IDT: InterruptDescriptorTable = { // let mut idt = InterruptDescriptorTable::new(); @@ -40,6 +44,7 @@ pub fn init_idt() { (*idt).breakpoint.set_handler_fn(breakpoint_handler); (*idt).double_fault.set_handler_fn(double_fault_handler); (*idt).divide_error.set_handler_fn(divide_error_handler); + (*idt)[32].set_handler_fn(interrupt_handler); (*idt).load(); } } From 23fa559a4c644379479ffb43b165416f7b9c6b05 Mon Sep 17 00:00:00 2001 From: Danny Milosavljevic Date: Thu, 15 Apr 2021 23:09:26 +0200 Subject: [PATCH 05/13] Rome: Rename outl to "outb" and mark it safe. Signed-off-by: Danny Milosavljevic --- src/mainboard/amd/romecrb/src/interrupts.rs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/mainboard/amd/romecrb/src/interrupts.rs b/src/mainboard/amd/romecrb/src/interrupts.rs index e088158ed9..5949939720 100644 --- a/src/mainboard/amd/romecrb/src/interrupts.rs +++ b/src/mainboard/amd/romecrb/src/interrupts.rs @@ -4,13 +4,15 @@ use lazy_static::lazy_static; use x86_64::structures::idt::InterruptDescriptorTable; use x86_64::structures::idt::InterruptStackFrame; -unsafe fn outl(port: u16, val: u32) { - llvm_asm!("outl %eax, %dx" :: "{dx}"(port), "{al}"(val)); +fn outb(port: u16, val: u8) { + unsafe { + llvm_asm!("outb %al, %dx" :: "{dx}"(port), "{al}"(val)); + } } extern "x86-interrupt" fn breakpoint_handler(stack_frame: &mut InterruptStackFrame) { unsafe { - outl(0x80, 0x11); + outb(0x80, 0x11); } panic!("Exception: Breakpoint.\r\n{:#?}", stack_frame); } From ccfb2b78e145de6cdb75cef8b12a1fdaa7e7acfd Mon Sep 17 00:00:00 2001 From: Danny Milosavljevic Date: Fri, 16 Apr 2021 20:34:38 +0200 Subject: [PATCH 06/13] Rome: Init the PICs, then mask all their interrupts. Signed-off-by: Danny Milosavljevic --- src/mainboard/amd/romecrb/src/interrupts.rs | 24 +++++++++++++++++++++ src/mainboard/amd/romecrb/src/main.rs | 8 ++++++- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/mainboard/amd/romecrb/src/interrupts.rs b/src/mainboard/amd/romecrb/src/interrupts.rs index 5949939720..dff928b132 100644 --- a/src/mainboard/amd/romecrb/src/interrupts.rs +++ b/src/mainboard/amd/romecrb/src/interrupts.rs @@ -50,3 +50,27 @@ pub fn init_idt() { (*idt).load(); } } + +pub fn init_pics() { + // Topology: CPU <- PIC A <- PIC B + + // Initialize both PICs + outb(0x20, 0x11); // PIC A: ICW4 needed; ICW1 is being issued; edge trigger mode + outb(0xA0, 0x11); // PIC B: ICW4 needed; ICW1 is being issued; edge trigger mode + + // Set bases of both PICs + outb(0x21, 0x20); // PIC A: first interrupt is 0x20 + outb(0xA1, 0x28); // PIC B: first interrupt is 0x28 + + // Set up PIC cascade + outb(0x21, 0x04); // PIC A's third input (input #2) is what PIC B's uplink is connected to + outb(0xA1, 0x02); + + // Set 80x86 mode on both PICs + outb(0x21, 0x01); // PIC A: Set to 80x86 mode + outb(0xA1, 0x01); // PIC B: Set to 80x86 mode + + // Mask all interrupts + outb(0x21, 0xFB); // PIC A: Mask all interrupts except the one caused by PIC B (Rationale: if someone unmasks a regular interrupt in the PIC, the PIC cascade is an implementation detail and thus the user shouldn't need to set it manually) + outb(0xA1, 0xFF); // PIC B: Mask all interrupts +} diff --git a/src/mainboard/amd/romecrb/src/main.rs b/src/mainboard/amd/romecrb/src/main.rs index 8edf7b73d2..2dcbff4766 100644 --- a/src/mainboard/amd/romecrb/src/main.rs +++ b/src/mainboard/amd/romecrb/src/main.rs @@ -28,7 +28,7 @@ use c00::c00; use wrappers::DoD; use x86_64::registers::model_specific::Msr; mod interrupts; -use interrupts::init_idt; +use interrupts::{init_idt, init_pics}; use core::ptr; @@ -131,8 +131,14 @@ fn start_bootstrap_core(fdt_address: usize) -> ! { } let w = &mut print::WriteToDyn::new(console); + init_pics(); init_idt(); + /* + unsafe { + llvm_asm!("mov %ebx, 0\ndiv %ebx" :::: "volatile"); + } + */ /*unsafe { llvm_asm!("int3" :::: "volatile"); }*/ From 2852e4ae7ff5a669e78037436667e8fc6b9e2d89 Mon Sep 17 00:00:00 2001 From: Danny Milosavljevic Date: Fri, 7 May 2021 20:20:53 +0200 Subject: [PATCH 07/13] AMD: Update x86_64 dependency to 0.14.0. Signed-off-by: Danny Milosavljevic --- src/mainboard/amd/romecrb/Cargo.toml | 3 +-- src/mainboard/asrock/a300m-stx/Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/mainboard/amd/romecrb/Cargo.toml b/src/mainboard/amd/romecrb/Cargo.toml index b6e7839db4..04c77bad1e 100644 --- a/src/mainboard/amd/romecrb/Cargo.toml +++ b/src/mainboard/amd/romecrb/Cargo.toml @@ -25,8 +25,7 @@ register = "0.3.2" static-ref = "0.1.1" postcard = "0.4.3" vcell = "0.1.2" -# TODO: 0.13.2 ? -x86_64 = "0.12.2" +x86_64 = "0.14.0" [dependencies.lazy_static] version = "1.0" diff --git a/src/mainboard/asrock/a300m-stx/Cargo.toml b/src/mainboard/asrock/a300m-stx/Cargo.toml index 82b71c80a4..774fd4bc10 100644 --- a/src/mainboard/asrock/a300m-stx/Cargo.toml +++ b/src/mainboard/asrock/a300m-stx/Cargo.toml @@ -23,7 +23,7 @@ register = "0.3.2" static-ref = "0.1.1" postcard = "0.4.3" vcell = "0.1.2" -x86_64 = "0.12.2" +x86_64 = "0.14.0" [dependencies.uart] path = "../../../drivers/uart" From 0bc4b4cb7f653e594297b079ffa7bc8162a0952a Mon Sep 17 00:00:00 2001 From: Danny Milosavljevic Date: Fri, 7 May 2021 20:22:22 +0200 Subject: [PATCH 08/13] AMD bootblock: Do not overwrite %esp. Signed-off-by: Danny Milosavljevic --- src/soc/amd/common/boot/src/bootblock.S | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/soc/amd/common/boot/src/bootblock.S b/src/soc/amd/common/boot/src/bootblock.S index 5df64d9e5b..ae3eef97c4 100644 --- a/src/soc/amd/common/boot/src/bootblock.S +++ b/src/soc/amd/common/boot/src/bootblock.S @@ -175,8 +175,8 @@ __protected_start_no_load_segs: // Set a pointer to the page table pages in %cr3. // We can use cr3 as a scratch register here; // its value won't matter until we set PG in CR0 below. - movl $pml4, %esp - movl %esp, %cr3 + movl $pml4, %eax + movl %eax, %cr3 // Now for the big fun: Long Mode. // Once again we put the data structures inline in this From 27aea9bb3f8feae311d508a60b69cf324c953ea6 Mon Sep 17 00:00:00 2001 From: Danny Milosavljevic Date: Fri, 7 May 2021 20:23:04 +0200 Subject: [PATCH 09/13] AMD Rome: Make exceptions work--and test it with a "divide error" exception. Signed-off-by: Danny Milosavljevic --- src/mainboard/amd/romecrb/src/interrupts.rs | 42 ++++++++++++++------- 1 file changed, 28 insertions(+), 14 deletions(-) diff --git a/src/mainboard/amd/romecrb/src/interrupts.rs b/src/mainboard/amd/romecrb/src/interrupts.rs index dff928b132..fd73e6547d 100644 --- a/src/mainboard/amd/romecrb/src/interrupts.rs +++ b/src/mainboard/amd/romecrb/src/interrupts.rs @@ -1,8 +1,8 @@ -#![feature(llvm_asm)] - use lazy_static::lazy_static; +use x86_64::structures::idt::EntryOptions; use x86_64::structures::idt::InterruptDescriptorTable; use x86_64::structures::idt::InterruptStackFrame; +use x86_64::PrivilegeLevel; fn outb(port: u16, val: u8) { unsafe { @@ -10,45 +10,59 @@ fn outb(port: u16, val: u8) { } } -extern "x86-interrupt" fn breakpoint_handler(stack_frame: &mut InterruptStackFrame) { - unsafe { - outb(0x80, 0x11); - } +extern "x86-interrupt" fn breakpoint_handler(stack_frame: InterruptStackFrame) { panic!("Exception: Breakpoint.\r\n{:#?}", stack_frame); } -extern "x86-interrupt" fn double_fault_handler(stack_frame: &mut InterruptStackFrame, _error_code: u64) -> ! { +extern "x86-interrupt" fn double_fault_handler(stack_frame: InterruptStackFrame, _error_code: u64) -> ! { panic!("Exception: Double fault.\r\n{:#?}", stack_frame); + arch::halt(); } -extern "x86-interrupt" fn divide_error_handler(stack_frame: &mut InterruptStackFrame) { +extern "x86-interrupt" fn general_protection_fault_handler(stack_frame: InterruptStackFrame, _error_code: u64) { + panic!("Exception: General protection fault.\r\n{:#?}", stack_frame); +} + +extern "x86-interrupt" fn divide_error_handler(stack_frame: InterruptStackFrame) { panic!("Exception: Division by zero.\r\n{:#?}", stack_frame); } -extern "x86-interrupt" fn interrupt_handler(stack_frame: &mut InterruptStackFrame) { +extern "x86-interrupt" fn interrupt_handler(stack_frame: InterruptStackFrame) { panic!("Interrupt.\r\n{:#?}", stack_frame); } + //lazy_static! { // static ref IDT: InterruptDescriptorTable = { // let mut idt = InterruptDescriptorTable::new(); // idt.breakpoint.set_handler_fn(breakpoint_handler); // idt.double_fault.set_handler_fn(double_fault_handler); +// idt.general_protection_fault.set_handler_fn(general_protection_fault_handler); // idt.divide_error.set_handler_fn(divide_error_handler); +// idt[32].set_handler_fn(interrupt_handler); // idt // }; //} pub fn init_idt() { - // IDT.load(); +// IDT.load(); + unsafe { let mut idt = 0x100000 as *mut InterruptDescriptorTable; - (*idt).breakpoint.set_handler_fn(breakpoint_handler); - (*idt).double_fault.set_handler_fn(double_fault_handler); - (*idt).divide_error.set_handler_fn(divide_error_handler); - (*idt)[32].set_handler_fn(interrupt_handler); + (*idt) = InterruptDescriptorTable::new(); + (*idt).breakpoint.set_handler_fn(breakpoint_handler).set_privilege_level(PrivilegeLevel::Ring0); + (*idt).double_fault.set_handler_fn(double_fault_handler).set_privilege_level(PrivilegeLevel::Ring0); + (*idt).general_protection_fault.set_handler_fn(general_protection_fault_handler).set_privilege_level(PrivilegeLevel::Ring0); + (*idt).divide_error.set_handler_fn(divide_error_handler).set_privilege_level(PrivilegeLevel::Ring0); + //(*idt)[32].set_handler_fn(interrupt_handler); + unsafe { llvm_asm!("nop" :::: "volatile") } (*idt).load(); + unsafe { llvm_asm!("nop" :::: "volatile") } } + unsafe { + llvm_asm!("xorl %ebx, %ebx\ndiv %ebx" : /* no outputs */ : /* no inputs */ : "ebx" : "volatile"); + } + panic!("X"); } pub fn init_pics() { From 878d93c5041085cc212383451044f5c42efbfa38 Mon Sep 17 00:00:00 2001 From: Danny Milosavljevic Date: Fri, 7 May 2021 20:44:18 +0200 Subject: [PATCH 10/13] AMD Rome: Remove compiler barrier around LIDT. Signed-off-by: Danny Milosavljevic --- src/mainboard/amd/romecrb/src/interrupts.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/mainboard/amd/romecrb/src/interrupts.rs b/src/mainboard/amd/romecrb/src/interrupts.rs index fd73e6547d..495589a106 100644 --- a/src/mainboard/amd/romecrb/src/interrupts.rs +++ b/src/mainboard/amd/romecrb/src/interrupts.rs @@ -55,9 +55,7 @@ pub fn init_idt() { (*idt).general_protection_fault.set_handler_fn(general_protection_fault_handler).set_privilege_level(PrivilegeLevel::Ring0); (*idt).divide_error.set_handler_fn(divide_error_handler).set_privilege_level(PrivilegeLevel::Ring0); //(*idt)[32].set_handler_fn(interrupt_handler); - unsafe { llvm_asm!("nop" :::: "volatile") } (*idt).load(); - unsafe { llvm_asm!("nop" :::: "volatile") } } unsafe { llvm_asm!("xorl %ebx, %ebx\ndiv %ebx" : /* no outputs */ : /* no inputs */ : "ebx" : "volatile"); From aa116c725b636ef325150bafce4866d44bc3a088 Mon Sep 17 00:00:00 2001 From: Danny Milosavljevic Date: Fri, 7 May 2021 20:55:25 +0200 Subject: [PATCH 11/13] AMD Rome: Test software interrupt instead of "divide error" exception. Signed-off-by: Danny Milosavljevic --- src/mainboard/amd/romecrb/src/interrupts.rs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/mainboard/amd/romecrb/src/interrupts.rs b/src/mainboard/amd/romecrb/src/interrupts.rs index 495589a106..6ddd59b8f1 100644 --- a/src/mainboard/amd/romecrb/src/interrupts.rs +++ b/src/mainboard/amd/romecrb/src/interrupts.rs @@ -54,12 +54,13 @@ pub fn init_idt() { (*idt).double_fault.set_handler_fn(double_fault_handler).set_privilege_level(PrivilegeLevel::Ring0); (*idt).general_protection_fault.set_handler_fn(general_protection_fault_handler).set_privilege_level(PrivilegeLevel::Ring0); (*idt).divide_error.set_handler_fn(divide_error_handler).set_privilege_level(PrivilegeLevel::Ring0); - //(*idt)[32].set_handler_fn(interrupt_handler); + (*idt)[0x21].set_handler_fn(interrupt_handler); (*idt).load(); } - unsafe { - llvm_asm!("xorl %ebx, %ebx\ndiv %ebx" : /* no outputs */ : /* no inputs */ : "ebx" : "volatile"); - } + unsafe { + //llvm_asm!("xorl %ebx, %ebx\ndiv %ebx" : /* no outputs */ : /* no inputs */ : "ebx" : "volatile"); + llvm_asm!("int $$0x21" : /* no outputs */ : /* no inputs */ : "ebx" : "volatile"); + } panic!("X"); } From 68b1b0d1e3a5f3bc1a3e0118cffffceb327c1173 Mon Sep 17 00:00:00 2001 From: Danny Milosavljevic Date: Fri, 7 May 2021 21:49:37 +0200 Subject: [PATCH 12/13] AMD Rome: Disable our test code that had caused interrupts and exceptions. Signed-off-by: Danny Milosavljevic --- src/mainboard/amd/romecrb/src/interrupts.rs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/mainboard/amd/romecrb/src/interrupts.rs b/src/mainboard/amd/romecrb/src/interrupts.rs index 6ddd59b8f1..47385774ce 100644 --- a/src/mainboard/amd/romecrb/src/interrupts.rs +++ b/src/mainboard/amd/romecrb/src/interrupts.rs @@ -3,6 +3,7 @@ use x86_64::structures::idt::EntryOptions; use x86_64::structures::idt::InterruptDescriptorTable; use x86_64::structures::idt::InterruptStackFrame; use x86_64::PrivilegeLevel; +use x86_64::instructions; fn outb(port: u16, val: u8) { unsafe { @@ -55,13 +56,16 @@ pub fn init_idt() { (*idt).general_protection_fault.set_handler_fn(general_protection_fault_handler).set_privilege_level(PrivilegeLevel::Ring0); (*idt).divide_error.set_handler_fn(divide_error_handler).set_privilege_level(PrivilegeLevel::Ring0); (*idt)[0x21].set_handler_fn(interrupt_handler); + for i in 32..256 { + (*idt)[i].set_handler_fn(interrupt_handler); + } (*idt).load(); + x86_64::instructions::interrupts::enable(); } unsafe { //llvm_asm!("xorl %ebx, %ebx\ndiv %ebx" : /* no outputs */ : /* no inputs */ : "ebx" : "volatile"); - llvm_asm!("int $$0x21" : /* no outputs */ : /* no inputs */ : "ebx" : "volatile"); + //llvm_asm!("int $$0x21" : /* no outputs */ : /* no inputs */ : "ebx" : "volatile"); } - panic!("X"); } pub fn init_pics() { From 682cc3bb93d0681f2cc30893b2eabc8a864565cb Mon Sep 17 00:00:00 2001 From: Danny Milosavljevic Date: Fri, 7 May 2021 23:07:41 +0200 Subject: [PATCH 13/13] AMD Rome: Upgrade x86_64 slightly. Signed-off-by: Danny Milosavljevic --- src/mainboard/amd/romecrb/Cargo.lock | 4 ++-- src/mainboard/amd/romecrb/Cargo.toml | 5 ++++- src/mainboard/amd/romecrb/src/interrupts.rs | 10 +++++----- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/mainboard/amd/romecrb/Cargo.lock b/src/mainboard/amd/romecrb/Cargo.lock index 21ccfc214f..68bbc3486b 100644 --- a/src/mainboard/amd/romecrb/Cargo.lock +++ b/src/mainboard/amd/romecrb/Cargo.lock @@ -426,9 +426,9 @@ dependencies = [ [[package]] name = "x86_64" -version = "0.12.2" +version = "0.13.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5b4b42dbabe13b69023e1a1407d395f1a1a33df76e9a9efdbe303acc907e292" +checksum = "021b49a4cb0a0d9490265cc169ca816014cbf61d3f3b75424815912977b81871" dependencies = [ "bit_field", "bitflags", diff --git a/src/mainboard/amd/romecrb/Cargo.toml b/src/mainboard/amd/romecrb/Cargo.toml index 04c77bad1e..2255715eb5 100644 --- a/src/mainboard/amd/romecrb/Cargo.toml +++ b/src/mainboard/amd/romecrb/Cargo.toml @@ -25,7 +25,10 @@ register = "0.3.2" static-ref = "0.1.1" postcard = "0.4.3" vcell = "0.1.2" -x86_64 = "0.14.0" + +[dependencies.x86_64] +version = "0.13.5" +features = ["const_fn"] [dependencies.lazy_static] version = "1.0" diff --git a/src/mainboard/amd/romecrb/src/interrupts.rs b/src/mainboard/amd/romecrb/src/interrupts.rs index 47385774ce..108c9549ce 100644 --- a/src/mainboard/amd/romecrb/src/interrupts.rs +++ b/src/mainboard/amd/romecrb/src/interrupts.rs @@ -11,24 +11,24 @@ fn outb(port: u16, val: u8) { } } -extern "x86-interrupt" fn breakpoint_handler(stack_frame: InterruptStackFrame) { +extern "x86-interrupt" fn breakpoint_handler(stack_frame: &mut InterruptStackFrame) { panic!("Exception: Breakpoint.\r\n{:#?}", stack_frame); } -extern "x86-interrupt" fn double_fault_handler(stack_frame: InterruptStackFrame, _error_code: u64) -> ! { +extern "x86-interrupt" fn double_fault_handler(stack_frame: &mut InterruptStackFrame, _error_code: u64) -> ! { panic!("Exception: Double fault.\r\n{:#?}", stack_frame); arch::halt(); } -extern "x86-interrupt" fn general_protection_fault_handler(stack_frame: InterruptStackFrame, _error_code: u64) { +extern "x86-interrupt" fn general_protection_fault_handler(stack_frame: &mut InterruptStackFrame, _error_code: u64) { panic!("Exception: General protection fault.\r\n{:#?}", stack_frame); } -extern "x86-interrupt" fn divide_error_handler(stack_frame: InterruptStackFrame) { +extern "x86-interrupt" fn divide_error_handler(stack_frame: &mut InterruptStackFrame) { panic!("Exception: Division by zero.\r\n{:#?}", stack_frame); } -extern "x86-interrupt" fn interrupt_handler(stack_frame: InterruptStackFrame) { +extern "x86-interrupt" fn interrupt_handler(stack_frame: &mut InterruptStackFrame) { panic!("Interrupt.\r\n{:#?}", stack_frame); } pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy