From ac2ac6756b5d3f059a3154b6dc09ff280d98da41 Mon Sep 17 00:00:00 2001 From: Vadim Kaushan Date: Tue, 25 Jun 2019 23:02:45 +0300 Subject: [PATCH 1/9] Derive useful traits for enums --- src/register/fcsr.rs | 1 + src/register/mcause.rs | 6 +++--- src/register/misa.rs | 1 + src/register/mstatus.rs | 4 ++++ src/register/mtvec.rs | 1 + src/register/satp.rs | 2 ++ src/register/scause.rs | 6 +++--- src/register/sstatus.rs | 4 ++-- src/register/stvec.rs | 1 + 9 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/register/fcsr.rs b/src/register/fcsr.rs index a6b2b13..ba204ff 100644 --- a/src/register/fcsr.rs +++ b/src/register/fcsr.rs @@ -64,6 +64,7 @@ impl Flags { } /// Rounding Mode +#[derive(Clone, Copy, Debug, Eq, PartialEq)] pub enum RoundingMode { RoundToNearestEven = 0b000, RoundTowardsZero = 0b001, diff --git a/src/register/mcause.rs b/src/register/mcause.rs index 67e6d8c..e0e6ffb 100644 --- a/src/register/mcause.rs +++ b/src/register/mcause.rs @@ -7,14 +7,14 @@ pub struct Mcause { } /// Trap Cause -#[derive(Copy, Clone, Debug)] +#[derive(Copy, Clone, Debug, PartialEq, Eq)] pub enum Trap { Interrupt(Interrupt), Exception(Exception), } /// Interrupt -#[derive(Copy, Clone, Debug)] +#[derive(Copy, Clone, Debug, PartialEq, Eq)] pub enum Interrupt { UserSoft, SupervisorSoft, @@ -29,7 +29,7 @@ pub enum Interrupt { } /// Exception -#[derive(Copy, Clone, Debug)] +#[derive(Copy, Clone, Debug, PartialEq, Eq)] pub enum Exception { InstructionMisaligned, InstructionFault, diff --git a/src/register/misa.rs b/src/register/misa.rs index 44ae950..792e22c 100644 --- a/src/register/misa.rs +++ b/src/register/misa.rs @@ -9,6 +9,7 @@ pub struct Misa { } /// Machine XLEN +#[derive(Copy, Clone, Debug, Eq, PartialEq)] pub enum MXL { XLEN32, XLEN64, diff --git a/src/register/mstatus.rs b/src/register/mstatus.rs index 3988097..9693918 100644 --- a/src/register/mstatus.rs +++ b/src/register/mstatus.rs @@ -10,6 +10,7 @@ pub struct Mstatus { } /// Additional extension state +#[derive(Copy, Clone, Debug, Eq, PartialEq)] pub enum XS { /// All off AllOff = 0, @@ -25,6 +26,7 @@ pub enum XS { } /// Floating-point extension state +#[derive(Copy, Clone, Debug, Eq, PartialEq)] pub enum FS { Off = 0, Initial = 1, @@ -33,6 +35,7 @@ pub enum FS { } /// Machine Previous Privilege Mode +#[derive(Copy, Clone, Debug, Eq, PartialEq)] pub enum MPP { Machine = 3, Supervisor = 1, @@ -40,6 +43,7 @@ pub enum MPP { } /// Supervisor Previous Privilege Mode +#[derive(Copy, Clone, Debug, Eq, PartialEq)] pub enum SPP { Supervisor = 1, User = 0, diff --git a/src/register/mtvec.rs b/src/register/mtvec.rs index d4f8c07..247e05f 100644 --- a/src/register/mtvec.rs +++ b/src/register/mtvec.rs @@ -7,6 +7,7 @@ pub struct Mtvec { } /// Trap mode +#[derive(Copy, Clone, Debug, Eq, PartialEq)] pub enum TrapMode { Direct = 0, Vectored = 1, diff --git a/src/register/satp.rs b/src/register/satp.rs index fa0c6ee..ffd347c 100644 --- a/src/register/satp.rs +++ b/src/register/satp.rs @@ -70,12 +70,14 @@ impl Satp { } #[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, diff --git a/src/register/scause.rs b/src/register/scause.rs index 596ccef..0172f07 100644 --- a/src/register/scause.rs +++ b/src/register/scause.rs @@ -10,14 +10,14 @@ pub struct Scause { } /// Trap Cause -#[derive(Copy, Clone, Debug)] +#[derive(Copy, Clone, Debug, Eq, PartialEq)] pub enum Trap { Interrupt(Interrupt), Exception(Exception), } /// Interrupt -#[derive(Copy, Clone, Debug)] +#[derive(Copy, Clone, Debug, Eq, PartialEq)] pub enum Interrupt { UserSoft, SupervisorSoft, @@ -29,7 +29,7 @@ pub enum Interrupt { } /// Exception -#[derive(Copy, Clone, Debug)] +#[derive(Copy, Clone, Debug, Eq, PartialEq)] pub enum Exception { InstructionMisaligned, InstructionFault, diff --git a/src/register/sstatus.rs b/src/register/sstatus.rs index ec4765a..550aaf2 100644 --- a/src/register/sstatus.rs +++ b/src/register/sstatus.rs @@ -10,14 +10,14 @@ pub struct Sstatus { } /// Supervisor Previous Privilege Mode -#[derive(Eq, PartialEq)] +#[derive(Copy, Clone, Debug, Eq, PartialEq)] pub enum SPP { Supervisor = 1, User = 0, } /// Floating-point unit Status -#[derive(Eq, PartialEq)] +#[derive(Copy, Clone, Debug, Eq, PartialEq)] pub enum FS { Off = 0, Initial = 1, diff --git a/src/register/stvec.rs b/src/register/stvec.rs index 5a179d0..aab918b 100644 --- a/src/register/stvec.rs +++ b/src/register/stvec.rs @@ -7,6 +7,7 @@ pub struct Stvec { } /// Trap mode +#[derive(Copy, Clone, Debug, Eq, PartialEq)] pub enum TrapMode { Direct = 0, Vectored = 1, From a659a0cc3963017e35d0224fbe1bc03e8c90bb24 Mon Sep 17 00:00:00 2001 From: Vadim Kaushan Date: Tue, 25 Jun 2019 23:11:58 +0300 Subject: [PATCH 2/9] Declare all the CSR registers in asm.S --- asm.S | 277 ++++++++++++++++++++++++++++++++++++++++++++++------ asm.h | 11 +++ asm32.S | 5 - assemble.sh | 8 +- 4 files changed, 260 insertions(+), 41 deletions(-) delete mode 100644 asm32.S diff --git a/asm.S b/asm.S index 3f7202d..c6c293b 100644 --- a/asm.S +++ b/asm.S @@ -24,37 +24,252 @@ __sfence_vma: sfence.vma a0, a1 ret -REG_READ_WRITE(fcsr, 0x003) -REG_SET_CLEAR(fcsr, 0x003) +// User Trap Setup +RW(0x000, ustatus) // User status register +RW(0x004, uie) // User interrupt-enable register +RW(0x005, utvec) // User trap handler base address -// M-mode registers -REG_READ(mcause, 0x342) -REG_READ(mcycle, 0xB00) -REG_READ(mepc, 0x341) -REG_READ(mie, 0x304) -REG_SET_CLEAR(mie, 0x304) -REG_READ(minstret, 0xB02) -REG_READ(mip, 0x344) -REG_READ(misa, 0x301) -REG_READ_WRITE(mstatus, 0x300) -REG_SET_CLEAR(mstatus, 0x300) -REG_READ_WRITE(mtvec, 0x305) -REG_READ(mvendorid, 0xF11) -REG_READ(marchid, 0xF12) -REG_READ(mimpid, 0xF13) -REG_READ(mhartid, 0xF14) +// 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 -// S-mode registers -REG_READ_WRITE(satp, 0x180) -REG_READ(scause, 0x142) -REG_READ_WRITE(sepc, 0x141) -REG_READ(sie, 0x104) -REG_SET_CLEAR(sie, 0x104) -REG_READ(sip, 0x144) -REG_READ_WRITE(sscratch, 0x140) -REG_READ_WRITE(sstatus, 0x100) -REG_SET_CLEAR(sstatus, 0x100) -REG_READ(stval, 0x143) -REG_READ_WRITE(stvec, 0x105) +// 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) -REG_READ(time, 0xC01) +// 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 diff --git a/asm.h b/asm.h index 3ec97f2..2b675e7 100644 --- a/asm.h +++ b/asm.h @@ -33,5 +33,16 @@ __clear_ ## name: \ #define REG_READ_WRITE(name, offset) REG_READ(name, offset); REG_WRITE(name, offset) #define REG_SET_CLEAR(name, offset) REG_SET(name, offset); REG_CLEAR(name, offset) +#define RW(offset, name) REG_READ_WRITE(name, offset); REG_SET_CLEAR(name, offset) +#define RO(offset, name) REG_READ(name, offset) + +#if __riscv_xlen == 32 +#define RW32(offset, name) RW(offset, name) +#define RO32(offset, name) RO(offset, name) +#else +#define RW32(offset, name) +#define RO32(offset, name) +#endif + #endif /* __ASM_H */ diff --git a/asm32.S b/asm32.S deleted file mode 100644 index c163b64..0000000 --- a/asm32.S +++ /dev/null @@ -1,5 +0,0 @@ -#include "asm.h" - -REG_READ(mcycleh, 0xB80) -REG_READ(minstreth, 0xB82) -REG_READ(timeh, 0xC81) diff --git a/assemble.sh b/assemble.sh index e89b5d5..a24df9e 100755 --- a/assemble.sh +++ b/assemble.sh @@ -7,14 +7,12 @@ crate=riscv # 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 -c -mabi=ilp32 -march=rv32imac asm32.S -o bin/$crate-32.o -ar crs bin/riscv32imac-unknown-none-elf.a bin/$crate.o bin/$crate-32.o -ar crs bin/riscv32imc-unknown-none-elf.a bin/$crate.o bin/$crate-32.o +riscv64-unknown-elf-gcc -c -mabi=ilp32 -march=rv32imc 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=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 rm bin/$crate.o -rm bin/$crate-32.o From 370a654d2c3c36e6cf5824c6c6227c438d7a56c7 Mon Sep 17 00:00:00 2001 From: Vadim Kaushan Date: Tue, 25 Jun 2019 23:12:18 +0300 Subject: [PATCH 3/9] Regenerate binaries --- bin/riscv32imac-unknown-none-elf.a | Bin 7582 -> 69858 bytes bin/riscv32imc-unknown-none-elf.a | Bin 7582 -> 69858 bytes bin/riscv64gc-unknown-none-elf.a | Bin 8654 -> 76608 bytes bin/riscv64imac-unknown-none-elf.a | Bin 8654 -> 76608 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/bin/riscv32imac-unknown-none-elf.a b/bin/riscv32imac-unknown-none-elf.a index 2daa4603d3c85d765b988fe7a1abcb3bb63ebcce..bd60165563571e7f12fb8fcb95ede6dfb763dc55 100644 GIT binary patch literal 69858 zcmeI5cX$=m*8lgWSP=1ug4i%3gJ8i)C}Kfl0UKgeP(+0U2ofY1l7Nbh3yNJ)(Tk{v z*p;hTKt)CD*pQ38-l$+Nh`n6jclMgH*ZQ7WzW@Gy&jZi+XvR|1MBvIb^E}& zec=DkePHJjzTRVSO_!%rPu6V-;%)#FE251&+9HN0xvI1xk;siTHZY-p@%oY>%I zsjq3QX53KS$Y|ua>Z*Fi@ys>Ven$G4W}=^x8R+L&Zk$v-((4J)49U;QED0rxH?qE} zapV|3Uqcqe3z%WLgjoX2~F)E5mrk`r2%i(eyLT zLO&%w{T$098|u9s1L^UPi5~;aF!J;$i{>C`tf|d@t{LCZSYO?kP8w5JJMxr?;~T5% zdlW}Ki=$q}QSaht_u{BeakNKqR2t@Fr8!wyPL{I z9%VV}QI@kFWjX6nma`sZIqOlDvmRwR>rs}o9%VV}QI@kFJ#yBgN46fclexEnY%j|o z+08O$`&mxbGbihnll9KYcF)QB<%K=+!n~C!&0Cw&ywxeqTc6Ur z6)MeJqq4j;D$84=vb;4a%Uh$eyfrGzTcfhPH7d(nqq4j;D$84=9(ilj!>>^Td{}yR zZ;+ni_ejsQ&o)$#svcK;QnU-lpAepD=4@&*bH?$^H869=G;>DD%o!&$`_Hq6>|;9q zDV-sE({2zS(<#v?;$u3U5|5C)u~(1xtH&dnod?OVJc=9nkN0FN`GA^uOj`ILZooh9 z8~o>e@?$a+`@C;RKg5&qQj8ZlITuJ5H^F$MXiDLQR(|+t-C?Qu%@<-(U_|GMuxC+*JkX- z^b`;4IUc#Dp(=anYh$3<;vbWFVu)wR_V0N6)n-hyWt7aBaWa}b8fvrsJsvZinhu+C zGP6G#YO|vu{wbXyI~r=m(U202B94Z1N<0GJt&`Q`5zWqnWLO@>jr`7?wDAEo@tCym zLEL~J4YmGgNPbLaVn;)5y8EY#o$T@PB8#ITQ{$1u(GYEp?CdxFITBw9){Pu}k~>L=m(8qw2*3P1UYHoPL4$b7qA8nMT6{YI%(j}q(uW4um%oAgY48hY2Z$~ zMFSVG1`b7o>^wbbKo?D-10}2lvFPD1w9+QUyQ52Zlj0rHC47GT5%0t3m4wC?20Je ziY&_x6qaTCKFhM*nPu4?%Cc;yV_CKzvCQumJj`Ba9%io_58W$6uLBSBR)%dSza{)- zIG;Ulef)(uH}lrWUy3u+UyJiFZ;kxbI5+dw$X}0hGw%iRSLEExdx`utIWzr5IS>77 zBrnU;9WT375X?1ih)ac*dMdaR9MG${Vh$wq!p+@c?j6e1=$wi`(3!srWcBzqno6j1# zNHp?q^um!#+ z`HM`jnfT<0mn>&D&(33fGk+!{Gr3>UnF+3D(Y{U=E?M#3PM^HktZ08H3!6C$mMmwN zr%!SD0_5!U^0PkPW;we(-G!IUa&~-wuikIQoL!&J8f3GaonM|?#7ma5`_p}Y*(~P( z@V_0%mW<9w;02&eG@}Gw0C_G$OGalh*sSOXAPbun9|8312yEu|ZMkGF!Dhur0G&Bu zGq=CXW;sWIJm-p6)9uIDtmp`!Uz6aH6(0d~riRUmjsUW-S@97-zjDE5Zhx1nnR5jA zU)K0tBj*U9vqjk~=LnGJl<_vpIRfYxKeAcQ5#WD4kmshNc&r5C z8Q5>?N72uu(@%*_KgY7a(;2VPC?C*l9+P>~puVPI*AyYEVLXKsnWr zY7kQ1i*l+V)u5d6ew0%UsRjjFo_4f6R70vk3FQIhR70vkNO>>HsfJVovou=fpg^^R zYDl%5Y6aCws&!PSP@O?_F4YB8mr`9pwTbE)s^&@RPql<f0MI+yAKs!OS^pxQ)r4OQdz%tA|7OQ?oagA&RE%BhA_gOKuG zlv53<2IZ9Zqnv6;HK0AeFqm?xA=RLg{A$XnhExNyIW3Q?B`sYIsRjkg+fhz6q#Be^ z9#Bp-q#A^j_oAF?NHr*@ydULML#l!4K;ybv($dwCYEbw-`Z*|}8d5E%YC`f|Eotd$ zNHr)>-i~srA=RLS@_=%xA=MzHycgwEL#jbJ<^3q98d41^C?8BY)sSjXNqIHpR70wP z=}F7!YDr61L#jc6@^+L{4XFktln0bk4XFkp<-I7U8d43)Dep%))sSjn_M~xLEotd$ zNHr)>-i~srA=RLS@_=%xA=MzHycgwEL#lz zq5LPxsfJVovmn~$K?&86YB|*ks+Cmhs7|3egX&zW3#cxox`JvG)iqSjeXetXY6;bl zYB|*ks+Cmhs7|3egX&zW3#cxox`JvG)iqSj!?fg7L#pLeE2vgdt)n`H>I|xLsV<

bph3-R98@KqPm7^SQhm!^m4U? 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 literal 7582 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

bph3-R98@KqPm7^SQhm!^m4U? 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 literal 7582 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≧+ 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 diff --git a/bin/riscv64imac-unknown-none-elf.a b/bin/riscv64imac-unknown-none-elf.a index bc00a83489efd73926ff6f3f08ed2cd97df0bd59..b1b370ac276e68552ce6c481224688182fd4edce 100644 GIT binary patch literal 76608 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≧+ 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 From 00367d4fd2c9beca3d8052cce46144e0fcb88930 Mon Sep 17 00:00:00 2001 From: Vadim Kaushan Date: Tue, 25 Jun 2019 23:31:06 +0300 Subject: [PATCH 4/9] Add sections to the registers module --- src/register/mod.rs | 99 +++++++++++++++++++++++++++++++++------------ 1 file changed, 74 insertions(+), 25 deletions(-) diff --git a/src/register/mod.rs b/src/register/mod.rs index d7219ec..06591ed 100644 --- a/src/register/mod.rs +++ b/src/register/mod.rs @@ -13,33 +13,82 @@ #[macro_use] mod macros; +// TODO: User Trap Setup + + +// TODO: User Trap Handling + + +// User Floating-Point CSRs +// TODO: frm, fflags pub mod fcsr; -pub mod marchid; -pub mod mcause; -pub mod mcycle; -pub mod mcycleh; -pub mod mepc; -pub mod mhartid; -pub mod mie; -pub mod mimpid; -pub mod minstret; -pub mod minstreth; -pub mod mip; -pub mod misa; -pub mod mstatus; -pub mod mtvec; -pub mod mvendorid; - -pub mod sstatus; -pub mod stvec; -pub mod sie; -pub mod sip; -pub mod scause; -pub mod stval; -pub mod satp; -pub mod sscratch; -pub mod sepc; +// User Counter/Timers +// TODO: cycle[h], instret[h], hpmcounter*[h] pub mod time; 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 +// TODO: mscratch +pub mod mepc; +pub mod mcause; +// TODO: mtval +pub mod mip; + + +// TODO: Machine Protection and Translation + +// Machine Counter/Timers +pub mod mcycle; +pub mod minstret; +// TODO: mhpmcounter* +pub mod mcycleh; +pub mod minstreth; +// TODO: mhpmcounter*h + + +// TODO: Machine Counter Setup + + +// TODO: Debug/Trace Registers (shared with Debug Mode) + + +// TODO: Debug Mode Registers From 7a8d3d1f6cca415d985bb9d8750cf47e3a8dd8d6 Mon Sep 17 00:00:00 2001 From: Vadim Kaushan Date: Tue, 25 Jun 2019 23:48:27 +0300 Subject: [PATCH 5/9] Implement mscratch and mtval registers --- src/register/mod.rs | 4 ++-- src/register/mscratch.rs | 4 ++++ src/register/mtval.rs | 3 +++ 3 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 src/register/mscratch.rs create mode 100644 src/register/mtval.rs diff --git a/src/register/mod.rs b/src/register/mod.rs index 06591ed..267a45c 100644 --- a/src/register/mod.rs +++ b/src/register/mod.rs @@ -67,10 +67,10 @@ pub mod mtvec; // Machine Trap Handling -// TODO: mscratch +pub mod mscratch; pub mod mepc; pub mod mcause; -// TODO: mtval +pub mod mtval; pub mod mip; diff --git a/src/register/mscratch.rs b/src/register/mscratch.rs new file mode 100644 index 0000000..c5ef9fe --- /dev/null +++ b/src/register/mscratch.rs @@ -0,0 +1,4 @@ +//! mscratch register + +read_csr_as_usize!(0x340, __read_mscratch); +write_csr_as_usize!(0x340, __write_mscratch); diff --git a/src/register/mtval.rs b/src/register/mtval.rs new file mode 100644 index 0000000..2afb7cb --- /dev/null +++ b/src/register/mtval.rs @@ -0,0 +1,3 @@ +//! mtval register + +read_csr_as_usize!(0x343, __read_mtval); From 298a8b6f6ec509a6ffb0ef250d7c80bcbde0df5f Mon Sep 17 00:00:00 2001 From: Vadim Kaushan Date: Tue, 25 Jun 2019 23:48:47 +0300 Subject: [PATCH 6/9] Provide write() for mepc --- src/register/mepc.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/register/mepc.rs b/src/register/mepc.rs index 9871513..160dff5 100644 --- a/src/register/mepc.rs +++ b/src/register/mepc.rs @@ -1,3 +1,4 @@ //! mepc register read_csr_as_usize!(0x341, __read_mepc); +write_csr_as_usize!(0x341, __write_mepc); From f37ab221c8617b38779e720f500bc15e8e544df6 Mon Sep 17 00:00:00 2001 From: Vadim Kaushan Date: Wed, 26 Jun 2019 00:51:37 +0300 Subject: [PATCH 7/9] Implement hpmcounter*[h], mhpmcounter*[h], mhpmevent* CSRs --- src/register/hpmcounterx.rs | 82 +++++++++++++++++++++++++++++++++++ src/register/macros.rs | 38 ++++++++++++++++ src/register/mhpmcounterx.rs | 84 ++++++++++++++++++++++++++++++++++++ src/register/mhpmeventx.rs | 41 ++++++++++++++++++ src/register/mod.rs | 12 ++++-- 5 files changed, 253 insertions(+), 4 deletions(-) create mode 100644 src/register/hpmcounterx.rs create mode 100644 src/register/mhpmcounterx.rs create mode 100644 src/register/mhpmeventx.rs diff --git a/src/register/hpmcounterx.rs b/src/register/hpmcounterx.rs new file mode 100644 index 0000000..5eb15b0 --- /dev/null +++ b/src/register/hpmcounterx.rs @@ -0,0 +1,82 @@ +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/macros.rs b/src/register/macros.rs index 02fc424..b71b4d4 100644 --- a/src/register/macros.rs +++ b/src/register/macros.rs @@ -118,6 +118,32 @@ macro_rules! write_csr { }; } +macro_rules! write_csr_rv32 { + ($csr_number:expr, $asm_fn: ident) => { + /// Writes the CSR + #[inline] + #[allow(unused_variables)] + unsafe fn _write(bits: usize) { + match () { + #[cfg(all(riscv32, feature = "inline-asm"))] + () => asm!("csrrw x0, $1, $0" :: "r"(bits), "i"($csr_number) :: "volatile"), + + #[cfg(all(riscv32, not(feature = "inline-asm")))] + () => { + extern "C" { + fn $asm_fn(bits: usize); + } + + $asm_fn(bits); + } + + #[cfg(not(riscv32))] + () => unimplemented!(), + } + } + }; +} + macro_rules! write_csr_as_usize { ($csr_number:expr, $asm_fn: ident) => { write_csr!($csr_number, $asm_fn); @@ -130,6 +156,18 @@ macro_rules! write_csr_as_usize { }; } +macro_rules! write_csr_as_usize_rv32 { + ($csr_number:expr, $asm_fn: ident) => { + write_csr_rv32!($csr_number, $asm_fn); + + /// Writes the CSR + #[inline] + pub fn write(bits: usize) { + unsafe{ _write(bits) } + } + }; +} + macro_rules! set { ($csr_number:expr, $asm_fn: ident) => { /// Set the CSR diff --git a/src/register/mhpmcounterx.rs b/src/register/mhpmcounterx.rs new file mode 100644 index 0000000..df3b6c4 --- /dev/null +++ b/src/register/mhpmcounterx.rs @@ -0,0 +1,84 @@ +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 new file mode 100644 index 0000000..78f6fef --- /dev/null +++ b/src/register/mhpmeventx.rs @@ -0,0 +1,41 @@ +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/mod.rs b/src/register/mod.rs index 267a45c..45487e0 100644 --- a/src/register/mod.rs +++ b/src/register/mod.rs @@ -25,8 +25,10 @@ pub mod fcsr; // User Counter/Timers -// TODO: cycle[h], instret[h], hpmcounter*[h] +// TODO: cycle[h], instret[h] pub mod time; +mod hpmcounterx; +pub use self::hpmcounterx::*; pub mod timeh; @@ -79,13 +81,15 @@ pub mod mip; // Machine Counter/Timers pub mod mcycle; pub mod minstret; -// TODO: mhpmcounter* +mod mhpmcounterx; +pub use self::mhpmcounterx::*; pub mod mcycleh; pub mod minstreth; -// TODO: mhpmcounter*h -// TODO: Machine Counter Setup +// Machine Counter Setup +mod mhpmeventx; +pub use self::mhpmeventx::*; // TODO: Debug/Trace Registers (shared with Debug Mode) From 31f41277022bec68d65aa09086bcb5abec4491d5 Mon Sep 17 00:00:00 2001 From: Vadim Kaushan Date: Wed, 26 Jun 2019 11:25:45 +0300 Subject: [PATCH 8/9] Add PMP CSRs --- src/register/mod.rs | 7 ++++++- src/register/pmpaddrx.rs | 28 ++++++++++++++++++++++++++++ src/register/pmpcfgx.rs | 23 +++++++++++++++++++++++ 3 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 src/register/pmpaddrx.rs create mode 100644 src/register/pmpcfgx.rs diff --git a/src/register/mod.rs b/src/register/mod.rs index 45487e0..82fb0a1 100644 --- a/src/register/mod.rs +++ b/src/register/mod.rs @@ -76,7 +76,12 @@ pub mod mtval; pub mod mip; -// TODO: Machine Protection and Translation +// Machine Protection and Translation +mod pmpcfgx; +pub use self::pmpcfgx::*; +mod pmpaddrx; +pub use self::pmpaddrx::*; + // Machine Counter/Timers pub mod mcycle; diff --git a/src/register/pmpaddrx.rs b/src/register/pmpaddrx.rs new file mode 100644 index 0000000..d615dde --- /dev/null +++ b/src/register/pmpaddrx.rs @@ -0,0 +1,28 @@ +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 new file mode 100644 index 0000000..ec27251 --- /dev/null +++ b/src/register/pmpcfgx.rs @@ -0,0 +1,23 @@ +/// 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); +} From d3dc245ce438201a16d20c822aa6f03a80bd7d97 Mon Sep 17 00:00:00 2001 From: Vadim Kaushan Date: Wed, 3 Jul 2019 01:37:34 +0300 Subject: [PATCH 9/9] Bump version (0.5.4) --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 12fb17d..307be96 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "riscv" -version = "0.5.3" +version = "0.5.4" repository = "https://github.com/rust-embedded/riscv" authors = ["The RISC-V Team "] categories = ["embedded", "hardware-support", "no-std"]