From 18995feba8da9e590aed167c866af12dc10c632c Mon Sep 17 00:00:00 2001 From: Vadim Kaushan Date: Sun, 14 Jun 2020 14:06:04 +0300 Subject: [PATCH 01/14] Revert "README: Obsolete" This reverts commit b7befcf6084c27c7c584f558b7c90db45c46e0b9. --- README.md | 34 ++++++++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 9f2d165..262f27e 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,37 @@ +[![crates.io](https://img.shields.io/crates/d/riscv.svg)](https://crates.io/crates/vexriscv) +[![crates.io](https://img.shields.io/crates/v/riscv.svg)](https://crates.io/crates/vexriscv) +[![Build Status](https://travis-ci.org/rust-embedded/riscv.svg?branch=master)](https://travis-ci.org/xobs/vexriscv) + # `veriscv` > Low level access to parts of the VexRiscv RISC-V processor -THIS PROJECT IS NOW OBSOLETE +This project is derived from [riscv](https://github.com/rust-embedded/riscv), developed and maintained by the [RISC-V team][team]. -You can access vexriscv-specific csrs in the `riscv` crate, under `riscv::registers::vexriscv::*`. +## [Documentation](https://docs.rs/crate/vexriscv) + +## License + +Copyright 2020 Sean "xobs" Cross +Copyright 2019 [RISC-V team][team] + +Permission to use, copy, modify, and/or distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright notice +and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. + +## Code of Conduct + +Contribution to this crate is organized under the terms of the [Rust Code of +Conduct][CoC], the maintainer of this crate, the [RISC-V team][team], promises +to intervene to uphold that code of conduct. + +[CoC]: CODE_OF_CONDUCT.md +[team]: https://github.com/rust-embedded/wg#the-riscv-team From 9bf5caafc2bd357614a78d3db77c225a323f209f Mon Sep 17 00:00:00 2001 From: Vadim Kaushan Date: Sun, 14 Jun 2020 14:16:26 +0300 Subject: [PATCH 02/14] Remove #![deny(warnings)] (anti-pattern) --- src/lib.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index 4c3d76d..af24199 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -16,7 +16,6 @@ //! - Wrappers around assembly instructions like `WFI`. #![no_std] -#![deny(warnings)] #![cfg_attr(feature = "inline-asm", feature(asm))] extern crate bare_metal; From b4546d1827aad0c423499b80031a3ea557f0433b Mon Sep 17 00:00:00 2001 From: Vadim Kaushan Date: Sun, 14 Jun 2020 14:17:55 +0300 Subject: [PATCH 03/14] Remove asm and interrupt modules --- asm.S | 24 --------------- src/asm.rs | 77 ------------------------------------------------ src/interrupt.rs | 54 --------------------------------- src/lib.rs | 2 -- 4 files changed, 157 deletions(-) delete mode 100644 src/asm.rs delete mode 100644 src/interrupt.rs diff --git a/asm.S b/asm.S index e42d90c..373f704 100644 --- a/asm.S +++ b/asm.S @@ -40,31 +40,7 @@ __clear_ ## name: \ #define RW32(offset, name) #define RO32(offset, name) #endif -// ----------------------- // -.section .text.__ebreak -.global __ebreak -__ebreak: - ebreak - ret - -.section .text.__wfi -.global __wfi -__wfi: - wfi - ret - -.section .text.__sfence_vma_all -.global __sfence_vma_all -__sfence_vma_all: - sfence.vma - ret - -.section .text.__sfence_vma -.global __sfence_vma -__sfence_vma: - sfence.vma a0, a1 - ret // User Trap Setup RW(0x000, ustatus) // User status register diff --git a/src/asm.rs b/src/asm.rs deleted file mode 100644 index 8ce24b7..0000000 --- a/src/asm.rs +++ /dev/null @@ -1,77 +0,0 @@ -//! Assembly instructions - -macro_rules! instruction { - ($(#[$attr:meta])*, $fnname:ident, $asm:expr, $asm_fn:ident) => ( - $(#[$attr])* - #[inline] - pub unsafe fn $fnname() { - match () { - #[cfg(all(riscv, feature = "inline-asm"))] - () => asm!($asm :::: "volatile"), - - #[cfg(all(riscv, not(feature = "inline-asm")))] - () => { - extern "C" { - fn $asm_fn(); - } - - $asm_fn(); - } - - #[cfg(not(riscv))] - () => unimplemented!(), - } - } - ) -} - - -instruction!( - /// `EBREAK` instruction wrapper - /// - /// Generates a breakpoint exception. - , ebreak, "ebreak", __ebreak); -instruction!( - /// `WFI` instruction wrapper - /// - /// Provides a hint to the implementation that the current hart can be stalled until an interrupt might need servicing. - /// The WFI instruction is just a hint, and a legal implementation is to implement WFI as a NOP. - , wfi, "wfi", __wfi); -instruction!( - /// `SFENCE.VMA` instruction wrapper (all address spaces and page table levels) - /// - /// Synchronizes updates to in-memory memory-management data structures with current execution. - /// Instruction execution causes implicit reads and writes to these data structures; however, these implicit references - /// are ordinarily not ordered with respect to loads and stores in the instruction stream. - /// Executing an `SFENCE.VMA` instruction guarantees that any stores in the instruction stream prior to the - /// `SFENCE.VMA` are ordered before all implicit references subsequent to the `SFENCE.VMA`. - , sfence_vma_all, "sfence.vma", __sfence_vma_all); - - -/// `SFENCE.VMA` instruction wrapper -/// -/// Synchronizes updates to in-memory memory-management data structures with current execution. -/// Instruction execution causes implicit reads and writes to these data structures; however, these implicit references -/// are ordinarily not ordered with respect to loads and stores in the instruction stream. -/// Executing an `SFENCE.VMA` instruction guarantees that any stores in the instruction stream prior to the -/// `SFENCE.VMA` are ordered before all implicit references subsequent to the `SFENCE.VMA`. -#[inline] -#[allow(unused_variables)] -pub unsafe fn sfence_vma(asid: usize, addr: usize) { - match () { - #[cfg(all(riscv, feature = "inline-asm"))] - () => asm!("sfence.vma $0, $1" :: "r"(asid), "r"(addr) :: "volatile"), - - #[cfg(all(riscv, not(feature = "inline-asm")))] - () => { - extern "C" { - fn __sfence_vma(asid: usize, addr: usize); - } - - __sfence_vma(asid, addr); - } - - #[cfg(not(riscv))] - () => unimplemented!(), - } -} diff --git a/src/interrupt.rs b/src/interrupt.rs deleted file mode 100644 index b569e11..0000000 --- a/src/interrupt.rs +++ /dev/null @@ -1,54 +0,0 @@ -//! Interrupts - -// NOTE: Adapted from cortex-m/src/interrupt.rs -pub use bare_metal::{CriticalSection, Mutex, Nr}; -use register::mstatus; - -/// Disables all interrupts -#[inline] -pub unsafe fn disable() { - match () { - #[cfg(riscv)] - () => mstatus::clear_mie(), - #[cfg(not(riscv))] - () => unimplemented!(), - } -} - -/// Enables all the interrupts -/// -/// # Safety -/// -/// - Do not call this function inside an `interrupt::free` critical section -#[inline] -pub unsafe fn enable() { - match () { - #[cfg(riscv)] - () => mstatus::set_mie(), - #[cfg(not(riscv))] - () => unimplemented!(), - } -} - -/// Execute closure `f` in an interrupt-free context. -/// -/// This as also known as a "critical section". -pub fn free(f: F) -> R -where - F: FnOnce(&CriticalSection) -> R, -{ - let mstatus = mstatus::read(); - - // disable interrupts - unsafe { disable(); } - - let r = f(unsafe { &CriticalSection::new() }); - - // If the interrupts were active before our `disable` call, then re-enable - // them. Otherwise, keep them disabled - if mstatus.mie() { - unsafe { enable(); } - } - - r -} diff --git a/src/lib.rs b/src/lib.rs index af24199..bae037b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -21,6 +21,4 @@ extern crate bare_metal; extern crate bit_field; -pub mod asm; -pub mod interrupt; pub mod register; From 11e711872940634fd3929522c5c18723f7b593ea Mon Sep 17 00:00:00 2001 From: Vadim Kaushan Date: Sun, 14 Jun 2020 14:20:38 +0300 Subject: [PATCH 04/14] Remove all the RISC-V standard registers --- asm.S | 250 ----------------------------------- src/register/fcsr.rs | 132 ------------------ src/register/hpmcounterx.rs | 82 ------------ src/register/marchid.rs | 27 ---- src/register/mcause.rs | 139 ------------------- src/register/mcycle.rs | 4 - src/register/mcycleh.rs | 3 - src/register/mepc.rs | 4 - src/register/mhartid.rs | 3 - src/register/mhpmcounterx.rs | 84 ------------ src/register/mhpmeventx.rs | 41 ------ src/register/mie.rs | 103 --------------- src/register/mimpid.rs | 27 ---- src/register/minstret.rs | 4 - src/register/minstreth.rs | 3 - src/register/mip.rs | 100 -------------- src/register/misa.rs | 60 --------- src/register/mod.rs | 109 +-------------- src/register/mscratch.rs | 4 - src/register/mstatus.rs | 200 ---------------------------- src/register/mtval.rs | 3 - src/register/mtvec.rs | 47 ------- src/register/mvendorid.rs | 32 ----- src/register/pmpaddrx.rs | 28 ---- src/register/pmpcfgx.rs | 23 ---- src/register/satp.rs | 110 --------------- src/register/scause.rs | 117 ---------------- src/register/sepc.rs | 4 - src/register/sie.rs | 76 ----------- src/register/sip.rs | 55 -------- src/register/sscratch.rs | 4 - src/register/sstatus.rs | 140 -------------------- src/register/stval.rs | 3 - src/register/stvec.rs | 40 ------ src/register/time.rs | 4 - src/register/timeh.rs | 3 - src/register/ucause.rs | 17 --- src/register/uepc.rs | 4 - src/register/uie.rs | 49 ------- src/register/uip.rs | 37 ------ src/register/uscratch.rs | 4 - src/register/ustatus.rs | 37 ------ src/register/utval.rs | 3 - src/register/utvec.rs | 40 ------ 44 files changed, 2 insertions(+), 2257 deletions(-) delete mode 100644 src/register/fcsr.rs delete mode 100644 src/register/hpmcounterx.rs delete mode 100644 src/register/marchid.rs delete mode 100644 src/register/mcause.rs delete mode 100644 src/register/mcycle.rs delete mode 100644 src/register/mcycleh.rs delete mode 100644 src/register/mepc.rs delete mode 100644 src/register/mhartid.rs delete mode 100644 src/register/mhpmcounterx.rs delete mode 100644 src/register/mhpmeventx.rs delete mode 100644 src/register/mie.rs delete mode 100644 src/register/mimpid.rs delete mode 100644 src/register/minstret.rs delete mode 100644 src/register/minstreth.rs delete mode 100644 src/register/mip.rs delete mode 100644 src/register/misa.rs delete mode 100644 src/register/mscratch.rs delete mode 100644 src/register/mstatus.rs delete mode 100644 src/register/mtval.rs delete mode 100644 src/register/mtvec.rs delete mode 100644 src/register/mvendorid.rs delete mode 100644 src/register/pmpaddrx.rs delete mode 100644 src/register/pmpcfgx.rs delete mode 100644 src/register/satp.rs delete mode 100644 src/register/scause.rs delete mode 100644 src/register/sepc.rs delete mode 100644 src/register/sie.rs delete mode 100644 src/register/sip.rs delete mode 100644 src/register/sscratch.rs delete mode 100644 src/register/sstatus.rs delete mode 100644 src/register/stval.rs delete mode 100644 src/register/stvec.rs delete mode 100644 src/register/time.rs delete mode 100644 src/register/timeh.rs delete mode 100644 src/register/ucause.rs delete mode 100644 src/register/uepc.rs delete mode 100644 src/register/uie.rs delete mode 100644 src/register/uip.rs delete mode 100644 src/register/uscratch.rs delete mode 100644 src/register/ustatus.rs delete mode 100644 src/register/utval.rs delete mode 100644 src/register/utvec.rs diff --git a/asm.S b/asm.S index 373f704..b10ff8e 100644 --- a/asm.S +++ b/asm.S @@ -42,256 +42,6 @@ __clear_ ## name: \ #endif -// User Trap Setup -RW(0x000, ustatus) // User status register -RW(0x004, uie) // User interrupt-enable register -RW(0x005, utvec) // User trap handler base address - -// User Trap Handling -RW(0x040, uscratch) // Scratch register for user trap handlers -RW(0x041, uepc) // User exception program counter -RW(0x042, ucause) // User trap cause -RW(0x043, utval) // User bad address or instruction -RW(0x044, uip) // User interrupt pending - -// User Floating-Point CSRs -RW(0x001, fflags) // Floating-Point Accrued Exceptions -RW(0x002, frm) // Floating-Point Dynamic Rounding Mode -RW(0x003, fcsr) // Floating-Point Control and Status Register (frm + fflags) - -// User Counter/Timers -RO( 0xC00, cycle) // Cycle counter for RDCYCLE instruction -RO( 0xC01, time) // Timer for RDTIME instruction -RO( 0xC02, instret) // Instructions-retired counter for RDINSTRET instruction -RO( 0xC03, hpmcounter3) // Performance-monitoring counter -RO( 0xC04, hpmcounter4) // Performance-monitoring counter -RO( 0xC05, hpmcounter5) // Performance-monitoring counter -RO( 0xC06, hpmcounter6) // Performance-monitoring counter -RO( 0xC07, hpmcounter7) // Performance-monitoring counter -RO( 0xC08, hpmcounter8) // Performance-monitoring counter -RO( 0xC09, hpmcounter9) // Performance-monitoring counter -RO( 0xC0A, hpmcounter10) // Performance-monitoring counter -RO( 0xC0B, hpmcounter11) // Performance-monitoring counter -RO( 0xC0C, hpmcounter12) // Performance-monitoring counter -RO( 0xC0D, hpmcounter13) // Performance-monitoring counter -RO( 0xC0E, hpmcounter14) // Performance-monitoring counter -RO( 0xC0F, hpmcounter15) // Performance-monitoring counter -RO( 0xC10, hpmcounter16) // Performance-monitoring counter -RO( 0xC11, hpmcounter17) // Performance-monitoring counter -RO( 0xC12, hpmcounter18) // Performance-monitoring counter -RO( 0xC13, hpmcounter19) // Performance-monitoring counter -RO( 0xC14, hpmcounter20) // Performance-monitoring counter -RO( 0xC15, hpmcounter21) // Performance-monitoring counter -RO( 0xC16, hpmcounter22) // Performance-monitoring counter -RO( 0xC17, hpmcounter23) // Performance-monitoring counter -RO( 0xC18, hpmcounter24) // Performance-monitoring counter -RO( 0xC19, hpmcounter25) // Performance-monitoring counter -RO( 0xC1A, hpmcounter26) // Performance-monitoring counter -RO( 0xC1B, hpmcounter27) // Performance-monitoring counter -RO( 0xC1C, hpmcounter28) // Performance-monitoring counter -RO( 0xC1D, hpmcounter29) // Performance-monitoring counter -RO( 0xC1E, hpmcounter30) // Performance-monitoring counter -RO( 0xC1F, hpmcounter31) // Performance-monitoring counter -RO32(0xC80, cycleh) // Upper 32 bits of cycle, RV32I only -RO32(0xC81, timeh) // Upper 32 bits of time, RV32I only -RO32(0xC82, instreth) // Upper 32 bits of instret, RV32I only -RO32(0xC83, hpmcounter3h) // Upper 32 bits of hpmcounter3, RV32I only -RO32(0xC84, hpmcounter4h) -RO32(0xC85, hpmcounter5h) -RO32(0xC86, hpmcounter6h) -RO32(0xC87, hpmcounter7h) -RO32(0xC88, hpmcounter8h) -RO32(0xC89, hpmcounter9h) -RO32(0xC8A, hpmcounter10h) -RO32(0xC8B, hpmcounter11h) -RO32(0xC8C, hpmcounter12h) -RO32(0xC8D, hpmcounter13h) -RO32(0xC8E, hpmcounter14h) -RO32(0xC8F, hpmcounter15h) -RO32(0xC90, hpmcounter16h) -RO32(0xC91, hpmcounter17h) -RO32(0xC92, hpmcounter18h) -RO32(0xC93, hpmcounter19h) -RO32(0xC94, hpmcounter20h) -RO32(0xC95, hpmcounter21h) -RO32(0xC96, hpmcounter22h) -RO32(0xC97, hpmcounter23h) -RO32(0xC98, hpmcounter24h) -RO32(0xC99, hpmcounter25h) -RO32(0xC9A, hpmcounter26h) -RO32(0xC9B, hpmcounter27h) -RO32(0xC9C, hpmcounter28h) -RO32(0xC9D, hpmcounter29h) -RO32(0xC9E, hpmcounter30h) -RO32(0xC9F, hpmcounter31h) - -// Supervisor Trap Setup -RW(0x100, sstatus) // Supervisor status register -RW(0x102, sedeleg) // Supervisor exception delegation register -RW(0x103, sideleg) // Supervisor interrupt delegation register -RW(0x104, sie) // Supervisor interrupt-enable register -RW(0x105, stvec) // Supervisor trap handler base address -RW(0x106, scounteren) // Supervisor counter enable - -// Supervisor Trap Handling -RW(0x140, sscratch) // Scratch register for supervisor trap handlers -RW(0x141, sepc) // Supervisor exception program counter -RW(0x142, scause) // Supervisor trap cause -RW(0x143, stval) // Supervisor bad address or instruction -RW(0x144, sip) // Supervisor interrupt pending - -// Supervisor Protection and Translation -RW(0x180, satp) // Supervisor address translation and protection - -// Machine Information Registers -RO(0xF11, mvendorid) // Vendor ID -RO(0xF12, marchid) // Architecture ID -RO(0xF13, mimpid) // Implementation ID -RO(0xF14, mhartid) // Hardware thread ID - -// Machine Trap Setup -RW(0x300, mstatus) // Machine status register -RW(0x301, misa) // ISA and extensions -RW(0x302, medeleg) // Machine exception delegation register -RW(0x303, mideleg) // Machine interrupt delegation register -RW(0x304, mie) // Machine interrupt-enable register -RW(0x305, mtvec) // Machine trap handler base address -RW(0x306, mcounteren) // Machine counter enable - -// Machine Trap Handling -RW(0x340, mscratch) // Scratch register for machine trap handlers -RW(0x341, mepc) // Machine exception program counter -RW(0x342, mcause) // Machine trap cause -RW(0x343, mtval) // Machine bad address or instruction -RW(0x344, mip) // Machine interrupt pending - -// Machine Protection and Translation -RW( 0x3A0, pmpcfg0) // Physical memory protection configuration -RW32(0x3A1, pmpcfg1) // Physical memory protection configuration, RV32 only -RW( 0x3A2, pmpcfg2) // Physical memory protection configuration -RW32(0x3A3, pmpcfg3) // Physical memory protection configuration, RV32 only -RW( 0x3B0, pmpaddr0) // Physical memory protection address register -RW( 0x3B1, pmpaddr1) // Physical memory protection address register -RW( 0x3B2, pmpaddr2) // Physical memory protection address register -RW( 0x3B3, pmpaddr3) // Physical memory protection address register -RW( 0x3B4, pmpaddr4) // Physical memory protection address register -RW( 0x3B5, pmpaddr5) // Physical memory protection address register -RW( 0x3B6, pmpaddr6) // Physical memory protection address register -RW( 0x3B7, pmpaddr7) // Physical memory protection address register -RW( 0x3B8, pmpaddr8) // Physical memory protection address register -RW( 0x3B9, pmpaddr9) // Physical memory protection address register -RW( 0x3BA, pmpaddr10) // Physical memory protection address register -RW( 0x3BB, pmpaddr11) // Physical memory protection address register -RW( 0x3BC, pmpaddr12) // Physical memory protection address register -RW( 0x3BD, pmpaddr13) // Physical memory protection address register -RW( 0x3BE, pmpaddr14) // Physical memory protection address register -RW( 0x3BF, pmpaddr15) // Physical memory protection address register - -// Machine Counter/Timers -RO( 0xB00, mcycle) // Machine cycle counter -RO( 0xB02, minstret) // Machine instructions-retired counter -RO( 0xB03, mhpmcounter3) // Machine performance-monitoring counter -RO( 0xB04, mhpmcounter4) // Machine performance-monitoring counter -RO( 0xB05, mhpmcounter5) // Machine performance-monitoring counter -RO( 0xB06, mhpmcounter6) // Machine performance-monitoring counter -RO( 0xB07, mhpmcounter7) // Machine performance-monitoring counter -RO( 0xB08, mhpmcounter8) // Machine performance-monitoring counter -RO( 0xB09, mhpmcounter9) // Machine performance-monitoring counter -RO( 0xB0A, mhpmcounter10) // Machine performance-monitoring counter -RO( 0xB0B, mhpmcounter11) // Machine performance-monitoring counter -RO( 0xB0C, mhpmcounter12) // Machine performance-monitoring counter -RO( 0xB0D, mhpmcounter13) // Machine performance-monitoring counter -RO( 0xB0E, mhpmcounter14) // Machine performance-monitoring counter -RO( 0xB0F, mhpmcounter15) // Machine performance-monitoring counter -RO( 0xB10, mhpmcounter16) // Machine performance-monitoring counter -RO( 0xB11, mhpmcounter17) // Machine performance-monitoring counter -RO( 0xB12, mhpmcounter18) // Machine performance-monitoring counter -RO( 0xB13, mhpmcounter19) // Machine performance-monitoring counter -RO( 0xB14, mhpmcounter20) // Machine performance-monitoring counter -RO( 0xB15, mhpmcounter21) // Machine performance-monitoring counter -RO( 0xB16, mhpmcounter22) // Machine performance-monitoring counter -RO( 0xB17, mhpmcounter23) // Machine performance-monitoring counter -RO( 0xB18, mhpmcounter24) // Machine performance-monitoring counter -RO( 0xB19, mhpmcounter25) // Machine performance-monitoring counter -RO( 0xB1A, mhpmcounter26) // Machine performance-monitoring counter -RO( 0xB1B, mhpmcounter27) // Machine performance-monitoring counter -RO( 0xB1C, mhpmcounter28) // Machine performance-monitoring counter -RO( 0xB1D, mhpmcounter29) // Machine performance-monitoring counter -RO( 0xB1E, mhpmcounter30) // Machine performance-monitoring counter -RO( 0xB1F, mhpmcounter31) // Machine performance-monitoring counter -RO32(0xB80, mcycleh) // Upper 32 bits of mcycle, RV32I only -RO32(0xB82, minstreth) // Upper 32 bits of minstret, RV32I only -RO32(0xB83, mhpmcounter3h) // Upper 32 bits of mhpmcounter3, RV32I only -RO32(0xB84, mhpmcounter4h) -RO32(0xB85, mhpmcounter5h) -RO32(0xB86, mhpmcounter6h) -RO32(0xB87, mhpmcounter7h) -RO32(0xB88, mhpmcounter8h) -RO32(0xB89, mhpmcounter9h) -RO32(0xB8A, mhpmcounter10h) -RO32(0xB8B, mhpmcounter11h) -RO32(0xB8C, mhpmcounter12h) -RO32(0xB8D, mhpmcounter13h) -RO32(0xB8E, mhpmcounter14h) -RO32(0xB8F, mhpmcounter15h) -RO32(0xB90, mhpmcounter16h) -RO32(0xB91, mhpmcounter17h) -RO32(0xB92, mhpmcounter18h) -RO32(0xB93, mhpmcounter19h) -RO32(0xB94, mhpmcounter20h) -RO32(0xB95, mhpmcounter21h) -RO32(0xB96, mhpmcounter22h) -RO32(0xB97, mhpmcounter23h) -RO32(0xB98, mhpmcounter24h) -RO32(0xB99, mhpmcounter25h) -RO32(0xB9A, mhpmcounter26h) -RO32(0xB9B, mhpmcounter27h) -RO32(0xB9C, mhpmcounter28h) -RO32(0xB9D, mhpmcounter29h) -RO32(0xB9E, mhpmcounter30h) -RO32(0xB9F, mhpmcounter31h) - -RW(0x323, mhpmevent3) // Machine performance-monitoring event selector -RW(0x324, mhpmevent4) // Machine performance-monitoring event selector -RW(0x325, mhpmevent5) // Machine performance-monitoring event selector -RW(0x326, mhpmevent6) // Machine performance-monitoring event selector -RW(0x327, mhpmevent7) // Machine performance-monitoring event selector -RW(0x328, mhpmevent8) // Machine performance-monitoring event selector -RW(0x329, mhpmevent9) // Machine performance-monitoring event selector -RW(0x32A, mhpmevent10) // Machine performance-monitoring event selector -RW(0x32B, mhpmevent11) // Machine performance-monitoring event selector -RW(0x32C, mhpmevent12) // Machine performance-monitoring event selector -RW(0x32D, mhpmevent13) // Machine performance-monitoring event selector -RW(0x32E, mhpmevent14) // Machine performance-monitoring event selector -RW(0x32F, mhpmevent15) // Machine performance-monitoring event selector -RW(0x330, mhpmevent16) // Machine performance-monitoring event selector -RW(0x331, mhpmevent17) // Machine performance-monitoring event selector -RW(0x332, mhpmevent18) // Machine performance-monitoring event selector -RW(0x333, mhpmevent19) // Machine performance-monitoring event selector -RW(0x334, mhpmevent20) // Machine performance-monitoring event selector -RW(0x335, mhpmevent21) // Machine performance-monitoring event selector -RW(0x336, mhpmevent22) // Machine performance-monitoring event selector -RW(0x337, mhpmevent23) // Machine performance-monitoring event selector -RW(0x338, mhpmevent24) // Machine performance-monitoring event selector -RW(0x339, mhpmevent25) // Machine performance-monitoring event selector -RW(0x33A, mhpmevent26) // Machine performance-monitoring event selector -RW(0x33B, mhpmevent27) // Machine performance-monitoring event selector -RW(0x33C, mhpmevent28) // Machine performance-monitoring event selector -RW(0x33D, mhpmevent29) // Machine performance-monitoring event selector -RW(0x33E, mhpmevent30) // Machine performance-monitoring event selector -RW(0x33F, mhpmevent31) // Machine performance-monitoring event selector - -// Debug/Trace Registers (shared with Debug Mode) -RW(0x7A0, tselect) // Debug/Trace trigger register select -RW(0x7A1, tdata1) // First Debug/Trace trigger data register -RW(0x7A2, tdata2) // Second Debug/Trace trigger data register -RW(0x7A3, tdata3) // Third Debug/Trace trigger data register - -// Debug Mode Registers -RW(0x7B0, dcsr) // Debug control and status register -RW(0x7B1, dpc) // Debug PC -RW(0x7B2, dscratch) // Debug scratch register - // VexRiscv custom registers RW(0xBC0, vmim) // Machine IRQ Mask RW(0xFC0, vmip) // Machine IRQ Pending diff --git a/src/register/fcsr.rs b/src/register/fcsr.rs deleted file mode 100644 index ba204ff..0000000 --- a/src/register/fcsr.rs +++ /dev/null @@ -1,132 +0,0 @@ -//! Floating-point control and status register - -use bit_field::BitField; - -/// Floating-point control and status register -#[derive(Clone, Copy, Debug)] -pub struct FCSR { - bits: u32, -} - -/// Accrued Exception Flags -#[derive(Clone, Copy, Debug)] -pub struct Flags(u32); - -/// Accrued Exception Flag -#[derive(Clone, Copy, Debug)] -pub enum Flag { - /// Inexact - NX = 0b00001, - - /// Underflow - UF = 0b00010, - - /// Overflow - OF = 0b00100, - - /// Divide by Zero - DZ = 0b01000, - - /// Invalid Operation - NV = 0b10000, -} - -impl Flags { - /// Inexact - #[inline] - pub fn nx(&self) -> bool { - self.0.get_bit(0) - } - - /// Underflow - #[inline] - pub fn uf(&self) -> bool { - self.0.get_bit(1) - } - - /// Overflow - #[inline] - pub fn of(&self) -> bool { - self.0.get_bit(2) - } - - /// Divide by Zero - #[inline] - pub fn dz(&self) -> bool { - self.0.get_bit(3) - } - - /// Invalid Operation - #[inline] - pub fn nv(&self) -> bool { - self.0.get_bit(4) - } -} - -/// Rounding Mode -#[derive(Clone, Copy, Debug, Eq, PartialEq)] -pub enum RoundingMode { - RoundToNearestEven = 0b000, - RoundTowardsZero = 0b001, - RoundDown = 0b010, - RoundUp = 0b011, - RoundToNearestMaxMagnitude = 0b100, - Invalid = 0b111, -} - -impl FCSR { - /// Returns the contents of the register as raw bits - pub fn bits(&self) -> u32 { - self.bits - } - - /// Accrued Exception Flags - #[inline] - pub fn fflags(&self) -> Flags { - Flags(self.bits.get_bits(0..5)) - } - - /// Rounding Mode - #[inline] - pub fn frm(&self) -> RoundingMode { - match self.bits.get_bits(5..8) { - 0b000 => RoundingMode::RoundToNearestEven, - 0b001 => RoundingMode::RoundTowardsZero, - 0b010 => RoundingMode::RoundDown, - 0b011 => RoundingMode::RoundUp, - 0b100 => RoundingMode::RoundToNearestMaxMagnitude, - _ => RoundingMode::Invalid, - } - } -} - -read_csr!(0x003, __read_fcsr); -write_csr!(0x003, __write_fcsr); -clear!(0x003, __clear_fcsr); - -/// Reads the CSR -#[inline] -pub fn read() -> FCSR { - FCSR { bits: unsafe{ _read() as u32 } } -} - -/// Writes the CSR -#[inline] -pub unsafe fn set_rounding_mode(frm: RoundingMode) { - let old = read(); - let bits = ((frm as u32) << 5) | old.fflags().0; - _write(bits as usize); -} - -/// Resets `fflags` field bits -#[inline] -pub unsafe fn clear_flags() { - let mask = 0b11111; - _clear(mask); -} - -/// Resets `fflags` field bit -#[inline] -pub unsafe fn clear_flag(flag: Flag) { - _clear(flag as usize); -} diff --git a/src/register/hpmcounterx.rs b/src/register/hpmcounterx.rs deleted file mode 100644 index 5eb15b0..0000000 --- a/src/register/hpmcounterx.rs +++ /dev/null @@ -1,82 +0,0 @@ -macro_rules! reg { - ( - $addr:expr, $csrl:ident, $csrh:ident, $readf:ident, $writef:ident - ) => { - /// Performance-monitoring counter - pub mod $csrl { - read_csr_as_usize!($addr, $readf); - read_composite_csr!(super::$csrh::read(), read()); - } - } -} - -macro_rules! regh { - ( - $addr:expr, $csrh:ident, $readf:ident, $writef:ident - ) => { - /// Upper 32 bits of performance-monitoring counter (RV32I only) - pub mod $csrh { - read_csr_as_usize_rv32!($addr, $readf); - } - } -} - -reg!(0xC03, hpmcounter3, hpmcounter3h, __read_hpmcounter3, __write_hpmcounter3); -reg!(0xC04, hpmcounter4, hpmcounter4h, __read_hpmcounter4, __write_hpmcounter4); -reg!(0xC05, hpmcounter5, hpmcounter5h, __read_hpmcounter5, __write_hpmcounter5); -reg!(0xC06, hpmcounter6, hpmcounter6h, __read_hpmcounter6, __write_hpmcounter6); -reg!(0xC07, hpmcounter7, hpmcounter7h, __read_hpmcounter7, __write_hpmcounter7); -reg!(0xC08, hpmcounter8, hpmcounter8h, __read_hpmcounter8, __write_hpmcounter8); -reg!(0xC09, hpmcounter9, hpmcounter9h, __read_hpmcounter9, __write_hpmcounter9); -reg!(0xC0A, hpmcounter10, hpmcounter10h, __read_hpmcounter10, __write_hpmcounter10); -reg!(0xC0B, hpmcounter11, hpmcounter11h, __read_hpmcounter11, __write_hpmcounter11); -reg!(0xC0C, hpmcounter12, hpmcounter12h, __read_hpmcounter12, __write_hpmcounter12); -reg!(0xC0D, hpmcounter13, hpmcounter13h, __read_hpmcounter13, __write_hpmcounter13); -reg!(0xC0E, hpmcounter14, hpmcounter14h, __read_hpmcounter14, __write_hpmcounter14); -reg!(0xC0F, hpmcounter15, hpmcounter15h, __read_hpmcounter15, __write_hpmcounter15); -reg!(0xC10, hpmcounter16, hpmcounter16h, __read_hpmcounter16, __write_hpmcounter16); -reg!(0xC11, hpmcounter17, hpmcounter17h, __read_hpmcounter17, __write_hpmcounter17); -reg!(0xC12, hpmcounter18, hpmcounter18h, __read_hpmcounter18, __write_hpmcounter18); -reg!(0xC13, hpmcounter19, hpmcounter19h, __read_hpmcounter19, __write_hpmcounter19); -reg!(0xC14, hpmcounter20, hpmcounter20h, __read_hpmcounter20, __write_hpmcounter20); -reg!(0xC15, hpmcounter21, hpmcounter21h, __read_hpmcounter21, __write_hpmcounter21); -reg!(0xC16, hpmcounter22, hpmcounter22h, __read_hpmcounter22, __write_hpmcounter22); -reg!(0xC17, hpmcounter23, hpmcounter23h, __read_hpmcounter23, __write_hpmcounter23); -reg!(0xC18, hpmcounter24, hpmcounter24h, __read_hpmcounter24, __write_hpmcounter24); -reg!(0xC19, hpmcounter25, hpmcounter25h, __read_hpmcounter25, __write_hpmcounter25); -reg!(0xC1A, hpmcounter26, hpmcounter26h, __read_hpmcounter26, __write_hpmcounter26); -reg!(0xC1B, hpmcounter27, hpmcounter27h, __read_hpmcounter27, __write_hpmcounter27); -reg!(0xC1C, hpmcounter28, hpmcounter28h, __read_hpmcounter28, __write_hpmcounter28); -reg!(0xC1D, hpmcounter29, hpmcounter29h, __read_hpmcounter29, __write_hpmcounter29); -reg!(0xC1E, hpmcounter30, hpmcounter30h, __read_hpmcounter30, __write_hpmcounter30); -reg!(0xC1F, hpmcounter31, hpmcounter31h, __read_hpmcounter31, __write_hpmcounter31); - -regh!(0xC83, hpmcounter3h, __read_hpmcounter3h, __write_hpmcounter3h); -regh!(0xC84, hpmcounter4h, __read_hpmcounter4h, __write_hpmcounter4h); -regh!(0xC85, hpmcounter5h, __read_hpmcounter5h, __write_hpmcounter5h); -regh!(0xC86, hpmcounter6h, __read_hpmcounter6h, __write_hpmcounter6h); -regh!(0xC87, hpmcounter7h, __read_hpmcounter7h, __write_hpmcounter7h); -regh!(0xC88, hpmcounter8h, __read_hpmcounter8h, __write_hpmcounter8h); -regh!(0xC89, hpmcounter9h, __read_hpmcounter9h, __write_hpmcounter9h); -regh!(0xC8A, hpmcounter10h, __read_hpmcounter10h, __write_hpmcounter10h); -regh!(0xC8B, hpmcounter11h, __read_hpmcounter11h, __write_hpmcounter11h); -regh!(0xC8C, hpmcounter12h, __read_hpmcounter12h, __write_hpmcounter12h); -regh!(0xC8D, hpmcounter13h, __read_hpmcounter13h, __write_hpmcounter13h); -regh!(0xC8E, hpmcounter14h, __read_hpmcounter14h, __write_hpmcounter14h); -regh!(0xC8F, hpmcounter15h, __read_hpmcounter15h, __write_hpmcounter15h); -regh!(0xC90, hpmcounter16h, __read_hpmcounter16h, __write_hpmcounter16h); -regh!(0xC91, hpmcounter17h, __read_hpmcounter17h, __write_hpmcounter17h); -regh!(0xC92, hpmcounter18h, __read_hpmcounter18h, __write_hpmcounter18h); -regh!(0xC93, hpmcounter19h, __read_hpmcounter19h, __write_hpmcounter19h); -regh!(0xC94, hpmcounter20h, __read_hpmcounter20h, __write_hpmcounter20h); -regh!(0xC95, hpmcounter21h, __read_hpmcounter21h, __write_hpmcounter21h); -regh!(0xC96, hpmcounter22h, __read_hpmcounter22h, __write_hpmcounter22h); -regh!(0xC97, hpmcounter23h, __read_hpmcounter23h, __write_hpmcounter23h); -regh!(0xC98, hpmcounter24h, __read_hpmcounter24h, __write_hpmcounter24h); -regh!(0xC99, hpmcounter25h, __read_hpmcounter25h, __write_hpmcounter25h); -regh!(0xC9A, hpmcounter26h, __read_hpmcounter26h, __write_hpmcounter26h); -regh!(0xC9B, hpmcounter27h, __read_hpmcounter27h, __write_hpmcounter27h); -regh!(0xC9C, hpmcounter28h, __read_hpmcounter28h, __write_hpmcounter28h); -regh!(0xC9D, hpmcounter29h, __read_hpmcounter29h, __write_hpmcounter29h); -regh!(0xC9E, hpmcounter30h, __read_hpmcounter30h, __write_hpmcounter30h); -regh!(0xC9F, hpmcounter31h, __read_hpmcounter31h, __write_hpmcounter31h); diff --git a/src/register/marchid.rs b/src/register/marchid.rs deleted file mode 100644 index c10112e..0000000 --- a/src/register/marchid.rs +++ /dev/null @@ -1,27 +0,0 @@ -//! marchid register - -use core::num::NonZeroUsize; - -/// marchid register -#[derive(Clone, Copy, Debug)] -pub struct Marchid { - bits: NonZeroUsize, -} - -impl Marchid { - /// Returns the contents of the register as raw bits - pub fn bits(&self) -> usize { - self.bits.get() - } -} - -read_csr!(0xF11, __read_marchid); - -/// Reads the CSR -#[inline] -pub fn read() -> Option { - let r = unsafe{ _read() }; - // When marchid is hardwired to zero it means that the marchid - // csr isn't implemented. - NonZeroUsize::new(r).map(|bits| Marchid { bits }) -} diff --git a/src/register/mcause.rs b/src/register/mcause.rs deleted file mode 100644 index e0e6ffb..0000000 --- a/src/register/mcause.rs +++ /dev/null @@ -1,139 +0,0 @@ -//! mcause register - -/// mcause register -#[derive(Clone, Copy, Debug)] -pub struct Mcause { - bits: usize, -} - -/// Trap Cause -#[derive(Copy, Clone, Debug, PartialEq, Eq)] -pub enum Trap { - Interrupt(Interrupt), - Exception(Exception), -} - -/// Interrupt -#[derive(Copy, Clone, Debug, PartialEq, Eq)] -pub enum Interrupt { - UserSoft, - SupervisorSoft, - MachineSoft, - UserTimer, - SupervisorTimer, - MachineTimer, - UserExternal, - SupervisorExternal, - MachineExternal, - Unknown, -} - -/// Exception -#[derive(Copy, Clone, Debug, PartialEq, Eq)] -pub enum Exception { - InstructionMisaligned, - InstructionFault, - IllegalInstruction, - Breakpoint, - LoadMisaligned, - LoadFault, - StoreMisaligned, - StoreFault, - UserEnvCall, - SupervisorEnvCall, - MachineEnvCall, - InstructionPageFault, - LoadPageFault, - StorePageFault, - Unknown, -} - -impl Interrupt { - pub fn from(nr: usize) -> Self { - match nr { - 0 => Interrupt::UserSoft, - 1 => Interrupt::SupervisorSoft, - 3 => Interrupt::MachineSoft, - 4 => Interrupt::UserTimer, - 5 => Interrupt::SupervisorTimer, - 7 => Interrupt::MachineTimer, - 8 => Interrupt::UserExternal, - 9 => Interrupt::SupervisorExternal, - 11 => Interrupt::MachineExternal, - _ => Interrupt::Unknown, - } - } -} - - -impl Exception { - pub fn from(nr: usize) -> Self { - match nr { - 0 => Exception::InstructionMisaligned, - 1 => Exception::InstructionFault, - 2 => Exception::IllegalInstruction, - 3 => Exception::Breakpoint, - 4 => Exception::LoadMisaligned, - 5 => Exception::LoadFault, - 6 => Exception::StoreMisaligned, - 7 => Exception::StoreFault, - 8 => Exception::UserEnvCall, - 9 => Exception::SupervisorEnvCall, - 11 => Exception::MachineEnvCall, - 12 => Exception::InstructionPageFault, - 13 => Exception::LoadPageFault, - 15 => Exception::StorePageFault, - _ => Exception::Unknown, - } - } -} -impl Mcause { - /// Returns the contents of the register as raw bits - #[inline] - pub fn bits(&self) -> usize { - self.bits - } - - /// Returns the code field - pub fn code(&self) -> usize { - match () { - #[cfg(target_pointer_width = "32")] - () => self.bits & !(1 << 31), - #[cfg(target_pointer_width = "64")] - () => self.bits & !(1 << 63), - #[cfg(target_pointer_width = "128")] - () => self.bits & !(1 << 127), - } - } - - /// Trap Cause - #[inline] - pub fn cause(&self) -> Trap { - if self.is_interrupt() { - Trap::Interrupt(Interrupt::from(self.code())) - } else { - Trap::Exception(Exception::from(self.code())) - } - } - - /// Is trap cause an interrupt. - #[inline] - pub fn is_interrupt(&self) -> bool { - match () { - #[cfg(target_pointer_width = "32")] - () => self.bits & (1 << 31) == 1 << 31, - #[cfg(target_pointer_width = "64")] - () => self.bits & (1 << 63) == 1 << 63, - #[cfg(target_pointer_width = "128")] - () => self.bits & (1 << 127) == 1 << 127, - } - } - - /// Is trap cause an exception. - #[inline] - pub fn is_exception(&self) -> bool { - !self.is_interrupt() - } -} - -read_csr_as!(Mcause, 0x342, __read_mcause); diff --git a/src/register/mcycle.rs b/src/register/mcycle.rs deleted file mode 100644 index 95d172b..0000000 --- a/src/register/mcycle.rs +++ /dev/null @@ -1,4 +0,0 @@ -//! mcycle register - -read_csr_as_usize!(0xB00, __read_mcycle); -read_composite_csr!(super::mcycleh::read(), read()); diff --git a/src/register/mcycleh.rs b/src/register/mcycleh.rs deleted file mode 100644 index 784dca4..0000000 --- a/src/register/mcycleh.rs +++ /dev/null @@ -1,3 +0,0 @@ -//! mcycleh register - -read_csr_as_usize_rv32!(0xB80, __read_mcycleh); diff --git a/src/register/mepc.rs b/src/register/mepc.rs deleted file mode 100644 index 160dff5..0000000 --- a/src/register/mepc.rs +++ /dev/null @@ -1,4 +0,0 @@ -//! mepc register - -read_csr_as_usize!(0x341, __read_mepc); -write_csr_as_usize!(0x341, __write_mepc); diff --git a/src/register/mhartid.rs b/src/register/mhartid.rs deleted file mode 100644 index 3960388..0000000 --- a/src/register/mhartid.rs +++ /dev/null @@ -1,3 +0,0 @@ -//! mhartid register - -read_csr_as_usize!(0xf14, __read_mhartid); diff --git a/src/register/mhpmcounterx.rs b/src/register/mhpmcounterx.rs deleted file mode 100644 index df3b6c4..0000000 --- a/src/register/mhpmcounterx.rs +++ /dev/null @@ -1,84 +0,0 @@ -macro_rules! reg { - ( - $addr:expr, $csrl:ident, $csrh:ident, $readf:ident, $writef:ident - ) => { - /// Machine performance-monitoring counter - pub mod $csrl { - read_csr_as_usize!($addr, $readf); - write_csr_as_usize!($addr, $writef); - read_composite_csr!(super::$csrh::read(), read()); - } - } -} - -macro_rules! regh { - ( - $addr:expr, $csrh:ident, $readf:ident, $writef:ident - ) => { - /// Upper 32 bits of machine performance-monitoring counter (RV32I only) - pub mod $csrh { - read_csr_as_usize_rv32!($addr, $readf); - write_csr_as_usize_rv32!($addr, $writef); - } - } -} - -reg!(0xB03, mhpmcounter3, mhpmcounter3h, __read_mhpmcounter3, __write_mhpmcounter3); -reg!(0xB04, mhpmcounter4, mhpmcounter4h, __read_mhpmcounter4, __write_mhpmcounter4); -reg!(0xB05, mhpmcounter5, mhpmcounter5h, __read_mhpmcounter5, __write_mhpmcounter5); -reg!(0xB06, mhpmcounter6, mhpmcounter6h, __read_mhpmcounter6, __write_mhpmcounter6); -reg!(0xB07, mhpmcounter7, mhpmcounter7h, __read_mhpmcounter7, __write_mhpmcounter7); -reg!(0xB08, mhpmcounter8, mhpmcounter8h, __read_mhpmcounter8, __write_mhpmcounter8); -reg!(0xB09, mhpmcounter9, mhpmcounter9h, __read_mhpmcounter9, __write_mhpmcounter9); -reg!(0xB0A, mhpmcounter10, mhpmcounter10h, __read_mhpmcounter10, __write_mhpmcounter10); -reg!(0xB0B, mhpmcounter11, mhpmcounter11h, __read_mhpmcounter11, __write_mhpmcounter11); -reg!(0xB0C, mhpmcounter12, mhpmcounter12h, __read_mhpmcounter12, __write_mhpmcounter12); -reg!(0xB0D, mhpmcounter13, mhpmcounter13h, __read_mhpmcounter13, __write_mhpmcounter13); -reg!(0xB0E, mhpmcounter14, mhpmcounter14h, __read_mhpmcounter14, __write_mhpmcounter14); -reg!(0xB0F, mhpmcounter15, mhpmcounter15h, __read_mhpmcounter15, __write_mhpmcounter15); -reg!(0xB10, mhpmcounter16, mhpmcounter16h, __read_mhpmcounter16, __write_mhpmcounter16); -reg!(0xB11, mhpmcounter17, mhpmcounter17h, __read_mhpmcounter17, __write_mhpmcounter17); -reg!(0xB12, mhpmcounter18, mhpmcounter18h, __read_mhpmcounter18, __write_mhpmcounter18); -reg!(0xB13, mhpmcounter19, mhpmcounter19h, __read_mhpmcounter19, __write_mhpmcounter19); -reg!(0xB14, mhpmcounter20, mhpmcounter20h, __read_mhpmcounter20, __write_mhpmcounter20); -reg!(0xB15, mhpmcounter21, mhpmcounter21h, __read_mhpmcounter21, __write_mhpmcounter21); -reg!(0xB16, mhpmcounter22, mhpmcounter22h, __read_mhpmcounter22, __write_mhpmcounter22); -reg!(0xB17, mhpmcounter23, mhpmcounter23h, __read_mhpmcounter23, __write_mhpmcounter23); -reg!(0xB18, mhpmcounter24, mhpmcounter24h, __read_mhpmcounter24, __write_mhpmcounter24); -reg!(0xB19, mhpmcounter25, mhpmcounter25h, __read_mhpmcounter25, __write_mhpmcounter25); -reg!(0xB1A, mhpmcounter26, mhpmcounter26h, __read_mhpmcounter26, __write_mhpmcounter26); -reg!(0xB1B, mhpmcounter27, mhpmcounter27h, __read_mhpmcounter27, __write_mhpmcounter27); -reg!(0xB1C, mhpmcounter28, mhpmcounter28h, __read_mhpmcounter28, __write_mhpmcounter28); -reg!(0xB1D, mhpmcounter29, mhpmcounter29h, __read_mhpmcounter29, __write_mhpmcounter29); -reg!(0xB1E, mhpmcounter30, mhpmcounter30h, __read_mhpmcounter30, __write_mhpmcounter30); -reg!(0xB1F, mhpmcounter31, mhpmcounter31h, __read_mhpmcounter31, __write_mhpmcounter31); - -regh!(0xB83, mhpmcounter3h, __read_mhpmcounter3h, __write_mhpmcounter3h); -regh!(0xB84, mhpmcounter4h, __read_mhpmcounter4h, __write_mhpmcounter4h); -regh!(0xB85, mhpmcounter5h, __read_mhpmcounter5h, __write_mhpmcounter5h); -regh!(0xB86, mhpmcounter6h, __read_mhpmcounter6h, __write_mhpmcounter6h); -regh!(0xB87, mhpmcounter7h, __read_mhpmcounter7h, __write_mhpmcounter7h); -regh!(0xB88, mhpmcounter8h, __read_mhpmcounter8h, __write_mhpmcounter8h); -regh!(0xB89, mhpmcounter9h, __read_mhpmcounter9h, __write_mhpmcounter9h); -regh!(0xB8A, mhpmcounter10h, __read_mhpmcounter10h, __write_mhpmcounter10h); -regh!(0xB8B, mhpmcounter11h, __read_mhpmcounter11h, __write_mhpmcounter11h); -regh!(0xB8C, mhpmcounter12h, __read_mhpmcounter12h, __write_mhpmcounter12h); -regh!(0xB8D, mhpmcounter13h, __read_mhpmcounter13h, __write_mhpmcounter13h); -regh!(0xB8E, mhpmcounter14h, __read_mhpmcounter14h, __write_mhpmcounter14h); -regh!(0xB8F, mhpmcounter15h, __read_mhpmcounter15h, __write_mhpmcounter15h); -regh!(0xB90, mhpmcounter16h, __read_mhpmcounter16h, __write_mhpmcounter16h); -regh!(0xB91, mhpmcounter17h, __read_mhpmcounter17h, __write_mhpmcounter17h); -regh!(0xB92, mhpmcounter18h, __read_mhpmcounter18h, __write_mhpmcounter18h); -regh!(0xB93, mhpmcounter19h, __read_mhpmcounter19h, __write_mhpmcounter19h); -regh!(0xB94, mhpmcounter20h, __read_mhpmcounter20h, __write_mhpmcounter20h); -regh!(0xB95, mhpmcounter21h, __read_mhpmcounter21h, __write_mhpmcounter21h); -regh!(0xB96, mhpmcounter22h, __read_mhpmcounter22h, __write_mhpmcounter22h); -regh!(0xB97, mhpmcounter23h, __read_mhpmcounter23h, __write_mhpmcounter23h); -regh!(0xB98, mhpmcounter24h, __read_mhpmcounter24h, __write_mhpmcounter24h); -regh!(0xB99, mhpmcounter25h, __read_mhpmcounter25h, __write_mhpmcounter25h); -regh!(0xB9A, mhpmcounter26h, __read_mhpmcounter26h, __write_mhpmcounter26h); -regh!(0xB9B, mhpmcounter27h, __read_mhpmcounter27h, __write_mhpmcounter27h); -regh!(0xB9C, mhpmcounter28h, __read_mhpmcounter28h, __write_mhpmcounter28h); -regh!(0xB9D, mhpmcounter29h, __read_mhpmcounter29h, __write_mhpmcounter29h); -regh!(0xB9E, mhpmcounter30h, __read_mhpmcounter30h, __write_mhpmcounter30h); -regh!(0xB9F, mhpmcounter31h, __read_mhpmcounter31h, __write_mhpmcounter31h); diff --git a/src/register/mhpmeventx.rs b/src/register/mhpmeventx.rs deleted file mode 100644 index 78f6fef..0000000 --- a/src/register/mhpmeventx.rs +++ /dev/null @@ -1,41 +0,0 @@ -macro_rules! reg { - ( - $addr:expr, $csr:ident, $readf:ident, $writef:ident - ) => { - /// Machine performance-monitoring event selector - pub mod $csr { - read_csr_as_usize!($addr, $readf); - write_csr_as_usize!($addr, $writef); - } - } -} - -reg!(0x323, mhpmevent3, __read_mhpmevent3, __write_mhpmevent3); -reg!(0x324, mhpmevent4, __read_mhpmevent4, __write_mhpmevent4); -reg!(0x325, mhpmevent5, __read_mhpmevent5, __write_mhpmevent5); -reg!(0x326, mhpmevent6, __read_mhpmevent6, __write_mhpmevent6); -reg!(0x327, mhpmevent7, __read_mhpmevent7, __write_mhpmevent7); -reg!(0x328, mhpmevent8, __read_mhpmevent8, __write_mhpmevent8); -reg!(0x329, mhpmevent9, __read_mhpmevent9, __write_mhpmevent9); -reg!(0x32A, mhpmevent10, __read_mhpmevent10, __write_mhpmevent10); -reg!(0x32B, mhpmevent11, __read_mhpmevent11, __write_mhpmevent11); -reg!(0x32C, mhpmevent12, __read_mhpmevent12, __write_mhpmevent12); -reg!(0x32D, mhpmevent13, __read_mhpmevent13, __write_mhpmevent13); -reg!(0x32E, mhpmevent14, __read_mhpmevent14, __write_mhpmevent14); -reg!(0x32F, mhpmevent15, __read_mhpmevent15, __write_mhpmevent15); -reg!(0x330, mhpmevent16, __read_mhpmevent16, __write_mhpmevent16); -reg!(0x331, mhpmevent17, __read_mhpmevent17, __write_mhpmevent17); -reg!(0x332, mhpmevent18, __read_mhpmevent18, __write_mhpmevent18); -reg!(0x333, mhpmevent19, __read_mhpmevent19, __write_mhpmevent19); -reg!(0x334, mhpmevent20, __read_mhpmevent20, __write_mhpmevent20); -reg!(0x335, mhpmevent21, __read_mhpmevent21, __write_mhpmevent21); -reg!(0x336, mhpmevent22, __read_mhpmevent22, __write_mhpmevent22); -reg!(0x337, mhpmevent23, __read_mhpmevent23, __write_mhpmevent23); -reg!(0x338, mhpmevent24, __read_mhpmevent24, __write_mhpmevent24); -reg!(0x339, mhpmevent25, __read_mhpmevent25, __write_mhpmevent25); -reg!(0x33A, mhpmevent26, __read_mhpmevent26, __write_mhpmevent26); -reg!(0x33B, mhpmevent27, __read_mhpmevent27, __write_mhpmevent27); -reg!(0x33C, mhpmevent28, __read_mhpmevent28, __write_mhpmevent28); -reg!(0x33D, mhpmevent29, __read_mhpmevent29, __write_mhpmevent29); -reg!(0x33E, mhpmevent30, __read_mhpmevent30, __write_mhpmevent30); -reg!(0x33F, mhpmevent31, __read_mhpmevent31, __write_mhpmevent31); diff --git a/src/register/mie.rs b/src/register/mie.rs deleted file mode 100644 index 121a5b5..0000000 --- a/src/register/mie.rs +++ /dev/null @@ -1,103 +0,0 @@ -//! mie register - -use bit_field::BitField; - -/// mie register -#[derive(Clone, Copy, Debug)] -pub struct Mie { - bits: usize, -} - -impl Mie { - /// Returns the contents of the register as raw bits - #[inline] - pub fn bits(&self) -> usize { - self.bits - } - - /// User Software Interrupt Enable - #[inline] - pub fn usoft(&self) -> bool { - self.bits.get_bit(0) - } - - /// Supervisor Software Interrupt Enable - #[inline] - pub fn ssoft(&self) -> bool { - self.bits.get_bit(1) - } - - /// Machine Software Interrupt Enable - #[inline] - pub fn msoft(&self) -> bool { - self.bits.get_bit(3) - } - - /// User Timer Interrupt Enable - #[inline] - pub fn utimer(&self) -> bool { - self.bits.get_bit(4) - } - - /// Supervisor Timer Interrupt Enable - #[inline] - pub fn stimer(&self) -> bool { - self.bits.get_bit(5) - } - - /// Machine Timer Interrupt Enable - #[inline] - pub fn mtimer(&self) -> bool { - self.bits.get_bit(7) - } - - /// User External Interrupt Enable - #[inline] - pub fn uext(&self) -> bool { - self.bits.get_bit(8) - } - - /// Supervisor External Interrupt Enable - #[inline] - pub fn sext(&self) -> bool { - self.bits.get_bit(9) - } - - /// Machine External Interrupt Enable - #[inline] - pub fn mext(&self) -> bool { - self.bits.get_bit(11) - } -} - -read_csr_as!(Mie, 0x304, __read_mie); -set!(0x304, __set_mie); -clear!(0x304, __clear_mie); - -set_clear_csr!( - /// User Software Interrupt Enable - , set_usoft, clear_usoft, 1 << 0); -set_clear_csr!( - /// Supervisor Software Interrupt Enable - , set_ssoft, clear_ssoft, 1 << 1); -set_clear_csr!( - /// Machine Software Interrupt Enable - , set_msoft, clear_msoft, 1 << 3); -set_clear_csr!( - /// User Timer Interrupt Enable - , set_utimer, clear_utimer, 1 << 4); -set_clear_csr!( - /// Supervisor Timer Interrupt Enable - , set_stimer, clear_stimer, 1 << 5); -set_clear_csr!( - /// Machine Timer Interrupt Enable - , set_mtimer, clear_mtimer, 1 << 7); -set_clear_csr!( - /// User External Interrupt Enable - , set_uext, clear_uext, 1 << 8); -set_clear_csr!( - /// Supervisor External Interrupt Enable - , set_sext, clear_sext, 1 << 9); -set_clear_csr!( - /// Machine External Interrupt Enable - , set_mext, clear_mext, 1 << 11); diff --git a/src/register/mimpid.rs b/src/register/mimpid.rs deleted file mode 100644 index e49a246..0000000 --- a/src/register/mimpid.rs +++ /dev/null @@ -1,27 +0,0 @@ -//! mimpid register - -use core::num::NonZeroUsize; - -/// mimpid register -#[derive(Clone, Copy, Debug)] -pub struct Mimpid { - bits: NonZeroUsize, -} - -impl Mimpid { - /// Returns the contents of the register as raw bits - pub fn bits(&self) -> usize { - self.bits.get() - } -} - -read_csr!(0xF11, __read_mimpid); - -/// Reads the CSR -#[inline] -pub fn read() -> Option { - let r = unsafe{ _read() }; - // When mimpid is hardwired to zero it means that the mimpid - // csr isn't implemented. - NonZeroUsize::new(r).map(|bits| Mimpid { bits }) -} diff --git a/src/register/minstret.rs b/src/register/minstret.rs deleted file mode 100644 index d553dd8..0000000 --- a/src/register/minstret.rs +++ /dev/null @@ -1,4 +0,0 @@ -//! minstret register - -read_csr_as_usize!(0xB02, __read_minstret); -read_composite_csr!(super::minstreth::read(), read()); diff --git a/src/register/minstreth.rs b/src/register/minstreth.rs deleted file mode 100644 index 56bc54e..0000000 --- a/src/register/minstreth.rs +++ /dev/null @@ -1,3 +0,0 @@ -//! minstreth register - -read_csr_as_usize_rv32!(0xB82, __read_minstreth); diff --git a/src/register/mip.rs b/src/register/mip.rs deleted file mode 100644 index 1a4cf82..0000000 --- a/src/register/mip.rs +++ /dev/null @@ -1,100 +0,0 @@ -//! mip register - -use bit_field::BitField; - -/// mip register -#[derive(Clone, Copy, Debug)] -pub struct Mip { - bits: usize, -} - -impl Mip { - /// Returns the contents of the register as raw bits - #[inline] - pub fn bits(&self) -> usize { - self.bits - } - - /// User Software Interrupt Pending - #[inline] - pub fn usoft(&self) -> bool { - self.bits.get_bit(0) - } - - /// Supervisor Software Interrupt Pending - #[inline] - pub fn ssoft(&self) -> bool { - self.bits.get_bit(1) - } - - /// Machine Software Interrupt Pending - #[inline] - pub fn msoft(&self) -> bool { - self.bits.get_bit(3) - } - - /// User Timer Interrupt Pending - #[inline] - pub fn utimer(&self) -> bool { - self.bits.get_bit(4) - } - - /// Supervisor Timer Interrupt Pending - #[inline] - pub fn stimer(&self) -> bool { - self.bits.get_bit(5) - } - - /// Machine Timer Interrupt Pending - #[inline] - pub fn mtimer(&self) -> bool { - self.bits.get_bit(7) - } - - /// User External Interrupt Pending - #[inline] - pub fn uext(&self) -> bool { - self.bits.get_bit(8) - } - - /// Supervisor External Interrupt Pending - #[inline] - pub fn sext(&self) -> bool { - self.bits.get_bit(9) - } - - /// Machine External Interrupt Pending - #[inline] - pub fn mext(&self) -> bool { - self.bits.get_bit(11) - } -} - -read_csr_as!(Mip, 0x344, __read_mip); -set!(0x344, __set_mip); -clear!(0x344, __clear_mip); - -set_clear_csr!( - /// User Software Interrupt Pending - , set_usoft, clear_usoft, 1 << 0); -set_clear_csr!( - /// Supervisor Software Interrupt Pending - , set_ssoft, clear_ssoft, 1 << 1); -set_clear_csr!( - /// Machine Software Interrupt Pending - , set_msoft, clear_msoft, 1 << 3); -set_clear_csr!( - /// User Timer Interrupt Pending - , set_utimer, clear_utimer, 1 << 4); -set_clear_csr!( - /// Supervisor Timer Interrupt Pending - , set_stimer, clear_stimer, 1 << 5); -set_clear_csr!( - /// Machine Timer Interrupt Pending - , set_mtimer, clear_mtimer, 1 << 7); -set_clear_csr!( - /// User External Interrupt Pending - , set_uext, clear_uext, 1 << 8); -set_clear_csr!( - /// Supervisor External Interrupt Pending - , set_sext, clear_sext, 1 << 9); diff --git a/src/register/misa.rs b/src/register/misa.rs deleted file mode 100644 index 792e22c..0000000 --- a/src/register/misa.rs +++ /dev/null @@ -1,60 +0,0 @@ -//! misa register - -use core::num::NonZeroUsize; - -/// misa register -#[derive(Clone, Copy, Debug)] -pub struct Misa { - bits: NonZeroUsize, -} - -/// Machine XLEN -#[derive(Copy, Clone, Debug, Eq, PartialEq)] -pub enum MXL { - XLEN32, - XLEN64, - XLEN128, -} - -impl Misa { - /// Returns the contents of the register as raw bits - pub fn bits(&self) -> usize { - self.bits.get() - } - - /// Returns the machine xlen. - pub fn mxl(&self) -> MXL { - let value = match () { - #[cfg(target_pointer_width = "32")] - () => (self.bits() >> 30) as u8, - #[cfg(target_pointer_width = "64")] - () => (self.bits() >> 62) as u8, - }; - match value { - 1 => MXL::XLEN32, - 2 => MXL::XLEN64, - 3 => MXL::XLEN128, - _ => unreachable!(), - } - } - - /// Returns true when the atomic extension is implemented. - pub fn has_extension(&self, extension: char) -> bool { - let bit = extension as u8 - 65; - if bit > 25 { - return false; - } - self.bits() & (1 << bit) == (1 << bit) - } -} - -read_csr!(0x301, __read_misa); - -/// Reads the CSR -#[inline] -pub fn read() -> Option { - let r = unsafe{ _read() }; - // When misa is hardwired to zero it means that the misa csr - // isn't implemented. - NonZeroUsize::new(r).map(|bits| Misa { bits }) -} diff --git a/src/register/mod.rs b/src/register/mod.rs index b478817..716c10e 100644 --- a/src/register/mod.rs +++ b/src/register/mod.rs @@ -1,114 +1,9 @@ -//! RISC-V CSR's -//! -//! The following registers are not available on 64-bit implementations. -//! -//! - cycleh -//! - timeh -//! - instreth -//! - hpmcounter[3-31]h -//! - mcycleh -//! - minstreth -//! - mhpmcounter[3-31]h +//! VexRiscv Control and Status Registers #[macro_use] mod macros; -// User Trap Setup -pub mod ustatus; -pub mod uie; -pub mod utvec; - -// User Trap Handling -pub mod uscratch; -pub mod uepc; -pub mod ucause; -pub mod utval; -pub mod uip; - -// User Floating-Point CSRs -// TODO: frm, fflags -pub mod fcsr; - - -// User Counter/Timers -// TODO: cycle[h], instret[h] -pub mod time; -mod hpmcounterx; -pub use self::hpmcounterx::*; -pub mod timeh; - - -// Supervisor Trap Setup -// TODO: sedeleg, sideleg -pub mod sstatus; -pub mod sie; -pub mod stvec; -// TODO: scounteren - - -// Supervisor Trap Handling -pub mod sscratch; -pub mod sepc; -pub mod scause; -pub mod stval; -pub mod sip; - - -// Supervisor Protection and Translation -pub mod satp; - - -// Machine Information Registers -pub mod mvendorid; -pub mod marchid; -pub mod mimpid; -pub mod mhartid; - - -// Machine Trap Setup -pub mod mstatus; -pub mod misa; -// TODO: medeleg, mideleg -pub mod mie; -pub mod mtvec; -// TODO: mcounteren - - -// Machine Trap Handling -pub mod mscratch; -pub mod mepc; -pub mod mcause; -pub mod mtval; -pub mod mip; - - -// Machine Protection and Translation -mod pmpcfgx; -pub use self::pmpcfgx::*; -mod pmpaddrx; -pub use self::pmpaddrx::*; - - -// Machine Counter/Timers -pub mod mcycle; -pub mod minstret; -mod mhpmcounterx; -pub use self::mhpmcounterx::*; -pub mod mcycleh; -pub mod minstreth; - - -// Machine Counter Setup -mod mhpmeventx; -pub use self::mhpmeventx::*; - - -// TODO: Debug/Trace Registers (shared with Debug Mode) - - -// TODO: Debug Mode Registers - -// Vexriscv Registers +// VexRiscv Registers pub mod vdci; pub mod vmim; pub mod vmip; diff --git a/src/register/mscratch.rs b/src/register/mscratch.rs deleted file mode 100644 index c5ef9fe..0000000 --- a/src/register/mscratch.rs +++ /dev/null @@ -1,4 +0,0 @@ -//! mscratch register - -read_csr_as_usize!(0x340, __read_mscratch); -write_csr_as_usize!(0x340, __write_mscratch); diff --git a/src/register/mstatus.rs b/src/register/mstatus.rs deleted file mode 100644 index 6c34c83..0000000 --- a/src/register/mstatus.rs +++ /dev/null @@ -1,200 +0,0 @@ -//! mstatus register -// TODO: Virtualization, Memory Privilege and Extension Context Fields - -use bit_field::BitField; -use core::mem::size_of; - -/// mstatus register -#[derive(Clone, Copy, Debug)] -pub struct Mstatus { - bits: usize, -} - -/// Additional extension state -#[derive(Copy, Clone, Debug, Eq, PartialEq)] -pub enum XS { - /// All off - AllOff = 0, - - /// None dirty or clean, some on - NoneDirtyOrClean = 1, - - /// None dirty, some clean - NoneDirtySomeClean = 2, - - /// Some dirty - SomeDirty = 3, -} - -/// Floating-point extension state -#[derive(Copy, Clone, Debug, Eq, PartialEq)] -pub enum FS { - Off = 0, - Initial = 1, - Clean = 2, - Dirty = 3, -} - -/// Machine Previous Privilege Mode -#[derive(Copy, Clone, Debug, Eq, PartialEq)] -pub enum MPP { - Machine = 3, - Supervisor = 1, - User = 0, -} - -/// Supervisor Previous Privilege Mode -#[derive(Copy, Clone, Debug, Eq, PartialEq)] -pub enum SPP { - Supervisor = 1, - User = 0, -} - -impl Mstatus { - /// User Interrupt Enable - #[inline] - pub fn uie(&self) -> bool { - self.bits.get_bit(0) - } - - /// Supervisor Interrupt Enable - #[inline] - pub fn sie(&self) -> bool { - self.bits.get_bit(1) - } - - /// Machine Interrupt Enable - #[inline] - pub fn mie(&self) -> bool { - self.bits.get_bit(3) - } - - /// User Previous Interrupt Enable - #[inline] - pub fn upie(&self) -> bool { - self.bits.get_bit(4) - } - - /// Supervisor Previous Interrupt Enable - #[inline] - pub fn spie(&self) -> bool { - self.bits.get_bit(5) - } - - /// Machine Previous Interrupt Enable - #[inline] - pub fn mpie(&self) -> bool { - self.bits.get_bit(7) - } - - /// Supervisor Previous Privilege Mode - #[inline] - pub fn spp(&self) -> SPP { - match self.bits.get_bit(8) { - true => SPP::Supervisor, - false => SPP::User, - } - } - - /// Machine Previous Privilege Mode - #[inline] - pub fn mpp(&self) -> MPP { - match self.bits.get_bits(11..13) { - 0b00 => MPP::User, - 0b01 => MPP::Supervisor, - 0b11 => MPP::Machine, - _ => unreachable!(), - } - } - - /// Floating-point extension state - /// - /// Encodes the status of the floating-point unit, - /// including the CSR `fcsr` and floating-point data registers `f0–f31`. - #[inline] - pub fn fs(&self) -> FS { - match self.bits.get_bits(13..15) { - 0b00 => FS::Off, - 0b01 => FS::Initial, - 0b10 => FS::Clean, - 0b11 => FS::Dirty, - _ => unreachable!(), - } - } - - /// Additional extension state - /// - /// Encodes the status of additional user-mode extensions and associated state. - #[inline] - pub fn xs(&self) -> XS { - match self.bits.get_bits(15..17) { - 0b00 => XS::AllOff, - 0b01 => XS::NoneDirtyOrClean, - 0b10 => XS::NoneDirtySomeClean, - 0b11 => XS::SomeDirty, - _ => unreachable!(), - } - } - - /// Whether either the FS field or XS field - /// signals the presence of some dirty state - #[inline] - pub fn sd(&self) -> bool { - self.bits.get_bit(size_of::() * 8 - 1) - } -} - - -read_csr_as!(Mstatus, 0x300, __read_mstatus); -write_csr!(0x300, __write_mstatus); -set!(0x300, __set_mstatus); -clear!(0x300, __clear_mstatus); - -set_clear_csr!( - /// User Interrupt Enable - , set_uie, clear_uie, 1 << 0); - -set_clear_csr!( - /// Supervisor Interrupt Enable - , set_sie, clear_sie, 1 << 1); - -set_clear_csr!( - /// Machine Interrupt Enable - , set_mie, clear_mie, 1 << 3); - -set_csr!( - /// User Previous Interrupt Enable - , set_upie, 1 << 4); - -set_csr!( - /// Supervisor Previous Interrupt Enable - , set_spie, 1 << 5); - -set_csr!( - /// Machine Previous Interrupt Enable - , set_mpie, 1 << 7); - -/// Supervisor Previous Privilege Mode -#[inline] -pub unsafe fn set_spp(spp: SPP) { - match spp { - SPP::Supervisor => _set(1 << 8), - SPP::User => _clear(1 << 8), - } -} - -/// Machine Previous Privilege Mode -#[inline] -pub unsafe fn set_mpp(mpp: MPP) { - let mut value = _read(); - value.set_bits(11..13, mpp as usize); - _write(value); -} - -/// Floating-point extension state -#[inline] -pub unsafe fn set_fs(fs: FS) { - let mut value = _read(); - value.set_bits(13..15, fs as usize); - _write(value); -} diff --git a/src/register/mtval.rs b/src/register/mtval.rs deleted file mode 100644 index 2afb7cb..0000000 --- a/src/register/mtval.rs +++ /dev/null @@ -1,3 +0,0 @@ -//! mtval register - -read_csr_as_usize!(0x343, __read_mtval); diff --git a/src/register/mtvec.rs b/src/register/mtvec.rs deleted file mode 100644 index 247e05f..0000000 --- a/src/register/mtvec.rs +++ /dev/null @@ -1,47 +0,0 @@ -//! mtvec register - -/// mtvec register -#[derive(Clone, Copy, Debug)] -pub struct Mtvec { - bits: usize, -} - -/// Trap mode -#[derive(Copy, Clone, Debug, Eq, PartialEq)] -pub enum TrapMode { - Direct = 0, - Vectored = 1, -} - -impl Mtvec { - /// Returns the contents of the register as raw bits - pub fn bits(&self) -> usize { - self.bits - } - - /// Returns the trap-vector base-address - pub fn address(&self) -> usize { - self.bits - (self.bits & 0b11) - } - - /// Returns the trap-vector mode - pub fn trap_mode(&self) -> TrapMode { - let mode = self.bits & 0b11; - match mode { - 0 => TrapMode::Direct, - 1 => TrapMode::Vectored, - _ => unimplemented!() - } - } -} - -read_csr_as!(Mtvec, 0x305, __read_mtvec); - -write_csr!(0x305, __write_mtvec); - -/// Writes the CSR -#[inline] -pub unsafe fn write(addr: usize, mode: TrapMode) { - let bits = addr + mode as usize; - _write(bits); -} diff --git a/src/register/mvendorid.rs b/src/register/mvendorid.rs deleted file mode 100644 index a76ffb8..0000000 --- a/src/register/mvendorid.rs +++ /dev/null @@ -1,32 +0,0 @@ -//! mvendorid register - -use core::num::NonZeroUsize; - -/// mvendorid register -#[derive(Clone, Copy, Debug)] -pub struct Mvendorid { - bits: NonZeroUsize, -} - -impl Mvendorid { - /// Returns the contents of the register as raw bits - pub fn bits(&self) -> usize { - self.bits.get() - } - - /// Returns the JEDEC manufacturer ID - pub fn jedec_manufacturer(&self) -> usize { - self.bits() >> 7 - } -} - -read_csr!(0xF11, __read_mvendorid); - -/// Reads the CSR -#[inline] -pub fn read() -> Option { - let r = unsafe{ _read() }; - // When mvendorid is hardwired to zero it means that the mvendorid - // csr isn't implemented. - NonZeroUsize::new(r).map(|bits| Mvendorid { bits }) -} diff --git a/src/register/pmpaddrx.rs b/src/register/pmpaddrx.rs deleted file mode 100644 index d615dde..0000000 --- a/src/register/pmpaddrx.rs +++ /dev/null @@ -1,28 +0,0 @@ -macro_rules! reg { - ( - $addr:expr, $csr:ident, $readf:ident, $writef:ident - ) => { - /// Physical memory protection address register - pub mod $csr { - read_csr_as_usize!($addr, $readf); - write_csr_as_usize!($addr, $writef); - } - } -} - -reg!(0x3B0, pmpaddr0, __read_pmpaddr0, __write_pmpaddr0); -reg!(0x3B1, pmpaddr1, __read_pmpaddr1, __write_pmpaddr1); -reg!(0x3B2, pmpaddr2, __read_pmpaddr2, __write_pmpaddr2); -reg!(0x3B3, pmpaddr3, __read_pmpaddr3, __write_pmpaddr3); -reg!(0x3B4, pmpaddr4, __read_pmpaddr4, __write_pmpaddr4); -reg!(0x3B5, pmpaddr5, __read_pmpaddr5, __write_pmpaddr5); -reg!(0x3B6, pmpaddr6, __read_pmpaddr6, __write_pmpaddr6); -reg!(0x3B7, pmpaddr7, __read_pmpaddr7, __write_pmpaddr7); -reg!(0x3B8, pmpaddr8, __read_pmpaddr8, __write_pmpaddr8); -reg!(0x3B9, pmpaddr9, __read_pmpaddr9, __write_pmpaddr9); -reg!(0x3BA, pmpaddr10, __read_pmpaddr10, __write_pmpaddr10); -reg!(0x3BB, pmpaddr11, __read_pmpaddr11, __write_pmpaddr11); -reg!(0x3BC, pmpaddr12, __read_pmpaddr12, __write_pmpaddr12); -reg!(0x3BD, pmpaddr13, __read_pmpaddr13, __write_pmpaddr13); -reg!(0x3BE, pmpaddr14, __read_pmpaddr14, __write_pmpaddr14); -reg!(0x3BF, pmpaddr15, __read_pmpaddr15, __write_pmpaddr15); diff --git a/src/register/pmpcfgx.rs b/src/register/pmpcfgx.rs deleted file mode 100644 index ec27251..0000000 --- a/src/register/pmpcfgx.rs +++ /dev/null @@ -1,23 +0,0 @@ -/// Physical memory protection configuration -pub mod pmpcfg0 { - read_csr_as_usize!(0x3A0, __read_pmpcfg0); - write_csr_as_usize!(0x3A0, __write_pmpcfg0); -} - -/// Physical memory protection configuration, RV32 only -pub mod pmpcfg1 { - read_csr_as_usize_rv32!(0x3A1, __read_pmpcfg1); - write_csr_as_usize_rv32!(0x3A1, __write_pmpcfg1); -} - -/// Physical memory protection configuration -pub mod pmpcfg2 { - read_csr_as_usize!(0x3A2, __read_pmpcfg2); - write_csr_as_usize!(0x3A2, __write_pmpcfg2); -} - -/// Physical memory protection configuration, RV32 only -pub mod pmpcfg3 { - read_csr_as_usize_rv32!(0x3A3, __read_pmpcfg3); - write_csr_as_usize_rv32!(0x3A3, __write_pmpcfg3); -} diff --git a/src/register/satp.rs b/src/register/satp.rs deleted file mode 100644 index d1821d3..0000000 --- a/src/register/satp.rs +++ /dev/null @@ -1,110 +0,0 @@ -//! satp register - -#[cfg(riscv)] -use bit_field::BitField; - -/// satp register -#[derive(Clone, Copy, Debug)] -pub struct Satp { - bits: usize, -} - -impl Satp { - /// Returns the contents of the register as raw bits - #[inline] - pub fn bits(&self) -> usize { - self.bits - } - - /// Current address-translation scheme - #[inline] - #[cfg(riscv32)] - pub fn mode(&self) -> Mode { - match self.bits.get_bit(31) { - false => Mode::Bare, - true => Mode::Sv32, - } - } - - /// Current address-translation scheme - #[inline] - #[cfg(riscv64)] - pub fn mode(&self) -> Mode { - match self.bits.get_bits(60..64) { - 0 => Mode::Bare, - 8 => Mode::Sv39, - 9 => Mode::Sv48, - 10 => Mode::Sv57, - 11 => Mode::Sv64, - _ => unreachable!(), - } - } - - /// Address space identifier - #[inline] - #[cfg(riscv32)] - pub fn asid(&self) -> usize { - self.bits.get_bits(22..31) - } - - /// Address space identifier - #[inline] - #[cfg(riscv64)] - pub fn asid(&self) -> usize { - self.bits.get_bits(44..60) - } - - /// Physical page number - #[inline] - #[cfg(riscv32)] - pub fn ppn(&self) -> usize { - self.bits.get_bits(0..22) - } - - /// Physical page number - #[inline] - #[cfg(riscv64)] - pub fn ppn(&self) -> usize { - self.bits.get_bits(0..44) - } -} - -#[cfg(riscv32)] -#[derive(Clone, Copy, Debug, Eq, PartialEq)] -pub enum Mode { - Bare = 0, - Sv32 = 1, -} - -#[cfg(riscv64)] -#[derive(Clone, Copy, Debug, Eq, PartialEq)] -pub enum Mode { - Bare = 0, - Sv39 = 8, - Sv48 = 9, - Sv57 = 10, - Sv64 = 11, -} - -read_csr_as!(Satp, 0x180, __read_satp); -write_csr_as_usize!(0x180, __write_satp); - -#[inline] -#[cfg(riscv32)] -pub unsafe fn set(mode: Mode, asid: usize, ppn: usize) { - let mut bits = 0usize; - bits.set_bits(31..32, mode as usize); - bits.set_bits(22..31, asid); - bits.set_bits(0..22, ppn); - _write(bits); -} - -#[inline] -#[cfg(riscv64)] -pub unsafe fn set(mode: Mode, asid: usize, ppn: usize) { - let mut bits = 0usize; - bits.set_bits(60..64, mode as usize); - bits.set_bits(44..60, asid); - bits.set_bits(0..44, ppn); - _write(bits); -} diff --git a/src/register/scause.rs b/src/register/scause.rs deleted file mode 100644 index a9ffe92..0000000 --- a/src/register/scause.rs +++ /dev/null @@ -1,117 +0,0 @@ -//! scause register - -use bit_field::BitField; -use core::mem::size_of; - -/// scause register -#[derive(Clone, Copy)] -pub struct Scause { - bits: usize, -} - -/// Trap Cause -#[derive(Copy, Clone, Debug, Eq, PartialEq)] -pub enum Trap { - Interrupt(Interrupt), - Exception(Exception), -} - -/// Interrupt -#[derive(Copy, Clone, Debug, Eq, PartialEq)] -pub enum Interrupt { - UserSoft, - SupervisorSoft, - UserTimer, - SupervisorTimer, - UserExternal, - SupervisorExternal, - Unknown, -} - -/// Exception -#[derive(Copy, Clone, Debug, Eq, PartialEq)] -pub enum Exception { - InstructionMisaligned, - InstructionFault, - IllegalInstruction, - Breakpoint, - LoadFault, - StoreMisaligned, - StoreFault, - UserEnvCall, - InstructionPageFault, - LoadPageFault, - StorePageFault, - Unknown, -} - -impl Interrupt { - pub fn from(nr: usize) -> Self { - match nr { - 0 => Interrupt::UserSoft, - 1 => Interrupt::SupervisorSoft, - 4 => Interrupt::UserTimer, - 5 => Interrupt::SupervisorTimer, - 8 => Interrupt::UserExternal, - 9 => Interrupt::SupervisorExternal, - _ => Interrupt::Unknown, - } - } -} - -impl Exception { - pub fn from(nr: usize) -> Self { - match nr { - 0 => Exception::InstructionMisaligned, - 1 => Exception::InstructionFault, - 2 => Exception::IllegalInstruction, - 3 => Exception::Breakpoint, - 5 => Exception::LoadFault, - 6 => Exception::StoreMisaligned, - 7 => Exception::StoreFault, - 8 => Exception::UserEnvCall, - 12 => Exception::InstructionPageFault, - 13 => Exception::LoadPageFault, - 15 => Exception::StorePageFault, - _ => Exception::Unknown, - } - } -} - -impl Scause { - /// Returns the contents of the register as raw bits - #[inline] - pub fn bits(&self) -> usize { - self.bits - } - - /// Returns the code field - pub fn code(&self) -> usize { - let bit = 1 << (size_of::() * 8 - 1); - self.bits & !bit - } - - /// Trap Cause - #[inline] - pub fn cause(&self) -> Trap { - if self.is_interrupt() { - Trap::Interrupt(Interrupt::from(self.code())) - } else { - Trap::Exception(Exception::from(self.code())) - } - } - - /// Is trap cause an interrupt. - #[inline] - pub fn is_interrupt(&self) -> bool { - self.bits.get_bit(size_of::() * 8 - 1) - } - - /// Is trap cause an exception. - #[inline] - pub fn is_exception(&self) -> bool { - !self.is_interrupt() - } -} - -read_csr_as!(Scause, 0x142, __read_scause); diff --git a/src/register/sepc.rs b/src/register/sepc.rs deleted file mode 100644 index aba69df..0000000 --- a/src/register/sepc.rs +++ /dev/null @@ -1,4 +0,0 @@ -//! sepc register - -read_csr_as_usize!(0x141, __read_sepc); -write_csr_as_usize!(0x141, __write_sepc); diff --git a/src/register/sie.rs b/src/register/sie.rs deleted file mode 100644 index b652110..0000000 --- a/src/register/sie.rs +++ /dev/null @@ -1,76 +0,0 @@ -//! sie register - -use bit_field::BitField; - -/// sie register -#[derive(Clone, Copy, Debug)] -pub struct Sie { - bits: usize, -} - -impl Sie { - /// Returns the contents of the register as raw bits - #[inline] - pub fn bits(&self) -> usize { - self.bits - } - - /// User Software Interrupt Enable - #[inline] - pub fn usoft(&self) -> bool { - self.bits.get_bit(0) - } - - /// Supervisor Software Interrupt Enable - #[inline] - pub fn ssoft(&self) -> bool { - self.bits.get_bit(1) - } - - /// User Timer Interrupt Enable - #[inline] - pub fn utimer(&self) -> bool { - self.bits.get_bit(4) - } - - /// Supervisor Timer Interrupt Enable - #[inline] - pub fn stimer(&self) -> bool { - self.bits.get_bit(5) - } - - /// User External Interrupt Enable - #[inline] - pub fn uext(&self) -> bool { - self.bits.get_bit(8) - } - - /// Supervisor External Interrupt Enable - #[inline] - pub fn sext(&self) -> bool { - self.bits.get_bit(9) - } -} - -read_csr_as!(Sie, 0x104, __read_sie); -set!(0x104, __set_sie); -clear!(0x104, __clear_sie); - -set_clear_csr!( - /// User Software Interrupt Enable - , set_usoft, clear_usoft, 1 << 0); -set_clear_csr!( - /// Supervisor Software Interrupt Enable - , set_ssoft, clear_ssoft, 1 << 1); -set_clear_csr!( - /// User Timer Interrupt Enable - , set_utimer, clear_utimer, 1 << 4); -set_clear_csr!( - /// Supervisor Timer Interrupt Enable - , set_stimer, clear_stimer, 1 << 5); -set_clear_csr!( - /// User External Interrupt Enable - , set_uext, clear_uext, 1 << 8); -set_clear_csr!( - /// Supervisor External Interrupt Enable - , set_sext, clear_sext, 1 << 9); diff --git a/src/register/sip.rs b/src/register/sip.rs deleted file mode 100644 index f625661..0000000 --- a/src/register/sip.rs +++ /dev/null @@ -1,55 +0,0 @@ -//! sip register - -use bit_field::BitField; - -/// sip register -#[derive(Clone, Copy, Debug)] -pub struct Sip { - bits: usize, -} - -impl Sip { - /// Returns the contents of the register as raw bits - #[inline] - pub fn bits(&self) -> usize { - self.bits - } - - /// User Software Interrupt Pending - #[inline] - pub fn usoft(&self) -> bool { - self.bits.get_bit(0) - } - - /// Supervisor Software Interrupt Pending - #[inline] - pub fn ssoft(&self) -> bool { - self.bits.get_bit(1) - } - - /// User Timer Interrupt Pending - #[inline] - pub fn utimer(&self) -> bool { - self.bits.get_bit(4) - } - - /// Supervisor Timer Interrupt Pending - #[inline] - pub fn stimer(&self) -> bool { - self.bits.get_bit(5) - } - - /// User External Interrupt Pending - #[inline] - pub fn uext(&self) -> bool { - self.bits.get_bit(8) - } - - /// Supervisor External Interrupt Pending - #[inline] - pub fn sext(&self) -> bool { - self.bits.get_bit(9) - } -} - -read_csr_as!(Sip, 0x144, __read_sip); diff --git a/src/register/sscratch.rs b/src/register/sscratch.rs deleted file mode 100644 index 349812c..0000000 --- a/src/register/sscratch.rs +++ /dev/null @@ -1,4 +0,0 @@ -//! sscratch register - -read_csr_as_usize!(0x140, __read_sscratch); -write_csr_as_usize!(0x140, __write_sscratch); diff --git a/src/register/sstatus.rs b/src/register/sstatus.rs deleted file mode 100644 index 68908fc..0000000 --- a/src/register/sstatus.rs +++ /dev/null @@ -1,140 +0,0 @@ -//! sstatus register - -use bit_field::BitField; -use core::mem::size_of; -pub use super::mstatus::FS; - -/// Supervisor Status Register -#[derive(Clone, Copy, Debug)] -pub struct Sstatus { - bits: usize, -} - -/// Supervisor Previous Privilege Mode -#[derive(Copy, Clone, Debug, Eq, PartialEq)] -pub enum SPP { - Supervisor = 1, - User = 0, -} - -impl Sstatus { - /// User Interrupt Enable - #[inline] - pub fn uie(&self) -> bool { - self.bits.get_bit(0) - } - - /// Supervisor Interrupt Enable - #[inline] - pub fn sie(&self) -> bool { - self.bits.get_bit(1) - } - - /// User Previous Interrupt Enable - #[inline] - pub fn upie(&self) -> bool { - self.bits.get_bit(4) - } - - /// Supervisor Previous Interrupt Enable - #[inline] - pub fn spie(&self) -> bool { - self.bits.get_bit(5) - } - - /// Supervisor Previous Privilege Mode - #[inline] - pub fn spp(&self) -> SPP { - match self.bits.get_bit(8) { - true => SPP::Supervisor, - false => SPP::User, - } - } - - /// The status of the floating-point unit - #[inline] - pub fn fs(&self) -> FS { - match self.bits.get_bits(13..15) { - 0 => FS::Off, - 1 => FS::Initial, - 2 => FS::Clean, - 3 => FS::Dirty, - _ => unreachable!(), - } - } - - /// The status of additional user-mode extensions - /// and associated state - #[inline] - pub fn xs(&self) -> FS { - match self.bits.get_bits(15..17) { - 0 => FS::Off, - 1 => FS::Initial, - 2 => FS::Clean, - 3 => FS::Dirty, - _ => unreachable!(), - } - } - - /// Permit Supervisor User Memory access - #[inline] - pub fn sum(&self) -> bool { - self.bits.get_bit(18) - } - - /// Make eXecutable Readable - #[inline] - pub fn mxr(&self) -> bool { - self.bits.get_bit(19) - } - - /// Whether either the FS field or XS field - /// signals the presence of some dirty state - #[inline] - pub fn sd(&self) -> bool { - self.bits.get_bit(size_of::() * 8 - 1) - } -} - -read_csr_as!(Sstatus, 0x100, __read_sstatus); -write_csr!(0x100, __write_sstatus); -set!(0x100, __set_sstatus); -clear!(0x100, __clear_sstatus); - -set_clear_csr!( - /// User Interrupt Enable - , set_uie, clear_uie, 1 << 0); -set_clear_csr!( - /// Supervisor Interrupt Enable - , set_sie, clear_sie, 1 << 1); -set_csr!( - /// User Previous Interrupt Enable - , set_upie, 1 << 4); -set_csr!( - /// Supervisor Previous Interrupt Enable - , set_spie, 1 << 5); -set_clear_csr!( - /// Make eXecutable Readable - , set_mxr, clear_mxr, 1 << 19); -set_clear_csr!( - /// Permit Supervisor User Memory access - , set_sum, clear_sum, 1 << 18); - -/// Supervisor Previous Privilege Mode -#[inline] -#[cfg(riscv)] -pub unsafe fn set_spp(spp: SPP) { - match spp { - SPP::Supervisor => _set(1 << 8), - SPP::User => _clear(1 << 8), - } -} - -/// The status of the floating-point unit -#[inline] -#[cfg(riscv)] -pub unsafe fn set_fs(fs: FS) { - let mut value = _read(); - value.set_bits(13..15, fs as usize); - _write(value); -} diff --git a/src/register/stval.rs b/src/register/stval.rs deleted file mode 100644 index 722cc19..0000000 --- a/src/register/stval.rs +++ /dev/null @@ -1,3 +0,0 @@ -//! stval register - -read_csr_as_usize!(0x143, __read_stval); diff --git a/src/register/stvec.rs b/src/register/stvec.rs deleted file mode 100644 index 2bbbefa..0000000 --- a/src/register/stvec.rs +++ /dev/null @@ -1,40 +0,0 @@ -//! stvec register - -pub use crate::register::mtvec::TrapMode; - -/// stvec register -#[derive(Clone, Copy, Debug)] -pub struct Stvec { - bits: usize, -} - -impl Stvec { - /// Returns the contents of the register as raw bits - pub fn bits(&self) -> usize { - self.bits - } - - /// Returns the trap-vector base-address - pub fn address(&self) -> usize { - self.bits - (self.bits & 0b11) - } - - /// Returns the trap-vector mode - pub fn trap_mode(&self) -> TrapMode { - let mode = self.bits & 0b11; - match mode { - 0 => TrapMode::Direct, - 1 => TrapMode::Vectored, - _ => unimplemented!() - } - } -} - -read_csr_as!(Stvec, 0x105, __read_stvec); -write_csr!(0x105, __write_stvec); - -/// Writes the CSR -#[inline] -pub unsafe fn write(addr: usize, mode: TrapMode) { - _write(addr + mode as usize); -} diff --git a/src/register/time.rs b/src/register/time.rs deleted file mode 100644 index 665b507..0000000 --- a/src/register/time.rs +++ /dev/null @@ -1,4 +0,0 @@ -//! time register - -read_csr_as_usize!(0xC01, __read_time); -read_composite_csr!(super::timeh::read(), read()); diff --git a/src/register/timeh.rs b/src/register/timeh.rs deleted file mode 100644 index ff725db..0000000 --- a/src/register/timeh.rs +++ /dev/null @@ -1,3 +0,0 @@ -//! timeh register - -read_csr_as_usize_rv32!(0xC81, __read_timeh); diff --git a/src/register/ucause.rs b/src/register/ucause.rs deleted file mode 100644 index 06dd8a3..0000000 --- a/src/register/ucause.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! ucause register - -/// ucause register -#[derive(Clone, Copy, Debug)] -pub struct Ucause { - bits: usize, -} - -impl Ucause { - /// Returns the contents of the register as raw bits - #[inline] - pub fn bits(&self) -> usize { - self.bits - } -} - -read_csr_as!(Ucause, 0x042, __read_ucause); diff --git a/src/register/uepc.rs b/src/register/uepc.rs deleted file mode 100644 index 1c9fa0e..0000000 --- a/src/register/uepc.rs +++ /dev/null @@ -1,4 +0,0 @@ -//! uepc register - -read_csr_as_usize!(0x041, __read_uepc); -write_csr_as_usize!(0x041, __write_uepc); diff --git a/src/register/uie.rs b/src/register/uie.rs deleted file mode 100644 index 4a5e9e0..0000000 --- a/src/register/uie.rs +++ /dev/null @@ -1,49 +0,0 @@ -//! uie register - -use bit_field::BitField; - -/// uie register -#[derive(Clone, Copy, Debug)] -pub struct Uie { - bits: usize, -} - -impl Uie { - /// Returns the contents of the register as raw bits - #[inline] - pub fn bits(&self) -> usize { - self.bits - } - - /// User Software Interrupt Enable - #[inline] - pub fn usoft(&self) -> bool { - self.bits.get_bit(0) - } - - /// User Timer Interrupt Enable - #[inline] - pub fn utimer(&self) -> bool { - self.bits.get_bit(4) - } - - /// User External Interrupt Enable - #[inline] - pub fn uext(&self) -> bool { - self.bits.get_bit(8) - } -} - -read_csr_as!(Uie, 0x004, __read_uie); -set!(0x004, __set_uie); -clear!(0x004, __clear_uie); - -set_clear_csr!( - /// User Software Interrupt Enable - , set_usoft, clear_usoft, 1 << 0); -set_clear_csr!( - /// User Timer Interrupt Enable - , set_utimer, clear_utimer, 1 << 4); -set_clear_csr!( - /// User External Interrupt Enable - , set_uext, clear_uext, 1 << 8); diff --git a/src/register/uip.rs b/src/register/uip.rs deleted file mode 100644 index ec92ad8..0000000 --- a/src/register/uip.rs +++ /dev/null @@ -1,37 +0,0 @@ -//! uip register - -use bit_field::BitField; - -/// uip register -#[derive(Clone, Copy, Debug)] -pub struct Uip { - bits: usize, -} - -impl Uip { - /// Returns the contents of the register as raw bits - #[inline] - pub fn bits(&self) -> usize { - self.bits - } - - /// User Software Interrupt Pending - #[inline] - pub fn usoft(&self) -> bool { - self.bits.get_bit(0) - } - - /// User Timer Interrupt Pending - #[inline] - pub fn utimer(&self) -> bool { - self.bits.get_bit(4) - } - - /// User External Interrupt Pending - #[inline] - pub fn uext(&self) -> bool { - self.bits.get_bit(8) - } -} - -read_csr_as!(Uip, 0x044, __read_uip); diff --git a/src/register/uscratch.rs b/src/register/uscratch.rs deleted file mode 100644 index 2bc2253..0000000 --- a/src/register/uscratch.rs +++ /dev/null @@ -1,4 +0,0 @@ -//! uscratch register - -read_csr_as_usize!(0x040, __read_uscratch); -write_csr_as_usize!(0x040, __write_uscratch); diff --git a/src/register/ustatus.rs b/src/register/ustatus.rs deleted file mode 100644 index 81890ba..0000000 --- a/src/register/ustatus.rs +++ /dev/null @@ -1,37 +0,0 @@ -//! ustatus register -// TODO: Virtualization, Memory Privilege and Extension Context Fields - -use bit_field::BitField; - -/// ustatus register -#[derive(Clone, Copy, Debug)] -pub struct Ustatus { - bits: usize, -} - -impl Ustatus { - /// User Interrupt Enable - #[inline] - pub fn uie(&self) -> bool { - self.bits.get_bit(0) - } - - /// User Previous Interrupt Enable - #[inline] - pub fn upie(&self) -> bool { - self.bits.get_bit(4) - } -} - -read_csr_as!(Ustatus, 0x000, __read_ustatus); -write_csr!(0x000, __write_ustatus); -set!(0x000, __set_ustatus); -clear!(0x000, __clear_ustatus); - -set_clear_csr!( - /// User Interrupt Enable - , set_uie, clear_uie, 1 << 0); - -set_csr!( - /// User Previous Interrupt Enable - , set_upie, 1 << 4); diff --git a/src/register/utval.rs b/src/register/utval.rs deleted file mode 100644 index b87dca6..0000000 --- a/src/register/utval.rs +++ /dev/null @@ -1,3 +0,0 @@ -//! utval register - -read_csr_as_usize!(0x043, __read_utval); diff --git a/src/register/utvec.rs b/src/register/utvec.rs deleted file mode 100644 index 31b6109..0000000 --- a/src/register/utvec.rs +++ /dev/null @@ -1,40 +0,0 @@ -//! stvec register - -pub use crate::register::mtvec::TrapMode; - -/// stvec register -#[derive(Clone, Copy, Debug)] -pub struct Utvec { - bits: usize, -} - -impl Utvec { - /// Returns the contents of the register as raw bits - pub fn bits(&self) -> usize { - self.bits - } - - /// Returns the trap-vector base-address - pub fn address(&self) -> usize { - self.bits - (self.bits & 0b11) - } - - /// Returns the trap-vector mode - pub fn trap_mode(&self) -> TrapMode { - let mode = self.bits & 0b11; - match mode { - 0 => TrapMode::Direct, - 1 => TrapMode::Vectored, - _ => unimplemented!() - } - } -} - -read_csr_as!(Utvec, 0x005, __read_utvec); -write_csr!(0x005, __write_utvec); - -/// Writes the CSR -#[inline] -pub unsafe fn write(addr: usize, mode: TrapMode) { - _write(addr + mode as usize); -} From a9b4b7149f50f7811030f1ae3d797166fa5ff614 Mon Sep 17 00:00:00 2001 From: Vadim Kaushan Date: Sun, 14 Jun 2020 14:22:08 +0300 Subject: [PATCH 05/14] Regenerate binaries --- bin/riscv32i-unknown-none-elf.a | Bin 73492 -> 3214 bytes bin/riscv32imac-unknown-none-elf.a | Bin 72468 -> 3190 bytes bin/riscv32imc-unknown-none-elf.a | Bin 72468 -> 3190 bytes bin/riscv64gc-unknown-none-elf.a | Bin 80062 -> 4242 bytes bin/riscv64imac-unknown-none-elf.a | Bin 80062 -> 4242 bytes 5 files changed, 0 insertions(+), 0 deletions(-) diff --git a/bin/riscv32i-unknown-none-elf.a b/bin/riscv32i-unknown-none-elf.a index 7f4c587eaf30fbb986771edae1cabf2e757f2ef3..4a81c6aff957b43c06e21ab6194e2cb6aaa59542 100644 GIT binary patch delta 750 zcmb`FJxGF46o%hx{*^|$QM!&Y6gK0t|8P=bH7VNwm4UDJWc=R42g@ZA^g%~$m~_pvK8>-$@sx|cp*DAb);GXrn{ zD)*0DCF%chuaZ@^K%g&T?91ymXVY23b#3hNlaAs7ZSRRYBxHt zK@W>?13bcw@C!E~D7+sr;R9F{ZpNzc!3;Jtd=%Hh z<95_U!+}TPPP_^q!@KZtRCbF2RoS_V>r{-&_nKO!XXXa|FjM5OYbr|#<|(C^B`Pwj zRAV;illex@2Tgrblxd=ErkjqK({#y<(hGBm42{-5XP7BkVII;!Lvx<+{q+HR-Aqqh rcxb(DFPwRm&HBaK&~b~uZWM03%44|Y`DT0MgGXFfdZ5(v3cBSluex$Q literal 73492 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 diff --git a/bin/riscv32imac-unknown-none-elf.a b/bin/riscv32imac-unknown-none-elf.a index 6b5e29950fc2b0aed1446df25ff51e1102754aa4..c843c3669b8283cb49cc090a6b3d466cf9c4563b 100644 GIT binary patch literal 3190 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 diff --git a/bin/riscv32imc-unknown-none-elf.a b/bin/riscv32imc-unknown-none-elf.a index 6b5e29950fc2b0aed1446df25ff51e1102754aa4..c843c3669b8283cb49cc090a6b3d466cf9c4563b 100644 GIT binary patch literal 3190 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 diff --git a/bin/riscv64gc-unknown-none-elf.a b/bin/riscv64gc-unknown-none-elf.a index 3f2bc7637e881a9594dc4aa902f525f728d790ec..53bc14a7c633963417c6a4cc0a6c9d8aa992d155 100644 GIT binary patch delta 852 zcmb`FPbfrD6vof-|4%Z)+eVu7+mij9Rd z8w|6MBvve}EQMJb=bbx~r?++Mp7*`)_q}sZw|D-Y7i(Pe&3Br=OKWE}%|IZVm@EN+ zDga#l$BnCWwVk4yCQozr9D5$;3_Zc1j2H-ogC?b$I(&&jo`e_jj@W{09n`|!Kzl9? zjroi+wmgt8$XRM=eoPt7LNh%axQmXM_6aR^_*xFq3)2yyr7k*6<>ShT3bjxFyXL5$ z=`x!hDF2K2ZJnY_cZF8C=ppSeJr!E%q8D__^iF8Ci#}6&T>0LFDi=Mu+-}8_#fvk{ z1*oNTLea=og6flIP9JPkqC%k2S3lRtha#2q=S%@D+>69nJCCEbjmx4ZB(eooBxrwX zJ$0jBz>I)%u;Nu3bRjp5ed(UB-2OrL{FL~j#0xQY?Zp+*25$7APPd7@E_N?k3*L-B zj1*7l$P~sNwVIXifrOVtAB)~ZD;`2sl(~@>YDhL%-yt-zHyF;-sD>W~SZ!f!EjBa1 WQ_4;3Dyu8)%|k7wO$-_P1*t-bfz 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 ADF6Tf diff --git a/bin/riscv64imac-unknown-none-elf.a b/bin/riscv64imac-unknown-none-elf.a index 3f2bc7637e881a9594dc4aa902f525f728d790ec..53bc14a7c633963417c6a4cc0a6c9d8aa992d155 100644 GIT binary patch delta 852 zcmb`FPbfrD6vof-|4%Z)+eVu7+mij9Rd z8w|6MBvve}EQMJb=bbx~r?++Mp7*`)_q}sZw|D-Y7i(Pe&3Br=OKWE}%|IZVm@EN+ zDga#l$BnCWwVk4yCQozr9D5$;3_Zc1j2H-ogC?b$I(&&jo`e_jj@W{09n`|!Kzl9? zjroi+wmgt8$XRM=eoPt7LNh%axQmXM_6aR^_*xFq3)2yyr7k*6<>ShT3bjxFyXL5$ z=`x!hDF2K2ZJnY_cZF8C=ppSeJr!E%q8D__^iF8Ci#}6&T>0LFDi=Mu+-}8_#fvk{ z1*oNTLea=og6flIP9JPkqC%k2S3lRtha#2q=S%@D+>69nJCCEbjmx4ZB(eooBxrwX zJ$0jBz>I)%u;Nu3bRjp5ed(UB-2OrL{FL~j#0xQY?Zp+*25$7APPd7@E_N?k3*L-B zj1*7l$P~sNwVIXifrOVtAB)~ZD;`2sl(~@>YDhL%-yt-zHyF;-sD>W~SZ!f!EjBa1 WQ_4;3Dyu8)%|k7wO$-_P1*t-bfz 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 ADF6Tf From a131c1636093a42064879a4a6dd0a18c1d9b0700 Mon Sep 17 00:00:00 2001 From: Vadim Kaushan Date: Sun, 14 Jun 2020 14:22:50 +0300 Subject: [PATCH 06/14] Remove unused dependencies --- Cargo.toml | 4 ---- src/lib.rs | 3 --- 2 files changed, 7 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 12ed2b2..a899aa0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,9 +8,5 @@ description = "Low level access to the VexRiscv processor" keywords = ["riscv", "register", "peripheral", "vexriscv"] license = "ISC" -[dependencies] -bare-metal = ">=0.2.0,<0.2.5" -bit_field = "0.9.0" - [features] inline-asm = [] diff --git a/src/lib.rs b/src/lib.rs index bae037b..b42ce92 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -18,7 +18,4 @@ #![no_std] #![cfg_attr(feature = "inline-asm", feature(asm))] -extern crate bare_metal; -extern crate bit_field; - pub mod register; From 7ce847ee3c6131956c7acf10aa2b0cf0b35476d0 Mon Sep 17 00:00:00 2001 From: Vadim Kaushan Date: Sun, 14 Jun 2020 14:32:33 +0300 Subject: [PATCH 07/14] Fix register docs --- src/register/vdci.rs | 2 +- src/register/vmim.rs | 2 +- src/register/vmip.rs | 2 +- src/register/vsim.rs | 2 +- src/register/vsip.rs | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/register/vdci.rs b/src/register/vdci.rs index 60141bc..4c2c839 100644 --- a/src/register/vdci.rs +++ b/src/register/vdci.rs @@ -1,4 +1,4 @@ -//! uscratch register +//! DCache Information register read_csr_as_usize!(0xCC0, __read_vdci); write_csr_as_usize!(0xCC0, __write_vdci); diff --git a/src/register/vmim.rs b/src/register/vmim.rs index eb231c0..a4b03e7 100644 --- a/src/register/vmim.rs +++ b/src/register/vmim.rs @@ -1,4 +1,4 @@ -//! uscratch register +//! Machine IRQ Mask register read_csr_as_usize!(0xBC0, __read_vmim); write_csr_as_usize!(0xBC0, __write_vmim); diff --git a/src/register/vmip.rs b/src/register/vmip.rs index d975f54..958e768 100644 --- a/src/register/vmip.rs +++ b/src/register/vmip.rs @@ -1,4 +1,4 @@ -//! uscratch register +//! Machine IRQ Pending register read_csr_as_usize!(0xFC0, __read_vmip); write_csr_as_usize!(0xFC0, __write_vmip); diff --git a/src/register/vsim.rs b/src/register/vsim.rs index 47eb5d6..7ed1d50 100644 --- a/src/register/vsim.rs +++ b/src/register/vsim.rs @@ -1,4 +1,4 @@ -//! uscratch register +//! Supervisor IRQ Mask register read_csr_as_usize!(0x9C0, __read_vsim); write_csr_as_usize!(0x9C0, __write_vsim); diff --git a/src/register/vsip.rs b/src/register/vsip.rs index 0a97c8d..0c7b32c 100644 --- a/src/register/vsip.rs +++ b/src/register/vsip.rs @@ -1,4 +1,4 @@ -//! uscratch register +//! Supervisor IRQ Pending register read_csr_as_usize!(0xDC0, __read_vsip); write_csr_as_usize!(0xDC0, __write_vsip); From 426fc067b41c0843e19fd5d08c08e70b015c1390 Mon Sep 17 00:00:00 2001 From: Vadim Kaushan Date: Sun, 14 Jun 2020 14:33:44 +0300 Subject: [PATCH 08/14] Allow unused macros --- src/register/macros.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/register/macros.rs b/src/register/macros.rs index b71b4d4..6ae98c8 100644 --- a/src/register/macros.rs +++ b/src/register/macros.rs @@ -1,3 +1,5 @@ +#![allow(unused_macros)] + macro_rules! read_csr { ($csr_number:expr, $asm_fn: ident) => { /// Reads the CSR From 707f51f46e2dd4cf8ec264f50a103c775db294b6 Mon Sep 17 00:00:00 2001 From: Vadim Kaushan Date: Sun, 14 Jun 2020 14:39:24 +0300 Subject: [PATCH 09/14] Fix docs --- src/lib.rs | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index b42ce92..7fb5b7a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,19 +1,4 @@ -//! Low level access to RISC-V processors -//! -//! # Minimum Supported Rust Version (MSRV) -//! -//! This crate is guaranteed to compile on stable Rust 1.30 and up. It *might* -//! compile with older versions but that may change in any new patch release. -//! Note that `riscv64imac-unknown-none-elf` and `riscv64gc-unknown-none-elf` targets -//! are not supported on stable yet. -//! -//! # Features -//! -//! This crate provides: -//! -//! - Access to core registers like `mstatus` or `mcause`. -//! - Interrupt manipulation mechanisms. -//! - Wrappers around assembly instructions like `WFI`. +//! Low level access to VexRiscv RISC-V cores #![no_std] #![cfg_attr(feature = "inline-asm", feature(asm))] From e21ce5249f7a95156bbb6a24f2948182cf95a7ae Mon Sep 17 00:00:00 2001 From: Vadim Kaushan Date: Sun, 14 Jun 2020 14:40:51 +0300 Subject: [PATCH 10/14] Remove write functions for read-only registers --- asm.S | 6 +++--- src/register/vdci.rs | 1 - src/register/vmip.rs | 1 - src/register/vsip.rs | 1 - 4 files changed, 3 insertions(+), 6 deletions(-) diff --git a/asm.S b/asm.S index b10ff8e..041a4b5 100644 --- a/asm.S +++ b/asm.S @@ -44,7 +44,7 @@ __clear_ ## name: \ // VexRiscv custom registers RW(0xBC0, vmim) // Machine IRQ Mask -RW(0xFC0, vmip) // Machine IRQ Pending +RO(0xFC0, vmip) // Machine IRQ Pending RW(0x9C0, vsim) // Supervisor IRQ Mask -RW(0xDC0, vsip) // Supervisor IRQ Pending -RW(0xCC0, vdci) // DCache Info +RO(0xDC0, vsip) // Supervisor IRQ Pending +RO(0xCC0, vdci) // DCache Info diff --git a/src/register/vdci.rs b/src/register/vdci.rs index 4c2c839..df2338a 100644 --- a/src/register/vdci.rs +++ b/src/register/vdci.rs @@ -1,4 +1,3 @@ //! DCache Information register read_csr_as_usize!(0xCC0, __read_vdci); -write_csr_as_usize!(0xCC0, __write_vdci); diff --git a/src/register/vmip.rs b/src/register/vmip.rs index 958e768..ce8e6cd 100644 --- a/src/register/vmip.rs +++ b/src/register/vmip.rs @@ -1,4 +1,3 @@ //! Machine IRQ Pending register read_csr_as_usize!(0xFC0, __read_vmip); -write_csr_as_usize!(0xFC0, __write_vmip); diff --git a/src/register/vsip.rs b/src/register/vsip.rs index 0c7b32c..76dfa54 100644 --- a/src/register/vsip.rs +++ b/src/register/vsip.rs @@ -1,4 +1,3 @@ //! Supervisor IRQ Pending register read_csr_as_usize!(0xDC0, __read_vsip); -write_csr_as_usize!(0xDC0, __write_vsip); From 496120e89f61eb29f9bb50f8c7448d01e9986f2c Mon Sep 17 00:00:00 2001 From: Vadim Kaushan Date: Sun, 14 Jun 2020 14:53:38 +0300 Subject: [PATCH 11/14] Add debug info, strip prefix --- assemble.ps1 | 6 +++--- assemble.sh | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/assemble.ps1 b/assemble.ps1 index 0c81f44..9d149f7 100644 --- a/assemble.ps1 +++ b/assemble.ps1 @@ -5,14 +5,14 @@ Remove-Item -Force bin/*.a $crate = "vexriscv" -riscv64-unknown-elf-gcc -c -mabi=ilp32 -march=rv32imac asm.S -o bin/$crate.o +riscv64-unknown-elf-gcc -ggdb3 -fdebug-prefix-map=$pwd=/vexriscv -c -mabi=ilp32 -march=rv32imac asm.S -o bin/$crate.o riscv64-unknown-elf-ar crs bin/riscv32imac-unknown-none-elf.a bin/$crate.o riscv64-unknown-elf-ar crs bin/riscv32imc-unknown-none-elf.a bin/$crate.o -riscv64-unknown-elf-gcc -c -mabi=ilp32 -march=rv32i asm.S -DSKIP_MULTICORE -o bin/$crate.o +riscv64-unknown-elf-gcc -ggdb3 -fdebug-prefix-map=$pwd=/vexriscv -c -mabi=ilp32 -march=rv32i asm.S -DSKIP_MULTICORE -o bin/$crate.o riscv64-unknown-elf-ar crs bin/riscv32i-unknown-none-elf.a bin/$crate.o -riscv64-unknown-elf-gcc -c -mabi=lp64 -march=rv64imac asm.S -o bin/$crate.o +riscv64-unknown-elf-gcc -ggdb3 -fdebug-prefix-map=$pwd=/vexriscv -c -mabi=lp64 -march=rv64imac asm.S -o bin/$crate.o riscv64-unknown-elf-ar crs bin/riscv64imac-unknown-none-elf.a bin/$crate.o riscv64-unknown-elf-ar crs bin/riscv64gc-unknown-none-elf.a bin/$crate.o diff --git a/assemble.sh b/assemble.sh index fde38db..74b66ca 100755 --- a/assemble.sh +++ b/assemble.sh @@ -7,14 +7,14 @@ crate=vexriscv # remove existing blobs because otherwise this will append object files to the old blobs rm -f bin/*.a -riscv64-unknown-elf-gcc -c -mabi=ilp32 -march=rv32imac asm.S -o bin/$crate.o +riscv64-unknown-elf-gcc -ggdb3 -fdebug-prefix-map=$(pwd)=/vexriscv -c -mabi=ilp32 -march=rv32imac asm.S -o bin/$crate.o ar crs bin/riscv32imac-unknown-none-elf.a bin/$crate.o ar crs bin/riscv32imc-unknown-none-elf.a bin/$crate.o -riscv64-unknown-elf-gcc -c -mabi=ilp32 -march=rv32i asm.S -DSKIP_MULTICORE -o bin/$crate.o +riscv64-unknown-elf-gcc -ggdb3 -fdebug-prefix-map=$(pwd)=/vexriscv -c -mabi=ilp32 -march=rv32i asm.S -DSKIP_MULTICORE -o bin/$crate.o ar crs bin/riscv32i-unknown-none-elf.a bin/$crate.o -riscv64-unknown-elf-gcc -c -mabi=lp64 -march=rv64imac asm.S -o bin/$crate.o +riscv64-unknown-elf-gcc -ggdb3 -fdebug-prefix-map=$(pwd)=/vexriscv -c -mabi=lp64 -march=rv64imac asm.S -o bin/$crate.o ar crs bin/riscv64imac-unknown-none-elf.a bin/$crate.o ar crs bin/riscv64gc-unknown-none-elf.a bin/$crate.o From 9a9d9121b456b3f3ec73e5f2ab013fe9c0e344d3 Mon Sep 17 00:00:00 2001 From: Vadim Kaushan Date: Sun, 14 Jun 2020 14:53:56 +0300 Subject: [PATCH 12/14] Regenerate binaries --- bin/riscv32i-unknown-none-elf.a | Bin 3214 -> 4082 bytes bin/riscv32imac-unknown-none-elf.a | Bin 3190 -> 4074 bytes bin/riscv32imc-unknown-none-elf.a | Bin 3190 -> 4074 bytes bin/riscv64gc-unknown-none-elf.a | Bin 4242 -> 6006 bytes bin/riscv64imac-unknown-none-elf.a | Bin 4242 -> 6006 bytes 5 files changed, 0 insertions(+), 0 deletions(-) diff --git a/bin/riscv32i-unknown-none-elf.a b/bin/riscv32i-unknown-none-elf.a index 4a81c6aff957b43c06e21ab6194e2cb6aaa59542..ab2fe2f17999f69834bb4d93277d6313bb45b11e 100644 GIT binary patch literal 4082 zcmd5;O>Y}T7=9-k=fic3Lrb8P!Zxn$7U;%tEE1%sYE%kEil|UqB&162I$jb>NgCE0 z6C@;ZK;puYLy`Ci965r-59pykfD>nKaN$FO=bf3?yF04Y_5`nXW}fH$n$O*xbL(Ne zwR5?+2}px`TYVZvM{$3!H4N^VxsRLi8|}89>B{P=o$}q{=hrsh zR!U*QMil)h_dZK2xrhPZqRx9kq=zZcka8`7FuS(L3+m_BU?&tzf04GyMa3 z%9PrD<1`w58c00@Scr!!t$ypE`Iuy0Zr6Dq%iSu?!NI*HPwDS^86 zXxia3PQDq(KI_8Q;7Q*Oqeax>nP zoBmSn=6CbC>+9xs*URnCT`#wPcmD4D%FcSsJL~cP8*hF;7xZ}3Q)hT(G^>RXV&Kt9 zhx6N$ibv0<1jwUP4tMjN&Yk!Q-j`=H5f!{2ujKd?y_)0Gw3_2HbT!9k=|+wh=}wNH zpzRzlQIg|xbe!YZ?_jg(kA6%4?LX}z#-{8iio zPJHIniqZ41RA4ZtP)i2uzn=X_>pWGX*Rkgf=Gba2#SN?1dFn>bd8&;RH>}==N?kB| z4y*D4Ll`%#o*QKk;p@QF*HA$iH>{qAs8|7Mqf{?xsBy#U`5UMBKLjbEs24Rf>u|VLa?sB5Y+~`D=-s|!jzPO3Trp~HHH$Cym-1kJ4-um(y zzWW7nv>OJ!sC&5G+3oK~IYoc}qkEXNHiq4991U~kFb?;(Bdmq-z*6PRVl{WmFiGNm z_b`F~lL~LOLgDkw!sjI`la}ySvY*^ATtBw4@UiBz^*BF$Cg7Ltm*Yev-(@Hmi{Co% zqx|@rko9|Oj9=IB+Z^L}==j|l>H;!L#jNf;T-|iT{A05ABjNe1Y@3S#} zzc_whjPd)!`k~SC73!hI+{nKD4$Nog3JS}8Y~c53`7^_RZMKzAiU^PxP?`XdPX%+a z6#%mNHm8ZM!_N8mlP~!e;3qLq(|M5WKV57W9ltg3D;!`&&KSpM`~4dI{sbTH_Y{is z%kg-~{vPNEgujy_Y~ykr6}KYyLDqzzm42^6pY8V+3`ekYzx=zCem{U8-n9d$v^)f7 z9}!S3+)h}`&96}SNW$+w-(fgk1!WdR-d#W{Vc&RJ!lj`6vyAW*?e3QbNSR5i%oH85!U4rV-o{{+L%H?tc1(n2WBBhj@``}LC`|9 z5vw#x3JbevCt?xALc0_ZEXBskPEf2Ye6usNGxL%mjhzE`@BQBV-^5XSYD z#o`&y9D#=1*S|e)c2+8uivTbNP(!>D{4WtdOMENri7%KO1Hk+3}Xp0 zp{*w{5DCo96BzJ>L|=hJmcU(+z(FQxD$%(p!j|ESnCI4WxebIZ!>*X;)^oWH zxVX;K+k~z!h?j55@x%hh65!9=s7S&WwyJFPUVfuE!?w=2?1n;R+kjW7+t zuO$iiEa2NDjX{+bg;?K^d3jfnfxJ~H zjVz=}=Y>>A6jFh_kP7iatf|P=L?Jzt719G*FYYU^n;(f+Q7x>KlNy+@v! zyyvJidD>13oji@HPWG=;sADJWVY(SnPhVF*nPok8w&>TlAnK#ZhSXg{(sdV+52{xq zx+RNlo#?JxbnI->*S%@cJtMk?MYm0Ks}|imqDw8hJ)&c0>p}bSjp!a&biau1u|?N| zo1*W_rbRbNbXykP4AH%?=*|<}ON;I*(Y?0lYDBkV(XA8R2aE0@(d}AvPf>@@P#dSS z@fpAMzKqk^U{-%)`hmQM0j6cIWL@}SZyf9`M?RD2!h3|@%n?J@V{aq6?hO{$mXkOq F-M_Ew)h_@5 diff --git a/bin/riscv32imac-unknown-none-elf.a b/bin/riscv32imac-unknown-none-elf.a index c843c3669b8283cb49cc090a6b3d466cf9c4563b..048bd4572c43efaa1183dd27431eed2fb42f8d60 100644 GIT binary patch literal 4074 zcmd5;&2Jk;6o1pT^Wi4Op(RjCVQbfR3+={nqBfwaO4L${6oH^B0tw-)lO-{V)3Dx{ za3bo3OAlO;_!BsC-~bW_jvV*{I3bSQ;KGLlzc(|_yE~HA_5@FwncwfdH}B2o?wq|E z#+y6WN(+8oS{Z6^w)XwSmA3WRC=t0G7J8y0FXc!&Fy}{-%xNGJ7s6ees$(QlM8qKjA)=F8fAp3cxSG^o=z_l^dYBGI#P2~nYc6Il~0%JKb)F_Bh-jrjXcIQt^l{Z7QC=z*#<%5+ILo+H#uN9P_B`*bPr-VdkH5 zGyasD@uuA5OSv20jpwef8{b_oH=ny+Zhm+E?)=KmddxZN@&6lden02+c+>SZyfT{A z{0K4d=!C-`bNG`EKk0Bc-l^P)ui(Bsp6OA+{dg|NC+PVcpQI}}K1J7ae41X*@e;k8 zM3qoy^hl`dX7_TrnqVKK2(bT z6%g)L;{}E=ZdyGz${xatz_k}pK^Ql!o`cXoSwQBKj@d;cybt&L%~8%M*OIgG=-?FegOJg`(bvslfWGE9=V z*F8w!|FFVatx)(pv+#Mzio7s*E7?z87_J}NSom1;*?N$lJ`?cE<`oRJ&c*FDi^cX5 zxL~$RUj8O97TanD1CIQ<7K`7_F@6V*-})H8PaVHE$M}8j_`N;G?@Pz;y)k~@I(}PY z{C;%&J{aTov*Wiv#_td7hepc~H5U=tkKdsvpsZTMXISvBfcZ1Se{HtSpp?)-`he1} zC{+el#8w2z#=9{|bPGNlk3abmZ{CSl2G9P}CEf+c&j(*c91%XlEa#xl=Dm-+-$BoL zPohZP6&sJgy(}Bx_S303sGjF7>!+2dj=)!hpq0GWq0i=Bhv5)*&da|$$@>=kaMyUd zw0sS2e;b;Ej@n}ubMp%fK7#Q5=Qj+;tDsDy$lV2`0`~1b11l1b*F5X@J;t{qM%V=Y E3(enldH?_b literal 3190 zcmd^>J!lj`6vyAWZaywwmrsom*%XHn!n)iA1<{~|X-uIOV&!G;19IY#V|VY2ASfx+ z%F0F&NhLzGw-7r!i`ZF+jg_@xW#M}>JG(P4x2Cak;NHF8oBzC-o4K90^Jo2_w!WM{ z>6p#aQ2M%coN`$y*75)_1(19EFF%z^(D3V(ZmZdXO67LYj2a5UMx@-@t%e^cPy^cf z0D^b`xyb+mIUv+$kRS#~Hy$8C4bWx?o5>8)O$MYh)N9RjNfN{i(v1fYK)10OG{aig z-H_*@_LvSs-~UrfOX7S=r^_XIP;2>n7gtwuxf~vbY&rM=DFLkZ;rU?KlIUK5qc8_y z5#DXx4+}O~M_5nTBK#I{vW`vG6SfG?MVzc-ll6ox!WR)I>)2#HVTG2QA#D~6rGTCV!;D85k1`%(TwpxTc!KdHV|-AxX2G;Zw7wa}hZr9=cD#W5 zssDlk?&lG0L;?DsXmCH23?6`Gg9qV~!Fjl5@DS7t9)=BrN8ql(qwvt+F?eEd0k#bu zhc^aKz*~bS;e)|b@X6q5_-gPBd^Z^PQ(Zj&*VX2RcUqBO1viWW`Ms{ZsIeJ=TlXU$ z+-ewtO95BkCKb`@fC?qmKn0R3zO^S&JBcKT(oj+*_9RL*ssN;^<3v;+)VQR2s6bK@ zQjJQKrcM&2p*T?*ND`$XnTU#qnk`PGheRShpw%2#792l{f@ZZ7HA3z0y01Hj3aTmU z)|9m+9j0#M`BNx7?hTTuM80XXHRX%nlcNE<%`uffw_tITqy7L*jD$}iG z=sHZdnxUh+NnhX94Ba!PyPl!jVY(X`y7x?1&(Q5M-OUW$H>PW6=zcO?H$&Hto1*Uv z-RZr~ZI0G7J8y0FXc!&Fy}{-%xNGJ7s6ees$(QlM8qKjA)=F8fAp3cxSG^o=z_l^dYBGI#P2~nYc6Il~0%JKb)F_Bh-jrjXcIQt^l{Z7QC=z*#<%5+ILo+H#uN9P_B`*bPr-VdkH5 zGyasD@uuA5OSv20jpwef8{b_oH=ny+Zhm+E?)=KmddxZN@&6lden02+c+>SZyfT{A z{0K4d=!C-`bNG`EKk0Bc-l^P)ui(Bsp6OA+{dg|NC+PVcpQI}}K1J7ae41X*@e;k8 zM3qoy^hl`dX7_TrnqVKK2(bT z6%g)L;{}E=ZdyGz${xatz_k}pK^Ql!o`cXoSwQBKj@d;cybt&L%~8%M*OIgG=-?FegOJg`(bvslfWGE9=V z*F8w!|FFVatx)(pv+#Mzio7s*E7?z87_J}NSom1;*?N$lJ`?cE<`oRJ&c*FDi^cX5 zxL~$RUj8O97TanD1CIQ<7K`7_F@6V*-})H8PaVHE$M}8j_`N;G?@Pz;y)k~@I(}PY z{C;%&J{aTov*Wiv#_td7hepc~H5U=tkKdsvpsZTMXISvBfcZ1Se{HtSpp?)-`he1} zC{+el#8w2z#=9{|bPGNlk3abmZ{CSl2G9P}CEf+c&j(*c91%XlEa#xl=Dm-+-$BoL zPohZP6&sJgy(}Bx_S303sGjF7>!+2dj=)!hpq0GWq0i=Bhv5)*&da|$$@>=kaMyUd zw0sS2e;b;Ej@n}ubMp%fK7#Q5=Qj+;tDsDy$lV2`0`~1b11l1b*F5X@J;t{qM%V=Y E3(enldH?_b literal 3190 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 literal 4242 zcmd^?J#5oZ5XUbyp-{fUSD_RkcZdL~GErNV4p5bWE_46}#6;>OmTE-Q$aX`KkU$-P ziHQZo(21q6FfkxDBnAf95eo~4HPH8Pvy5qydC(Fr-IOn)UbWaa|0D9 zpqB+OhyffX00t5Wvn$Ae06B~S87LsLLg*(e$YBDcD|Fg^dP*{&7344mFo3?d8u($m z?<~uDsC$gX$lm|ysVS<@)kqJ`Aek0CO~)gX1s? zVIAJC-4AP3^fvhh`8xa|9lc#e-ymOy=cJ>ztLPi#>+pqi^mY|}gM1x6l8)Z4qHmzT za7vs6T{Torh+#G8Pfz(1y+*T(&PCT2j!w0}S;i{{uwcMQTH=VwEZAm}#q27hZ)f!Q zX6KGtup_6)(1M+ejz2QpEZC)sLa|^sqwit#y^Ow((QAyppV1F6`awn)8;Zd!IBZby zdWRYP2%{g>bo{N<40XplRx{N780mW5>!j;-pCDbY`z+~t-7k@@*ZmsldfnTk>vdly zU9bCH()GGOBwerj6Vmm%uamCV{T1nY-QSR|*Zn=|dfh*huGjr5>3ZFNkZ!2E+VKCc zmg0nWx{=!gCyWC5y`)Bww;F-daU&O;Rv3bVf|I>XO3CzJB_&;02}x`1YKeM@k|au{ zq&sVg(mAT}rm5pZ*q0TTbZsRhtvH>d5~Zn=M5z=fN`)j*D#=9HwAE^HqO3%TvO=cU zJF?NcQ55*CmBw5 zetq0eP1ip!bhIM=ikM^K7l#@# zdnNf#4Bs!we`9#;muN-L&o42@bpO|gF6IXXY~ml4NpI{$Ho$NrC2#Ghw) ze6G-n_{$8xPINKfV)z#&`4xtLS(1Oi@UKhqPX#abPW8CQ6ac}_4$oK#`5dqo1lpwjtjq$19Bn!1>Sqw AQUCw| diff --git a/bin/riscv64imac-unknown-none-elf.a b/bin/riscv64imac-unknown-none-elf.a index 53bc14a7c633963417c6a4cc0a6c9d8aa992d155..a389036c6672fd1e24ceec0927d43df8a9330a6c 100644 GIT binary patch literal 6006 zcmd^CPj6dA5Fhs?Aqk0bDTG2PxS@s?=!=u4AxKcUswhQ@fKnB40Nm%~kr*XuupQG% zNJNnU331?9Bn})oaNq;LH|U`sfD@kp2`>DRV1K(a&Up7dVu30SjO5+f-~MKHcHZuK z_t*WYh7JE=6< zX-CxM^)zWoLkzZzfz#XC*fp%NQ`y)x#9+^OWw}Y+^m?n=Uhc-%+}!hKyf8m+XL@Gg z*#$S{tK%QOuyo--pC_PN=3VpY`(=H98EZeeb%L@Hr zkP3Zidr_8$QC4kPp&xATt=*lEjkm~nA}SPqFHV}$hGT*#P}1IrFWb>*?0~Bc`BY)d zvNaZGU^5w5H3OSv>=EPDjWU{Yp;9;B~M)Y97$9^bfoMZP|JUp)+wYa~Fh@P}~cwRkY@$g(aZ}IT_dBx)4`SYg5 zacSz8Rnsg{c>Z)O9`1`Bi-+e4#Y@$4@2d3Q-m^@IbP|OT{3GeF@VrGGuCsJW;W`_s z!u2k`p>Vw#&oDl1YQ4Gyf85|Yo|hE=e%4V54!(}_E#|<#UZsMAuj7AD@%1hc9DF^m zj}-qf>!<_=U(a`hIoRK`tfP_`fV&%y>y-Tr{Ir8?DY*h3D_mj#KBI8lLm|NRrA5c{ zm}R&^#>IL#u5j@WtdfD_+NAkq=D-hfAp#x*+$XH&3c*opzQhba!hyvi3M23%YZz_8 z!PWd4I*q^&&JdA{tiaDx0-9QI_|W`UnFBvhvySQw*5T(A>!<{WAI;Z!)~DrRwuS$P zSVvW69rzK}QNb?+xO{80b>5BwV3GWQkNd4ijTPWHdqpG)fTIb=I!ezeTPb-|_ z_Kl5B(lB+Wpx(Pw0QEW*Xzz{MkKhq1 z2)ou$@6{?C^>!6#?*-eB;2j&c()A=>NgLa%_4Vdv+6Oc@-??TcZ99`jqm_31x|3G2 zxtf|>IEG18U$^wScXHC{w3?0Wj^Y1X!P>%EA?JhmtBK;(_|96e7GUqcWNMnEba1uc zOc*u4e`=3C_IL67^YX_(n`3{$;E?_7FBwkO_)FG$fBQy`{c8i-Z|B&{zT7YVPjc+v z9&r3Ga_m z$DcCxzE7CM4C1|@#pj;Pv9B>v)`9paiNf`9!^?{Q1V0IO*bm~zUCfVvk;kuke!pcq z{T~eq!@c?<+k578n~D3yf8Ox2;{STWdHjhTBYxa-{rF!u_U7#MhoRa5XQ=O5KsYSd y$!(_gFeqCLR`~$J{|w%2{`gp?{@HIJ`ihC4p`pYdA8RVh{w6=sWc`Z^-~KPgY=0F1 literal 4242 zcmd^?J#5oZ5XUbyp-{fUSD_RkcZdL~GErNV4p5bWE_46}#6;>OmTE-Q$aX`KkU$-P ziHQZo(21q6FfkxDBnAf95eo~4HPH8Pvy5qydC(Fr-IOn)UbWaa|0D9 zpqB+OhyffX00t5Wvn$Ae06B~S87LsLLg*(e$YBDcD|Fg^dP*{&7344mFo3?d8u($m z?<~uDsC$gX$lm|ysVS<@)kqJ`Aek0CO~)gX1s? zVIAJC-4AP3^fvhh`8xa|9lc#e-ymOy=cJ>ztLPi#>+pqi^mY|}gM1x6l8)Z4qHmzT za7vs6T{Torh+#G8Pfz(1y+*T(&PCT2j!w0}S;i{{uwcMQTH=VwEZAm}#q27hZ)f!Q zX6KGtup_6)(1M+ejz2QpEZC)sLa|^sqwit#y^Ow((QAyppV1F6`awn)8;Zd!IBZby zdWRYP2%{g>bo{N<40XplRx{N780mW5>!j;-pCDbY`z+~t-7k@@*ZmsldfnTk>vdly zU9bCH()GGOBwerj6Vmm%uamCV{T1nY-QSR|*Zn=|dfh*huGjr5>3ZFNkZ!2E+VKCc zmg0nWx{=!gCyWC5y`)Bww;F-daU&O;Rv3bVf|I>XO3CzJB_&;02}x`1YKeM@k|au{ zq&sVg(mAT}rm5pZ*q0TTbZsRhtvH>d5~Zn=M5z=fN`)j*D#=9HwAE^HqO3%TvO=cU zJF?NcQ55*CmBw5 zetq0eP1ip!bhIM=ikM^K7l#@# zdnNf#4Bs!we`9#;muN-L&o42@bpO|gF6IXXY~ml4NpI{$Ho$NrC2#Ghw) ze6G-n_{$8xPINKfV)z#&`4xtLS(1Oi@UKhqPX#abPW8CQ6ac}_4$oK#`5dqo1lpwjtjq$19Bn!1>Sqw AQUCw| From ca21628edbcc446a26ba914b56530883b1e2e20a Mon Sep 17 00:00:00 2001 From: Vadim Kaushan Date: Sun, 14 Jun 2020 14:58:03 +0300 Subject: [PATCH 13/14] Fix badges in README --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 262f27e..acc88ec 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -[![crates.io](https://img.shields.io/crates/d/riscv.svg)](https://crates.io/crates/vexriscv) -[![crates.io](https://img.shields.io/crates/v/riscv.svg)](https://crates.io/crates/vexriscv) -[![Build Status](https://travis-ci.org/rust-embedded/riscv.svg?branch=master)](https://travis-ci.org/xobs/vexriscv) +[![crates.io](https://img.shields.io/crates/d/vexriscv.svg)](https://crates.io/crates/vexriscv) +[![crates.io](https://img.shields.io/crates/v/vexriscv.svg)](https://crates.io/crates/vexriscv) +[![Build Status](https://travis-ci.org/xobs/vexriscv-rust.svg?branch=master)](https://travis-ci.org/xobs/vexriscv-rust) # `veriscv` From 81c5f3d619a80556cbb8e804ca2eefa877caa077 Mon Sep 17 00:00:00 2001 From: Vadim Kaushan Date: Sun, 14 Jun 2020 15:00:27 +0300 Subject: [PATCH 14/14] Update README --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index acc88ec..47c221f 100644 --- a/README.md +++ b/README.md @@ -2,11 +2,12 @@ [![crates.io](https://img.shields.io/crates/v/vexriscv.svg)](https://crates.io/crates/vexriscv) [![Build Status](https://travis-ci.org/xobs/vexriscv-rust.svg?branch=master)](https://travis-ci.org/xobs/vexriscv-rust) -# `veriscv` +# `vexriscv` > Low level access to parts of the VexRiscv RISC-V processor -This project is derived from [riscv](https://github.com/rust-embedded/riscv), developed and maintained by the [RISC-V team][team]. +This project complements [riscv](https://github.com/rust-embedded/riscv), +which is developed and maintained by the [RISC-V team][team]. ## [Documentation](https://docs.rs/crate/vexriscv)