mirror of
https://github.com/izzy2lost/xemu.git
synced 2026-07-06 00:20:22 -07:00
Merge tag 'pull-pa-20240329' of https://gitlab.com/rth7680/qemu into staging
target/hppa: Fix BE,L set of sr0 target/hppa: Fix B,GATE for wide mode target/hppa: Mark interval timer write as io target/hppa: Fix EIRR, EIEM versus icount target/hppa: Fix DCOR reconstruction of carry bits target/hppa: Fix unit carry conditions target/hppa: Fix overflow computation for shladd target/hppa: Add diag instructions to set/restore shadow registers target/hppa: Clear psw_n for BE on use_nullify_skip path # -----BEGIN PGP SIGNATURE----- # # iQFRBAABCgA7FiEEekgeeIaLTbaoWgXAZN846K9+IV8FAmYHQPEdHHJpY2hhcmQu # aGVuZGVyc29uQGxpbmFyby5vcmcACgkQZN846K9+IV/lpwf+PRmKNguclUYZ5Pub # kVxeylyTGdiYieDfv4RxSnkQbmfiJdwhr+lRUiiA/AfK2IFMTC56Wn0URAdvpFxG # MuI9r7t8Z640KwVnF9GTau0JagU/GXYorYdO7WY/PMvrgjeRukjMqb0Sgnoknlqw # LuPUu6+Z+zMMNLT69WNfbcYIqdHcb2iP5Tr3yWGRKywu8+zM9q/fL7GEi+5GEB6Y # bljjv03hpzKPyZg6UCwQzoeDnIfUpefrghkwzenPKmoWzuLSohmG+Q7Cnp4WiGMg # 3HX7+LVCXXW4OOHu0syf3M/cG6zGfH7kBTvq4CNKjNeeqz/g2qwNTPO1xfOr7f5w # zsUf/Q== # =fcSC # -----END PGP SIGNATURE----- # gpg: Signature made Fri 29 Mar 2024 22:30:09 GMT # gpg: using RSA key 7A481E78868B4DB6A85A05C064DF38E8AF7E215F # gpg: issuer "richard.henderson@linaro.org" # gpg: Good signature from "Richard Henderson <richard.henderson@linaro.org>" [full] # Primary key fingerprint: 7A48 1E78 868B 4DB6 A85A 05C0 64DF 38E8 AF7E 215F * tag 'pull-pa-20240329' of https://gitlab.com/rth7680/qemu: target/hppa: Clear psw_n for BE on use_nullify_skip path target/hppa: Add diag instructions to set/restore shadow registers target/hppa: Move diag argument handling to decodetree target/hppa: Generate getshadowregs inline target/hppa: Fix overflow computation for shladd target/hppa: Replace c with uv in do_cond target/hppa: Squash d for pa1.x during decode target/hppa: Fix unit carry conditions target/hppa: Optimize UADDCM with no condition target/hppa: Fix DCOR reconstruction of carry bits target/hppa: Use gva_offset_mask() everywhere target/hppa: Fix EIRR, EIEM versus icount target/hppa: Tidy read of interval timer target/hppa: Mark interval timer write as io target/hppa: Fix ADD/SUB trap on overflow for narrow mode target/hppa: Handle unit conditions for wide mode target/hppa: Fix B,GATE for wide mode target/hppa: Fix BE,L set of sr0 Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
+8
-2
@@ -285,14 +285,20 @@ void hppa_translate_init(void);
|
||||
|
||||
#define CPU_RESOLVING_TYPE TYPE_HPPA_CPU
|
||||
|
||||
static inline uint64_t gva_offset_mask(target_ulong psw)
|
||||
{
|
||||
return (psw & PSW_W
|
||||
? MAKE_64BIT_MASK(0, 62)
|
||||
: MAKE_64BIT_MASK(0, 32));
|
||||
}
|
||||
|
||||
static inline target_ulong hppa_form_gva_psw(target_ulong psw, uint64_t spc,
|
||||
target_ulong off)
|
||||
{
|
||||
#ifdef CONFIG_USER_ONLY
|
||||
return off;
|
||||
#else
|
||||
off &= psw & PSW_W ? MAKE_64BIT_MASK(0, 62) : MAKE_64BIT_MASK(0, 32);
|
||||
return spc | off;
|
||||
return spc | (off & gva_offset_mask(psw));
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@@ -86,12 +86,10 @@ DEF_HELPER_FLAGS_0(read_interval_timer, TCG_CALL_NO_RWG, tl)
|
||||
#ifndef CONFIG_USER_ONLY
|
||||
DEF_HELPER_1(halt, noreturn, env)
|
||||
DEF_HELPER_1(reset, noreturn, env)
|
||||
DEF_HELPER_1(getshadowregs, void, env)
|
||||
DEF_HELPER_1(rfi, void, env)
|
||||
DEF_HELPER_1(rfi_r, void, env)
|
||||
DEF_HELPER_FLAGS_2(write_interval_timer, TCG_CALL_NO_RWG, void, env, tl)
|
||||
DEF_HELPER_FLAGS_2(write_eirr, TCG_CALL_NO_RWG, void, env, tl)
|
||||
DEF_HELPER_FLAGS_2(write_eiem, TCG_CALL_NO_RWG, void, env, tl)
|
||||
DEF_HELPER_FLAGS_2(swap_system_mask, TCG_CALL_NO_RWG, tl, env, tl)
|
||||
DEF_HELPER_FLAGS_3(itlba_pa11, TCG_CALL_NO_RWG, void, env, tl, tl)
|
||||
DEF_HELPER_FLAGS_3(itlbp_pa11, TCG_CALL_NO_RWG, void, env, tl, tl)
|
||||
|
||||
@@ -57,11 +57,16 @@
|
||||
%neg_to_m 0:1 !function=neg_to_m
|
||||
%a_to_m 2:1 !function=neg_to_m
|
||||
%cmpbid_c 13:2 !function=cmpbid_c
|
||||
%d_5 5:1 !function=pa20_d
|
||||
%d_11 11:1 !function=pa20_d
|
||||
%d_13 13:1 !function=pa20_d
|
||||
|
||||
####
|
||||
# Argument set definitions
|
||||
####
|
||||
|
||||
&empty
|
||||
|
||||
# All insns that need to form a virtual address should use this set.
|
||||
&ldst t b x disp sp m scale size
|
||||
|
||||
@@ -84,15 +89,16 @@
|
||||
# Format definitions
|
||||
####
|
||||
|
||||
@rr_cf_d ...... r:5 ..... cf:4 ...... d:1 t:5 &rr_cf_d
|
||||
@rr_cf_d ...... r:5 ..... cf:4 ...... . t:5 &rr_cf_d d=%d_5
|
||||
@rrr ...... r2:5 r1:5 .... ....... t:5 &rrr
|
||||
@rrr_cf ...... r2:5 r1:5 cf:4 ....... t:5 &rrr_cf
|
||||
@rrr_cf_d ...... r2:5 r1:5 cf:4 ...... d:1 t:5 &rrr_cf_d
|
||||
@rrr_cf_d ...... r2:5 r1:5 cf:4 ...... . t:5 &rrr_cf_d d=%d_5
|
||||
@rrr_sh ...... r2:5 r1:5 ........ sh:2 . t:5 &rrr_sh
|
||||
@rrr_cf_d_sh ...... r2:5 r1:5 cf:4 .... sh:2 d:1 t:5 &rrr_cf_d_sh
|
||||
@rrr_cf_d_sh0 ...... r2:5 r1:5 cf:4 ...... d:1 t:5 &rrr_cf_d_sh sh=0
|
||||
@rrr_cf_d_sh ...... r2:5 r1:5 cf:4 .... sh:2 . t:5 &rrr_cf_d_sh d=%d_5
|
||||
@rrr_cf_d_sh0 ...... r2:5 r1:5 cf:4 ...... . t:5 &rrr_cf_d_sh d=%d_5 sh=0
|
||||
@rri_cf ...... r:5 t:5 cf:4 . ........... &rri_cf i=%lowsign_11
|
||||
@rri_cf_d ...... r:5 t:5 cf:4 d:1 ........... &rri_cf_d i=%lowsign_11
|
||||
@rri_cf_d ...... r:5 t:5 cf:4 . ........... \
|
||||
&rri_cf_d d=%d_11 i=%lowsign_11
|
||||
|
||||
@rrb_cf ...... r2:5 r1:5 c:3 ........... n:1 . \
|
||||
&rrb_c_f disp=%assemble_12
|
||||
@@ -368,8 +374,10 @@ fmpysub_d 100110 ..... ..... ..... ..... 1 ..... @mpyadd
|
||||
# Conditional Branches
|
||||
####
|
||||
|
||||
bb_sar 110000 00000 r:5 c:1 1 d:1 ........... n:1 . disp=%assemble_12
|
||||
bb_imm 110001 p:5 r:5 c:1 1 d:1 ........... n:1 . disp=%assemble_12
|
||||
bb_sar 110000 00000 r:5 c:1 1 . ........... n:1 . \
|
||||
disp=%assemble_12 d=%d_13
|
||||
bb_imm 110001 p:5 r:5 c:1 1 . ........... n:1 . \
|
||||
disp=%assemble_12 d=%d_13
|
||||
|
||||
movb 110010 ..... ..... ... ........... . . @rrb_cf f=0
|
||||
movbi 110011 ..... ..... ... ........... . . @rib_cf f=0
|
||||
@@ -628,4 +636,18 @@ fdiv_d 001110 ..... ..... 011 ..... ... ..... @f0e_d_3
|
||||
xmpyu 001110 ..... ..... 010 .0111 .00 t:5 r1=%ra64 r2=%rb64
|
||||
|
||||
# diag
|
||||
diag 000101 i:26
|
||||
{
|
||||
[
|
||||
diag_btlb 000101 00 0000 0000 0000 0001 0000 0000
|
||||
diag_cout 000101 00 0000 0000 0000 0001 0000 0001
|
||||
|
||||
# For 32-bit PA-7300LC (PCX-L2)
|
||||
diag_getshadowregs_pa1 000101 00 0000 0000 0001 1010 0000 0000
|
||||
diag_putshadowregs_pa1 000101 00 0000 0000 0001 1010 0100 0000
|
||||
|
||||
# For 64-bit PA8700 (PCX-W2)
|
||||
diag_getshadowregs_pa2 000101 00 0111 1000 0001 1000 0100 0000
|
||||
diag_putshadowregs_pa2 000101 00 0111 0000 0001 1000 0100 0000
|
||||
]
|
||||
diag_unimp 000101 i:26
|
||||
}
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
static void eval_interrupt(HPPACPU *cpu)
|
||||
{
|
||||
CPUState *cs = CPU(cpu);
|
||||
if (cpu->env.cr[CR_EIRR] & cpu->env.cr[CR_EIEM]) {
|
||||
if (cpu->env.cr[CR_EIRR]) {
|
||||
cpu_interrupt(cs, CPU_INTERRUPT_HARD);
|
||||
} else {
|
||||
cpu_reset_interrupt(cs, CPU_INTERRUPT_HARD);
|
||||
@@ -89,14 +89,6 @@ void HELPER(write_eirr)(CPUHPPAState *env, target_ulong val)
|
||||
bql_unlock();
|
||||
}
|
||||
|
||||
void HELPER(write_eiem)(CPUHPPAState *env, target_ulong val)
|
||||
{
|
||||
env->cr[CR_EIEM] = val;
|
||||
bql_lock();
|
||||
eval_interrupt(env_archcpu(env));
|
||||
bql_unlock();
|
||||
}
|
||||
|
||||
void hppa_cpu_do_interrupt(CPUState *cs)
|
||||
{
|
||||
HPPACPU *cpu = HPPA_CPU(cs);
|
||||
@@ -280,7 +272,9 @@ bool hppa_cpu_exec_interrupt(CPUState *cs, int interrupt_request)
|
||||
}
|
||||
|
||||
/* If interrupts are requested and enabled, raise them. */
|
||||
if ((env->psw & PSW_I) && (interrupt_request & CPU_INTERRUPT_HARD)) {
|
||||
if ((interrupt_request & CPU_INTERRUPT_HARD)
|
||||
&& (env->psw & PSW_I)
|
||||
&& (env->cr[CR_EIRR] & env->cr[CR_EIEM])) {
|
||||
cs->exception_index = EXCP_EXT_INTERRUPT;
|
||||
hppa_cpu_do_interrupt(cs);
|
||||
return true;
|
||||
|
||||
@@ -95,7 +95,7 @@ void HELPER(rfi)(CPUHPPAState *env)
|
||||
cpu_hppa_put_psw(env, env->cr[CR_IPSW]);
|
||||
}
|
||||
|
||||
void HELPER(getshadowregs)(CPUHPPAState *env)
|
||||
static void getshadowregs(CPUHPPAState *env)
|
||||
{
|
||||
env->gr[1] = env->shadow[0];
|
||||
env->gr[8] = env->shadow[1];
|
||||
@@ -108,7 +108,7 @@ void HELPER(getshadowregs)(CPUHPPAState *env)
|
||||
|
||||
void HELPER(rfi_r)(CPUHPPAState *env)
|
||||
{
|
||||
helper_getshadowregs(env);
|
||||
getshadowregs(env);
|
||||
helper_rfi(env);
|
||||
}
|
||||
|
||||
|
||||
+320
-168
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user