e2k: write tags only if enabled
This commit is contained in:
parent
3aef40913f
commit
d988acb0fa
|
@ -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 {
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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]);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue