[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v6 24/24] target/m68k: Implement FPIAR
From: |
Richard Henderson |
Subject: |
[PATCH v6 24/24] target/m68k: Implement FPIAR |
Date: |
Sun, 11 May 2025 13:35:46 -0700 |
So far, this is only read-as-written.
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2497
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
target/m68k/cpu.h | 1 +
target/m68k/cpu.c | 23 ++++++++++++++++++++++-
target/m68k/helper.c | 14 ++++++++------
target/m68k/translate.c | 3 ++-
4 files changed, 33 insertions(+), 8 deletions(-)
diff --git a/target/m68k/cpu.h b/target/m68k/cpu.h
index 77ed496ab4..baa2e035a4 100644
--- a/target/m68k/cpu.h
+++ b/target/m68k/cpu.h
@@ -110,6 +110,7 @@ typedef struct CPUArchState {
uint32_t fpsr;
uint32_t fpsr_pdr; /* live only with a packed decimal real operand */
float_status fp_status;
+ uint32_t fpiar;
uint64_t mactmp;
/*
diff --git a/target/m68k/cpu.c b/target/m68k/cpu.c
index fe53572542..00cba4d963 100644
--- a/target/m68k/cpu.c
+++ b/target/m68k/cpu.c
@@ -470,6 +470,23 @@ static const VMStateDescription vmstate_freg = {
}
};
+static bool fpu_fpiar_needed(void *opaque)
+{
+ M68kCPU *s = opaque;
+ return s->env.fpiar != 0;
+}
+
+static const VMStateDescription vmstate_fpiar = {
+ .name = "cpu/fpu/fpiar",
+ .version_id = 1,
+ .minimum_version_id = 1,
+ .needed = fpu_fpiar_needed,
+ .fields = (const VMStateField[]) {
+ VMSTATE_UINT32(env.fpiar, M68kCPU),
+ VMSTATE_END_OF_LIST()
+ }
+};
+
static int fpu_post_load(void *opaque, int version)
{
M68kCPU *s = opaque;
@@ -490,7 +507,11 @@ static const VMStateDescription vmstate_fpu = {
VMSTATE_STRUCT_ARRAY(env.fregs, M68kCPU, 8, 0, vmstate_freg, FPReg),
VMSTATE_STRUCT(env.fp_result, M68kCPU, 0, vmstate_freg, FPReg),
VMSTATE_END_OF_LIST()
- }
+ },
+ .subsections = (const VMStateDescription * const []) {
+ &vmstate_fpiar,
+ NULL
+ },
};
static bool cf_spregs_needed(void *opaque)
diff --git a/target/m68k/helper.c b/target/m68k/helper.c
index b50ef6dec3..818c0dd057 100644
--- a/target/m68k/helper.c
+++ b/target/m68k/helper.c
@@ -47,8 +47,8 @@ static int cf_fpu_gdb_get_reg(CPUState *cs, GByteArray
*mem_buf, int n)
return gdb_get_reg32(mem_buf, env->fpcr);
case 9: /* fpstatus */
return gdb_get_reg32(mem_buf, env->fpsr);
- case 10: /* fpiar, not implemented */
- return gdb_get_reg32(mem_buf, 0);
+ case 10: /* fpiar */
+ return gdb_get_reg32(mem_buf, env->fpiar);
}
return 0;
}
@@ -71,7 +71,8 @@ static int cf_fpu_gdb_set_reg(CPUState *cs, uint8_t *mem_buf,
int n)
case 9: /* fpstatus */
env->fpsr = ldl_be_p(mem_buf);
return 4;
- case 10: /* fpiar, not implemented */
+ case 10: /* fpiar */
+ env->fpiar = ldl_be_p(mem_buf);
return 4;
}
return 0;
@@ -93,8 +94,8 @@ static int m68k_fpu_gdb_get_reg(CPUState *cs, GByteArray
*mem_buf, int n)
return gdb_get_reg32(mem_buf, env->fpcr);
case 9: /* fpstatus */
return gdb_get_reg32(mem_buf, env->fpsr);
- case 10: /* fpiar, not implemented */
- return gdb_get_reg32(mem_buf, 0);
+ case 10: /* fpiar */
+ return gdb_get_reg32(mem_buf, env->fpiar);
}
return 0;
}
@@ -116,7 +117,8 @@ static int m68k_fpu_gdb_set_reg(CPUState *cs, uint8_t
*mem_buf, int n)
case 9: /* fpstatus */
env->fpsr = ldl_be_p(mem_buf);
return 4;
- case 10: /* fpiar, not implemented */
+ case 10: /* fpiar */
+ env->fpiar = ldl_be_p(mem_buf);
return 4;
}
return 0;
diff --git a/target/m68k/translate.c b/target/m68k/translate.c
index 49c9d4e870..07d1812deb 100644
--- a/target/m68k/translate.c
+++ b/target/m68k/translate.c
@@ -4674,7 +4674,7 @@ static void gen_load_fcr(DisasContext *s, TCGv res, int
reg)
{
switch (reg) {
case M68K_FPIAR:
- tcg_gen_movi_i32(res, 0);
+ tcg_gen_ld_i32(res, tcg_env, offsetof(CPUM68KState, fpiar));
break;
case M68K_FPSR:
tcg_gen_ld_i32(res, tcg_env, offsetof(CPUM68KState, fpsr));
@@ -4689,6 +4689,7 @@ static void gen_store_fcr(DisasContext *s, TCGv val, int
reg)
{
switch (reg) {
case M68K_FPIAR:
+ tcg_gen_st_i32(val, tcg_env, offsetof(CPUM68KState, fpiar));
break;
case M68K_FPSR:
tcg_gen_st_i32(val, tcg_env, offsetof(CPUM68KState, fpsr));
--
2.43.0
- [PATCH v6 09/24] target/m68k: Use OS_UNSIZED in LEA, PEA, JMP, (continued)
- [PATCH v6 09/24] target/m68k: Use OS_UNSIZED in LEA, PEA, JMP, Richard Henderson, 2025/05/11
- [PATCH v6 14/24] target/m68k: Remove env argument to gen_load_mode, Richard Henderson, 2025/05/11
- [PATCH v6 16/24] target/m68k: Remove env argument to gen_ea_mode_fp, Richard Henderson, 2025/05/11
- [PATCH v6 17/24] target/m68k: Split gen_ea_mode_fp for load/store, Richard Henderson, 2025/05/11
- [PATCH v6 18/24] target/m68k: Move gen_addr_fault into gen_{load, store}_mode_fp, Richard Henderson, 2025/05/11
- [PATCH v6 20/24] target/m68k: Merge gen_store_fp, gen_store_mode_fp, Richard Henderson, 2025/05/11
- [PATCH v6 19/24] target/m68k: Merge gen_load_fp, gen_load_mode_fp, Richard Henderson, 2025/05/11
- [PATCH v6 22/24] tests/tcg/m68k: Add packed decimal tests, Richard Henderson, 2025/05/11
- [PATCH v6 23/24] target/m68k: Make vmstate variables static, Richard Henderson, 2025/05/11
- [PATCH v6 24/24] target/m68k: Implement FPIAR,
Richard Henderson <=
- [PATCH v6 21/24] target/m68k: Implement packed decimal real loads and stores, Richard Henderson, 2025/05/11