1 | From: Alexey Baturo <baturo.alexey@gmail.com> | 1 | From: Alexey Baturo <baturo.alexey@gmail.com> |
---|---|---|---|
2 | 2 | ||
3 | Hi, | 3 | Hi, |
4 | 4 | ||
5 | It looks like Pointer Masking spec has reached v1.0 and been frozen, | 5 | Rebased and addressed Daniel's comments about the return type of the helper. |
6 | rebasing on riscv-to-apply.next branch and resubmitting patches. | ||
7 | 6 | ||
7 | Thanks | ||
8 | |||
9 | [v12]: | ||
10 | Rebased and addressed Richard's comments about proper masking virtualized accesses. | ||
11 | |||
12 | Thanks | ||
13 | |||
14 | [v11]: | ||
15 | As suggested on the mailing list by Daniel, I'm resubmitting this series and keeping the original versioning number. | ||
16 | So that makes this one v11 and previous - v10. | ||
17 | Also I applied previously issues reviewed-by tags on some of the patches that were present in v9 series, but only for the code, that didn't change much. | ||
18 | For the others I'd really like to have them reviewed as there were a lot of comments on v9 series. | ||
19 | Also rebased on the current upstream. | ||
20 | |||
21 | Thanks | ||
22 | |||
23 | [v10]: | ||
24 | I've rebased this patch series and addressed Richard's and Daniel's comments. | ||
25 | Thanks | ||
26 | |||
27 | [v0]: | ||
28 | As Pointer Masking is finally ratified, these patches intend to update the existing code to the final version. | ||
29 | These patches have been submitted previously and I tried to address all the suggestions, but I'd suggest to review them from the clean slate and then finally push them to the repo. | ||
8 | Thanks. | 30 | Thanks. |
9 | 31 | ||
10 | [v8]: | 32 | Alexey Baturo (7): |
11 | Rebasing patches on current qemu branch and resubmitting them. | 33 | target/riscv: Remove obsolete pointer masking extension code. |
12 | |||
13 | |||
14 | [v7]: | ||
15 | I'm terribly sorry, but previous rebase went wrong and somehow I missed it. | ||
16 | This time I double-checked rebased version. | ||
17 | This patch series is properly rebased on https://github.com/alistair23/qemu/tree/riscv-to-apply.next | ||
18 | |||
19 | [v6]: | ||
20 | This patch series is rebased on https://github.com/alistair23/qemu/tree/riscv-to-apply.next | ||
21 | |||
22 | [v5]: | ||
23 | This patch series targets Zjpm v0.8 extension. | ||
24 | The spec itself could be found here: https://github.com/riscv/riscv-j-extension/blob/8088461d8d66a7676872b61c908cbeb7cf5c5d1d/zjpm-spec.pdf | ||
25 | This patch series is updated after the suggested comments: | ||
26 | - add "x-" to the extension names to indicate experimental | ||
27 | |||
28 | [v4]: | ||
29 | Patch series updated after the suggested comments: | ||
30 | - removed J-letter extension as it's unused | ||
31 | - renamed and fixed function to detect if address should be sign-extended | ||
32 | - zeroed unused context variables and moved computation logic to another patch | ||
33 | - bumped pointer masking version_id and minimum_version_id by 1 | ||
34 | |||
35 | [v3]: | ||
36 | There patches are updated after Richard's comments: | ||
37 | - moved new tb flags to the end | ||
38 | - used tcg_gen_(s)extract to get the final address | ||
39 | - properly handle CONFIG_USER_ONLY | ||
40 | |||
41 | [v2]: | ||
42 | As per Richard's suggestion I made pmm field part of tb_flags. | ||
43 | It allowed to get rid of global variable to store pmlen. | ||
44 | Also it allowed to simplify all the machinery around it. | ||
45 | |||
46 | [v1]: | ||
47 | It looks like Zjpm v0.8 is almost frozen and we don't expect it change drastically anymore. | ||
48 | Compared to the original implementation with explicit base and mask CSRs, we now only have | ||
49 | several fixed options for number of masked bits which are set using existing CSRs. | ||
50 | The changes have been tested with handwritten assembly tests and LLVM HWASAN | ||
51 | test suite. | ||
52 | |||
53 | Alexey Baturo (6): | ||
54 | target/riscv: Remove obsolete pointer masking extension code. | ||
55 | target/riscv: Add new CSR fields for S{sn,mn,m}pm extensions as part | 34 | target/riscv: Add new CSR fields for S{sn,mn,m}pm extensions as part |
56 | of Zjpm v0.8 | 35 | of Zjpm v1.0 |
57 | target/riscv: Add helper functions to calculate current number of | 36 | target/riscv: Add helper functions to calculate current number of |
58 | masked bits for pointer masking | 37 | masked bits for pointer masking |
59 | target/riscv: Add pointer masking tb flags | 38 | target/riscv: Add pointer masking tb flags |
60 | target/riscv: Update address modify functions to take into account | 39 | target/riscv: Update address modify functions to take into account |
61 | pointer masking | 40 | pointer masking |
41 | target/riscv: Apply pointer masking for virtualized memory accesses | ||
62 | target/riscv: Enable updates for pointer masking variables and thus | 42 | target/riscv: Enable updates for pointer masking variables and thus |
63 | enable pointer masking extension | 43 | enable pointer masking extension |
64 | 44 | ||
65 | target/riscv/cpu.c | 21 +-- | 45 | target/riscv/cpu.c | 19 +- |
66 | target/riscv/cpu.h | 46 +++-- | 46 | target/riscv/cpu.h | 50 ++--- |
67 | target/riscv/cpu_bits.h | 90 +--------- | 47 | target/riscv/cpu_bits.h | 91 +-------- |
68 | target/riscv/cpu_cfg.h | 3 + | 48 | target/riscv/cpu_cfg.h | 3 + |
69 | target/riscv/cpu_helper.c | 97 +++++----- | 49 | target/riscv/cpu_helper.c | 122 ++++++++---- |
70 | target/riscv/csr.c | 337 ++--------------------------------- | 50 | target/riscv/csr.c | 357 +++-------------------------------- |
71 | target/riscv/machine.c | 20 +-- | 51 | target/riscv/internals.h | 44 +++++ |
72 | target/riscv/pmp.c | 13 +- | 52 | target/riscv/machine.c | 17 +- |
73 | target/riscv/pmp.h | 11 +- | 53 | target/riscv/op_helper.c | 16 +- |
54 | target/riscv/pmp.c | 14 +- | ||
55 | target/riscv/pmp.h | 1 + | ||
74 | target/riscv/tcg/tcg-cpu.c | 5 +- | 56 | target/riscv/tcg/tcg-cpu.c | 5 +- |
75 | target/riscv/translate.c | 46 ++--- | 57 | target/riscv/translate.c | 47 ++--- |
76 | target/riscv/vector_helper.c | 15 +- | 58 | target/riscv/vector_helper.c | 5 - |
77 | 12 files changed, 158 insertions(+), 546 deletions(-) | 59 | 14 files changed, 241 insertions(+), 550 deletions(-) |
78 | 60 | ||
79 | -- | 61 | -- |
80 | 2.34.1 | 62 | 2.39.5 | diff view generated by jsdifflib |
1 | From: Alexey Baturo <baturo.alexey@gmail.com> | 1 | From: Alexey Baturo <baturo.alexey@gmail.com> |
---|---|---|---|
2 | 2 | ||
3 | Zjpm v0.8 is almost frozen and it's much simplier compared to the existing one: | 3 | Zjpm extension is finally ratified. And it's much simplier compared to the experimental one. |
4 | The newer version doesn't allow to specify custom mask or base for masking. | 4 | The newer version doesn't allow to specify custom mask or base for pointer masking. |
5 | Instead it allows only certain options for masking top bits. | 5 | Instead it allows only certain options for masking top bits. |
6 | 6 | ||
7 | Signed-off-by: Alexey Baturo <baturo.alexey@gmail.com> | 7 | Signed-off-by: Alexey Baturo <baturo.alexey@gmail.com> |
8 | 8 | ||
9 | Acked-by: Alistair Francis <alistair.francis@wdc.com> | 9 | Acked-by: Alistair Francis <alistair.francis@wdc.com> |
10 | --- | 10 | --- |
11 | target/riscv/cpu.c | 13 +- | 11 | target/riscv/cpu.c | 13 +- |
12 | target/riscv/cpu.h | 30 +--- | 12 | target/riscv/cpu.h | 33 +--- |
13 | target/riscv/cpu_bits.h | 87 ---------- | 13 | target/riscv/cpu_bits.h | 87 ---------- |
14 | target/riscv/cpu_helper.c | 52 ------ | 14 | target/riscv/cpu_helper.c | 52 ------ |
15 | target/riscv/csr.c | 326 ----------------------------------- | 15 | target/riscv/csr.c | 326 ----------------------------------- |
16 | target/riscv/machine.c | 14 +- | 16 | target/riscv/machine.c | 17 +- |
17 | target/riscv/tcg/tcg-cpu.c | 5 +- | 17 | target/riscv/tcg/tcg-cpu.c | 5 +- |
18 | target/riscv/translate.c | 27 +-- | 18 | target/riscv/translate.c | 28 +-- |
19 | target/riscv/vector_helper.c | 2 +- | 19 | target/riscv/vector_helper.c | 2 +- |
20 | 9 files changed, 13 insertions(+), 543 deletions(-) | 20 | 9 files changed, 19 insertions(+), 544 deletions(-) |
21 | 21 | ||
22 | diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c | 22 | diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c |
23 | index XXXXXXX..XXXXXXX 100644 | 23 | index XXXXXXX..XXXXXXX 100644 |
24 | --- a/target/riscv/cpu.c | 24 | --- a/target/riscv/cpu.c |
25 | +++ b/target/riscv/cpu.c | 25 | +++ b/target/riscv/cpu.c |
... | ... | ||
54 | - env->mmte |= (EXT_STATUS_INITIAL | MMTE_M_PM_CURRENT); | 54 | - env->mmte |= (EXT_STATUS_INITIAL | MMTE_M_PM_CURRENT); |
55 | 55 | ||
56 | /* | 56 | /* |
57 | * Bits 10, 6, 2 and 12 of mideleg are read only 1 when the Hypervisor | 57 | * Bits 10, 6, 2 and 12 of mideleg are read only 1 when the Hypervisor |
58 | @@ -XXX,XX +XXX,XX @@ static void riscv_cpu_reset_hold(Object *obj, ResetType type) | 58 | @@ -XXX,XX +XXX,XX @@ static void riscv_cpu_reset_hold(Object *obj, ResetType type) |
59 | pmp_unlock_entries(env); | 59 | env->ssp = 0; |
60 | #endif | 60 | |
61 | env->xl = riscv_cpu_mxl(env); | 61 | env->xl = riscv_cpu_mxl(env); |
62 | - riscv_cpu_update_mask(env); | 62 | - riscv_cpu_update_mask(env); |
63 | cs->exception_index = RISCV_EXCP_NONE; | 63 | cs->exception_index = RISCV_EXCP_NONE; |
64 | env->load_res = -1; | 64 | env->load_res = -1; |
65 | set_default_nan_mode(1, &env->fp_status); | 65 | set_default_nan_mode(1, &env->fp_status); |
... | ... | ||
68 | MISA_EXT_INFO(RVU, "u", "User-level instructions"), | 68 | MISA_EXT_INFO(RVU, "u", "User-level instructions"), |
69 | MISA_EXT_INFO(RVH, "h", "Hypervisor"), | 69 | MISA_EXT_INFO(RVH, "h", "Hypervisor"), |
70 | - MISA_EXT_INFO(RVJ, "x-j", "Dynamic translated languages"), | 70 | - MISA_EXT_INFO(RVJ, "x-j", "Dynamic translated languages"), |
71 | MISA_EXT_INFO(RVV, "v", "Vector operations"), | 71 | MISA_EXT_INFO(RVV, "v", "Vector operations"), |
72 | MISA_EXT_INFO(RVG, "g", "General purpose (IMAFD_Zicsr_Zifencei)"), | 72 | MISA_EXT_INFO(RVG, "g", "General purpose (IMAFD_Zicsr_Zifencei)"), |
73 | MISA_EXT_INFO(RVB, "x-b", "Bit manipulation (Zba_Zbb_Zbs)") | 73 | MISA_EXT_INFO(RVB, "b", "Bit manipulation (Zba_Zbb_Zbs)") |
74 | diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h | 74 | diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h |
75 | index XXXXXXX..XXXXXXX 100644 | 75 | index XXXXXXX..XXXXXXX 100644 |
76 | --- a/target/riscv/cpu.h | 76 | --- a/target/riscv/cpu.h |
77 | +++ b/target/riscv/cpu.h | 77 | +++ b/target/riscv/cpu.h |
78 | @@ -XXX,XX +XXX,XX @@ typedef struct CPUArchState CPURISCVState; | 78 | @@ -XXX,XX +XXX,XX @@ typedef struct CPUArchState CPURISCVState; |
... | ... | ||
96 | - target_ulong spmmask; | 96 | - target_ulong spmmask; |
97 | - target_ulong spmbase; | 97 | - target_ulong spmbase; |
98 | - target_ulong upmmask; | 98 | - target_ulong upmmask; |
99 | - target_ulong upmbase; | 99 | - target_ulong upmbase; |
100 | - | 100 | - |
101 | /* CSRs for execution environment configuration */ | ||
102 | uint64_t menvcfg; | ||
103 | uint64_t mstateen[SMSTATEEN_MAX_COUNT]; | 101 | uint64_t mstateen[SMSTATEEN_MAX_COUNT]; |
104 | @@ -XXX,XX +XXX,XX @@ struct CPUArchState { | 102 | uint64_t hstateen[SMSTATEEN_MAX_COUNT]; |
105 | target_ulong senvcfg; | 103 | uint64_t sstateen[SMSTATEEN_MAX_COUNT]; |
106 | uint64_t henvcfg; | 104 | uint64_t henvcfg; |
107 | #endif | 105 | #endif |
108 | - target_ulong cur_pmmask; | 106 | - target_ulong cur_pmmask; |
109 | - target_ulong cur_pmbase; | 107 | - target_ulong cur_pmbase; |
110 | - | 108 | |
111 | /* Fields from here on are preserved across CPU reset. */ | 109 | /* Fields from here on are preserved across CPU reset. */ |
112 | QEMUTimer *stimer; /* Internal timer for S-mode interrupt */ | 110 | QEMUTimer *stimer; /* Internal timer for S-mode interrupt */ |
113 | QEMUTimer *vstimer; /* Internal timer for VS-mode interrupt */ | 111 | @@ -XXX,XX +XXX,XX @@ FIELD(TB_FLAGS, XL, 16, 2) |
114 | @@ -XXX,XX +XXX,XX @@ FIELD(TB_FLAGS, VSTART_EQ_ZERO, 15, 1) | ||
115 | /* The combination of MXL/SXL/UXL that applies to the current cpu mode. */ | ||
116 | FIELD(TB_FLAGS, XL, 16, 2) | ||
117 | /* If PointerMasking should be applied */ | 112 | /* If PointerMasking should be applied */ |
118 | -FIELD(TB_FLAGS, PM_MASK_ENABLED, 18, 1) | 113 | FIELD(TB_FLAGS, PM_MASK_ENABLED, 18, 1) |
119 | -FIELD(TB_FLAGS, PM_BASE_ENABLED, 19, 1) | 114 | FIELD(TB_FLAGS, PM_BASE_ENABLED, 19, 1) |
120 | -FIELD(TB_FLAGS, VTA, 20, 1) | 115 | -FIELD(TB_FLAGS, VTA, 20, 1) |
121 | -FIELD(TB_FLAGS, VMA, 21, 1) | 116 | -FIELD(TB_FLAGS, VMA, 21, 1) |
122 | +FIELD(TB_FLAGS, VTA, 18, 1) | 117 | +FIELD(TB_FLAGS, VTA, 18, 1) |
123 | +FIELD(TB_FLAGS, VMA, 19, 1) | 118 | +FIELD(TB_FLAGS, VMA, 19, 1) |
124 | /* Native debug itrigger */ | 119 | /* Native debug itrigger */ |
... | ... | ||
129 | -FIELD(TB_FLAGS, PRIV, 24, 2) | 124 | -FIELD(TB_FLAGS, PRIV, 24, 2) |
130 | -FIELD(TB_FLAGS, AXL, 26, 2) | 125 | -FIELD(TB_FLAGS, AXL, 26, 2) |
131 | +FIELD(TB_FLAGS, VIRT_ENABLED, 21, 1) | 126 | +FIELD(TB_FLAGS, VIRT_ENABLED, 21, 1) |
132 | +FIELD(TB_FLAGS, PRIV, 22, 2) | 127 | +FIELD(TB_FLAGS, PRIV, 22, 2) |
133 | +FIELD(TB_FLAGS, AXL, 24, 2) | 128 | +FIELD(TB_FLAGS, AXL, 24, 2) |
129 | /* zicfilp needs a TB flag to track indirect branches */ | ||
130 | -FIELD(TB_FLAGS, FCFI_ENABLED, 28, 1) | ||
131 | -FIELD(TB_FLAGS, FCFI_LP_EXPECTED, 29, 1) | ||
132 | +FIELD(TB_FLAGS, FCFI_ENABLED, 26, 1) | ||
133 | +FIELD(TB_FLAGS, FCFI_LP_EXPECTED, 27, 1) | ||
134 | /* zicfiss needs a TB flag so that correct TB is located based on tb flags */ | ||
135 | -FIELD(TB_FLAGS, BCFI_ENABLED, 30, 1) | ||
136 | +FIELD(TB_FLAGS, BCFI_ENABLED, 28, 1) | ||
134 | 137 | ||
135 | #ifdef TARGET_RISCV32 | 138 | #ifdef TARGET_RISCV32 |
136 | #define riscv_cpu_mxl(env) ((void)(env), MXL_RV32) | 139 | #define riscv_cpu_mxl(env) ((void)(env), MXL_RV32) |
137 | @@ -XXX,XX +XXX,XX @@ static inline uint32_t vext_get_vlmax(uint32_t vlenb, uint32_t vsew, | 140 | @@ -XXX,XX +XXX,XX @@ static inline uint32_t vext_get_vlmax(uint32_t vlenb, uint32_t vsew, |
138 | void cpu_get_tb_cpu_state(CPURISCVState *env, vaddr *pc, | 141 | void cpu_get_tb_cpu_state(CPURISCVState *env, vaddr *pc, |
... | ... | ||
193 | -#define PM_CURRENT 0x00000002ULL | 196 | -#define PM_CURRENT 0x00000002ULL |
194 | -#define PM_INSN 0x00000004ULL | 197 | -#define PM_INSN 0x00000004ULL |
195 | - | 198 | - |
196 | /* Execution environment configuration bits */ | 199 | /* Execution environment configuration bits */ |
197 | #define MENVCFG_FIOM BIT(0) | 200 | #define MENVCFG_FIOM BIT(0) |
198 | #define MENVCFG_CBIE (3UL << 4) | 201 | #define MENVCFG_LPE BIT(2) /* zicfilp */ |
199 | @@ -XXX,XX +XXX,XX @@ typedef enum RISCVException { | 202 | @@ -XXX,XX +XXX,XX @@ typedef enum RISCVException { |
200 | #define HENVCFGH_PBMTE MENVCFGH_PBMTE | 203 | #define HENVCFGH_PBMTE MENVCFGH_PBMTE |
201 | #define HENVCFGH_STCE MENVCFGH_STCE | 204 | #define HENVCFGH_STCE MENVCFGH_STCE |
202 | 205 | ||
203 | -/* Offsets for every pair of control bits per each priv level */ | 206 | -/* Offsets for every pair of control bits per each priv level */ |
... | ... | ||
318 | -} | 321 | -} |
319 | - | 322 | - |
320 | #ifndef CONFIG_USER_ONLY | 323 | #ifndef CONFIG_USER_ONLY |
321 | 324 | ||
322 | /* | 325 | /* |
323 | @@ -XXX,XX +XXX,XX @@ void riscv_cpu_set_mode(CPURISCVState *env, target_ulong newpriv) | 326 | @@ -XXX,XX +XXX,XX @@ void riscv_cpu_set_mode(CPURISCVState *env, target_ulong newpriv, bool virt_en) |
324 | /* tlb_flush is unnecessary as mode is contained in mmu_idx */ | 327 | /* tlb_flush is unnecessary as mode is contained in mmu_idx */ |
325 | env->priv = newpriv; | 328 | env->priv = newpriv; |
326 | env->xl = cpu_recompute_xl(env); | 329 | env->xl = cpu_recompute_xl(env); |
327 | - riscv_cpu_update_mask(env); | 330 | - riscv_cpu_update_mask(env); |
328 | 331 | ||
... | ... | ||
700 | - return riscv_has_ext(env, RVJ); | 703 | - return riscv_has_ext(env, RVJ); |
701 | + return false; | 704 | + return false; |
702 | } | 705 | } |
703 | 706 | ||
704 | static const VMStateDescription vmstate_pointermasking = { | 707 | static const VMStateDescription vmstate_pointermasking = { |
705 | @@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_pointermasking = { | 708 | .name = "cpu/pointer_masking", |
706 | .minimum_version_id = 1, | 709 | - .version_id = 1, |
710 | - .minimum_version_id = 1, | ||
711 | + .version_id = 2, | ||
712 | + .minimum_version_id = 2, | ||
707 | .needed = pointermasking_needed, | 713 | .needed = pointermasking_needed, |
708 | .fields = (const VMStateField[]) { | 714 | .fields = (const VMStateField[]) { |
709 | - VMSTATE_UINTTL(env.mmte, RISCVCPU), | 715 | - VMSTATE_UINTTL(env.mmte, RISCVCPU), |
710 | - VMSTATE_UINTTL(env.mpmmask, RISCVCPU), | 716 | - VMSTATE_UINTTL(env.mpmmask, RISCVCPU), |
711 | - VMSTATE_UINTTL(env.mpmbase, RISCVCPU), | 717 | - VMSTATE_UINTTL(env.mpmbase, RISCVCPU), |
712 | - VMSTATE_UINTTL(env.spmmask, RISCVCPU), | 718 | - VMSTATE_UINTTL(env.spmmask, RISCVCPU), |
713 | - VMSTATE_UINTTL(env.spmbase, RISCVCPU), | 719 | - VMSTATE_UINTTL(env.spmbase, RISCVCPU), |
714 | - VMSTATE_UINTTL(env.upmmask, RISCVCPU), | 720 | - VMSTATE_UINTTL(env.upmmask, RISCVCPU), |
715 | - VMSTATE_UINTTL(env.upmbase, RISCVCPU), | 721 | - VMSTATE_UINTTL(env.upmbase, RISCVCPU), |
716 | - | 722 | |
717 | VMSTATE_END_OF_LIST() | 723 | VMSTATE_END_OF_LIST() |
718 | } | 724 | } |
719 | }; | ||
720 | @@ -XXX,XX +XXX,XX @@ static int riscv_cpu_post_load(void *opaque, int version_id) | 725 | @@ -XXX,XX +XXX,XX @@ static int riscv_cpu_post_load(void *opaque, int version_id) |
721 | CPURISCVState *env = &cpu->env; | 726 | CPURISCVState *env = &cpu->env; |
722 | 727 | ||
723 | env->xl = cpu_recompute_xl(env); | 728 | env->xl = cpu_recompute_xl(env); |
724 | - riscv_cpu_update_mask(env); | 729 | - riscv_cpu_update_mask(env); |
... | ... | ||
740 | @@ -XXX,XX +XXX,XX @@ static void riscv_init_max_cpu_extensions(Object *obj) | 745 | @@ -XXX,XX +XXX,XX @@ static void riscv_init_max_cpu_extensions(Object *obj) |
741 | CPURISCVState *env = &cpu->env; | 746 | CPURISCVState *env = &cpu->env; |
742 | const RISCVCPUMultiExtConfig *prop; | 747 | const RISCVCPUMultiExtConfig *prop; |
743 | 748 | ||
744 | - /* Enable RVG, RVJ and RVV that are disabled by default */ | 749 | - /* Enable RVG, RVJ and RVV that are disabled by default */ |
745 | - riscv_cpu_set_misa_ext(env, env->misa_ext | RVG | RVJ | RVV); | 750 | - riscv_cpu_set_misa_ext(env, env->misa_ext | RVB | RVG | RVJ | RVV); |
746 | + /* Enable RVG and RVV that are disabled by default */ | 751 | + /* Enable RVG and RVV that are disabled by default */ |
747 | + riscv_cpu_set_misa_ext(env, env->misa_ext | RVG | RVV); | 752 | + riscv_cpu_set_misa_ext(env, env->misa_ext | RVB | RVG | RVV); |
748 | 753 | ||
749 | for (prop = riscv_cpu_extensions; prop && prop->name; prop++) { | 754 | for (prop = riscv_cpu_extensions; prop && prop->name; prop++) { |
750 | isa_ext_update_enabled(cpu, prop->offset, true); | 755 | isa_ext_update_enabled(cpu, prop->offset, true); |
751 | diff --git a/target/riscv/translate.c b/target/riscv/translate.c | 756 | diff --git a/target/riscv/translate.c b/target/riscv/translate.c |
752 | index XXXXXXX..XXXXXXX 100644 | 757 | index XXXXXXX..XXXXXXX 100644 |
... | ... | ||
799 | tcg_gen_ext32u_tl(addr, addr); | 804 | tcg_gen_ext32u_tl(addr, addr); |
800 | } | 805 | } |
801 | - if (ctx->pm_base_enabled) { | 806 | - if (ctx->pm_base_enabled) { |
802 | - tcg_gen_or_tl(addr, addr, pm_base); | 807 | - tcg_gen_or_tl(addr, addr, pm_base); |
803 | - } | 808 | - } |
809 | + | ||
804 | return addr; | 810 | return addr; |
805 | } | 811 | } |
806 | 812 | ||
807 | @@ -XXX,XX +XXX,XX @@ static void riscv_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cs) | 813 | @@ -XXX,XX +XXX,XX @@ static void riscv_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cs) |
808 | ctx->xl = FIELD_EX32(tb_flags, TB_FLAGS, XL); | 814 | ctx->xl = FIELD_EX32(tb_flags, TB_FLAGS, XL); |
809 | ctx->address_xl = FIELD_EX32(tb_flags, TB_FLAGS, AXL); | 815 | ctx->address_xl = FIELD_EX32(tb_flags, TB_FLAGS, AXL); |
810 | ctx->cs = cs; | 816 | ctx->cs = cs; |
811 | - ctx->pm_mask_enabled = FIELD_EX32(tb_flags, TB_FLAGS, PM_MASK_ENABLED); | 817 | - ctx->pm_mask_enabled = FIELD_EX32(tb_flags, TB_FLAGS, PM_MASK_ENABLED); |
812 | - ctx->pm_base_enabled = FIELD_EX32(tb_flags, TB_FLAGS, PM_BASE_ENABLED); | 818 | - ctx->pm_base_enabled = FIELD_EX32(tb_flags, TB_FLAGS, PM_BASE_ENABLED); |
813 | ctx->ztso = cpu->cfg.ext_ztso; | 819 | ctx->ztso = cpu->cfg.ext_ztso; |
814 | ctx->itrigger = FIELD_EX32(tb_flags, TB_FLAGS, ITRIGGER); | 820 | ctx->itrigger = FIELD_EX32(tb_flags, TB_FLAGS, ITRIGGER); |
815 | ctx->zero = tcg_constant_tl(0); | 821 | ctx->bcfi_enabled = FIELD_EX32(tb_flags, TB_FLAGS, BCFI_ENABLED); |
816 | @@ -XXX,XX +XXX,XX @@ void riscv_translate_init(void) | 822 | @@ -XXX,XX +XXX,XX @@ void riscv_translate_init(void) |
817 | "load_res"); | 823 | "load_res"); |
818 | load_val = tcg_global_mem_new(tcg_env, offsetof(CPURISCVState, load_val), | 824 | load_val = tcg_global_mem_new(tcg_env, offsetof(CPURISCVState, load_val), |
819 | "load_val"); | 825 | "load_val"); |
820 | - /* Assign PM CSRs to tcg globals */ | 826 | - /* Assign PM CSRs to tcg globals */ |
... | ... | ||
835 | + return addr; | 841 | + return addr; |
836 | } | 842 | } |
837 | 843 | ||
838 | /* | 844 | /* |
839 | -- | 845 | -- |
840 | 2.34.1 | 846 | 2.39.5 | diff view generated by jsdifflib |
1 | From: Alexey Baturo <baturo.alexey@gmail.com> | 1 | From: Alexey Baturo <baturo.alexey@gmail.com> |
---|---|---|---|
2 | 2 | ||
3 | Signed-off-by: Alexey Baturo <baturo.alexey@gmail.com> | 3 | Signed-off-by: Alexey Baturo <baturo.alexey@gmail.com> |
4 | 4 | ||
5 | Reviewed-by: Alistair Francis <alistair.francis@wdc.com> | 5 | Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com> |
6 | --- | 6 | --- |
7 | target/riscv/cpu.h | 8 ++++++++ | 7 | target/riscv/cpu.h | 8 ++++++++ |
8 | target/riscv/cpu_bits.h | 3 +++ | 8 | target/riscv/cpu_bits.h | 4 ++++ |
9 | target/riscv/cpu_cfg.h | 3 +++ | 9 | target/riscv/cpu_cfg.h | 3 +++ |
10 | target/riscv/csr.c | 11 +++++++++++ | 10 | target/riscv/csr.c | 31 ++++++++++++++++++++++++++++++- |
11 | target/riscv/machine.c | 10 +++++++--- | 11 | target/riscv/pmp.c | 14 +++++++++++--- |
12 | target/riscv/pmp.c | 13 ++++++++++--- | 12 | target/riscv/pmp.h | 1 + |
13 | target/riscv/pmp.h | 11 ++++++----- | 13 | 6 files changed, 57 insertions(+), 4 deletions(-) |
14 | 7 files changed, 48 insertions(+), 11 deletions(-) | ||
15 | 14 | ||
16 | diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h | 15 | diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h |
17 | index XXXXXXX..XXXXXXX 100644 | 16 | index XXXXXXX..XXXXXXX 100644 |
18 | --- a/target/riscv/cpu.h | 17 | --- a/target/riscv/cpu.h |
19 | +++ b/target/riscv/cpu.h | 18 | +++ b/target/riscv/cpu.h |
20 | @@ -XXX,XX +XXX,XX @@ typedef enum { | 19 | @@ -XXX,XX +XXX,XX @@ typedef enum { |
21 | EXT_STATUS_DIRTY, | 20 | EXT_STATUS_DIRTY, |
22 | } RISCVExtStatus; | 21 | } RISCVExtStatus; |
23 | 22 | ||
24 | +/* Enum holds PMM field values for Zjpm v0.8 extension */ | 23 | +/* Enum holds PMM field values for Zjpm v1.0 extension */ |
25 | +typedef enum { | 24 | +typedef enum { |
26 | + PMM_FIELD_DISABLED = 0, | 25 | + PMM_FIELD_DISABLED = 0, |
27 | + PMM_FIELD_RESERVED = 1, | 26 | + PMM_FIELD_RESERVED = 1, |
28 | + PMM_FIELD_PMLEN7 = 2, | 27 | + PMM_FIELD_PMLEN7 = 2, |
29 | + PMM_FIELD_PMLEN16 = 3, | 28 | + PMM_FIELD_PMLEN16 = 3, |
30 | +} RISCVPmPmm; | 29 | +} RISCVPmPmm; |
31 | + | 30 | + |
32 | #define MMU_USER_IDX 3 | 31 | typedef struct riscv_cpu_implied_exts_rule { |
33 | 32 | #ifndef CONFIG_USER_ONLY | |
34 | #define MAX_RISCV_PMPS (16) | 33 | /* |
35 | diff --git a/target/riscv/cpu_bits.h b/target/riscv/cpu_bits.h | 34 | diff --git a/target/riscv/cpu_bits.h b/target/riscv/cpu_bits.h |
36 | index XXXXXXX..XXXXXXX 100644 | 35 | index XXXXXXX..XXXXXXX 100644 |
37 | --- a/target/riscv/cpu_bits.h | 36 | --- a/target/riscv/cpu_bits.h |
38 | +++ b/target/riscv/cpu_bits.h | 37 | +++ b/target/riscv/cpu_bits.h |
38 | @@ -XXX,XX +XXX,XX @@ typedef enum { | ||
39 | #define HSTATUS_VTW 0x00200000 | ||
40 | #define HSTATUS_VTSR 0x00400000 | ||
41 | #define HSTATUS_VSXL 0x300000000 | ||
42 | +#define HSTATUS_HUPMM 0x3000000000000 | ||
43 | |||
44 | #define HSTATUS32_WPRI 0xFF8FF87E | ||
45 | #define HSTATUS64_WPRI 0xFFFFFFFFFF8FF87EULL | ||
39 | @@ -XXX,XX +XXX,XX @@ typedef enum RISCVException { | 46 | @@ -XXX,XX +XXX,XX @@ typedef enum RISCVException { |
40 | #define MENVCFG_CBIE (3UL << 4) | 47 | #define MENVCFG_CBIE (3UL << 4) |
41 | #define MENVCFG_CBCFE BIT(6) | 48 | #define MENVCFG_CBCFE BIT(6) |
42 | #define MENVCFG_CBZE BIT(7) | 49 | #define MENVCFG_CBZE BIT(7) |
43 | +#define MENVCFG_PMM (3ULL << 32) | 50 | +#define MENVCFG_PMM (3ULL << 32) |
... | ... | ||
49 | #define SENVCFG_CBCFE MENVCFG_CBCFE | 56 | #define SENVCFG_CBCFE MENVCFG_CBCFE |
50 | #define SENVCFG_CBZE MENVCFG_CBZE | 57 | #define SENVCFG_CBZE MENVCFG_CBZE |
51 | +#define SENVCFG_PMM MENVCFG_PMM | 58 | +#define SENVCFG_PMM MENVCFG_PMM |
52 | 59 | ||
53 | #define HENVCFG_FIOM MENVCFG_FIOM | 60 | #define HENVCFG_FIOM MENVCFG_FIOM |
61 | #define HENVCFG_LPE MENVCFG_LPE | ||
62 | @@ -XXX,XX +XXX,XX @@ typedef enum RISCVException { | ||
54 | #define HENVCFG_CBIE MENVCFG_CBIE | 63 | #define HENVCFG_CBIE MENVCFG_CBIE |
55 | #define HENVCFG_CBCFE MENVCFG_CBCFE | 64 | #define HENVCFG_CBCFE MENVCFG_CBCFE |
56 | #define HENVCFG_CBZE MENVCFG_CBZE | 65 | #define HENVCFG_CBZE MENVCFG_CBZE |
57 | +#define HENVCFG_PMM MENVCFG_PMM | 66 | +#define HENVCFG_PMM MENVCFG_PMM |
58 | #define HENVCFG_ADUE MENVCFG_ADUE | 67 | #define HENVCFG_ADUE MENVCFG_ADUE |
... | ... | ||
69 | + bool ext_ssnpm; | 78 | + bool ext_ssnpm; |
70 | + bool ext_smnpm; | 79 | + bool ext_smnpm; |
71 | + bool ext_smmpm; | 80 | + bool ext_smmpm; |
72 | bool rvv_ta_all_1s; | 81 | bool rvv_ta_all_1s; |
73 | bool rvv_ma_all_1s; | 82 | bool rvv_ma_all_1s; |
74 | 83 | bool rvv_vl_half_avl; | |
75 | diff --git a/target/riscv/csr.c b/target/riscv/csr.c | 84 | diff --git a/target/riscv/csr.c b/target/riscv/csr.c |
76 | index XXXXXXX..XXXXXXX 100644 | 85 | index XXXXXXX..XXXXXXX 100644 |
77 | --- a/target/riscv/csr.c | 86 | --- a/target/riscv/csr.c |
78 | +++ b/target/riscv/csr.c | 87 | +++ b/target/riscv/csr.c |
79 | @@ -XXX,XX +XXX,XX @@ static RISCVException have_mseccfg(CPURISCVState *env, int csrno) | 88 | @@ -XXX,XX +XXX,XX @@ static RISCVException have_mseccfg(CPURISCVState *env, int csrno) |
... | ... | ||
85 | + } | 94 | + } |
86 | 95 | ||
87 | return RISCV_EXCP_ILLEGAL_INST; | 96 | return RISCV_EXCP_ILLEGAL_INST; |
88 | } | 97 | } |
89 | @@ -XXX,XX +XXX,XX @@ static RISCVException write_menvcfg(CPURISCVState *env, int csrno, | 98 | @@ -XXX,XX +XXX,XX @@ static RISCVException write_menvcfg(CPURISCVState *env, int csrno, |
90 | (cfg->ext_sstc ? MENVCFG_STCE : 0) | | 99 | if (env_archcpu(env)->cfg.ext_zicfiss) { |
91 | (cfg->ext_svadu ? MENVCFG_ADUE : 0); | 100 | mask |= MENVCFG_SSE; |
92 | } | 101 | } |
93 | + /* Update PMM field only if the value is valid according to Zjpm v0.8 */ | 102 | + |
94 | + if (((val & MENVCFG_PMM) >> 32) != PMM_FIELD_RESERVED) { | 103 | + /* Update PMM field only if the value is valid according to Zjpm v1.0 */ |
95 | + mask |= MENVCFG_PMM; | 104 | + if (env_archcpu(env)->cfg.ext_smnpm && |
96 | + } | 105 | + get_field(val, MENVCFG_PMM) != PMM_FIELD_RESERVED) { |
106 | + mask |= MENVCFG_PMM; | ||
107 | + } | ||
108 | } | ||
97 | env->menvcfg = (env->menvcfg & ~mask) | (val & mask); | 109 | env->menvcfg = (env->menvcfg & ~mask) | (val & mask); |
98 | 110 | ||
99 | return RISCV_EXCP_NONE; | ||
100 | @@ -XXX,XX +XXX,XX @@ static RISCVException write_senvcfg(CPURISCVState *env, int csrno, | 111 | @@ -XXX,XX +XXX,XX @@ static RISCVException write_senvcfg(CPURISCVState *env, int csrno, |
112 | { | ||
113 | uint64_t mask = SENVCFG_FIOM | SENVCFG_CBIE | SENVCFG_CBCFE | SENVCFG_CBZE; | ||
114 | RISCVException ret; | ||
115 | + /* Update PMM field only if the value is valid according to Zjpm v1.0 */ | ||
116 | + if (env_archcpu(env)->cfg.ext_ssnpm && | ||
117 | + riscv_cpu_mxl(env) == MXL_RV64 && | ||
118 | + get_field(val, SENVCFG_PMM) != PMM_FIELD_RESERVED) { | ||
119 | + mask |= SENVCFG_PMM; | ||
120 | + } | ||
121 | |||
122 | ret = smstateen_acc_ok(env, 0, SMSTATEEN0_HSENVCFG); | ||
123 | if (ret != RISCV_EXCP_NONE) { | ||
124 | @@ -XXX,XX +XXX,XX @@ static RISCVException write_henvcfg(CPURISCVState *env, int csrno, | ||
125 | get_field(env->menvcfg, MENVCFG_SSE)) { | ||
126 | mask |= HENVCFG_SSE; | ||
127 | } | ||
128 | + | ||
129 | + /* Update PMM field only if the value is valid according to Zjpm v1.0 */ | ||
130 | + if (env_archcpu(env)->cfg.ext_ssnpm && | ||
131 | + get_field(val, HENVCFG_PMM) != PMM_FIELD_RESERVED) { | ||
132 | + mask |= HENVCFG_PMM; | ||
133 | + } | ||
134 | } | ||
135 | |||
136 | env->henvcfg = (env->henvcfg & ~mask) | (val & mask); | ||
137 | @@ -XXX,XX +XXX,XX @@ static RISCVException read_hstatus(CPURISCVState *env, int csrno, | ||
138 | static RISCVException write_hstatus(CPURISCVState *env, int csrno, | ||
101 | target_ulong val) | 139 | target_ulong val) |
102 | { | 140 | { |
103 | uint64_t mask = SENVCFG_FIOM | SENVCFG_CBIE | SENVCFG_CBCFE | SENVCFG_CBZE; | 141 | - env->hstatus = val; |
104 | + /* Update PMM field only if the value is valid according to Zjpm v0.8 */ | 142 | + uint64_t mask = (target_ulong)-1; |
105 | + if (((val & SENVCFG_PMM) >> 32) != PMM_FIELD_RESERVED) { | 143 | + /* Update PMM field only if the value is valid according to Zjpm v1.0 */ |
106 | + mask |= SENVCFG_PMM; | 144 | + if (!env_archcpu(env)->cfg.ext_ssnpm || |
107 | + } | 145 | + riscv_cpu_mxl(env) != MXL_RV64 || |
108 | RISCVException ret; | 146 | + get_field(val, HSTATUS_HUPMM) == PMM_FIELD_RESERVED) { |
109 | 147 | + mask &= ~HSTATUS_HUPMM; | |
110 | ret = smstateen_acc_ok(env, 0, SMSTATEEN0_HSENVCFG); | 148 | + } |
111 | diff --git a/target/riscv/machine.c b/target/riscv/machine.c | 149 | + env->hstatus = (env->hstatus & ~mask) | (val & mask); |
112 | index XXXXXXX..XXXXXXX 100644 | 150 | + |
113 | --- a/target/riscv/machine.c | 151 | if (riscv_cpu_mxl(env) != MXL_RV32 && get_field(val, HSTATUS_VSXL) != 2) { |
114 | +++ b/target/riscv/machine.c | 152 | qemu_log_mask(LOG_UNIMP, |
115 | @@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_vector = { | 153 | "QEMU does not support mixed HSXLEN options."); |
116 | |||
117 | static bool pointermasking_needed(void *opaque) | ||
118 | { | ||
119 | - return false; | ||
120 | + RISCVCPU *cpu = opaque; | ||
121 | + return cpu->cfg.ext_ssnpm || cpu->cfg.ext_smnpm || cpu->cfg.ext_smmpm; | ||
122 | } | ||
123 | |||
124 | static const VMStateDescription vmstate_pointermasking = { | ||
125 | .name = "cpu/pointer_masking", | ||
126 | - .version_id = 1, | ||
127 | - .minimum_version_id = 1, | ||
128 | + .version_id = 2, | ||
129 | + .minimum_version_id = 2, | ||
130 | .needed = pointermasking_needed, | ||
131 | .fields = (const VMStateField[]) { | ||
132 | + VMSTATE_UINTTL(env.mseccfg, RISCVCPU), | ||
133 | + VMSTATE_UINTTL(env.senvcfg, RISCVCPU), | ||
134 | + VMSTATE_UINTTL(env.menvcfg, RISCVCPU), | ||
135 | VMSTATE_END_OF_LIST() | ||
136 | } | ||
137 | }; | ||
138 | diff --git a/target/riscv/pmp.c b/target/riscv/pmp.c | 154 | diff --git a/target/riscv/pmp.c b/target/riscv/pmp.c |
139 | index XXXXXXX..XXXXXXX 100644 | 155 | index XXXXXXX..XXXXXXX 100644 |
140 | --- a/target/riscv/pmp.c | 156 | --- a/target/riscv/pmp.c |
141 | +++ b/target/riscv/pmp.c | 157 | +++ b/target/riscv/pmp.c |
142 | @@ -XXX,XX +XXX,XX @@ target_ulong pmpaddr_csr_read(CPURISCVState *env, uint32_t addr_index) | 158 | @@ -XXX,XX +XXX,XX @@ target_ulong pmpaddr_csr_read(CPURISCVState *env, uint32_t addr_index) |
143 | void mseccfg_csr_write(CPURISCVState *env, target_ulong val) | 159 | void mseccfg_csr_write(CPURISCVState *env, target_ulong val) |
144 | { | 160 | { |
145 | int i; | 161 | int i; |
146 | + uint64_t mask = MSECCFG_MMWP | MSECCFG_MML; | 162 | + uint64_t mask = MSECCFG_MMWP | MSECCFG_MML; |
147 | + | 163 | + /* Update PMM field only if the value is valid according to Zjpm v1.0 */ |
148 | + /* Update PMM field only if the value is valid according to Zjpm v0.8 */ | 164 | + if (riscv_cpu_cfg(env)->ext_smmpm && |
149 | + if (((val & MSECCFG_PMM) >> 32) != PMM_FIELD_RESERVED) { | 165 | + riscv_cpu_mxl(env) == MXL_RV64 && |
166 | + get_field(val, MSECCFG_PMM) != PMM_FIELD_RESERVED) { | ||
150 | + mask |= MSECCFG_PMM; | 167 | + mask |= MSECCFG_PMM; |
151 | + } | 168 | + } |
152 | 169 | ||
153 | trace_mseccfg_csr_write(env->mhartid, val); | 170 | trace_mseccfg_csr_write(env->mhartid, val); |
154 | 171 | ||
... | ... | ||
166 | - val &= ~(MSECCFG_MMWP | MSECCFG_MML | MSECCFG_RLB); | 183 | - val &= ~(MSECCFG_MMWP | MSECCFG_MML | MSECCFG_RLB); |
167 | + mask |= MSECCFG_RLB; | 184 | + mask |= MSECCFG_RLB; |
168 | + val &= ~(mask); | 185 | + val &= ~(mask); |
169 | } | 186 | } |
170 | 187 | ||
171 | env->mseccfg = val; | 188 | /* M-mode forward cfi to be enabled if cfi extension is implemented */ |
172 | diff --git a/target/riscv/pmp.h b/target/riscv/pmp.h | 189 | diff --git a/target/riscv/pmp.h b/target/riscv/pmp.h |
173 | index XXXXXXX..XXXXXXX 100644 | 190 | index XXXXXXX..XXXXXXX 100644 |
174 | --- a/target/riscv/pmp.h | 191 | --- a/target/riscv/pmp.h |
175 | +++ b/target/riscv/pmp.h | 192 | +++ b/target/riscv/pmp.h |
176 | @@ -XXX,XX +XXX,XX @@ typedef enum { | 193 | @@ -XXX,XX +XXX,XX @@ typedef enum { |
177 | } pmp_am_t; | 194 | MSECCFG_USEED = 1 << 8, |
178 | 195 | MSECCFG_SSEED = 1 << 9, | |
179 | typedef enum { | 196 | MSECCFG_MLPE = 1 << 10, |
180 | - MSECCFG_MML = 1 << 0, | 197 | + MSECCFG_PMM = 3ULL << 32, |
181 | - MSECCFG_MMWP = 1 << 1, | ||
182 | - MSECCFG_RLB = 1 << 2, | ||
183 | - MSECCFG_USEED = 1 << 8, | ||
184 | - MSECCFG_SSEED = 1 << 9 | ||
185 | + MSECCFG_MML = 1 << 0, | ||
186 | + MSECCFG_MMWP = 1 << 1, | ||
187 | + MSECCFG_RLB = 1 << 2, | ||
188 | + MSECCFG_USEED = 1 << 8, | ||
189 | + MSECCFG_SSEED = 1 << 9, | ||
190 | + MSECCFG_PMM = 3UL << 32, | ||
191 | } mseccfg_field_t; | 198 | } mseccfg_field_t; |
192 | 199 | ||
193 | typedef struct { | 200 | typedef struct { |
194 | -- | 201 | -- |
195 | 2.34.1 | 202 | 2.39.5 | diff view generated by jsdifflib |
1 | From: Alexey Baturo <baturo.alexey@gmail.com> | 1 | From: Alexey Baturo <baturo.alexey@gmail.com> |
---|---|---|---|
2 | 2 | ||
3 | Signed-off-by: Alexey Baturo <baturo.alexey@gmail.com> | 3 | Signed-off-by: Alexey Baturo <baturo.alexey@gmail.com> |
4 | |||
5 | Reviewed-by: Alistair Francis <alistair.francis@wdc.com> | ||
6 | --- | 4 | --- |
7 | target/riscv/cpu.h | 5 ++++ | 5 | target/riscv/cpu.h | 5 +++ |
8 | target/riscv/cpu_helper.c | 58 +++++++++++++++++++++++++++++++++++++++ | 6 | target/riscv/cpu_helper.c | 73 +++++++++++++++++++++++++++++++++++++++ |
9 | 2 files changed, 63 insertions(+) | 7 | 2 files changed, 78 insertions(+) |
10 | 8 | ||
11 | diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h | 9 | diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h |
12 | index XXXXXXX..XXXXXXX 100644 | 10 | index XXXXXXX..XXXXXXX 100644 |
13 | --- a/target/riscv/cpu.h | 11 | --- a/target/riscv/cpu.h |
14 | +++ b/target/riscv/cpu.h | 12 | +++ b/target/riscv/cpu.h |
15 | @@ -XXX,XX +XXX,XX @@ void cpu_get_tb_cpu_state(CPURISCVState *env, vaddr *pc, | 13 | @@ -XXX,XX +XXX,XX @@ void cpu_get_tb_cpu_state(CPURISCVState *env, vaddr *pc, |
16 | 14 | ||
17 | bool riscv_cpu_is_32bit(RISCVCPU *cpu); | 15 | bool riscv_cpu_is_32bit(RISCVCPU *cpu); |
18 | 16 | ||
19 | +bool riscv_cpu_virt_mem_enabled(CPURISCVState *env); | 17 | +bool riscv_cpu_virt_mem_enabled(CPURISCVState *env); |
20 | +RISCVPmPmm riscv_pm_get_pmm(CPURISCVState *env); | 18 | +RISCVPmPmm riscv_pm_get_pmm(CPURISCVState *env); |
21 | +int riscv_pm_get_pmlen(RISCVPmPmm pmm); | 19 | +uint32_t riscv_pm_get_pmlen(RISCVPmPmm pmm); |
22 | + | 20 | + |
23 | RISCVException riscv_csrr(CPURISCVState *env, int csrno, | 21 | RISCVException riscv_csrr(CPURISCVState *env, int csrno, |
24 | target_ulong *ret_value); | 22 | target_ulong *ret_value); |
25 | + | 23 | + |
26 | RISCVException riscv_csrrw(CPURISCVState *env, int csrno, | 24 | RISCVException riscv_csrrw(CPURISCVState *env, int csrno, |
... | ... | ||
34 | *pflags = flags; | 32 | *pflags = flags; |
35 | } | 33 | } |
36 | 34 | ||
37 | +RISCVPmPmm riscv_pm_get_pmm(CPURISCVState *env) | 35 | +RISCVPmPmm riscv_pm_get_pmm(CPURISCVState *env) |
38 | +{ | 36 | +{ |
39 | + int pmm = 0; | 37 | + RISCVPmPmm pmm = PMM_FIELD_DISABLED; |
40 | +#ifndef CONFIG_USER_ONLY | 38 | +#ifndef CONFIG_USER_ONLY |
39 | + if (get_field(env->mstatus, MSTATUS_MPRV) && | ||
40 | + get_field(env->mstatus, MSTATUS_MXR)) { | ||
41 | + return pmm; | ||
42 | + } | ||
41 | + int priv_mode = cpu_address_mode(env); | 43 | + int priv_mode = cpu_address_mode(env); |
42 | + /* Get current PMM field */ | 44 | + /* Get current PMM field */ |
43 | + switch (priv_mode) { | 45 | + switch (priv_mode) { |
44 | + case PRV_M: | 46 | + case PRV_M: |
45 | + pmm = riscv_cpu_cfg(env)->ext_smmpm ? | 47 | + if (riscv_cpu_cfg(env)->ext_smmpm) { |
46 | + get_field(env->mseccfg, MSECCFG_PMM) : PMM_FIELD_DISABLED; | 48 | + pmm = get_field(env->mseccfg, MSECCFG_PMM); |
49 | + } | ||
47 | + break; | 50 | + break; |
48 | + case PRV_S: | 51 | + case PRV_S: |
49 | + pmm = riscv_cpu_cfg(env)->ext_smnpm ? | 52 | + if (riscv_cpu_cfg(env)->ext_smnpm) { |
50 | + get_field(env->menvcfg, MENVCFG_PMM) : PMM_FIELD_DISABLED; | 53 | + if (get_field(env->mstatus, MSTATUS_MPV)) { |
54 | + pmm = get_field(env->henvcfg, HENVCFG_PMM); | ||
55 | + } else { | ||
56 | + pmm = get_field(env->menvcfg, MENVCFG_PMM); | ||
57 | + } | ||
58 | + } | ||
51 | + break; | 59 | + break; |
52 | + case PRV_U: | 60 | + case PRV_U: |
53 | + pmm = riscv_cpu_cfg(env)->ext_ssnpm ? | 61 | + if (riscv_has_ext(env, RVS)) { |
54 | + get_field(env->senvcfg, SENVCFG_PMM) : PMM_FIELD_DISABLED; | 62 | + if (riscv_cpu_cfg(env)->ext_ssnpm) { |
63 | + pmm = get_field(env->senvcfg, SENVCFG_PMM); | ||
64 | + } | ||
65 | + } else { | ||
66 | + if (riscv_cpu_cfg(env)->ext_smnpm) { | ||
67 | + pmm = get_field(env->menvcfg, MENVCFG_PMM); | ||
68 | + } | ||
69 | + } | ||
55 | + break; | 70 | + break; |
56 | + default: | 71 | + default: |
57 | + g_assert_not_reached(); | 72 | + g_assert_not_reached(); |
58 | + } | 73 | + } |
59 | +#endif | 74 | +#endif |
... | ... | ||
64 | +{ | 79 | +{ |
65 | + bool virt_mem_en = false; | 80 | + bool virt_mem_en = false; |
66 | +#ifndef CONFIG_USER_ONLY | 81 | +#ifndef CONFIG_USER_ONLY |
67 | + int satp_mode = 0; | 82 | + int satp_mode = 0; |
68 | + int priv_mode = cpu_address_mode(env); | 83 | + int priv_mode = cpu_address_mode(env); |
69 | + /* Get current PMM field */ | ||
70 | + if (riscv_cpu_mxl(env) == MXL_RV32) { | 84 | + if (riscv_cpu_mxl(env) == MXL_RV32) { |
71 | + satp_mode = get_field(env->satp, SATP32_MODE); | 85 | + satp_mode = get_field(env->satp, SATP32_MODE); |
72 | + } else { | 86 | + } else { |
73 | + satp_mode = get_field(env->satp, SATP64_MODE); | 87 | + satp_mode = get_field(env->satp, SATP64_MODE); |
74 | + } | 88 | + } |
75 | + virt_mem_en = ((satp_mode != VM_1_10_MBARE) && (priv_mode != PRV_M)); | 89 | + virt_mem_en = ((satp_mode != VM_1_10_MBARE) && (priv_mode != PRV_M)); |
76 | +#endif | 90 | +#endif |
77 | + return virt_mem_en; | 91 | + return virt_mem_en; |
78 | +} | 92 | +} |
79 | + | 93 | + |
80 | +int riscv_pm_get_pmlen(RISCVPmPmm pmm) | 94 | +uint32_t riscv_pm_get_pmlen(RISCVPmPmm pmm) |
81 | +{ | 95 | +{ |
82 | + switch (pmm) { | 96 | + switch (pmm) { |
83 | + case PMM_FIELD_DISABLED: | 97 | + case PMM_FIELD_DISABLED: |
84 | + return 0; | 98 | + return 0; |
85 | + case PMM_FIELD_PMLEN7: | 99 | + case PMM_FIELD_PMLEN7: |
86 | + return 7; | 100 | + return 7; |
87 | + case PMM_FIELD_PMLEN16: | 101 | + case PMM_FIELD_PMLEN16: |
88 | + return 16; | 102 | + return 16; |
89 | + default: | 103 | + default: |
90 | + g_assert_not_reached(); | 104 | + g_assert_not_reached(); |
91 | + } | 105 | + } |
92 | + return -1; | ||
93 | +} | 106 | +} |
94 | + | 107 | + |
95 | #ifndef CONFIG_USER_ONLY | 108 | #ifndef CONFIG_USER_ONLY |
96 | 109 | ||
97 | /* | 110 | /* |
98 | -- | 111 | -- |
99 | 2.34.1 | 112 | 2.39.5 | diff view generated by jsdifflib |
1 | From: Alexey Baturo <baturo.alexey@gmail.com> | 1 | From: Alexey Baturo <baturo.alexey@gmail.com> |
---|---|---|---|
2 | 2 | ||
3 | Signed-off-by: Alexey Baturo <baturo.alexey@gmail.com> | 3 | Signed-off-by: Alexey Baturo <baturo.alexey@gmail.com> |
4 | 4 | ||
5 | Reviewed-by: Richard Henderson <richard.henderson@linaro.org> | 5 | Reviewed-by: Richard Henderson <richard.henderson@linaro.org> |
6 | Reviewed-by: Alistair Francis <alistair.francis@wdc.com> | 6 | Reviewed-by: Alistair Francis <alistair.francis@wdc.com> |
7 | Reviewed-by: LIU Zhiwei <zhiwei_liu@linux.alibaba.com> | ||
7 | --- | 8 | --- |
8 | target/riscv/cpu.h | 3 +++ | 9 | target/riscv/cpu.h | 3 +++ |
9 | target/riscv/cpu_helper.c | 3 +++ | 10 | target/riscv/cpu_helper.c | 3 +++ |
10 | target/riscv/translate.c | 5 +++++ | 11 | target/riscv/translate.c | 5 +++++ |
11 | 3 files changed, 11 insertions(+) | 12 | 3 files changed, 11 insertions(+) |
12 | 13 | ||
13 | diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h | 14 | diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h |
14 | index XXXXXXX..XXXXXXX 100644 | 15 | index XXXXXXX..XXXXXXX 100644 |
15 | --- a/target/riscv/cpu.h | 16 | --- a/target/riscv/cpu.h |
16 | +++ b/target/riscv/cpu.h | 17 | +++ b/target/riscv/cpu.h |
17 | @@ -XXX,XX +XXX,XX @@ FIELD(TB_FLAGS, ITRIGGER, 20, 1) | 18 | @@ -XXX,XX +XXX,XX @@ FIELD(TB_FLAGS, FCFI_ENABLED, 26, 1) |
18 | FIELD(TB_FLAGS, VIRT_ENABLED, 21, 1) | 19 | FIELD(TB_FLAGS, FCFI_LP_EXPECTED, 27, 1) |
19 | FIELD(TB_FLAGS, PRIV, 22, 2) | 20 | /* zicfiss needs a TB flag so that correct TB is located based on tb flags */ |
20 | FIELD(TB_FLAGS, AXL, 24, 2) | 21 | FIELD(TB_FLAGS, BCFI_ENABLED, 28, 1) |
21 | +/* If pointer masking should be applied and address sign extended */ | 22 | +/* If pointer masking should be applied and address sign extended */ |
22 | +FIELD(TB_FLAGS, PM_PMM, 26, 2) | 23 | +FIELD(TB_FLAGS, PM_PMM, 29, 2) |
23 | +FIELD(TB_FLAGS, PM_SIGNEXTEND, 28, 1) | 24 | +FIELD(TB_FLAGS, PM_SIGNEXTEND, 31, 1) |
24 | 25 | ||
25 | #ifdef TARGET_RISCV32 | 26 | #ifdef TARGET_RISCV32 |
26 | #define riscv_cpu_mxl(env) ((void)(env), MXL_RV32) | 27 | #define riscv_cpu_mxl(env) ((void)(env), MXL_RV32) |
27 | diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c | 28 | diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c |
28 | index XXXXXXX..XXXXXXX 100644 | 29 | index XXXXXXX..XXXXXXX 100644 |
... | ... | ||
52 | @@ -XXX,XX +XXX,XX @@ typedef struct DisasContext { | 53 | @@ -XXX,XX +XXX,XX @@ typedef struct DisasContext { |
53 | bool vl_eq_vlmax; | 54 | bool vl_eq_vlmax; |
54 | CPUState *cs; | 55 | CPUState *cs; |
55 | TCGv zero; | 56 | TCGv zero; |
56 | + /* actual address width */ | 57 | + /* actual address width */ |
57 | + uint8_t addr_width; | 58 | + uint8_t addr_xl; |
58 | + bool addr_signed; | 59 | + bool addr_signed; |
59 | /* Ztso */ | 60 | /* Ztso */ |
60 | bool ztso; | 61 | bool ztso; |
61 | /* Use icount trigger for native debug */ | 62 | /* Use icount trigger for native debug */ |
62 | @@ -XXX,XX +XXX,XX @@ static void riscv_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cs) | 63 | @@ -XXX,XX +XXX,XX @@ static void riscv_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cs) |
63 | ctx->xl = FIELD_EX32(tb_flags, TB_FLAGS, XL); | 64 | ctx->xl = FIELD_EX32(tb_flags, TB_FLAGS, XL); |
64 | ctx->address_xl = FIELD_EX32(tb_flags, TB_FLAGS, AXL); | 65 | ctx->address_xl = FIELD_EX32(tb_flags, TB_FLAGS, AXL); |
65 | ctx->cs = cs; | 66 | ctx->cs = cs; |
66 | + ctx->addr_width = 0; | 67 | + ctx->addr_xl = 0; |
67 | + ctx->addr_signed = false; | 68 | + ctx->addr_signed = false; |
68 | ctx->ztso = cpu->cfg.ext_ztso; | 69 | ctx->ztso = cpu->cfg.ext_ztso; |
69 | ctx->itrigger = FIELD_EX32(tb_flags, TB_FLAGS, ITRIGGER); | 70 | ctx->itrigger = FIELD_EX32(tb_flags, TB_FLAGS, ITRIGGER); |
70 | ctx->zero = tcg_constant_tl(0); | 71 | ctx->bcfi_enabled = FIELD_EX32(tb_flags, TB_FLAGS, BCFI_ENABLED); |
71 | -- | 72 | -- |
72 | 2.34.1 | 73 | 2.39.5 | diff view generated by jsdifflib |
... | ... | ||
---|---|---|---|
4 | 4 | ||
5 | Reviewed-by: Richard Henderson <richard.henderson@linaro.org> | 5 | Reviewed-by: Richard Henderson <richard.henderson@linaro.org> |
6 | Reviewed-by: Alistair Francis <alistair.francis@wdc.com> | 6 | Reviewed-by: Alistair Francis <alistair.francis@wdc.com> |
7 | --- | 7 | --- |
8 | target/riscv/translate.c | 22 ++++++++++++++++------ | 8 | target/riscv/translate.c | 22 ++++++++++++++++------ |
9 | target/riscv/vector_helper.c | 13 +++++++++++++ | 9 | target/riscv/vector_helper.c | 16 ++++++++++++++++ |
10 | 2 files changed, 29 insertions(+), 6 deletions(-) | 10 | 2 files changed, 32 insertions(+), 6 deletions(-) |
11 | 11 | ||
12 | diff --git a/target/riscv/translate.c b/target/riscv/translate.c | 12 | diff --git a/target/riscv/translate.c b/target/riscv/translate.c |
13 | index XXXXXXX..XXXXXXX 100644 | 13 | index XXXXXXX..XXXXXXX 100644 |
14 | --- a/target/riscv/translate.c | 14 | --- a/target/riscv/translate.c |
15 | +++ b/target/riscv/translate.c | 15 | +++ b/target/riscv/translate.c |
... | ... | ||
18 | 18 | ||
19 | tcg_gen_addi_tl(addr, src1, imm); | 19 | tcg_gen_addi_tl(addr, src1, imm); |
20 | - if (get_address_xl(ctx) == MXL_RV32) { | 20 | - if (get_address_xl(ctx) == MXL_RV32) { |
21 | - tcg_gen_ext32u_tl(addr, addr); | 21 | - tcg_gen_ext32u_tl(addr, addr); |
22 | + if (ctx->addr_signed) { | 22 | + if (ctx->addr_signed) { |
23 | + tcg_gen_sextract_tl(addr, addr, 0, ctx->addr_width); | 23 | + tcg_gen_sextract_tl(addr, addr, 0, ctx->addr_xl); |
24 | + } else { | 24 | + } else { |
25 | + tcg_gen_extract_tl(addr, addr, 0, ctx->addr_width); | 25 | + tcg_gen_extract_tl(addr, addr, 0, ctx->addr_xl); |
26 | } | 26 | } |
27 | 27 | ||
28 | return addr; | 28 | return addr; |
29 | @@ -XXX,XX +XXX,XX @@ static TCGv get_address_indexed(DisasContext *ctx, int rs1, TCGv offs) | 29 | @@ -XXX,XX +XXX,XX @@ static TCGv get_address_indexed(DisasContext *ctx, int rs1, TCGv offs) |
30 | TCGv src1 = get_gpr(ctx, rs1, EXT_NONE); | 30 | TCGv src1 = get_gpr(ctx, rs1, EXT_NONE); |
31 | 31 | ||
32 | tcg_gen_add_tl(addr, src1, offs); | 32 | tcg_gen_add_tl(addr, src1, offs); |
33 | - if (get_xl(ctx) == MXL_RV32) { | 33 | - if (get_xl(ctx) == MXL_RV32) { |
34 | - tcg_gen_ext32u_tl(addr, addr); | 34 | - tcg_gen_ext32u_tl(addr, addr); |
35 | + if (ctx->addr_signed) { | 35 | + if (ctx->addr_signed) { |
36 | + tcg_gen_sextract_tl(addr, addr, 0, ctx->addr_width); | 36 | + tcg_gen_sextract_tl(addr, addr, 0, ctx->addr_xl); |
37 | + } else { | 37 | + } else { |
38 | + tcg_gen_extract_tl(addr, addr, 0, ctx->addr_width); | 38 | + tcg_gen_extract_tl(addr, addr, 0, ctx->addr_xl); |
39 | } | 39 | } |
40 | |||
40 | return addr; | 41 | return addr; |
41 | } | ||
42 | @@ -XXX,XX +XXX,XX @@ static void riscv_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cs) | 42 | @@ -XXX,XX +XXX,XX @@ static void riscv_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cs) |
43 | ctx->xl = FIELD_EX32(tb_flags, TB_FLAGS, XL); | 43 | ctx->xl = FIELD_EX32(tb_flags, TB_FLAGS, XL); |
44 | ctx->address_xl = FIELD_EX32(tb_flags, TB_FLAGS, AXL); | 44 | ctx->address_xl = FIELD_EX32(tb_flags, TB_FLAGS, AXL); |
45 | ctx->cs = cs; | 45 | ctx->cs = cs; |
46 | - ctx->addr_width = 0; | 46 | - ctx->addr_xl = 0; |
47 | - ctx->addr_signed = false; | 47 | - ctx->addr_signed = false; |
48 | + if (get_xl(ctx) == MXL_RV32) { | 48 | + if (get_xl(ctx) == MXL_RV32) { |
49 | + ctx->addr_width = 32; | 49 | + ctx->addr_xl = 32; |
50 | + ctx->addr_signed = false; | 50 | + ctx->addr_signed = false; |
51 | + } else { | 51 | + } else { |
52 | + int pm_pmm = FIELD_EX32(tb_flags, TB_FLAGS, PM_PMM); | 52 | + int pm_pmm = FIELD_EX32(tb_flags, TB_FLAGS, PM_PMM); |
53 | + ctx->addr_width = 64 - riscv_pm_get_pmlen(pm_pmm); | 53 | + ctx->addr_xl = 64 - riscv_pm_get_pmlen(pm_pmm); |
54 | + ctx->addr_signed = FIELD_EX32(tb_flags, TB_FLAGS, PM_SIGNEXTEND); | 54 | + ctx->addr_signed = FIELD_EX32(tb_flags, TB_FLAGS, PM_SIGNEXTEND); |
55 | + } | 55 | + } |
56 | ctx->ztso = cpu->cfg.ext_ztso; | 56 | ctx->ztso = cpu->cfg.ext_ztso; |
57 | ctx->itrigger = FIELD_EX32(tb_flags, TB_FLAGS, ITRIGGER); | 57 | ctx->itrigger = FIELD_EX32(tb_flags, TB_FLAGS, ITRIGGER); |
58 | ctx->zero = tcg_constant_tl(0); | 58 | ctx->bcfi_enabled = FIELD_EX32(tb_flags, TB_FLAGS, BCFI_ENABLED); |
59 | diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c | 59 | diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c |
60 | index XXXXXXX..XXXXXXX 100644 | 60 | index XXXXXXX..XXXXXXX 100644 |
61 | --- a/target/riscv/vector_helper.c | 61 | --- a/target/riscv/vector_helper.c |
62 | +++ b/target/riscv/vector_helper.c | 62 | +++ b/target/riscv/vector_helper.c |
63 | @@ -XXX,XX +XXX,XX @@ static inline uint32_t vext_max_elems(uint32_t desc, uint32_t log2_esz) | 63 | @@ -XXX,XX +XXX,XX @@ static inline uint32_t vext_max_elems(uint32_t desc, uint32_t log2_esz) |
64 | 64 | ||
65 | static inline target_ulong adjust_addr(CPURISCVState *env, target_ulong addr) | 65 | static inline target_ulong adjust_addr(CPURISCVState *env, target_ulong addr) |
66 | { | 66 | { |
67 | + if (riscv_cpu_mxl(env) == MXL_RV32) { | ||
68 | + return addr; | ||
69 | + } | ||
67 | + RISCVPmPmm pmm = riscv_pm_get_pmm(env); | 70 | + RISCVPmPmm pmm = riscv_pm_get_pmm(env); |
68 | + if (pmm == PMM_FIELD_DISABLED) { | 71 | + if (pmm == PMM_FIELD_DISABLED) { |
69 | + return addr; | 72 | + return addr; |
70 | + } | 73 | + } |
71 | + int pmlen = riscv_pm_get_pmlen(pmm); | 74 | + int pmlen = riscv_pm_get_pmlen(pmm); |
... | ... | ||
79 | + } | 82 | + } |
80 | return addr; | 83 | return addr; |
81 | } | 84 | } |
82 | 85 | ||
83 | -- | 86 | -- |
84 | 2.34.1 | 87 | 2.39.5 | diff view generated by jsdifflib |
New patch | |||
---|---|---|---|
1 | From: Alexey Baturo <baturo.alexey@gmail.com> | ||
1 | 2 | ||
3 | Signed-off-by: Alexey Baturo <baturo.alexey@gmail.com> | ||
4 | --- | ||
5 | target/riscv/cpu.h | 1 + | ||
6 | target/riscv/cpu_helper.c | 18 +++++++++++++++ | ||
7 | target/riscv/internals.h | 44 ++++++++++++++++++++++++++++++++++++ | ||
8 | target/riscv/op_helper.c | 16 ++++++------- | ||
9 | target/riscv/vector_helper.c | 21 ----------------- | ||
10 | 5 files changed, 71 insertions(+), 29 deletions(-) | ||
11 | |||
12 | diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h | ||
13 | index XXXXXXX..XXXXXXX 100644 | ||
14 | --- a/target/riscv/cpu.h | ||
15 | +++ b/target/riscv/cpu.h | ||
16 | @@ -XXX,XX +XXX,XX @@ bool riscv_cpu_is_32bit(RISCVCPU *cpu); | ||
17 | |||
18 | bool riscv_cpu_virt_mem_enabled(CPURISCVState *env); | ||
19 | RISCVPmPmm riscv_pm_get_pmm(CPURISCVState *env); | ||
20 | +RISCVPmPmm riscv_pm_get_virt_pmm(CPURISCVState *env); | ||
21 | uint32_t riscv_pm_get_pmlen(RISCVPmPmm pmm); | ||
22 | |||
23 | RISCVException riscv_csrr(CPURISCVState *env, int csrno, | ||
24 | diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c | ||
25 | index XXXXXXX..XXXXXXX 100644 | ||
26 | --- a/target/riscv/cpu_helper.c | ||
27 | +++ b/target/riscv/cpu_helper.c | ||
28 | @@ -XXX,XX +XXX,XX @@ RISCVPmPmm riscv_pm_get_pmm(CPURISCVState *env) | ||
29 | return pmm; | ||
30 | } | ||
31 | |||
32 | +RISCVPmPmm riscv_pm_get_virt_pmm(CPURISCVState *env) | ||
33 | +{ | ||
34 | + RISCVPmPmm pmm = PMM_FIELD_DISABLED; | ||
35 | +#ifndef CONFIG_USER_ONLY | ||
36 | + int priv_mode = cpu_address_mode(env); | ||
37 | + if (priv_mode == PRV_U) { | ||
38 | + pmm = get_field(env->hstatus, HSTATUS_HUPMM); | ||
39 | + } else { | ||
40 | + if (get_field(env->hstatus, HSTATUS_SPVP)) { | ||
41 | + pmm = get_field(env->henvcfg, HENVCFG_PMM); | ||
42 | + } else { | ||
43 | + pmm = get_field(env->senvcfg, SENVCFG_PMM); | ||
44 | + } | ||
45 | + } | ||
46 | +#endif | ||
47 | + return pmm; | ||
48 | +} | ||
49 | + | ||
50 | bool riscv_cpu_virt_mem_enabled(CPURISCVState *env) | ||
51 | { | ||
52 | bool virt_mem_en = false; | ||
53 | diff --git a/target/riscv/internals.h b/target/riscv/internals.h | ||
54 | index XXXXXXX..XXXXXXX 100644 | ||
55 | --- a/target/riscv/internals.h | ||
56 | +++ b/target/riscv/internals.h | ||
57 | @@ -XXX,XX +XXX,XX @@ static inline float16 check_nanbox_h(CPURISCVState *env, uint64_t f) | ||
58 | /* Our implementation of CPUClass::has_work */ | ||
59 | bool riscv_cpu_has_work(CPUState *cs); | ||
60 | |||
61 | +/* Zjpm addr masking routine */ | ||
62 | +static inline target_ulong adjust_addr_body(CPURISCVState *env, | ||
63 | + target_ulong addr, | ||
64 | + bool is_virt) | ||
65 | +{ | ||
66 | + if (riscv_cpu_mxl(env) == MXL_RV32) { | ||
67 | + return addr; | ||
68 | + } | ||
69 | + RISCVPmPmm pmm = PMM_FIELD_DISABLED; | ||
70 | + if (is_virt) { | ||
71 | + pmm = riscv_pm_get_virt_pmm(env); | ||
72 | + } else { | ||
73 | + pmm = riscv_pm_get_pmm(env); | ||
74 | + } | ||
75 | + if (pmm == PMM_FIELD_DISABLED) { | ||
76 | + return addr; | ||
77 | + } | ||
78 | + uint32_t pmlen = riscv_pm_get_pmlen(pmm); | ||
79 | + bool signext = false; | ||
80 | + if (!is_virt) { | ||
81 | + signext = riscv_cpu_virt_mem_enabled(env); | ||
82 | + } | ||
83 | + addr = addr << pmlen; | ||
84 | + /* sign/zero extend masked address by N-1 bit */ | ||
85 | + if (signext) { | ||
86 | + addr = (target_long)addr >> pmlen; | ||
87 | + } else { | ||
88 | + addr = addr >> pmlen; | ||
89 | + } | ||
90 | + return addr; | ||
91 | +} | ||
92 | + | ||
93 | +static inline target_ulong adjust_addr(CPURISCVState *env, | ||
94 | + target_ulong addr) | ||
95 | +{ | ||
96 | + return adjust_addr_body(env, addr, false); | ||
97 | +} | ||
98 | + | ||
99 | +static inline target_ulong adjust_addr_virt(CPURISCVState *env, | ||
100 | + target_ulong addr) | ||
101 | +{ | ||
102 | + return adjust_addr_body(env, addr, true); | ||
103 | +} | ||
104 | + | ||
105 | #endif | ||
106 | diff --git a/target/riscv/op_helper.c b/target/riscv/op_helper.c | ||
107 | index XXXXXXX..XXXXXXX 100644 | ||
108 | --- a/target/riscv/op_helper.c | ||
109 | +++ b/target/riscv/op_helper.c | ||
110 | @@ -XXX,XX +XXX,XX @@ target_ulong helper_hyp_hlv_bu(CPURISCVState *env, target_ulong addr) | ||
111 | int mmu_idx = check_access_hlsv(env, false, ra); | ||
112 | MemOpIdx oi = make_memop_idx(MO_UB, mmu_idx); | ||
113 | |||
114 | - return cpu_ldb_mmu(env, addr, oi, ra); | ||
115 | + return cpu_ldb_mmu(env, adjust_addr_virt(env, addr), oi, ra); | ||
116 | } | ||
117 | |||
118 | target_ulong helper_hyp_hlv_hu(CPURISCVState *env, target_ulong addr) | ||
119 | @@ -XXX,XX +XXX,XX @@ target_ulong helper_hyp_hlv_hu(CPURISCVState *env, target_ulong addr) | ||
120 | int mmu_idx = check_access_hlsv(env, false, ra); | ||
121 | MemOpIdx oi = make_memop_idx(MO_TEUW, mmu_idx); | ||
122 | |||
123 | - return cpu_ldw_mmu(env, addr, oi, ra); | ||
124 | + return cpu_ldw_mmu(env, adjust_addr_virt(env, addr), oi, ra); | ||
125 | } | ||
126 | |||
127 | target_ulong helper_hyp_hlv_wu(CPURISCVState *env, target_ulong addr) | ||
128 | @@ -XXX,XX +XXX,XX @@ target_ulong helper_hyp_hlv_wu(CPURISCVState *env, target_ulong addr) | ||
129 | int mmu_idx = check_access_hlsv(env, false, ra); | ||
130 | MemOpIdx oi = make_memop_idx(MO_TEUL, mmu_idx); | ||
131 | |||
132 | - return cpu_ldl_mmu(env, addr, oi, ra); | ||
133 | + return cpu_ldl_mmu(env, adjust_addr_virt(env, addr), oi, ra); | ||
134 | } | ||
135 | |||
136 | target_ulong helper_hyp_hlv_d(CPURISCVState *env, target_ulong addr) | ||
137 | @@ -XXX,XX +XXX,XX @@ target_ulong helper_hyp_hlv_d(CPURISCVState *env, target_ulong addr) | ||
138 | int mmu_idx = check_access_hlsv(env, false, ra); | ||
139 | MemOpIdx oi = make_memop_idx(MO_TEUQ, mmu_idx); | ||
140 | |||
141 | - return cpu_ldq_mmu(env, addr, oi, ra); | ||
142 | + return cpu_ldq_mmu(env, adjust_addr_virt(env, addr), oi, ra); | ||
143 | } | ||
144 | |||
145 | void helper_hyp_hsv_b(CPURISCVState *env, target_ulong addr, target_ulong val) | ||
146 | @@ -XXX,XX +XXX,XX @@ void helper_hyp_hsv_b(CPURISCVState *env, target_ulong addr, target_ulong val) | ||
147 | int mmu_idx = check_access_hlsv(env, false, ra); | ||
148 | MemOpIdx oi = make_memop_idx(MO_UB, mmu_idx); | ||
149 | |||
150 | - cpu_stb_mmu(env, addr, val, oi, ra); | ||
151 | + cpu_stb_mmu(env, adjust_addr_virt(env, addr), val, oi, ra); | ||
152 | } | ||
153 | |||
154 | void helper_hyp_hsv_h(CPURISCVState *env, target_ulong addr, target_ulong val) | ||
155 | @@ -XXX,XX +XXX,XX @@ void helper_hyp_hsv_h(CPURISCVState *env, target_ulong addr, target_ulong val) | ||
156 | int mmu_idx = check_access_hlsv(env, false, ra); | ||
157 | MemOpIdx oi = make_memop_idx(MO_TEUW, mmu_idx); | ||
158 | |||
159 | - cpu_stw_mmu(env, addr, val, oi, ra); | ||
160 | + cpu_stw_mmu(env, adjust_addr_virt(env, addr), val, oi, ra); | ||
161 | } | ||
162 | |||
163 | void helper_hyp_hsv_w(CPURISCVState *env, target_ulong addr, target_ulong val) | ||
164 | @@ -XXX,XX +XXX,XX @@ void helper_hyp_hsv_w(CPURISCVState *env, target_ulong addr, target_ulong val) | ||
165 | int mmu_idx = check_access_hlsv(env, false, ra); | ||
166 | MemOpIdx oi = make_memop_idx(MO_TEUL, mmu_idx); | ||
167 | |||
168 | - cpu_stl_mmu(env, addr, val, oi, ra); | ||
169 | + cpu_stl_mmu(env, adjust_addr_virt(env, addr), val, oi, ra); | ||
170 | } | ||
171 | |||
172 | void helper_hyp_hsv_d(CPURISCVState *env, target_ulong addr, target_ulong val) | ||
173 | @@ -XXX,XX +XXX,XX @@ void helper_hyp_hsv_d(CPURISCVState *env, target_ulong addr, target_ulong val) | ||
174 | int mmu_idx = check_access_hlsv(env, false, ra); | ||
175 | MemOpIdx oi = make_memop_idx(MO_TEUQ, mmu_idx); | ||
176 | |||
177 | - cpu_stq_mmu(env, addr, val, oi, ra); | ||
178 | + cpu_stq_mmu(env, adjust_addr_virt(env, addr), val, oi, ra); | ||
179 | } | ||
180 | |||
181 | /* | ||
182 | diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c | ||
183 | index XXXXXXX..XXXXXXX 100644 | ||
184 | --- a/target/riscv/vector_helper.c | ||
185 | +++ b/target/riscv/vector_helper.c | ||
186 | @@ -XXX,XX +XXX,XX @@ static inline uint32_t vext_max_elems(uint32_t desc, uint32_t log2_esz) | ||
187 | return scale < 0 ? vlenb >> -scale : vlenb << scale; | ||
188 | } | ||
189 | |||
190 | -static inline target_ulong adjust_addr(CPURISCVState *env, target_ulong addr) | ||
191 | -{ | ||
192 | - if (riscv_cpu_mxl(env) == MXL_RV32) { | ||
193 | - return addr; | ||
194 | - } | ||
195 | - RISCVPmPmm pmm = riscv_pm_get_pmm(env); | ||
196 | - if (pmm == PMM_FIELD_DISABLED) { | ||
197 | - return addr; | ||
198 | - } | ||
199 | - int pmlen = riscv_pm_get_pmlen(pmm); | ||
200 | - bool signext = riscv_cpu_virt_mem_enabled(env); | ||
201 | - addr = addr << pmlen; | ||
202 | - /* sign/zero extend masked address by N-1 bit */ | ||
203 | - if (signext) { | ||
204 | - addr = (target_long)addr >> pmlen; | ||
205 | - } else { | ||
206 | - addr = addr >> pmlen; | ||
207 | - } | ||
208 | - return addr; | ||
209 | -} | ||
210 | - | ||
211 | /* | ||
212 | * This function checks watchpoint before real load operation. | ||
213 | * | ||
214 | -- | ||
215 | 2.39.5 | diff view generated by jsdifflib |
1 | From: Alexey Baturo <baturo.alexey@gmail.com> | 1 | From: Alexey Baturo <baturo.alexey@gmail.com> |
---|---|---|---|
2 | 2 | ||
3 | Signed-off-by: Alexey Baturo <baturo.alexey@gmail.com> | 3 | Signed-off-by: Alexey Baturo <baturo.alexey@gmail.com> |
4 | 4 | ||
5 | Reviewed-by: Alistair Francis <alistair.francis@wdc.com> | 5 | Reviewed-by: Alistair Francis <alistair.francis@wdc.com> |
6 | --- | 6 | --- |
7 | target/riscv/cpu.c | 8 ++++++++ | 7 | target/riscv/cpu.c | 6 ++++++ |
8 | 1 file changed, 8 insertions(+) | 8 | 1 file changed, 6 insertions(+) |
9 | 9 | ||
10 | diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c | 10 | diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c |
11 | index XXXXXXX..XXXXXXX 100644 | 11 | index XXXXXXX..XXXXXXX 100644 |
12 | --- a/target/riscv/cpu.c | 12 | --- a/target/riscv/cpu.c |
13 | +++ b/target/riscv/cpu.c | 13 | +++ b/target/riscv/cpu.c |
14 | @@ -XXX,XX +XXX,XX @@ const RISCVIsaExtData isa_edata_arr[] = { | 14 | @@ -XXX,XX +XXX,XX @@ const RISCVIsaExtData isa_edata_arr[] = { |
15 | ISA_EXT_DATA_ENTRY(svinval, PRIV_VERSION_1_12_0, ext_svinval), | 15 | ISA_EXT_DATA_ENTRY(smaia, PRIV_VERSION_1_12_0, ext_smaia), |
16 | ISA_EXT_DATA_ENTRY(svnapot, PRIV_VERSION_1_12_0, ext_svnapot), | 16 | ISA_EXT_DATA_ENTRY(smcntrpmf, PRIV_VERSION_1_12_0, ext_smcntrpmf), |
17 | ISA_EXT_DATA_ENTRY(svpbmt, PRIV_VERSION_1_12_0, ext_svpbmt), | 17 | ISA_EXT_DATA_ENTRY(smepmp, PRIV_VERSION_1_12_0, ext_smepmp), |
18 | + ISA_EXT_DATA_ENTRY(ssnpm, PRIV_VERSION_1_12_0, ext_ssnpm), | 18 | + ISA_EXT_DATA_ENTRY(smmpm, PRIV_VERSION_1_13_0, ext_smmpm), |
19 | + ISA_EXT_DATA_ENTRY(smnpm, PRIV_VERSION_1_12_0, ext_smnpm), | 19 | + ISA_EXT_DATA_ENTRY(smnpm, PRIV_VERSION_1_13_0, ext_smnpm), |
20 | + ISA_EXT_DATA_ENTRY(smmpm, PRIV_VERSION_1_12_0, ext_smmpm), | 20 | ISA_EXT_DATA_ENTRY(smstateen, PRIV_VERSION_1_12_0, ext_smstateen), |
21 | ISA_EXT_DATA_ENTRY(xtheadba, PRIV_VERSION_1_11_0, ext_xtheadba), | 21 | ISA_EXT_DATA_ENTRY(ssaia, PRIV_VERSION_1_12_0, ext_ssaia), |
22 | ISA_EXT_DATA_ENTRY(xtheadbb, PRIV_VERSION_1_11_0, ext_xtheadbb), | 22 | ISA_EXT_DATA_ENTRY(ssccptr, PRIV_VERSION_1_11_0, has_priv_1_11), |
23 | ISA_EXT_DATA_ENTRY(xtheadbs, PRIV_VERSION_1_11_0, ext_xtheadbs), | 23 | ISA_EXT_DATA_ENTRY(sscofpmf, PRIV_VERSION_1_12_0, ext_sscofpmf), |
24 | @@ -XXX,XX +XXX,XX @@ const RISCVCPUMultiExtConfig riscv_cpu_vendor_exts[] = { | 24 | ISA_EXT_DATA_ENTRY(sscounterenw, PRIV_VERSION_1_12_0, has_priv_1_12), |
25 | 25 | + ISA_EXT_DATA_ENTRY(ssnpm, PRIV_VERSION_1_13_0, ext_ssnpm), | |
26 | /* These are experimental so mark with 'x-' */ | 26 | ISA_EXT_DATA_ENTRY(sstc, PRIV_VERSION_1_12_0, ext_sstc), |
27 | const RISCVCPUMultiExtConfig riscv_cpu_experimental_exts[] = { | 27 | ISA_EXT_DATA_ENTRY(sstvala, PRIV_VERSION_1_12_0, has_priv_1_12), |
28 | + /* Zjpm v0.8 extensions */ | 28 | ISA_EXT_DATA_ENTRY(sstvecd, PRIV_VERSION_1_12_0, has_priv_1_12), |
29 | + MULTI_EXT_CFG_BOOL("x-ssnpm", ext_ssnpm, false), | 29 | @@ -XXX,XX +XXX,XX @@ const RISCVCPUMultiExtConfig riscv_cpu_extensions[] = { |
30 | + MULTI_EXT_CFG_BOOL("x-smnpm", ext_smnpm, false), | 30 | MULTI_EXT_CFG_BOOL("zvfh", ext_zvfh, false), |
31 | + MULTI_EXT_CFG_BOOL("x-smmpm", ext_smmpm, false), | 31 | MULTI_EXT_CFG_BOOL("zvfhmin", ext_zvfhmin, false), |
32 | + | 32 | MULTI_EXT_CFG_BOOL("sstc", ext_sstc, true), |
33 | DEFINE_PROP_END_OF_LIST(), | 33 | + MULTI_EXT_CFG_BOOL("ssnpm", ext_ssnpm, false), |
34 | }; | 34 | |
35 | 35 | MULTI_EXT_CFG_BOOL("smaia", ext_smaia, false), | |
36 | MULTI_EXT_CFG_BOOL("smepmp", ext_smepmp, false), | ||
37 | + MULTI_EXT_CFG_BOOL("smmpm", ext_smmpm, false), | ||
38 | + MULTI_EXT_CFG_BOOL("smnpm", ext_smnpm, false), | ||
39 | MULTI_EXT_CFG_BOOL("smstateen", ext_smstateen, false), | ||
40 | MULTI_EXT_CFG_BOOL("ssaia", ext_ssaia, false), | ||
41 | MULTI_EXT_CFG_BOOL("svade", ext_svade, false), | ||
36 | -- | 42 | -- |
37 | 2.34.1 | 43 | 2.39.5 | diff view generated by jsdifflib |