diff --git a/arch/csr/H/hgeie.yaml b/arch/csr/H/hgeie.yaml new file mode 100644 index 000000000..ceb11317d --- /dev/null +++ b/arch/csr/H/hgeie.yaml @@ -0,0 +1,68 @@ +# yaml-language-server: $schema=../../../schemas/csr_schema.json + +$schema: "csr_schema.json#" +kind: csr +name: hgeie +long_name: Hypervisor Guest External Interrupt Enable Register +description: + - id: csr-hgeie-purpose + normative: true + text: | + The hgeie register is an HSXLEN-bit read/write register that contains enable bits for the guest external interrupts at this hart. + - id: csr-hgeie-bits + normative: true + text: Guest external interrupt number i corresponds with bit i in hgeie. + - id: csr-hgeie-interrupts + normative: true + text: | + Guest external interrupts represent interrupts directed to individual virtual machines + at VS-level. + If a RISC-V platform supports placing a physical device under the direct control of a + guest OS with minimal hypervisor intervention (known as pass-through or direct assignment + between a virtual machine and the physical device), then, in such circumstance, + interrupts from the device are intended for a specific virtual machine. + - id: csr-hgeie-controller-req + normative: false + text: | + Support for guest external interrupts requires an interrupt controller that can collect + virtual-machine-directed interrupts separately from other interrupts. + - id: csr-hgeie-geilen + normative: true + text: | + The number of bits implemented in hgeie for guest external interrupts is UNSPECIFIED and + may be zero. + This number is known as `GEILEN`. + - id: csr-hgeie-bitorder + normative: true + text: | + The least-significant bits are implemented first, apart from bit 0. + - id: csr-hgeie-nonzero-geilen + normative: true + text: | + Hence, if GEILEN is nonzero, bits `GEILEN`:1 shall be writable in hgeie, and all other + bit positions shall be read-only zeros. + - id: csr-hgeie-select + normative: true + text: | + Register hgeie selects the subset of guest external interrupts that cause a + supervisor-level (HS-level) guest external interrupt. + - id: csr-hgeie-hgeip + normative: true + text: | + The enable bits in hgeie do not affect the VS-level external interrupt signal selected + from hgeip by hstatus.VGEIN.address: 0x607 +priv_mode: S +definedBy: H +length: SXLEN +fields: + GEI_ENABLE: + long_name: Guest external interrupt enable bits + location_rv32: 31-1 + location_rv64: 63-1 + type(): | + return NUM_EXTERNAL_GUEST_INTERRUPTS > 0 ? CsrFieldType::RW : CsrFieldType::RO; + reset_value: UNDEFINED_LEGAL + sw_write(csr_value): | + return ((1 << NUM_EXTERNAL_GUEST_INTERRUPTS) - 1) & csr_value.GEI_ENABLE; + description: | + Enable bits; see description of hgeie diff --git a/arch/csr/H/hgeip.yaml b/arch/csr/H/hgeip.yaml new file mode 100644 index 000000000..26cfda097 --- /dev/null +++ b/arch/csr/H/hgeip.yaml @@ -0,0 +1,59 @@ +# yaml-language-server: $schema=../../../schemas/csr_schema.json + +$schema: "csr_schema.json#" +kind: csr +name: hgeip +long_name: Hypervisor Guest External Interrupt Pending Register +description: + - id: csr-hgeip-purpose + normative: true + text: | + The hgeip register is an HSXLEN-bit read-only register that indicates pending guest external interrupts for this hart. + + - id: csr-hgeip-interrupts + normative: true + text: | + Guest external interrupts represent interrupts directed to individual virtual machines at VS-level. + + - id: csr-hgeip-pass-through + normative: true + text: | + If a RISC-V platform supports placing a physical device under the direct control of a guest OS with minimal hypervisor intervention (known as pass-through or direct assignment between a virtual machine and the physical device), then, in such circumstance, interrupts from the device are intended for a specific virtual machine. + + - id: csr-hgeip-summary + normative: true + text: | + Each bit of hgeip summarizes all pending interrupts directed to one virtual hart, as collected and reported by an interrupt controller. + + - id: csr-hgeip-controller-query + normative: true + text: | + To distinguish specific pending interrupts from multiple devices, software must query the interrupt controller. + + - id: csr-hgeip-geilen + normative: true + text: | + The number of bits implemented in hgeip and hgeie for guest external interrupts is UNSPECIFIED and may be zero. This number is known as `GEILEN`. + + - id: csr-hgeip-bitorder + normative: true + text: | + The least-significant bits are implemented first, apart from bit 0. + + - id: csr-hgeip-readonly-bits + normative: true + text: | + Hence, if GEILEN is nonzero, bits `GEILEN`:1 shall be writable in hgeie, and all other bit positions shall be read-only zeros in both hgeip and hgeie. +address: 0xE12 +priv_mode: S +definedBy: H +length: SXLEN +fields: + GEI_PENDING: + long_name: Guest External Interrupts Pending + location_rv32: 31-1 + location_rv64: 63-1 + type: RO + reset_value: UNDEFINED_LEGAL + description: | + Enable bits; see description of hgeip diff --git a/arch/csr/H/hideleg.yaml b/arch/csr/H/hideleg.yaml new file mode 100644 index 000000000..738ecfa9f --- /dev/null +++ b/arch/csr/H/hideleg.yaml @@ -0,0 +1,74 @@ +# yaml-language-server: $schema=../../../schemas/csr_schema.json + +$schema: "csr_schema.json#" +kind: csr +name: hideleg +long_name: Hypervisor Interrupt Delegation Register +description: | + Register hideleg is an HSXLEN-bit read/write register. By default, all traps at any privilege level are handled in M-mode, though M-mode usually uses the medeleg and mideleg CSRs to delegate some traps to HS-mode. + The hedeleg and hideleg CSRs allow these traps to be further delegated to a VS-mode guest; their layout is the same as medeleg and mideleg. + An interrupt that has been delegated to HS-mode (using mideleg) is further delegated to VS-mode if the corresponding hideleg bit is set. + Among bits 15:0 of hideleg, bits 10, 6, and 2 (corresponding to the standard VS-level interrupts) are writable, and bits 12, 9, 5, and 1 (corresponding to the standard S-level interrupts) are read-only zeros. +address: 0x603 +priv_mode: S +definedBy: H +length: SXLEN +fields: + SSI: + location: 1 + type: RO + reset_value: 0 + long_name: Supervisor Software Interrupt + description: Supervisor Software Interrupt + + VSSI: + location: 2 + type: RW + reset_value: UNDEFINED_LEGAL + long_name: Virtual Supervisor Software Interrupt + description: Delegates the Virtual Supervisor Software Interrupt to VS-mode + + STI: + location: 5 + type: RO + reset_value: 0 + long_name: Supervisor Timer Interrupt + description: Supervisor Timer Interrupt + + VSTI: + location: 6 + type: RW + reset_value: UNDEFINED_LEGAL + long_name: Virtual Supervisor Timer Interrupt + description: Delegates the Virtual Supervisor Timer Interrupt to VS-mode + + SEI: + location: 9 + type: RO + reset_value: 0 + long_name: Supervisor External Interrupt + description: Supervisor External Interrupt + + VSEI: + location: 10 + type: RW + reset_value: UNDEFINED_LEGAL + long_name: Virtual Supervisor External Interrupt + description: Delegates the Virtual Supervisor External Interrupt to VS-mode + + SGEI: + location: 12 + type: RW + reset_value: 0 + long_name: Supervisor Guest External Interrupt + description: Supervisor Guest External Interrupt + + LCOFI: + location: 13 + definedBy: Sscofpmf + long_name: Local Counter Overflow Interrupt + description: Delegate Local Counter Overflow Interrupts to VS-mode. + type(): | + return HIDELEG_LCOFI_MUTABLE ? CsrFieldType::RW : CsrFieldType::RO; + reset_value(): | + return HIDELEG_LCOFI_MUTABLE ? UNDEFINED_LEGAL : 0; diff --git a/arch/csr/H/hie.yaml b/arch/csr/H/hie.yaml new file mode 100644 index 000000000..9afd9efcf --- /dev/null +++ b/arch/csr/H/hie.yaml @@ -0,0 +1,57 @@ +# yaml-language-server: $schema=../../../schemas/csr_schema.json + +$schema: "csr_schema.json#" +kind: csr +name: hie +long_name: Hypervisor Interrupt Enable Register +description: | + The `hie` register is a read/write register in HS-mode that enables interrupts. + It corresponds to the enable bits for VS-level and hypervisor-specific interrupts, and supplements + the HS-level `sie` register. +address: 0x604 +priv_mode: S +definedBy: H +length: SXLEN +fields: + SGEIE: + location: 12 + type: RW-H + reset_value: UNDEFINED_LEGAL + description: | + Hypervisor guest external interrupt enable bit. When set, allows external interrupts to be delivered + to VS-mode based on the `hgeie` setting. + + VSEIE: + location: 10 + type: RW-H + reset_value: UNDEFINED_LEGAL + description: | + VS-level external interrupt enable bit. When set, allows external interrupts directed to VS-level + to be processed based on the configuration in `hvip` and other platform-specific sources. + + VSTIE: + location: 6 + type: RW-H + reset_value: UNDEFINED_LEGAL + description: | + VS-level timer interrupt enable bit. When set, allows VS-level timer interrupts to be processed + based on the `hvip` configuration and any platform-specific timer interrupts. + + VSSIE: + location: 2 + type: RW-H + reset_value: UNDEFINED_LEGAL + description: | + VS-level software interrupt enable bit. When set, allows software interrupts directed to VS-level + to be processed, based on the configuration in `hvip`. + + LCOFIE: + location: 13 + definedBy: Sscofpmf + long_name: Local Counter Overflow Interrupt Enable + description: | + Enable Local Counter Overflow Interrupts in VS-mode. + type(): | + return HIE_LCOFIE_MUTABLE ? CsrFieldType::RW : CsrFieldType::RO; + reset_value(): | + return HIE_LCOFIE_MUTABLE ? UNDEFINED_LEGAL : 0; diff --git a/arch/csr/H/hip.yaml b/arch/csr/H/hip.yaml new file mode 100644 index 000000000..91b0ded69 --- /dev/null +++ b/arch/csr/H/hip.yaml @@ -0,0 +1,58 @@ +# yaml-language-server: $schema=../../../schemas/csr_schema.json + +$schema: "csr_schema.json#" +kind: csr +name: hip +long_name: Hypervisor Interrupt Pending Register +description: | + The `hip` register is an HSXLEN-bit read/write register that indicates pending interrupts at the hypervisor level. + It contains interrupt-pending bits for both VS-level and hypervisor-specific interrupts. +address: 0x608 +priv_mode: S +definedBy: H +length: SXLEN +fields: + SGEIP: + location: 12 + type: RO + reset_value: 0 + description: | + Pending interrupt bit for supervisor guest external interrupts (SGEI). + This bit is 1 if and only if the logical AND of `hgeip` and `hgeie` is nonzero. + + VSEIP: + location: 10 + type: RO + reset_value: 0 + description: | + Pending interrupt bit for VS-level external interrupts (VSEI). + This bit is the logical OR of `vseip` from `hvip`, the interrupt from `hgeip` selected by `hstatus.VGEIN`, + and any other external interrupt signal directed to VS-level. + + VSTIP: + location: 6 + type: RO-H + reset_value: 0 + description: | + Pending interrupt bit for VS-level timer interrupts (VSTI). + This bit is the logical OR of `vstip` from `hvip` and any other timer interrupt directed to VS-level. + + VSSIP: + location: 2 + alias: hvip.VSSIP + sw_write(csr_value): CSR[hvip].VSSIP = csr_value.VSSIP; + type: RW + reset_value: 0 + description: | + Pending interrupt bit for VS-level software interrupts (VSSI). + This bit is an alias of the `vssip` bit in `hvip`. + + LCOFI: + location: 13 + definedBy: Sscofpmf + long_name: Local Counter Overflow Interrupt + description: Delegate Local Counter Overflow Interrupts to VS-mode. + type(): | + return HIDELEG_LCOFI_MUTABLE ? CsrFieldType::RW : CsrFieldType::RO; + reset_value(): | + return HIDELEG_LCOFI_MUTABLE ? UNDEFINED_LEGAL : 0; diff --git a/arch/csr/H/hvip.yaml b/arch/csr/H/hvip.yaml new file mode 100644 index 000000000..a08b0bffe --- /dev/null +++ b/arch/csr/H/hvip.yaml @@ -0,0 +1,37 @@ +# yaml-language-server: $schema=../../../schemas/csr_schema.json + +$schema: "csr_schema.json#" +kind: csr +name: hvip +long_name: Hypervisor Virtual Interrupt Pending Register +description: | + The `hvip` register is an HSXLEN-bit read/write register that a hypervisor can write to indicate virtual interrupts intended for VS-mode. + It contains interrupt-pending bits for virtual interrupts such as VS-level external interrupts, timer interrupts, and software interrupts. +address: 0x645 +priv_mode: S +definedBy: H +length: SXLEN +fields: + VSEIP: + location: 10 + type: RW + reset_value: 0 + description: | + Pending interrupt bit for VS-level external interrupts. This bit is writable and + is set to 1 to assert a VS-level external interrupt. + + VSTIP: + location: 6 + type: RW + reset_value: 0 + description: | + Pending interrupt bit for VS-level timer interrupts. This bit is writable and + is set to 1 to assert a VS-level timer interrupt. + + VSSIP: + location: 2 + type: RW + reset_value: 0 + description: | + Pending interrupt bit for VS-level software interrupts. This bit is writable and + is set to 1 to assert a VS-level software interrupt. diff --git a/arch/csr/H/vsie.yaml b/arch/csr/H/vsie.yaml new file mode 100644 index 000000000..c2161c087 --- /dev/null +++ b/arch/csr/H/vsie.yaml @@ -0,0 +1,53 @@ +# yaml-language-server: $schema=../../../schemas/csr_schema.json + +$schema: "csr_schema.json#" +kind: csr +name: vsie +address: 0x204 +virtual_address: 0x144 +long_name: Virtual Supervisor Interrupt Enable +description: | + The vsie register is a VSXLEN-bit read/write register that is VS-mode’s version of + supervisor CSR sie. When V=1, vsie substitutes for the usual sie, so instructions that + normally read or modify sie actually access vsie instead. However, interrupts directed to + HS-level continue to be indicated in the HS-level sip register, not in vsip, when V=1. + + When bit 13 of hideleg is zero, vsie.LCOFIE is read-only zero. Else, vsie.LCOFIE is an alias of sie.LCOFIE. + When bit 10 of hideleg is zero, vsie.SEIE is read-only zero. Else, vsie.SEIE is an alias of hie.VSEIE. + When bit 6 of hideleg is zero, vsie.STIE is read-only zero. Else, vsie.STIE is an alias of hie.VSTIE. + When bit 2 of hideleg is zero, vsie.SSIE is read-only zero. Else, vsie.SSIE is an alias of hie.VSSIE. +priv_mode: VS +definedBy: H +length: VSXLEN +fields: + SSIE: + location: 1 + type: RW-H + reset_value: UNDEFINED_LEGAL + alias: hie.VSSIE[0] + description: | + SSIE. Read-only zero when hideleg[2] is 0. Else, alias of hie.VSSIE. + + STIE: + location: 5 + type: RW-H + reset_value: UNDEFINED_LEGAL + alias: hie.VSTIE[0] + description: | + STIE. Read-only zero when hideleg[6] is 0. Else, alias of hie.VSTIE. + + SEIE: + location: 9 + type: RW-H + reset_value: UNDEFINED_LEGAL + alias: hie.VSEIE[0] + description: | + SEIE. Read-only zero when hideleg[10] is 0. Else, alias of hie.VSEIE. + + LCOFIE: + location: 13 + type: RW-H + reset_value: UNDEFINED_LEGAL + alias: sie.LCOFIE[0] + description: | + LCOFIE. Read-only zero when hideleg[13] is 0. Else, alias of sie.LCOFIE. diff --git a/arch/csr/H/vsip.yaml b/arch/csr/H/vsip.yaml new file mode 100644 index 000000000..34f516241 --- /dev/null +++ b/arch/csr/H/vsip.yaml @@ -0,0 +1,64 @@ +# yaml-language-server: $schema=../../../schemas/csr_schema.json + +$schema: "csr_schema.json#" +kind: csr +name: vsip +address: 0x244 +virtual_address: 0x144 +long_name: Virtual Supervisor Interrupt Pending +description: | + The `vsip` register is a VSXLEN-bit read/write register that is VS-mode’s version of the `sip` CSR. + When V=1, instructions that normally access `sip` instead access `vsip`. It holds the pending + interrupt status for supervisor-level traps in a virtualized environment. + + However, interrupts directed to HS-level continue to be indicated in the HS-level `sip` register, + not in `vsip`, when V=1. + + The standard portion (bits 15:0) includes individual interrupt-pending bits. +priv_mode: VS +definedBy: H +length: VSXLEN +fields: + SSIP: + location: 1 + type: RW-H + reset_value: UNDEFINED_LEGAL + alias: hip.VSSIP[0] + description: | + *Supervisor Software Interrupt Pending* + + Indicates a pending software interrupt at the supervisor level. + Read-only zero when `hideleg[2] == 0`, else aliased to `hip.VSSIP[0]`. + + STIP: + location: 5 + type: RW-H + reset_value: UNDEFINED_LEGAL + alias: hip.VSTIP[0] + description: | + *Supervisor Timer Interrupt Pending* + + Indicates a pending timer interrupt at the supervisor level. + Read-only zero when `hideleg[6] == 0`, else aliased to `hip.VSTIP[0]`. + + SEIP: + location: 9 + type: RW-H + reset_value: UNDEFINED_LEGAL + alias: hip.VSEIP[0] + description: | + *Supervisor External Interrupt Pending* + + Indicates a pending external interrupt at the supervisor level. + Read-only zero when `hideleg[10] == 0`, else aliased to `hip.VSEIP[0]`. + + LCOFIP: + location: 13 + type: RW-H + reset_value: UNDEFINED_LEGAL + alias: sip.LCOFIP[0] + description: | + *Local Counter Overflow Interrupt Pending* + + Indicates an overflow of a local counter. + Read-only zero when `hideleg[13] == 0`, else aliased to `sip.LCOFIP[0]`. diff --git a/arch/csr/H/vsscratch.yaml b/arch/csr/H/vsscratch.yaml new file mode 100644 index 000000000..ef81a1ded --- /dev/null +++ b/arch/csr/H/vsscratch.yaml @@ -0,0 +1,17 @@ +# yaml-language-server: $schema=../../../schemas/csr_schema.json + +$schema: "csr_schema.json#" +kind: csr +name: vsscratch +address: 0x240 +virtual_address: 0x140 +long_name: Virtual Supervisor Scratch Register +description: | + The vsscratch register is a VSXLEN-bit read/write register that is VS-mode’s version of + supervisor register sscratch. When V=1, vsscratch substitutes for the usual sscratch, + so instructions that normally read or modify sscratch actually access vsscratch instead. + The contents of vsscratch never directly affect the behavior of the machine. +priv_mode: VS +length: VSXLEN +definedBy: H +fields: {} diff --git a/arch/ext/H.yaml b/arch/ext/H.yaml index a2d409ee3..4fd304fa3 100644 --- a/arch/ext/H.yaml +++ b/arch/ext/H.yaml @@ -660,3 +660,18 @@ params: schema: type: boolean extra_validation: assert STVEC_MODE_DIRECT || STVEC_MODE_VECTORED + + HIDELEG_LCOFI_MUTABLE: + schema: + type: boolean + description: When true, `hideleg`[13] is writable, and Local Counter Overflow Interrupts can be delegated to VS-mode. + + HIE_LCOFIE_MUTABLE: + schema: + type: boolean + description: When true, `hie`[13] is writable and enables Local Counter Overflow Interrupts for VS-mode. + + HIP_LCOFI_MUTABLE: + schema: + type: boolean + description: When true, `hip`[13] is writable, and Local Counter Overflow Interrupts can be delegated to VS-mode.