Revision 17d996e1

b/gdbstub.c
383 383
    }
384 384
    registers[64] = tswapl(env->pc);
385 385
    registers[65] = tswapl(env->npc);
386
    registers[66] = tswapl(env->tstate[env->tl]);
386
    registers[66] = tswapl(((uint64_t)GET_CCR(env) << 32) |
387
                           ((env->asi & 0xff) << 24) |
388
                           ((env->pstate & 0xfff) << 8) |
389
                           GET_CWP64(env));
387 390
    registers[67] = tswapl(env->fsr);
388 391
    registers[68] = tswapl(env->fprs);
389 392
    registers[69] = tswapl(env->y);
......
427 430
    }
428 431
    env->pc = tswapl(registers[64]);
429 432
    env->npc = tswapl(registers[65]);
430
    env->tstate[env->tl] = tswapl(registers[66]);
433
    {
434
        uint64_t tmp = tswapl(registers[66]);
435

  
436
        PUT_CCR(env, tmp >> 32);
437
        env->asi = (tmp >> 24) & 0xff;
438
        env->pstate = (tmp >> 8) & 0xfff;
439
        PUT_CWP64(env, tmp & 0xff);
440
    }
431 441
    env->fsr = tswapl(registers[67]);
432 442
    env->fprs = tswapl(registers[68]);
433 443
    env->y = tswapl(registers[69]);
b/target-sparc/cpu.h
288 288
    } while (0)
289 289

  
290 290
#ifdef TARGET_SPARC64
291
#define GET_CCR(env) ((env->xcc << 4) | (env->psr & PSR_ICC))
291
#define GET_CCR(env) (((env->xcc >> 20) << 4) | ((env->psr & PSR_ICC) >> 20))
292 292
#define PUT_CCR(env, val) do { int _tmp = val;				\
293
	env->xcc = _tmp >> 4;						\
293
	env->xcc = (_tmp >> 4) << 20;						\
294 294
	env->psr = (_tmp & 0xf) << 20;					\
295 295
    } while (0)
296
#define GET_CWP64(env) (NWINDOWS - 1 - (env)->cwp)
297
#define PUT_CWP64(env, val)  do {                                       \
298
        env->cwp = NWINDOWS - 1 - ((val) & 0xff);                       \
299
        cpu_set_cwp(env, env->cwp);                                     \
300
    } while(0)
301

  
296 302
#endif
297 303

  
298 304
int cpu_sparc_signal_handler(int host_signum, void *pinfo, void *puc);
b/target-sparc/op.c
1184 1184
// order.
1185 1185
void OPPROTO op_rdcwp(void)
1186 1186
{
1187
    T0 = NWINDOWS - 1 - env->cwp;
1187
    T0 = GET_CWP64(env);
1188 1188
}
1189 1189

  
1190 1190
void OPPROTO op_wrcwp(void)
1191 1191
{
1192
    env->cwp = NWINDOWS - 1 - T0;
1192
    PUT_CWP64(env, T0);
1193 1193
}
1194 1194

  
1195 1195
/* XXX: use another pointer for %iN registers to avoid slow wrapping
b/target-sparc/op_helper.c
871 871
    PUT_CCR(env, env->tstate[env->tl] >> 32);
872 872
    env->asi = (env->tstate[env->tl] >> 24) & 0xff;
873 873
    env->pstate = (env->tstate[env->tl] >> 8) & 0xfff;
874
    set_cwp(env->tstate[env->tl] & 0xff);
874
    PUT_CWP64(env, env->tstate[env->tl] & 0xff);
875 875
}
876 876

  
877 877
void do_retry(void)
......
882 882
    PUT_CCR(env, env->tstate[env->tl] >> 32);
883 883
    env->asi = (env->tstate[env->tl] >> 24) & 0xff;
884 884
    env->pstate = (env->tstate[env->tl] >> 8) & 0xfff;
885
    set_cwp(env->tstate[env->tl] & 0xff);
885
    PUT_CWP64(env, env->tstate[env->tl] & 0xff);
886 886
}
887 887
#endif
888 888

  
......
952 952
    }
953 953
#endif
954 954
    env->tstate[env->tl] = ((uint64_t)GET_CCR(env) << 32) | ((env->asi & 0xff) << 24) |
955
	((env->pstate & 0xfff) << 8) | (env->cwp & 0xff);
955
	((env->pstate & 0xfff) << 8) | GET_CWP64(env);
956 956
    env->tpc[env->tl] = env->pc;
957 957
    env->tnpc[env->tl] = env->npc;
958 958
    env->tt[env->tl] = intno;

Also available in: Unified diff