Skip to content

Commit 0b5a620

Browse files
authored
ch32v: Define structs for CSRs (#753)
1 parent cb7b34d commit 0b5a620

File tree

2 files changed

+61
-16
lines changed

2 files changed

+61
-16
lines changed

modules/riscv32-common/src/riscv32_common.zig

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,9 @@ pub fn wfi() void {
5353
asm volatile ("wfi");
5454
}
5555

56-
// NOTE: Contains all csrs from the riscv manual and should follow their spec. Cpu implementations can
57-
// reexport what they need from here.
56+
// NOTE: Contains all CSRs (Control Status Registers) from the riscv manual and should follow their
57+
// spec. Cpu implementations can reexport what they need from here.
58+
// See https://docs.riscv.org/reference/isa/priv/priv-csrs.html
5859
pub const csr = struct {
5960
pub const fflags = Csr(0x001, u32);
6061
pub const frm = Csr(0x002, u32);
@@ -158,7 +159,7 @@ pub const csr = struct {
158159

159160
pub const mscratch = Csr(0x340, u32);
160161
pub const mepc = Csr(0x341, u32);
161-
pub const mcause = Csr(0x342, packed struct {
162+
pub const mcause = Csr(0x342, packed struct(u32) {
162163
code: u31,
163164
is_interrupt: u1,
164165
});

port/wch/ch32v/src/cpus/main.zig

Lines changed: 57 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -397,11 +397,27 @@ pub const csr = struct {
397397
pub const Csr = riscv32_common.csr.Csr;
398398

399399
/// Architecture Number Register
400+
/// Fields correspond to individual letters. 1=A, 2=B, etc.
400401
/// Examples:
401402
/// - 0xDC68D841 - WCH-V2A
402403
/// - 0xDC68D886 - WCH-V4F
403-
pub const marchid = riscv32_common.csr.marchid;
404-
pub const mimpid = riscv32_common.csr.mimpid;
404+
pub const marchid = Csr(0xF12, packed struct(u32) {
405+
version: u4 = 0,
406+
serial: u5 = 0,
407+
arch: u5 = 0,
408+
reserved15: u1 = 0,
409+
vendor2: u5 = 0, // 'H'
410+
vendor1: u5 = 0, // 'C'
411+
vendor0: u5 = 0, // 'W'
412+
reserved: u1 = 0,
413+
});
414+
pub const mimpid = Csr(0xF13, packed struct(u32) {
415+
reserved0: u16 = 0,
416+
vendor2: u5 = 0, // 'H'
417+
vendor1: u5 = 0, // 'C'
418+
vendor0: u5 = 0, // 'W'
419+
reserved31: u1 = 0,
420+
});
405421

406422
/// Machine Mode Status Register
407423
pub const mstatus = Csr(0x300, packed struct(u32) {
@@ -414,26 +430,29 @@ pub const csr = struct {
414430
};
415431

416432
/// [2:0] Reserved
417-
reserved4: u3 = 0,
433+
reserved0: u3 = 0,
418434
/// [3] Machine mode interrupt enable
419435
mie: u1,
420436
/// [6:4] Reserved
421-
reserved3: u3 = 0,
437+
reserved4: u3 = 0,
422438
/// [7] Interrupt enable state before entering interrupt
423439
mpie: u1,
424440
/// [10:8] Reserved
425-
reserved2: u3 = 0,
441+
reserved8: u3 = 0,
426442
/// [12:11] Privileged mode before entering break
427443
mpp: u2 = 0,
428-
/// [14:13] Reserved
429-
reserved1: u2 = 0,
430444
/// [14:13] Floating-point unit status
431445
/// Valid only for WCH-V4F
446+
/// NOTE: reserved on other chips
432447
fs: Fs = .off,
433448
/// [31:15] Reserved
434-
reserved0: u15 = 0,
449+
reserved15: u17 = 0,
450+
});
451+
pub const misa = Csr(0x301, packed struct(u32) {
452+
extensions: u26 = 0,
453+
reserved26: u4 = 0,
454+
mxl: u2 = 0,
435455
});
436-
pub const misa = riscv32_common.csr.misa;
437456
/// Machine Mode Exception Base Address Register
438457
pub const mtvec = Csr(0x305, packed struct(u32) {
439458
/// [0] Mode 0
@@ -463,7 +482,15 @@ pub const csr = struct {
463482
pub const pmpaddr2 = riscv32_common.csr.pmpaddr2;
464483
pub const pmpaddr3 = riscv32_common.csr.pmpaddr3;
465484

466-
pub const fcsr = riscv32_common.csr.fcsr;
485+
pub const fcsr = Csr(0x003, packed struct(u32) {
486+
nx: u1 = 0,
487+
uf: u1 = 0,
488+
of: u1 = 0,
489+
dz: u1 = 0,
490+
nv: u1 = 0,
491+
frm: u3 = 0,
492+
reserved8: u24 = 0,
493+
});
467494
pub const fflags = riscv32_common.csr.fflags;
468495
pub const frm = riscv32_common.csr.frm;
469496

@@ -475,8 +502,25 @@ pub const csr = struct {
475502
pub const gintenr = Csr(0x800, u32);
476503
pub const intsyscr = Csr(0x804, cpu_impl.csr_types.intsyscr);
477504
pub const corecfgr = Csr(0xBC0, u32);
478-
pub const cstrcr = Csr(0xBC2, u32);
505+
pub const cstrcr = Csr(0xBC2, packed struct(u32) {
506+
reserved0: u1 = 0,
507+
icddisable: u1 = 0,
508+
reserved2: u22 = 0,
509+
iccodestren: u1 = 0,
510+
icsramstren: u1 = 0,
511+
reserved26: u6 = 0,
512+
});
479513
pub const cpmpocr = Csr(0xBC3, u32);
480-
pub const cmcr = Csr(0xBD0, u32);
481-
pub const cinfor = Csr(0xFC0, u32);
514+
pub const cmcr = Csr(0xBD0, packed struct(u32) {
515+
opcode: u2 = 0,
516+
idxmode: u1 = 0,
517+
reserved3: u2 = 0,
518+
vaddr: u27 = 0,
519+
});
520+
pub const cinfor = Csr(0xFC0, packed struct(u32) {
521+
iclinesize: u2 = 0,
522+
icszie: u3 = 0,
523+
icway: u2 = 0,
524+
reserved7: u25 = 0,
525+
});
482526
};

0 commit comments

Comments
 (0)