e2k: write tags only if enabled

This commit is contained in:
Denis Drakhnia 2024-01-08 15:45:28 +02:00
parent 3aef40913f
commit d988acb0fa
6 changed files with 36 additions and 18 deletions

View File

@ -88,7 +88,7 @@ void cpu_loop(CPUE2KState *env)
args[i] = env->regs[i].lo;
}
if ((env->tags[0] & E2K_TAG_MASK_32) == E2K_TAG_NUMBER32) {
if (!env->enable_tags || (env->tags[0] & E2K_TAG_MASK_32) == E2K_TAG_NUMBER32) {
ret = do_syscall(env, (uint32_t) args[0], args[1], args[2], args[3],
args[4], args[5], args[6], args[7], args[8]);
} else {
@ -100,10 +100,13 @@ void cpu_loop(CPUE2KState *env)
} else if (ret != -QEMU_ESIGRETURN && env->wd.psize > 0) {
env->ip = E2K_SYSRET_ADDR;
env->regs[0].lo = ret;
env->tags[0] = E2K_TAG_NUMBER64;
for (i = 1; i < E2K_SYSCALL_MAX_ARGS; i++) {
env->tags[i] = E2K_TAG_NON_NUMBER64;
if (env->enable_tags) {
env->tags[0] = E2K_TAG_NUMBER64;
for (i = 1; i < E2K_SYSCALL_MAX_ARGS; i++) {
env->tags[i] = E2K_TAG_NON_NUMBER64;
}
}
}
} else {

View File

@ -227,8 +227,10 @@ static void target_setup_frame(int sig, struct target_sigaction *ka,
__put_user(env->ilcr_lcnt, &frame->ilcr_lcnt);
copy_to_user(frame_addr + offsetof(struct target_sigframe, gregs),
&env->greg[16], 16 * sizeof(E2KReg));
copy_to_user(frame_addr + offsetof(struct target_sigframe, gtags),
&env->gtag[16], 16);
if (env->enable_tags) {
copy_to_user(frame_addr + offsetof(struct target_sigframe, gtags),
&env->gtag[16], 16);
}
if (ka->sa_flags & TARGET_SA_RESTORER) {
// TODO: sa_restorer?
@ -246,15 +248,19 @@ static void target_setup_frame(int sig, struct target_sigaction *ka,
env->ip = ka->_sa_handler;
env->regs[0].lo = sig;
env->tags[0] = E2K_TAG_NUMBER64;
if (env->enable_tags) {
env->tags[0] = E2K_TAG_NUMBER64;
}
env->wd.size = 8;
if (info && (ka->sa_flags & TARGET_SA_SIGINFO)) {
tswap_siginfo(&frame->info, info);
env->regs[1].lo = frame_addr + offsetof(struct target_sigframe, info);
env->tags[1] = E2K_TAG_NUMBER64;
env->regs[2].lo = frame_addr + offsetof(struct target_sigframe, uc);
env->tags[2] = E2K_TAG_NUMBER64;
if (env->enable_tags) {
env->tags[1] = E2K_TAG_NUMBER64;
env->tags[2] = E2K_TAG_NUMBER64;
}
}
unlock_user_struct(frame, frame_addr, 1);
@ -331,8 +337,10 @@ long do_rt_sigreturn(CPUE2KState *env)
__get_user(env->ilcr_lcnt, &frame->ilcr_lcnt);
copy_from_user(&env->greg[16], frame_addr
+ offsetof(struct target_sigframe, gregs), 16 * sizeof(E2KReg));
copy_from_user(&env->gtag[16], frame_addr
+ offsetof(struct target_sigframe, gtags), 16);
if (env->enable_tags) {
copy_from_user(&env->gtag[16], frame_addr
+ offsetof(struct target_sigframe, gtags), 16);
}
if (do_sigaltstack(frame_addr +
offsetof(struct target_sigframe, uc.uc_stack),

View File

@ -62,7 +62,9 @@ static inline void cpu_clone_regs_child(CPUE2KState *env, target_ulong newsp,
env->pcsp = pcs;
env->psp = ps;
env->regs[0].lo = 0;
env->tags[0] = 0;
if (env->enable_tags) {
env->tags[0] = 0;
}
}
}

View File

@ -99,7 +99,7 @@ static void dump_predicate_regs(CPUE2KState *env, FILE *f, int flags)
qemu_fprintf(f, "\n");
}
static inline void dump_reg(FILE *f, char mnemonic, int index,
static inline void dump_reg(CPUE2KState *env, FILE *f, char mnemonic, int index,
uint8_t tag, E2KReg reg)
{
int width = (index > 9) + (index > 99);
@ -119,7 +119,8 @@ static void dump_regs(CPUE2KState *env, FILE *f, int flags)
int i;
for (i = 0; i < env->wd.size; i++) {
dump_reg(f, 'r', i, env->tags[i], env->regs[i]);
int tags = env->enable_tags ? env->tags[i] : 0;
dump_reg(env, f, 'r', i, tags, env->regs[i]);
}
if (env->wd.size & 3) {
qemu_fprintf(f, "\n");
@ -128,7 +129,8 @@ static void dump_regs(CPUE2KState *env, FILE *f, int flags)
if ((env->wd.size - env->bn.base) >= env->bn.size) {
for (i = 0; i < env->bn.size; i++) {
int index = env->bn.base + (i + env->bn.cur) % env->bn.size;
dump_reg(f, 'b', i, env->tags[index], env->regs[index]);
int tags = env->enable_tags ? env->tags[index] : 0;
dump_reg(env, f, 'b', i, tags, env->regs[index]);
}
if (env->bn.size & 3) {
qemu_fprintf(f, "\n");
@ -136,7 +138,8 @@ static void dump_regs(CPUE2KState *env, FILE *f, int flags)
}
for (i = 0; i < 32; i++) {
dump_reg(f, 'g', i, env->gtag[i], env->greg[i]);
int tags = env->enable_tags ? env->gtag[i] : 0;
dump_reg(env, f, 'g', i, tags, env->greg[i]);
}
}

View File

@ -391,7 +391,7 @@ void e2k_cpu_gdb_rw_tags(CPUState *cs, vaddr addr,
}
#ifdef CONFIG_USER_ONLY
if (env->psp.base <= addr && addr < (env->psp.base + env->psp.size)) {
if (env->enable_tags && env->psp.base <= addr && addr < (env->psp.base + env->psp.size)) {
target_ulong offset = addr - env->psp.base;
target_ulong ptr = env->psp.base_tag + offset / 8;

View File

@ -277,7 +277,9 @@ void HELPER(return)(CPUE2KState *env)
CPUState *cs = env_cpu(env);
env->wd.psize = 2;
env->regs[0].lo = 119; /* TARGET_NR_sigreturn */
env->tags[0] = E2K_TAG_NUMBER64;
if (env->enable_tags) {
env->tags[0] = E2K_TAG_NUMBER64;
}
cs->exception_index = EXCP_SYSCALL;
cpu_loop_exit(cs);
}