Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
ppc: spapr: cleanup cr get/set with helpers.
The bits in cr reg are grouped into eight 4-bit fields represented
by env->crf[8] and the related calculations should be abstracted to
keep the calling routines simpler to read. This is a step towards
cleaning up the related/calling code for better readability.

Signed-off-by: Harsh Prateek Bora <harshpb@linux.ibm.com>
Reviewed-by: Fabiano Rosas <farosas@suse.de>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Message-Id: <20230503093619.2530487-2-harshpb@linux.ibm.com>
[danielhb: add 'const' modifier to fix linux-user build]
Signed-off-by: Daniel Henrique Barboza <danielhb413@gmail.com>
  • Loading branch information
Harsh Prateek Bora authored and danielhb committed May 5, 2023
1 parent 1b336bb commit 2060436
Show file tree
Hide file tree
Showing 8 changed files with 31 additions and 60 deletions.
18 changes: 2 additions & 16 deletions hw/ppc/spapr_hcall.c
Expand Up @@ -1566,8 +1566,6 @@ static target_ulong h_enter_nested(PowerPCCPU *cpu,
struct kvmppc_hv_guest_state hv_state;
struct kvmppc_pt_regs *regs;
hwaddr len;
uint64_t cr;
int i;

if (spapr->nested_ptcr == 0) {
return H_NOT_AVAILABLE;
Expand Down Expand Up @@ -1616,12 +1614,7 @@ static target_ulong h_enter_nested(PowerPCCPU *cpu,
env->lr = regs->link;
env->ctr = regs->ctr;
cpu_write_xer(env, regs->xer);

cr = regs->ccr;
for (i = 7; i >= 0; i--) {
env->crf[i] = cr & 15;
cr >>= 4;
}
ppc_set_cr(env, regs->ccr);

env->msr = regs->msr;
env->nip = regs->nip;
Expand Down Expand Up @@ -1698,8 +1691,6 @@ void spapr_exit_nested(PowerPCCPU *cpu, int excp)
struct kvmppc_hv_guest_state *hvstate;
struct kvmppc_pt_regs *regs;
hwaddr len;
uint64_t cr;
int i;

assert(spapr_cpu->in_nested);

Expand Down Expand Up @@ -1757,12 +1748,7 @@ void spapr_exit_nested(PowerPCCPU *cpu, int excp)
regs->link = env->lr;
regs->ctr = env->ctr;
regs->xer = cpu_read_xer(env);

cr = 0;
for (i = 0; i < 8; i++) {
cr |= (env->crf[i] & 15) << (4 * (7 - i));
}
regs->ccr = cr;
regs->ccr = ppc_get_cr(env);

if (excp == POWERPC_EXCP_MCHECK ||
excp == POWERPC_EXCP_RESET ||
Expand Down
4 changes: 1 addition & 3 deletions linux-user/elfload.c
Expand Up @@ -961,9 +961,7 @@ static void elf_core_copy_regs(target_elf_gregset_t *regs, const CPUPPCState *en
(*regs)[36] = tswapreg(env->lr);
(*regs)[37] = tswapreg(cpu_read_xer(env));

for (i = 0; i < ARRAY_SIZE(env->crf); i++) {
ccr |= env->crf[i] << (32 - ((i + 1) * 4));
}
ccr = ppc_get_cr(env);
(*regs)[38] = tswapreg(ccr);
}

Expand Down
9 changes: 2 additions & 7 deletions linux-user/ppc/signal.c
Expand Up @@ -243,9 +243,7 @@ static void save_user_regs(CPUPPCState *env, struct target_mcontext *frame)
__put_user(env->lr, &frame->mc_gregs[TARGET_PT_LNK]);
__put_user(cpu_read_xer(env), &frame->mc_gregs[TARGET_PT_XER]);

for (i = 0; i < ARRAY_SIZE(env->crf); i++) {
ccr |= env->crf[i] << (32 - ((i + 1) * 4));
}
ccr = ppc_get_cr(env);
__put_user(ccr, &frame->mc_gregs[TARGET_PT_CCR]);

/* Save Altivec registers if necessary. */
Expand Down Expand Up @@ -335,10 +333,7 @@ static void restore_user_regs(CPUPPCState *env,
cpu_write_xer(env, xer);

__get_user(ccr, &frame->mc_gregs[TARGET_PT_CCR]);
for (i = 0; i < ARRAY_SIZE(env->crf); i++) {
env->crf[i] = (ccr >> (32 - ((i + 1) * 4))) & 0xf;
}

ppc_set_cr(env, ccr);
if (!sig) {
env->gpr[2] = save_r2;
}
Expand Down
17 changes: 17 additions & 0 deletions target/ppc/cpu.c
Expand Up @@ -67,6 +67,23 @@ uint32_t ppc_get_vscr(CPUPPCState *env)
return env->vscr | (sat << VSCR_SAT);
}

void ppc_set_cr(CPUPPCState *env, uint64_t cr)
{
for (int i = 7; i >= 0; i--) {
env->crf[i] = cr & 0xf;
cr >>= 4;
}
}

uint64_t ppc_get_cr(const CPUPPCState *env)
{
uint64_t cr = 0;
for (int i = 0; i < 8; i++) {
cr |= (env->crf[i] & 0xf) << (4 * (7 - i));
}
return cr;
}

/* GDBstub can read and write MSR... */
void ppc_store_msr(CPUPPCState *env, target_ulong value)
{
Expand Down
2 changes: 2 additions & 0 deletions target/ppc/cpu.h
Expand Up @@ -2773,6 +2773,8 @@ void dump_mmu(CPUPPCState *env);
void ppc_maybe_bswap_register(CPUPPCState *env, uint8_t *mem_buf, int len);
void ppc_store_vscr(CPUPPCState *env, uint32_t vscr);
uint32_t ppc_get_vscr(CPUPPCState *env);
void ppc_set_cr(CPUPPCState *env, uint64_t cr);
uint64_t ppc_get_cr(const CPUPPCState *env);

/*****************************************************************************/
/* Power management enable checks */
Expand Down
22 changes: 4 additions & 18 deletions target/ppc/gdbstub.c
Expand Up @@ -145,11 +145,7 @@ int ppc_cpu_gdb_read_register(CPUState *cs, GByteArray *buf, int n)
break;
case 66:
{
uint32_t cr = 0;
int i;
for (i = 0; i < 8; i++) {
cr |= env->crf[i] << (32 - ((i + 1) * 4));
}
uint32_t cr = ppc_get_cr(env);
gdb_get_reg32(buf, cr);
break;
}
Expand Down Expand Up @@ -203,11 +199,7 @@ int ppc_cpu_gdb_read_register_apple(CPUState *cs, GByteArray *buf, int n)
break;
case 66 + 32:
{
uint32_t cr = 0;
int i;
for (i = 0; i < 8; i++) {
cr |= env->crf[i] << (32 - ((i + 1) * 4));
}
uint32_t cr = ppc_get_cr(env);
gdb_get_reg32(buf, cr);
break;
}
Expand Down Expand Up @@ -257,10 +249,7 @@ int ppc_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n)
case 66:
{
uint32_t cr = ldl_p(mem_buf);
int i;
for (i = 0; i < 8; i++) {
env->crf[i] = (cr >> (32 - ((i + 1) * 4))) & 0xF;
}
ppc_set_cr(env, cr);
break;
}
case 67:
Expand Down Expand Up @@ -307,10 +296,7 @@ int ppc_cpu_gdb_write_register_apple(CPUState *cs, uint8_t *mem_buf, int n)
case 66 + 32:
{
uint32_t cr = ldl_p(mem_buf);
int i;
for (i = 0; i < 8; i++) {
env->crf[i] = (cr >> (32 - ((i + 1) * 4))) & 0xF;
}
ppc_set_cr(env, cr);
break;
}
case 67 + 32:
Expand Down
13 changes: 2 additions & 11 deletions target/ppc/kvm.c
Expand Up @@ -927,10 +927,7 @@ int kvm_arch_put_registers(CPUState *cs, int level)
regs.gpr[i] = env->gpr[i];
}

regs.cr = 0;
for (i = 0; i < 8; i++) {
regs.cr |= (env->crf[i] & 15) << (4 * (7 - i));
}
regs.cr = ppc_get_cr(env);

ret = kvm_vcpu_ioctl(cs, KVM_SET_REGS, &regs);
if (ret < 0) {
Expand Down Expand Up @@ -1205,20 +1202,14 @@ int kvm_arch_get_registers(CPUState *cs)
PowerPCCPU *cpu = POWERPC_CPU(cs);
CPUPPCState *env = &cpu->env;
struct kvm_regs regs;
uint32_t cr;
int i, ret;

ret = kvm_vcpu_ioctl(cs, KVM_GET_REGS, &regs);
if (ret < 0) {
return ret;
}

cr = regs.cr;
for (i = 7; i >= 0; i--) {
env->crf[i] = cr & 15;
cr >>= 4;
}

ppc_set_cr(env, regs.cr);
env->ctr = regs.ctr;
env->lr = regs.lr;
cpu_write_xer(env, regs.xer);
Expand Down
6 changes: 1 addition & 5 deletions target/ppc/ppc-qmp-cmds.c
Expand Up @@ -37,12 +37,8 @@ static target_long monitor_get_ccr(Monitor *mon, const struct MonitorDef *md,
{
CPUArchState *env = mon_get_cpu_env(mon);
unsigned int u;
int i;

u = 0;
for (i = 0; i < 8; i++) {
u |= env->crf[i] << (32 - (4 * (i + 1)));
}
u = ppc_get_cr(env);

return u;
}
Expand Down

0 comments on commit 2060436

Please sign in to comment.