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