mirror of
https://github.com/rcore-os/rCore.git
synced 2024-11-26 09:53:28 +04:00
Use phys_to_virt and virt_to_phys to replace the use of KERNEL_OFFSET
This commit is contained in:
parent
28652ef685
commit
221304d78a
@ -1,20 +1,20 @@
|
|||||||
use super::consts::KERNEL_OFFSET;
|
use crate::memory::phys_to_virt;
|
||||||
|
|
||||||
/// Mask all external interrupt except serial.
|
/// Mask all external interrupt except serial.
|
||||||
pub unsafe fn init_external_interrupt() {
|
pub unsafe fn init_external_interrupt() {
|
||||||
const HART0_S_MODE_INTERRUPT_ENABLES: *mut u64 = (KERNEL_OFFSET + 0x0C00_2080) as *mut u64;
|
const HART0_S_MODE_INTERRUPT_ENABLES: *mut u64 = phys_to_virt(0x0C00_2080) as *mut u64;
|
||||||
// enable all external interrupts
|
// enable all external interrupts
|
||||||
HART0_S_MODE_INTERRUPT_ENABLES.write_volatile(0xf);
|
HART0_S_MODE_INTERRUPT_ENABLES.write_volatile(0xf);
|
||||||
|
|
||||||
// mask interrupts first
|
// mask interrupts first
|
||||||
const AXI_INTC_IER: *mut u32 = (KERNEL_OFFSET + 0x1810_0008) as *mut u32;
|
const AXI_INTC_IER: *mut u32 = phys_to_virt(0x6120_0008) as *mut u32;
|
||||||
AXI_INTC_IER.write_volatile(0x0);
|
AXI_INTC_IER.write_volatile(0x0);
|
||||||
|
|
||||||
// acknowledge all interrupts
|
// acknowledge all interrupts
|
||||||
const AXI_INTC_IAR: *mut u32 = (KERNEL_OFFSET + 0x1810_000C) as *mut u32;
|
const AXI_INTC_IAR: *mut u32 = phys_to_virt(0x6120_000C) as *mut u32;
|
||||||
AXI_INTC_IAR.write_volatile(0xffffffff);
|
AXI_INTC_IAR.write_volatile(0xffffffff);
|
||||||
|
|
||||||
const AXI_INTC_MER: *mut u32 = (KERNEL_OFFSET + 0x1810_001C) as *mut u32;
|
const AXI_INTC_MER: *mut u32 = phys_to_virt(0x6120_001C) as *mut u32;
|
||||||
// Hardware Interrupt enable | Enable irq output
|
// Hardware Interrupt enable | Enable irq output
|
||||||
AXI_INTC_MER.write_volatile(0b11);
|
AXI_INTC_MER.write_volatile(0b11);
|
||||||
|
|
||||||
@ -25,20 +25,19 @@ pub unsafe fn init_external_interrupt() {
|
|||||||
/// Claim and complete external interrupt by reading and writing to
|
/// Claim and complete external interrupt by reading and writing to
|
||||||
/// PLIC Interrupt Claim/Complete Register.
|
/// PLIC Interrupt Claim/Complete Register.
|
||||||
pub unsafe fn handle_external_interrupt() {
|
pub unsafe fn handle_external_interrupt() {
|
||||||
const HART0_S_MODE_INTERRUPT_CLAIM_COMPLETE: *mut u32 =
|
const HART0_S_MODE_INTERRUPT_CLAIM_COMPLETE: *mut u32 = phys_to_virt(0x0C20_1004) as *mut u32;
|
||||||
(KERNEL_OFFSET + 0x0C20_1004) as *mut u32;
|
|
||||||
// claim
|
// claim
|
||||||
let source = HART0_S_MODE_INTERRUPT_CLAIM_COMPLETE.read_volatile();
|
let source = HART0_S_MODE_INTERRUPT_CLAIM_COMPLETE.read_volatile();
|
||||||
// complete
|
// complete
|
||||||
HART0_S_MODE_INTERRUPT_CLAIM_COMPLETE.write_volatile(source);
|
HART0_S_MODE_INTERRUPT_CLAIM_COMPLETE.write_volatile(source);
|
||||||
|
|
||||||
// acknowledge all interrupts
|
// acknowledge all interrupts
|
||||||
const AXI_INTC_IAR: *mut u32 = (KERNEL_OFFSET + 0x1810_000C) as *mut u32;
|
const AXI_INTC_IAR: *mut u32 = phys_to_virt(0x6120_000C) as *mut u32;
|
||||||
AXI_INTC_IAR.write_volatile(0xffffffff);
|
AXI_INTC_IAR.write_volatile(0xffffffff);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub unsafe fn enable_serial_interrupt() {
|
pub unsafe fn enable_serial_interrupt() {
|
||||||
const SERIAL_BASE: *mut u32 = (KERNEL_OFFSET + 0x18000000) as *mut u32;
|
const SERIAL_BASE: *mut u32 = phys_to_virt(0x60000000) as *mut u32;
|
||||||
const UART_CTRL_REG: usize = 3;
|
const UART_CTRL_REG: usize = 3;
|
||||||
// Intr enable | rx reset | tx reset
|
// Intr enable | rx reset | tx reset
|
||||||
const UART_IE: u32 = 0x13;
|
const UART_IE: u32 = 0x13;
|
||||||
|
@ -1,8 +1,9 @@
|
|||||||
use super::consts::KERNEL_OFFSET;
|
use super::consts::KERNEL_OFFSET;
|
||||||
|
use crate::memory::phys_to_virt;
|
||||||
|
|
||||||
/// Mask all external interrupt except serial.
|
/// Mask all external interrupt except serial.
|
||||||
pub unsafe fn init_external_interrupt() {
|
pub unsafe fn init_external_interrupt() {
|
||||||
const HART1_S_MODE_INTERRUPT_ENABLES: *mut u64 = (KERNEL_OFFSET + 0x0C00_2100) as *mut u64;
|
const HART1_S_MODE_INTERRUPT_ENABLES: *mut u64 = phys_to_virt(0x0C00_2100) as *mut u64;
|
||||||
const SERIAL: u64 = 4;
|
const SERIAL: u64 = 4;
|
||||||
HART1_S_MODE_INTERRUPT_ENABLES.write_volatile(1 << SERIAL);
|
HART1_S_MODE_INTERRUPT_ENABLES.write_volatile(1 << SERIAL);
|
||||||
}
|
}
|
||||||
@ -10,8 +11,7 @@ pub unsafe fn init_external_interrupt() {
|
|||||||
/// Claim and complete external interrupt by reading and writing to
|
/// Claim and complete external interrupt by reading and writing to
|
||||||
/// PLIC Interrupt Claim/Complete Register.
|
/// PLIC Interrupt Claim/Complete Register.
|
||||||
pub unsafe fn handle_external_interrupt() {
|
pub unsafe fn handle_external_interrupt() {
|
||||||
const HART1_S_MODE_INTERRUPT_CLAIM_COMPLETE: *mut u32 =
|
const HART1_S_MODE_INTERRUPT_CLAIM_COMPLETE: *mut u32 = phys_to_virt(0x0C20_2004) as *mut u32;
|
||||||
(KERNEL_OFFSET + 0x0C20_2004) as *mut u32;
|
|
||||||
// claim
|
// claim
|
||||||
let source = HART1_S_MODE_INTERRUPT_CLAIM_COMPLETE.read_volatile();
|
let source = HART1_S_MODE_INTERRUPT_CLAIM_COMPLETE.read_volatile();
|
||||||
// complete
|
// complete
|
||||||
@ -19,7 +19,7 @@ pub unsafe fn handle_external_interrupt() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub unsafe fn enable_serial_interrupt() {
|
pub unsafe fn enable_serial_interrupt() {
|
||||||
const SERIAL_BASE: *mut u8 = (KERNEL_OFFSET + 0x10010000) as *mut u8;
|
const SERIAL_BASE: *mut u8 = phys_to_virt(0x10010000) as *mut u8;
|
||||||
const UART_REG_IE: usize = 4;
|
const UART_REG_IE: usize = 4;
|
||||||
const UART_RXWM: u8 = 0x2;
|
const UART_RXWM: u8 = 0x2;
|
||||||
SERIAL_BASE.add(UART_REG_IE).write_volatile(UART_RXWM);
|
SERIAL_BASE.add(UART_REG_IE).write_volatile(UART_RXWM);
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
use super::consts::KERNEL_OFFSET;
|
|
||||||
use crate::memory::phys_to_virt;
|
use crate::memory::phys_to_virt;
|
||||||
|
|
||||||
/// Mask all external interrupt except serial.
|
/// Mask all external interrupt except serial.
|
||||||
|
@ -20,13 +20,13 @@ mod sbi;
|
|||||||
pub mod syscall;
|
pub mod syscall;
|
||||||
pub mod timer;
|
pub mod timer;
|
||||||
|
|
||||||
use self::consts::{KERNEL_OFFSET, MEMORY_OFFSET};
|
use crate::memory::phys_to_virt;
|
||||||
use core::sync::atomic::{AtomicBool, Ordering};
|
use core::sync::atomic::{AtomicBool, Ordering};
|
||||||
use log::*;
|
use log::*;
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "C" fn rust_main(hartid: usize, device_tree_paddr: usize) -> ! {
|
pub extern "C" fn rust_main(hartid: usize, device_tree_paddr: usize) -> ! {
|
||||||
let mut device_tree_vaddr = device_tree_paddr - MEMORY_OFFSET + KERNEL_OFFSET;
|
let mut device_tree_vaddr = phys_to_virt(device_tree_paddr);
|
||||||
|
|
||||||
unsafe {
|
unsafe {
|
||||||
cpu::set_cpu_id(hartid);
|
cpu::set_cpu_id(hartid);
|
||||||
|
@ -5,7 +5,6 @@ mod trapframe;
|
|||||||
|
|
||||||
pub use self::handler::*;
|
pub use self::handler::*;
|
||||||
pub use self::trapframe::*;
|
pub use self::trapframe::*;
|
||||||
use crate::consts::KERNEL_OFFSET;
|
|
||||||
use crate::memory::phys_to_virt;
|
use crate::memory::phys_to_virt;
|
||||||
use apic::*;
|
use apic::*;
|
||||||
|
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
/// Interface for inter-processor interrupt.
|
/// Interface for inter-processor interrupt.
|
||||||
/// This module wraps inter-processor interrupt into a broadcast-calling style.
|
/// This module wraps inter-processor interrupt into a broadcast-calling style.
|
||||||
use crate::consts::KERNEL_OFFSET;
|
|
||||||
use alloc::boxed::{Box, FnBox};
|
use alloc::boxed::{Box, FnBox};
|
||||||
use alloc::sync::Arc;
|
use alloc::sync::Arc;
|
||||||
use apic::{LocalApic, XApic, LAPIC_ADDR};
|
use apic::{LocalApic, XApic, LAPIC_ADDR};
|
||||||
@ -9,7 +8,7 @@ use core::sync::atomic::{spin_loop_hint, AtomicU8, Ordering};
|
|||||||
pub type IPIEventItem = Box<FnBox()>;
|
pub type IPIEventItem = Box<FnBox()>;
|
||||||
|
|
||||||
unsafe fn get_apic() -> XApic {
|
unsafe fn get_apic() -> XApic {
|
||||||
let mut lapic = unsafe { XApic::new(KERNEL_OFFSET + LAPIC_ADDR) };
|
let mut lapic = unsafe { XApic::new(phys_to_virt(LAPIC_ADDR)) };
|
||||||
lapic
|
lapic
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
use crate::consts::KERNEL_OFFSET;
|
|
||||||
use crate::memory::{alloc_frame, dealloc_frame, phys_to_virt};
|
use crate::memory::{alloc_frame, dealloc_frame, phys_to_virt};
|
||||||
use core::sync::atomic::Ordering;
|
use core::sync::atomic::Ordering;
|
||||||
use log::*;
|
use log::*;
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
use crate::consts::KERNEL_OFFSET;
|
|
||||||
use crate::drivers::block::*;
|
use crate::drivers::block::*;
|
||||||
use crate::drivers::net::*;
|
use crate::drivers::net::*;
|
||||||
use crate::drivers::{Driver, DRIVERS, NET_DRIVERS};
|
use crate::drivers::{Driver, DRIVERS, NET_DRIVERS};
|
||||||
|
@ -11,14 +11,13 @@ use log::*;
|
|||||||
use rcore_memory::PAGE_SIZE;
|
use rcore_memory::PAGE_SIZE;
|
||||||
use volatile::{ReadOnly, Volatile, WriteOnly};
|
use volatile::{ReadOnly, Volatile, WriteOnly};
|
||||||
|
|
||||||
use crate::arch::consts::{KERNEL_OFFSET, MEMORY_OFFSET};
|
|
||||||
use crate::HEAP_ALLOCATOR;
|
use crate::HEAP_ALLOCATOR;
|
||||||
|
|
||||||
use super::super::block::virtio_blk;
|
use super::super::block::virtio_blk;
|
||||||
use super::super::gpu::virtio_gpu;
|
use super::super::gpu::virtio_gpu;
|
||||||
use super::super::input::virtio_input;
|
use super::super::input::virtio_input;
|
||||||
use super::super::net::virtio_net;
|
use super::super::net::virtio_net;
|
||||||
use crate::memory::phys_to_virt;
|
use crate::memory::{phys_to_virt, virt_to_phys};
|
||||||
|
|
||||||
// virtio 4.2.4 Legacy interface
|
// virtio 4.2.4 Legacy interface
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
@ -95,9 +94,7 @@ impl VirtIOVirtqueue {
|
|||||||
|
|
||||||
header.queue_num.write(queue_num as u32);
|
header.queue_num.write(queue_num as u32);
|
||||||
header.queue_align.write(align as u32);
|
header.queue_align.write(align as u32);
|
||||||
header
|
header.queue_pfn.write((virt_to_phys(address) as u32) >> 12);
|
||||||
.queue_pfn
|
|
||||||
.write(((address - KERNEL_OFFSET + MEMORY_OFFSET) as u32) >> 12);
|
|
||||||
|
|
||||||
// link desc together
|
// link desc together
|
||||||
let desc =
|
let desc =
|
||||||
@ -145,7 +142,7 @@ impl VirtIOVirtqueue {
|
|||||||
desc[cur].flags.write(VirtIOVirtqueueFlag::NEXT.bits());
|
desc[cur].flags.write(VirtIOVirtqueueFlag::NEXT.bits());
|
||||||
desc[cur]
|
desc[cur]
|
||||||
.addr
|
.addr
|
||||||
.write(output[i].as_ptr() as u64 - KERNEL_OFFSET as u64 + MEMORY_OFFSET as u64);
|
.write(virt_to_phys(output[i].as_ptr() as usize) as u64);
|
||||||
desc[cur].len.write(output[i].len() as u32);
|
desc[cur].len.write(output[i].len() as u32);
|
||||||
prev = cur;
|
prev = cur;
|
||||||
cur = desc[cur].next.read() as usize;
|
cur = desc[cur].next.read() as usize;
|
||||||
@ -156,7 +153,7 @@ impl VirtIOVirtqueue {
|
|||||||
.write((VirtIOVirtqueueFlag::NEXT | VirtIOVirtqueueFlag::WRITE).bits());
|
.write((VirtIOVirtqueueFlag::NEXT | VirtIOVirtqueueFlag::WRITE).bits());
|
||||||
desc[cur]
|
desc[cur]
|
||||||
.addr
|
.addr
|
||||||
.write(input[i].as_ptr() as u64 - KERNEL_OFFSET as u64 + MEMORY_OFFSET as u64);
|
.write(virt_to_phys(input[i].as_ptr() as usize) as u64);
|
||||||
desc[cur].len.write(input[i].len() as u32);
|
desc[cur].len.write(input[i].len() as u32);
|
||||||
prev = cur;
|
prev = cur;
|
||||||
cur = desc[cur].next.read() as usize;
|
cur = desc[cur].next.read() as usize;
|
||||||
@ -221,7 +218,7 @@ impl VirtIOVirtqueue {
|
|||||||
let mut output = Vec::new();
|
let mut output = Vec::new();
|
||||||
loop {
|
loop {
|
||||||
let flags = VirtIOVirtqueueFlag::from_bits_truncate(desc[cur].flags.read());
|
let flags = VirtIOVirtqueueFlag::from_bits_truncate(desc[cur].flags.read());
|
||||||
let addr = desc[cur].addr.read() as u64 - MEMORY_OFFSET as u64 + KERNEL_OFFSET as u64;
|
let addr = phys_to_virt(desc[cur].addr.read() as usize);
|
||||||
let buffer =
|
let buffer =
|
||||||
unsafe { slice::from_raw_parts(addr as *const u8, desc[cur].len.read() as usize) };
|
unsafe { slice::from_raw_parts(addr as *const u8, desc[cur].len.read() as usize) };
|
||||||
if flags.contains(VirtIOVirtqueueFlag::WRITE) {
|
if flags.contains(VirtIOVirtqueueFlag::WRITE) {
|
||||||
|
@ -10,8 +10,8 @@ use log::*;
|
|||||||
use rcore_memory::PAGE_SIZE;
|
use rcore_memory::PAGE_SIZE;
|
||||||
use volatile::{ReadOnly, Volatile, WriteOnly};
|
use volatile::{ReadOnly, Volatile, WriteOnly};
|
||||||
|
|
||||||
use crate::arch::consts::{KERNEL_OFFSET, MEMORY_OFFSET};
|
|
||||||
use crate::arch::cpu;
|
use crate::arch::cpu;
|
||||||
|
use crate::memory::virt_to_phys;
|
||||||
use crate::sync::SpinNoIrqLock as Mutex;
|
use crate::sync::SpinNoIrqLock as Mutex;
|
||||||
use crate::HEAP_ALLOCATOR;
|
use crate::HEAP_ALLOCATOR;
|
||||||
|
|
||||||
@ -279,7 +279,7 @@ fn setup_framebuffer(driver: &mut VirtIOGpu) {
|
|||||||
header: VirtIOGpuCtrlHdr::with_type(VIRTIO_GPU_CMD_RESOURCE_ATTACH_BACKING),
|
header: VirtIOGpuCtrlHdr::with_type(VIRTIO_GPU_CMD_RESOURCE_ATTACH_BACKING),
|
||||||
resource_id: VIRTIO_GPU_RESOURCE_ID,
|
resource_id: VIRTIO_GPU_RESOURCE_ID,
|
||||||
nr_entries: 1,
|
nr_entries: 1,
|
||||||
addr: (frame_buffer - KERNEL_OFFSET + MEMORY_OFFSET) as u64,
|
addr: virt_to_phys(frame_buffer) as u64,
|
||||||
length: size,
|
length: size,
|
||||||
padding: 0,
|
padding: 0,
|
||||||
};
|
};
|
||||||
|
@ -18,7 +18,7 @@ use crate::net::SOCKETS;
|
|||||||
use crate::sync::SpinNoIrqLock as Mutex;
|
use crate::sync::SpinNoIrqLock as Mutex;
|
||||||
|
|
||||||
use super::super::{DeviceType, Driver, DRIVERS, NET_DRIVERS, SOCKET_ACTIVITY};
|
use super::super::{DeviceType, Driver, DRIVERS, NET_DRIVERS, SOCKET_ACTIVITY};
|
||||||
use crate::consts::{KERNEL_OFFSET, MEMORY_OFFSET};
|
use crate::memory::phys_to_virt;
|
||||||
|
|
||||||
const AXI_STREAM_FIFO_ISR: *mut u32 = (KERNEL_OFFSET + 0x1820_0000) as *mut u32;
|
const AXI_STREAM_FIFO_ISR: *mut u32 = (KERNEL_OFFSET + 0x1820_0000) as *mut u32;
|
||||||
const AXI_STREAM_FIFO_IER: *mut u32 = (KERNEL_OFFSET + 0x1820_0004) as *mut u32;
|
const AXI_STREAM_FIFO_IER: *mut u32 = (KERNEL_OFFSET + 0x1820_0004) as *mut u32;
|
||||||
|
@ -59,6 +59,11 @@ pub const fn phys_to_virt(paddr: usize) -> usize {
|
|||||||
PHYSICAL_MEMORY_OFFSET + paddr
|
PHYSICAL_MEMORY_OFFSET + paddr
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Convert virtual address to physical address
|
||||||
|
pub const fn virt_to_phys(vaddr: usize) -> usize {
|
||||||
|
vaddr - PHYSICAL_MEMORY_OFFSET
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, Copy)]
|
#[derive(Debug, Clone, Copy)]
|
||||||
pub struct GlobalFrameAlloc;
|
pub struct GlobalFrameAlloc;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user