Revision af7bf89b

b/target-sparc/cpu.h
1 1
#ifndef CPU_SPARC_H
2 2
#define CPU_SPARC_H
3 3

  
4
#include "config.h"
5

  
6
#if !defined(TARGET_SPARC64)
4 7
#define TARGET_LONG_BITS 32
8
#define TARGET_FPREGS 32
9
#define TARGET_FPREG_T float
10
#else
11
#define TARGET_LONG_BITS 64
12
#define TARGET_FPREGS 64
13
#define TARGET_FPREG_T double
14
#endif
5 15

  
6 16
#include "cpu-defs.h"
7 17

  
......
95 105
#define NWINDOWS  32
96 106

  
97 107
typedef struct CPUSPARCState {
98
    uint32_t gregs[8]; /* general registers */
99
    uint32_t *regwptr; /* pointer to current register window */
100
    float    fpr[32];  /* floating point registers */
101
    uint32_t pc;       /* program counter */
102
    uint32_t npc;      /* next program counter */
103
    uint32_t y;        /* multiply/divide register */
108
    target_ulong gregs[8]; /* general registers */
109
    target_ulong *regwptr; /* pointer to current register window */
110
    TARGET_FPREG_T    fpr[TARGET_FPREGS];  /* floating point registers */
111
    target_ulong pc;       /* program counter */
112
    target_ulong npc;      /* next program counter */
113
    target_ulong y;        /* multiply/divide register */
104 114
    uint32_t psr;      /* processor state register */
105 115
    uint32_t fsr;      /* FPU state register */
106
    uint32_t T2;
107 116
    uint32_t cwp;      /* index of current register window (extracted
108 117
                          from PSR) */
109 118
    uint32_t wim;      /* window invalid mask */
......
118 127
    int exception_index;
119 128
    int interrupt_index;
120 129
    int interrupt_request;
121
    uint32_t exception_next_pc;
130
    target_ulong exception_next_pc;
122 131
    struct TranslationBlock *current_tb;
123 132
    void *opaque;
124 133
    /* NOTE: we allow 8 more registers to handle wrapping */
125
    uint32_t regbase[NWINDOWS * 16 + 8];
134
    target_ulong regbase[NWINDOWS * 16 + 8];
126 135

  
127 136
    /* in order to avoid passing too many arguments to the memory
128 137
       write helpers, we store some rarely used information in the CPU
......
140 149
    /* temporary float registers */
141 150
    float ft0, ft1, ft2;
142 151
    double dt0, dt1, dt2;
152
#if defined(TARGET_SPARC64)
153
    target_ulong t0, t1, t2;
154
#endif
143 155

  
144 156
    /* ice debug support */
145
    uint32_t breakpoints[MAX_BREAKPOINTS];
157
    target_ulong breakpoints[MAX_BREAKPOINTS];
146 158
    int nb_breakpoints;
147 159
    int singlestep_enabled; /* XXX: should use CPU single step mode instead */
148 160

  
......
155 167
double cpu_put_fp64(uint64_t mant, uint16_t exp);
156 168

  
157 169
/* Fake impl 0, version 4 */
158
#define GET_PSR(env) ((0 << 28) | (4 << 24) | env->psr |		\
170
#define GET_PSR(env) ((0 << 28) | (4 << 24) | (env->psr & PSR_ICC) |	\
159 171
		      (env->psref? PSR_EF : 0) |			\
160 172
		      (env->psrpil << 8) |				\
161 173
		      (env->psrs? PSR_S : 0) |				\
......
167 179
#endif
168 180

  
169 181
#define PUT_PSR(env, val) do { int _tmp = val;				\
170
	env->psr = _tmp & ~PSR_ICC;					\
182
	env->psr = _tmp & PSR_ICC;					\
171 183
	env->psref = (_tmp & PSR_EF)? 1 : 0;				\
172 184
	env->psrpil = (_tmp & PSR_PIL) >> 8;				\
173 185
	env->psrs = (_tmp & PSR_S)? 1 : 0;				\
b/target-sparc/exec.h
3 3
#include "dyngen-exec.h"
4 4

  
5 5
register struct CPUSPARCState *env asm(AREG0);
6
#ifdef TARGET_SPARC64
7
#define T0 (env->t0)
8
#define T1 (env->t1)
9
#define T2 (env->t2)
10
#else
6 11
register uint32_t T0 asm(AREG1);
7 12
register uint32_t T1 asm(AREG2);
8 13
register uint32_t T2 asm(AREG3);
14
#endif
9 15
#define FT0 (env->ft0)
10 16
#define FT1 (env->ft1)
11 17
#define FT2 (env->ft2)
......
32 38
void do_fsqrtd(void);
33 39
void do_fcmps(void);
34 40
void do_fcmpd(void);
35
void do_ldd_kernel(uint32_t addr);
36
void do_ldd_user(uint32_t addr);
37
void do_ldd_raw(uint32_t addr);
41
void do_ldd_kernel(target_ulong addr);
42
void do_ldd_user(target_ulong addr);
43
void do_ldd_raw(target_ulong addr);
38 44
void do_interrupt(int intno, int is_int, int error_code, 
39 45
                  unsigned int next_eip, int is_hw);
40 46
void raise_exception_err(int exception_index, int error_code);
41 47
void raise_exception(int tt);
42
void memcpy32(uint32_t *dst, const uint32_t *src);
43
uint32_t mmu_probe(uint32_t address, int mmulev);
48
void memcpy32(target_ulong *dst, const target_ulong *src);
49
target_ulong mmu_probe(target_ulong address, int mmulev);
44 50
void dump_mmu(void);
45 51
void helper_debug();
52
void do_wrpsr();
53
void do_rdpsr();
46 54

  
47 55
/* XXX: move that to a generic header */
48 56
#if !defined(CONFIG_USER_ONLY)
b/target-sparc/helper.c
23 23
//#define DEBUG_MMU
24 24

  
25 25
/* Sparc MMU emulation */
26
int cpu_sparc_handle_mmu_fault (CPUState *env, uint32_t address, int rw,
26
int cpu_sparc_handle_mmu_fault (CPUState *env, target_ulong address, int rw,
27 27
                              int is_user, int is_softmmu);
28 28

  
29 29
/* thread support */
......
109 109
    { 0, 1, 0, 1, 0, 0, 0, 0 }
110 110
};
111 111

  
112
int get_physical_address (CPUState *env, uint32_t *physical, int *prot,
113
			  int *access_index, uint32_t address, int rw,
112
int get_physical_address (CPUState *env, target_phys_addr_t *physical, int *prot,
113
			  int *access_index, target_ulong address, int rw,
114 114
			  int is_user)
115 115
{
116 116
    int access_perms = 0;
117 117
    target_phys_addr_t pde_ptr;
118
    uint32_t pde, virt_addr;
118
    uint32_t pde;
119
    target_ulong virt_addr;
119 120
    int error_code = 0, is_dirty;
120 121
    unsigned long page_offset;
121 122

  
......
217 218
}
218 219

  
219 220
/* Perform address translation */
220
int cpu_sparc_handle_mmu_fault (CPUState *env, uint32_t address, int rw,
221
int cpu_sparc_handle_mmu_fault (CPUState *env, target_ulong address, int rw,
221 222
                              int is_user, int is_softmmu)
222 223
{
223 224
    int exception = 0;
224
    uint32_t virt_addr, paddr;
225
    target_ulong virt_addr;
226
    target_phys_addr_t paddr;
225 227
    unsigned long vaddr;
226 228
    int error_code = 0, prot, ret = 0, access_index;
227 229

  
......
252 254
    return error_code;
253 255
}
254 256

  
255
void memcpy32(uint32_t *dst, const uint32_t *src)
257
void memcpy32(target_ulong *dst, const target_ulong *src)
256 258
{
257 259
    dst[0] = src[0];
258 260
    dst[1] = src[1];
......
328 330
    env->psret = 0;
329 331
    cwp = (env->cwp - 1) & (NWINDOWS - 1); 
330 332
    set_cwp(cwp);
331
    env->regwptr[9] = env->pc - 4; // XXX?
332
    env->regwptr[10] = env->pc;
333
    if (intno & 0x80) {
334
	env->regwptr[9] = env->pc;
335
	env->regwptr[10] = env->npc;
336
    } else {
337
	env->regwptr[9] = env->pc - 4; // XXX?
338
	env->regwptr[10] = env->pc;
339
    }
333 340
    env->psrps = env->psrs;
334 341
    env->psrs = 1;
335 342
    env->tbr = (env->tbr & TBR_BASE_MASK) | (intno << 4);
......
343 350
    raise_exception(exception_index);
344 351
}
345 352

  
346
uint32_t mmu_probe(uint32_t address, int mmulev)
353
target_ulong mmu_probe(target_ulong address, int mmulev)
347 354
{
348 355
    target_phys_addr_t pde_ptr;
349 356
    uint32_t pde;
......
408 415
void dump_mmu(void)
409 416
{
410 417
#ifdef DEBUG_MMU
411
    uint32_t pa, va, va1, va2;
412
    int n, m, o;
413
    target_phys_addr_t pde_ptr;
418
     target_ulong va, va1, va2;
419
     unsigned int n, m, o;
420
     target_phys_addr_t pde_ptr, pa;
414 421
    uint32_t pde;
415 422

  
416 423
    printf("MMU dump:\n");
417 424
    pde_ptr = (env->mmuregs[1] << 4) + (env->mmuregs[2] << 4);
418 425
    pde = ldl_phys(pde_ptr);
419
    printf("Root ptr: 0x%08x, ctx: %d\n", env->mmuregs[1] << 4, env->mmuregs[2]);
426
    printf("Root ptr: " TARGET_FMT_lx ", ctx: %d\n", env->mmuregs[1] << 4, env->mmuregs[2]);
420 427
    for (n = 0, va = 0; n < 256; n++, va += 16 * 1024 * 1024) {
421 428
	pde_ptr = mmu_probe(va, 2);
422 429
	if (pde_ptr) {
423 430
	    pa = cpu_get_phys_page_debug(env, va);
424
	    printf("VA: 0x%08x, PA: 0x%08x PDE: 0x%08x\n", va, pa, pde_ptr);
431
 	    printf("VA: " TARGET_FMT_lx ", PA: " TARGET_FMT_lx " PDE: " TARGET_FMT_lx "\n", va, pa, pde_ptr);
425 432
	    for (m = 0, va1 = va; m < 64; m++, va1 += 256 * 1024) {
426 433
		pde_ptr = mmu_probe(va1, 1);
427 434
		if (pde_ptr) {
428 435
		    pa = cpu_get_phys_page_debug(env, va1);
429
		    printf(" VA: 0x%08x, PA: 0x%08x PDE: 0x%08x\n", va1, pa, pde_ptr);
436
 		    printf(" VA: " TARGET_FMT_lx ", PA: " TARGET_FMT_lx " PDE: " TARGET_FMT_lx "\n", va1, pa, pde_ptr);
430 437
		    for (o = 0, va2 = va1; o < 64; o++, va2 += 4 * 1024) {
431 438
			pde_ptr = mmu_probe(va2, 0);
432 439
			if (pde_ptr) {
433 440
			    pa = cpu_get_phys_page_debug(env, va2);
434
			    printf("  VA: 0x%08x, PA: 0x%08x PTE: 0x%08x\n", va2, pa, pde_ptr);
441
 			    printf("  VA: " TARGET_FMT_lx ", PA: " TARGET_FMT_lx " PTE: " TARGET_FMT_lx "\n", va2, pa, pde_ptr);
435 442
			}
436 443
		    }
437 444
		}
b/target-sparc/op.c
217 217

  
218 218
#define EIP (env->pc)
219 219

  
220
#define FLAG_SET(x) (env->psr&x)?1:0
220
#define FLAG_SET(x) ((env->psr&x)?1:0)
221 221
#define FFLAG_SET(x) ((env->fsr&x)?1:0)
222 222

  
223 223
void OPPROTO op_movl_T0_0(void)
......
225 225
    T0 = 0;
226 226
}
227 227

  
228
void OPPROTO op_movl_T0_1(void)
229
{
230
    T0 = 1;
231
}
232

  
233 228
void OPPROTO op_movl_T0_im(void)
234 229
{
235 230
    T0 = PARAM1;
......
245 240
    T2 = PARAM1;
246 241
}
247 242

  
248
void OPPROTO op_addl_T1_im(void)
243
void OPPROTO op_add_T1_T0(void)
249 244
{
250
    T1 += PARAM1;
245
    T0 += T1;
251 246
}
252 247

  
253
void OPPROTO op_addl_T1_T2(void)
248
void OPPROTO op_add_T1_T0_cc(void)
254 249
{
255
    T1 += T2;
256
}
250
    target_ulong src1;
257 251

  
258
void OPPROTO op_subl_T1_T2(void)
259
{
260
    T1 -= T2;
252
    src1 = T0;
253
    T0 += T1;
254
    env->psr = 0;
255
    if (!T0)
256
	env->psr |= PSR_ZERO;
257
    if ((int32_t) T0 < 0)
258
	env->psr |= PSR_NEG;
259
    if (T0 < src1)
260
	env->psr |= PSR_CARRY;
261
    if (((src1 ^ T1 ^ -1) & (src1 ^ T0)) & (1 << 31))
262
	env->psr |= PSR_OVF;
263
    /* V9 xcc */
264
    FORCE_RET();
261 265
}
262 266

  
263
void OPPROTO op_add_T1_T0(void)
267
void OPPROTO op_addx_T1_T0(void)
264 268
{
265
    T0 += T1;
269
    T0 += T1 + FLAG_SET(PSR_CARRY);
266 270
}
267 271

  
268
void OPPROTO op_add_T1_T0_cc(void)
272
void OPPROTO op_addx_T1_T0_cc(void)
269 273
{
270
    unsigned int src1;
274
    target_ulong src1;
275

  
271 276
    src1 = T0;
272
    T0 += T1;
277
    T0 += T1 + FLAG_SET(PSR_CARRY);
273 278
    env->psr = 0;
274 279
    if (!T0)
275 280
	env->psr |= PSR_ZERO;
276
    if ((int) T0 < 0)
281
    if ((int32_t) T0 < 0)
277 282
	env->psr |= PSR_NEG;
278 283
    if (T0 < src1)
279 284
	env->psr |= PSR_CARRY;
280 285
    if (((src1 ^ T1 ^ -1) & (src1 ^ T0)) & (1 << 31))
281 286
	env->psr |= PSR_OVF;
287
    /* V9 xcc */
282 288
    FORCE_RET();
283 289
}
284 290

  
......
289 295

  
290 296
void OPPROTO op_sub_T1_T0_cc(void)
291 297
{
292
    unsigned int src1;
298
    target_ulong src1;
293 299

  
294 300
    src1 = T0;
295 301
    T0 -= T1;
296 302
    env->psr = 0;
297 303
    if (!T0)
298 304
	env->psr |= PSR_ZERO;
299
    if ((int) T0 < 0)
305
    if ((int32_t) T0 < 0)
300 306
	env->psr |= PSR_NEG;
301 307
    if (src1 < T1)
302 308
	env->psr |= PSR_CARRY;
303 309
    if (((src1 ^ T1) & (src1 ^ T0)) & (1 << 31))
304 310
	env->psr |= PSR_OVF;
311
    /* V9 xcc */
312
    FORCE_RET();
313
}
314

  
315
void OPPROTO op_subx_T1_T0(void)
316
{
317
    T0 -= T1 + FLAG_SET(PSR_CARRY);
318
}
319

  
320
void OPPROTO op_subx_T1_T0_cc(void)
321
{
322
    target_ulong src1;
323

  
324
    src1 = T0;
325
    T0 -= T1 + FLAG_SET(PSR_CARRY);
326
    env->psr = 0;
327
    if (!T0)
328
	env->psr |= PSR_ZERO;
329
    if ((int32_t) T0 < 0)
330
	env->psr |= PSR_NEG;
331
    if (src1 < T1)
332
	env->psr |= PSR_CARRY;
333
    if (((src1 ^ T1) & (src1 ^ T0)) & (1 << 31))
334
	env->psr |= PSR_OVF;
335
    /* V9 xcc */
305 336
    FORCE_RET();
306 337
}
307 338

  
......
335 366
    T0 ^= ~T1;
336 367
}
337 368

  
338
void OPPROTO op_addx_T1_T0(void)
339
{
340
    T0 += T1 + ((env->psr & PSR_CARRY) ? 1 : 0);
341
}
342

  
343 369
void OPPROTO op_umul_T1_T0(void)
344 370
{
345 371
    uint64_t res;
346
    res = (uint64_t) T0 *(uint64_t) T1;
372
    res = (uint64_t) T0 * (uint64_t) T1;
347 373
    T0 = res & 0xffffffff;
348 374
    env->y = res >> 32;
349 375
}
......
358 384

  
359 385
void OPPROTO op_mulscc_T1_T0(void)
360 386
{
361
    unsigned int b1, N, V, b2, src1;
387
    unsigned int b1, N, V, b2;
388
    target_ulong src1;
389

  
362 390
    N = FLAG_SET(PSR_NEG);
363 391
    V = FLAG_SET(PSR_OVF);
364 392
    b1 = N ^ V;
......
372 400
    env->psr = 0;
373 401
    if (!T0)
374 402
	env->psr |= PSR_ZERO;
375
    if ((int) T0 < 0)
403
    if ((int32_t) T0 < 0)
376 404
	env->psr |= PSR_NEG;
377 405
    if (T0 < src1)
378 406
	env->psr |= PSR_CARRY;
......
405 433
    int64_t x0;
406 434
    int32_t x1;
407 435

  
408
    x0 = T0 | ((uint64_t) (env->y) << 32);
436
    x0 = T0 | ((int64_t) (env->y) << 32);
409 437
    x1 = T1;
410 438
    x0 = x0 / x1;
411 439
    if ((int32_t) x0 != x0) {
412
	T0 = x0 >> 63;
440
	T0 = x0 < 0? 0x80000000: 0x7fffffff;
413 441
	T1 = 1;
414 442
    } else {
415 443
	T0 = x0;
......
423 451
    env->psr = 0;
424 452
    if (!T0)
425 453
	env->psr |= PSR_ZERO;
426
    if ((int) T0 < 0)
454
    if ((int32_t) T0 < 0)
427 455
	env->psr |= PSR_NEG;
428 456
    if (T1)
429 457
	env->psr |= PSR_OVF;
458
    /* V9 xcc */
430 459
    FORCE_RET();
431 460
}
432 461

  
433
void OPPROTO op_subx_T1_T0(void)
434
{
435
    T0 -= T1 + ((env->psr & PSR_CARRY) ? 1 : 0);
436
}
437

  
438 462
void OPPROTO op_logic_T0_cc(void)
439 463
{
440 464
    env->psr = 0;
441 465
    if (!T0)
442 466
	env->psr |= PSR_ZERO;
443
    if ((int) T0 < 0)
444
	env->psr |= PSR_NEG;
445
    FORCE_RET();
446
}
447

  
448
void OPPROTO op_set_flags(void)
449
{
450
    env->psr = 0;
451
    if (!T0)
452
	env->psr |= PSR_ZERO;
453
    if ((unsigned int) T0 < (unsigned int) T1)
454
	env->psr |= PSR_CARRY;
455
    if ((int) T0 < (int) T1)
456
	env->psr |= PSR_OVF;
457
    if ((int) T0 < 0)
467
    if ((int32_t) T0 < 0)
458 468
	env->psr |= PSR_NEG;
469
    /* V9 xcc */
459 470
    FORCE_RET();
460 471
}
461 472

  
......
519 530

  
520 531
void OPPROTO op_rdpsr(void)
521 532
{
522
    T0 = GET_PSR(env);
533
    do_rdpsr();
523 534
}
524 535

  
525 536
void OPPROTO op_wrpsr(void)
526 537
{
527
    PUT_PSR(env,T0);
538
    do_wrpsr();
528 539
    FORCE_RET();
529 540
}
530 541

  
......
555 566
   handling ? */
556 567
void OPPROTO op_save(void)
557 568
{
558
    int cwp;
569
    uint32_t cwp;
559 570
    cwp = (env->cwp - 1) & (NWINDOWS - 1); 
560 571
    if (env->wim & (1 << cwp)) {
561 572
        raise_exception(TT_WIN_OVF);
......
566 577

  
567 578
void OPPROTO op_restore(void)
568 579
{
569
    int cwp;
580
    uint32_t cwp;
570 581
    cwp = (env->cwp + 1) & (NWINDOWS - 1); 
571 582
    if (env->wim & (1 << cwp)) {
572 583
        raise_exception(TT_WIN_UNF);
......
626 637

  
627 638
void OPPROTO op_eval_be(void)
628 639
{
629
    T2 = (env->psr & PSR_ZERO);
640
    T2 = FLAG_SET(PSR_ZERO);
630 641
}
631 642

  
632 643
void OPPROTO op_eval_ble(void)
633 644
{
634
    unsigned int Z = FLAG_SET(PSR_ZERO), N = FLAG_SET(PSR_NEG), V = FLAG_SET(PSR_OVF);
645
    target_ulong Z = FLAG_SET(PSR_ZERO), N = FLAG_SET(PSR_NEG), V = FLAG_SET(PSR_OVF);
635 646
    
636 647
    T2 = Z | (N ^ V);
637 648
}
638 649

  
639 650
void OPPROTO op_eval_bl(void)
640 651
{
641
    unsigned int N = FLAG_SET(PSR_NEG), V = FLAG_SET(PSR_OVF);
652
    target_ulong N = FLAG_SET(PSR_NEG), V = FLAG_SET(PSR_OVF);
642 653

  
643 654
    T2 = N ^ V;
644 655
}
645 656

  
646 657
void OPPROTO op_eval_bleu(void)
647 658
{
648
    unsigned int Z = FLAG_SET(PSR_ZERO), C = FLAG_SET(PSR_CARRY);
659
    target_ulong Z = FLAG_SET(PSR_ZERO), C = FLAG_SET(PSR_CARRY);
649 660

  
650 661
    T2 = C | Z;
651 662
}
652 663

  
653 664
void OPPROTO op_eval_bcs(void)
654 665
{
655
    T2 = (env->psr & PSR_CARRY);
666
    T2 = FLAG_SET(PSR_CARRY);
656 667
}
657 668

  
658 669
void OPPROTO op_eval_bvs(void)
659 670
{
660
    T2 = (env->psr & PSR_OVF);
671
    T2 = FLAG_SET(PSR_OVF);
661 672
}
662 673

  
663 674
void OPPROTO op_eval_bneg(void)
664 675
{
665
    T2 = (env->psr & PSR_NEG);
676
    T2 = FLAG_SET(PSR_NEG);
666 677
}
667 678

  
668 679
void OPPROTO op_eval_bne(void)
669 680
{
670
    T2 = !(env->psr & PSR_ZERO);
681
    T2 = !FLAG_SET(PSR_ZERO);
671 682
}
672 683

  
673 684
void OPPROTO op_eval_bg(void)
674 685
{
675
    unsigned int Z = FLAG_SET(PSR_ZERO), N = FLAG_SET(PSR_NEG), V = FLAG_SET(PSR_OVF);
686
    target_ulong Z = FLAG_SET(PSR_ZERO), N = FLAG_SET(PSR_NEG), V = FLAG_SET(PSR_OVF);
676 687

  
677 688
    T2 = !(Z | (N ^ V));
678 689
}
679 690

  
680 691
void OPPROTO op_eval_bge(void)
681 692
{
682
    unsigned int N = FLAG_SET(PSR_NEG), V = FLAG_SET(PSR_OVF);
693
    target_ulong N = FLAG_SET(PSR_NEG), V = FLAG_SET(PSR_OVF);
683 694

  
684 695
    T2 = !(N ^ V);
685 696
}
686 697

  
687 698
void OPPROTO op_eval_bgu(void)
688 699
{
689
    unsigned int Z = FLAG_SET(PSR_ZERO), C = FLAG_SET(PSR_CARRY);
700
    target_ulong Z = FLAG_SET(PSR_ZERO), C = FLAG_SET(PSR_CARRY);
690 701

  
691 702
    T2 = !(C | Z);
692 703
}
693 704

  
694 705
void OPPROTO op_eval_bcc(void)
695 706
{
696
    T2 = !(env->psr & PSR_CARRY);
707
    T2 = !FLAG_SET(PSR_CARRY);
697 708
}
698 709

  
699 710
void OPPROTO op_eval_bpos(void)
700 711
{
701
    T2 = !(env->psr & PSR_NEG);
712
    T2 = !FLAG_SET(PSR_NEG);
702 713
}
703 714

  
704 715
void OPPROTO op_eval_bvc(void)
705 716
{
706
    T2 = !(env->psr & PSR_OVF);
717
    T2 = !FLAG_SET(PSR_OVF);
707 718
}
708 719

  
709 720
/* FCC1:FCC0: 0 =, 1 <, 2 >, 3 u */
......
792 803
    T2 = !(FFLAG_SET(FSR_FCC0) & FFLAG_SET(FSR_FCC1));
793 804
}
794 805

  
795
void OPPROTO op_movl_T2_0(void)
796
{
797
    T2 = 0;
798
}
799

  
800
void OPPROTO op_movl_T2_1(void)
801
{
802
    T2 = 1;
803
}
804

  
805 806
void OPPROTO op_jmp_im(void)
806 807
{
807 808
    env->pc = PARAM1;
......
845 846
{
846 847
    if (T2) {
847 848
	env->npc = PARAM2; /* XXX: optimize */
848
        JUMP_TB(op_generic_branch_a, PARAM1, 0, PARAM3);
849
        JUMP_TB(op_branch_a, PARAM1, 0, PARAM3);
849 850
    } else {
850 851
	env->npc = PARAM3 + 8; /* XXX: optimize */
851
        JUMP_TB(op_generic_branch_a, PARAM1, 1, PARAM3 + 4);
852
        JUMP_TB(op_branch_a, PARAM1, 1, PARAM3 + 4);
852 853
    }
853 854
    FORCE_RET();
854 855
}
b/target-sparc/op_helper.c
209 209

  
210 210
void helper_rett()
211 211
{
212
    int cwp;
212
    unsigned int cwp;
213

  
213 214
    env->psret = 1;
214 215
    cwp = (env->cwp + 1) & (NWINDOWS - 1); 
215 216
    if (env->wim & (1 << cwp)) {
......
255 256
    env->exception_index = EXCP_DEBUG;
256 257
    cpu_loop_exit();
257 258
}
259

  
260
void do_wrpsr()
261
{
262
    PUT_PSR(env, T0);
263
}
264

  
265
void do_rdpsr()
266
{
267
    T0 = GET_PSR(env);
268
}
b/target-sparc/op_mem.h
36 36

  
37 37
void OPPROTO glue(op_swap, MEMSUFFIX)(void)
38 38
{
39
    unsigned int tmp = glue(ldl, MEMSUFFIX)(T0);
39
    target_ulong tmp = glue(ldl, MEMSUFFIX)(T0);
40 40
    glue(stl, MEMSUFFIX)(T0, T1);       /* XXX: Should be Atomically */
41 41
    T1 = tmp;
42 42
}
b/target-sparc/translate.c
423 423

  
424 424
static inline void save_state(DisasContext * dc)
425 425
{
426
    gen_op_jmp_im((uint32_t)dc->pc);
426
    gen_op_jmp_im(dc->pc);
427 427
    save_npc(dc);
428 428
}
429 429

  
430 430
static void gen_cond(int cond)
431 431
{
432 432
	switch (cond) {
433
        case 0x0:
434
            gen_op_movl_T2_0();
435
            break;
436 433
	case 0x1:
437 434
	    gen_op_eval_be();
438 435
	    break;
......
454 451
	case 0x7:
455 452
	    gen_op_eval_bvs();
456 453
	    break;
457
        case 0x8:
458
            gen_op_movl_T2_1();
459
            break;
460 454
	case 0x9:
461 455
	    gen_op_eval_bne();
462 456
	    break;
......
485 479
static void gen_fcond(int cond)
486 480
{
487 481
	switch (cond) {
488
        case 0x0:
489
            gen_op_movl_T2_0();
490
            break;
491 482
	case 0x1:
492 483
	    gen_op_eval_fbne();
493 484
	    break;
......
509 500
	case 0x7:
510 501
	    gen_op_eval_fbu();
511 502
	    break;
512
        case 0x8:
513
            gen_op_movl_T2_1();
514
            break;
515 503
	case 0x9:
516 504
	    gen_op_eval_fbe();
517 505
	    break;
......
537 525
	}
538 526
}
539 527

  
540
static void do_branch(DisasContext * dc, uint32_t target, uint32_t insn)
528
static void do_branch(DisasContext * dc, int32_t offset, uint32_t insn)
541 529
{
542 530
    unsigned int cond = GET_FIELD(insn, 3, 6), a = (insn & (1 << 29));
543
    target += (uint32_t) dc->pc;
531
    target_ulong target = dc->pc + offset;
532

  
544 533
    if (cond == 0x0) {
545 534
	/* unconditional not taken */
546 535
	if (a) {
......
574 563
    }
575 564
}
576 565

  
577
static void do_fbranch(DisasContext * dc, uint32_t target, uint32_t insn)
566
static void do_fbranch(DisasContext * dc, int32_t offset, uint32_t insn)
578 567
{
579 568
    unsigned int cond = GET_FIELD(insn, 3, 6), a = (insn & (1 << 29));
580
    target += (uint32_t) dc->pc;
569
    target_ulong target = dc->pc + offset;
570

  
581 571
    if (cond == 0x0) {
582 572
	/* unconditional not taken */
583 573
	if (a) {
......
611 601
    }
612 602
}
613 603

  
614
#if 0
615
static void gen_debug(DisasContext *s, uint32_t pc)
616
{
617
    gen_op_jmp_im(pc);
618
    gen_op_debug();
619
    s->is_br = 1;
620
}
621
#endif
622

  
623 604
#define GET_FIELDs(x,a,b) sign_extend (GET_FIELD(x,a,b), (b) - (a) + 1)
624 605

  
625 606
static int sign_extend(int x, int len)
......
640 621
    case 0:			/* branches/sethi */
641 622
	{
642 623
	    unsigned int xop = GET_FIELD(insn, 7, 9);
643
	    int target;
624
	    int32_t target;
644 625
	    target = GET_FIELD(insn, 10, 31);
645 626
	    switch (xop) {
646
	    case 0x0:
647
	    case 0x1:		/* UNIMPL */
648
	    case 0x5:		/*CBN+x */
627
	    case 0x0:		/* UNIMPL */
628
	    case 0x1:		/* V9 BPcc */
629
	    case 0x3:		/* V9 BPr */
630
	    case 0x5:		/* V9 FBPcc */
649 631
	    default:
650 632
                goto illegal_insn;
651 633
	    case 0x2:		/* BN+x */
......
679 661
	    }
680 662
	    break;
681 663
	}
664
	break;
682 665
    case 1:
683 666
	/*CALL*/ {
684
	    unsigned int target = GET_FIELDs(insn, 2, 31) << 2;
667
	    target_long target = GET_FIELDs(insn, 2, 31) << 2;
685 668

  
686
	    gen_op_movl_T0_im((long) (dc->pc));
669
	    gen_op_movl_T0_im(dc->pc);
687 670
	    gen_movl_T0_reg(15);
688
	    target = dc->pc + target;
671
	    target += dc->pc;
689 672
	    dc->pc = dc->npc;
690 673
	    dc->npc = target;
691 674
	}
......
719 702
#endif
720 703
                }
721 704
                save_state(dc);
705
		/* V9 icc/xcc */
722 706
                cond = GET_FIELD(insn, 3, 6);
723 707
                if (cond == 0x8) {
724 708
                    gen_op_trap_T0();
725 709
                    dc->is_br = 1;
726 710
                    goto jmp_insn;
727
                } else {
711
                } else if (cond != 0) {
728 712
		    gen_cond(cond);
729 713
                    gen_op_trapcc_T0();
730 714
                }
......
735 719
                    gen_op_rdy();
736 720
                    gen_movl_T0_reg(rd);
737 721
                    break;
738
                case 15: /* stbar */
722
                case 15: /* stbar / V9 membar */
739 723
		    break; /* no effect? */
740 724
                default:
725
		case 0x2: /* V9 rdccr */
726
		case 0x3: /* V9 rdasi */
727
		case 0x4: /* V9 rdtick */
728
		case 0x5: /* V9 rdpc */
729
		case 0x6: /* V9 rdfprs */
741 730
                    goto illegal_insn;
742 731
                }
743 732
#if !defined(CONFIG_USER_ONLY)
......
901 890
		    case 0xd3: /* fqtoi */
902 891
		        goto nfpu_insn;
903 892
		    default:
893
		    case 0x2: /* V9 fmovd */
894
		    case 0x6: /* V9 fnegd */
895
		    case 0xa: /* V9 fabsd */
896
		    case 0x81: /* V9 fstox */
897
		    case 0x82: /* V9 fdtox */
898
		    case 0x84: /* V9 fxtos */
899
		    case 0x88: /* V9 fxtod */
900

  
901
		    case 0x3: /* V9 fmovq */
902
		    case 0x7: /* V9 fnegq */
903
		    case 0xb: /* V9 fabsq */
904
		    case 0x83: /* V9 fqtox */
905
		    case 0x8c: /* V9 fxtoq */
904 906
                	goto illegal_insn;
905 907
		}
906 908
	    } else if (xop == 0x35) {	/* FPU Operations */
......
910 912
                rs1 = GET_FIELD(insn, 13, 17);
911 913
	        rs2 = GET_FIELD(insn, 27, 31);
912 914
	        xop = GET_FIELD(insn, 18, 26);
915
		/* V9 fmovscc: x5, cond = x >> 1 */
916
		/* V9 fmovdcc: x6, cond = x >> 1 */
917

  
918
		/* V9 fmovqcc: x7, cond = x >> 1 */
913 919
		switch (xop) {
914 920
		    case 0x51:
915 921
                	gen_op_load_fpr_FT0(rs1);
......
1028 1034
                            gen_op_logic_T0_cc();
1029 1035
                        break;
1030 1036
                    case 0x8:
1031
                        gen_op_addx_T1_T0();
1032 1037
                        if (xop & 0x10)
1033
                            gen_op_set_flags();
1038
                            gen_op_addx_T1_T0_cc();
1039
                        else
1040
                            gen_op_addx_T1_T0();
1034 1041
                        break;
1035 1042
                    case 0xa:
1036 1043
                        gen_op_umul_T1_T0();
......
1043 1050
                            gen_op_logic_T0_cc();
1044 1051
                        break;
1045 1052
                    case 0xc:
1046
                        gen_op_subx_T1_T0();
1047 1053
                        if (xop & 0x10)
1048
                            gen_op_set_flags();
1054
                            gen_op_subx_T1_T0_cc();
1055
                        else
1056
                            gen_op_subx_T1_T0();
1049 1057
                        break;
1050 1058
                    case 0xe:
1051 1059
                        gen_op_udiv_T1_T0();
......
1058 1066
                            gen_op_div_cc();
1059 1067
                        break;
1060 1068
                    default:
1069
		    case 0x9: /* V9 mulx */
1070
		    case 0xd: /* V9 udivx */
1061 1071
                        goto illegal_insn;
1062 1072
                    }
1063 1073
		    gen_movl_T0_reg(rd);
......
1072 1082
                        gen_op_mulscc_T1_T0();
1073 1083
                        gen_movl_T0_reg(rd);
1074 1084
                        break;
1075
                    case 0x25:	/* SLL */
1085
                    case 0x25:	/* sll, V9 sllx */
1076 1086
                        gen_op_sll();
1077 1087
                        gen_movl_T0_reg(rd);
1078 1088
                        break;
1079
                    case 0x26:
1089
                    case 0x26:  /* srl, V9 srlx */
1080 1090
                        gen_op_srl();
1081 1091
                        gen_movl_T0_reg(rd);
1082 1092
                        break;
1083
                    case 0x27:
1093
                    case 0x27:  /* sra, V9 srax */
1084 1094
                        gen_op_sra();
1085 1095
                        gen_movl_T0_reg(rd);
1086 1096
                        break;
......
1092 1102
                                gen_op_wry();
1093 1103
                                break;
1094 1104
                            default:
1105
			    case 0x2: /* V9 wrccr */
1106
			    case 0x3: /* V9 wrasi */
1107
			    case 0x6: /* V9 wrfprs */
1108
			    case 0xf: /* V9 sir */
1095 1109
                                goto illegal_insn;
1096 1110
                            }
1097 1111
                        }
1098 1112
                        break;
1099 1113
#if !defined(CONFIG_USER_ONLY)
1100
                    case 0x31:
1114
                    case 0x31: /* wrpsr, V9 saved, restored */
1101 1115
                        {
1102 1116
			    if (!supervisor(dc))
1103 1117
				goto priv_insn;
......
1105 1119
                            gen_op_wrpsr();
1106 1120
                        }
1107 1121
                        break;
1108
                    case 0x32:
1122
                    case 0x32: /* wrwim, V9 wrpr */
1109 1123
                        {
1110 1124
			    if (!supervisor(dc))
1111 1125
				goto priv_insn;
......
1123 1137
                        break;
1124 1138
#endif
1125 1139
		    default:
1140
		    case 0x2a: /* V9 rdpr */
1141
		    case 0x2b: /* V9 flushw */
1142
		    case 0x2c: /* V9 movcc */
1143
		    case 0x2d: /* V9 sdivx */
1144
		    case 0x2e: /* V9 popc */
1145
		    case 0x2f: /* V9 movr */
1126 1146
			goto illegal_insn;
1127 1147
		    }
1128 1148
		}
......
1155 1175
		    {
1156 1176
			gen_op_movl_npc_T0();
1157 1177
			if (rd != 0) {
1158
			    gen_op_movl_T0_im((long) (dc->pc));
1178
			    gen_op_movl_T0_im(dc->pc);
1159 1179
			    gen_movl_T0_reg(rd);
1160 1180
			}
1161 1181
			dc->pc = dc->npc;
......
1163 1183
		    }
1164 1184
		    goto jmp_insn;
1165 1185
#if !defined(CONFIG_USER_ONLY)
1166
		case 0x39:	/* rett */
1186
		case 0x39:	/* rett, V9 return */
1167 1187
		    {
1168 1188
			if (!supervisor(dc))
1169 1189
			    goto priv_insn;
......
1186 1206
		    gen_movl_T0_reg(rd);
1187 1207
		    break;
1188 1208
		default:
1209
		case 0x3e:      /* V9 done/retry */
1189 1210
		    goto illegal_insn;
1190 1211
		}
1191 1212
            }
1192 1213
	    break;
1193 1214
	}
1215
	break;
1194 1216
    case 3:			/* load/store instructions */
1195 1217
	{
1196 1218
	    unsigned int xop = GET_FIELD(insn, 7, 12);
......
1297 1319
                    (void) &gen_op_lddfa;
1298 1320
#endif
1299 1321
		default:
1322
		case 0x08: /* V9 ldsw */
1323
		case 0x0b: /* V9 ldx */
1324
		case 0x18: /* V9 ldswa */
1325
		case 0x1b: /* V9 ldxa */
1326
		case 0x2d: /* V9 prefetch */
1327
		case 0x30: /* V9 ldfa */
1328
		case 0x33: /* V9 lddfa */
1329
		case 0x3d: /* V9 prefetcha */
1330

  
1331
		case 0x32: /* V9 ldqfa */
1300 1332
		    goto illegal_insn;
1301 1333
		}
1302 1334
		gen_movl_T1_reg(rd);
......
1313 1345
		    gen_op_ldfsr();
1314 1346
		    gen_op_store_FT0_fpr(rd);
1315 1347
		    break;
1348
		case 0x22:      /* load quad fpreg */
1349
		    goto nfpu_insn;
1316 1350
		case 0x23:	/* load double fpreg */
1317 1351
		    gen_op_ldst(lddf);
1318 1352
		    gen_op_store_DT0_fpr(rd);
......
1362 1396
		    break;
1363 1397
#endif
1364 1398
		default:
1399
		case 0x0e: /* V9 stx */
1400
		case 0x1e: /* V9 stxa */
1365 1401
		    goto illegal_insn;
1366 1402
		}
1367 1403
	    } else if (xop > 0x23 && xop < 0x28) {
......
1373 1409
                    gen_op_load_fpr_FT0(rd);
1374 1410
		    gen_op_ldst(stf);
1375 1411
		    break;
1376
		case 0x25:
1412
		case 0x25: /* stfsr, V9 stxfsr */
1377 1413
                    gen_op_load_fpr_FT0(rd);
1378 1414
		    gen_op_stfsr();
1379 1415
		    break;
1416
		case 0x26: /* stdfq */
1417
		    goto nfpu_insn;
1380 1418
		case 0x27:
1381 1419
                    gen_op_load_fpr_DT0(rd);
1382 1420
		    gen_op_ldst(stdf);
1383 1421
		    break;
1384
		case 0x26: /* stdfq */
1385 1422
		default:
1423
		case 0x34: /* V9 stfa */
1424
		case 0x37: /* V9 stdfa */
1425
		case 0x3c: /* V9 casa */
1426
		case 0x3e: /* V9 casxa */
1427

  
1428
		case 0x36: /* V9 stqfa */
1386 1429
		    goto illegal_insn;
1387 1430
		}
1388 1431
	    } else if (xop > 0x33 && xop < 0x38) {
......
1392 1435
	    else
1393 1436
		goto illegal_insn;
1394 1437
	}
1438
	break;
1395 1439
    }
1396 1440
    /* default case for non jump instructions */
1397 1441
    if (dc->npc == DYNAMIC_PC) {
......
1589 1633
{
1590 1634
    int i, x;
1591 1635

  
1592
    cpu_fprintf(f, "pc: 0x%08x  npc: 0x%08x\n", (int) env->pc, (int) env->npc);
1636
    cpu_fprintf(f, "pc: " TARGET_FMT_lx "  npc: " TARGET_FMT_lx "\n", env->pc, env->npc);
1593 1637
    cpu_fprintf(f, "General Registers:\n");
1594 1638
    for (i = 0; i < 4; i++)
1595
	cpu_fprintf(f, "%%g%c: 0x%08x\t", i + '0', env->gregs[i]);
1639
	cpu_fprintf(f, "%%g%c: " TARGET_FMT_lx "\t", i + '0', env->gregs[i]);
1596 1640
    cpu_fprintf(f, "\n");
1597 1641
    for (; i < 8; i++)
1598
	cpu_fprintf(f, "%%g%c: 0x%08x\t", i + '0', env->gregs[i]);
1642
	cpu_fprintf(f, "%%g%c: " TARGET_FMT_lx "\t", i + '0', env->gregs[i]);
1599 1643
    cpu_fprintf(f, "\nCurrent Register Window:\n");
1600 1644
    for (x = 0; x < 3; x++) {
1601 1645
	for (i = 0; i < 4; i++)
1602
	    cpu_fprintf(f, "%%%c%d: 0x%08x\t",
1646
	    cpu_fprintf(f, "%%%c%d: " TARGET_FMT_lx "\t",
1603 1647
		    (x == 0 ? 'o' : (x == 1 ? 'l' : 'i')), i,
1604 1648
		    env->regwptr[i + x * 8]);
1605 1649
	cpu_fprintf(f, "\n");
1606 1650
	for (; i < 8; i++)
1607
	    cpu_fprintf(f, "%%%c%d: 0x%08x\t",
1651
	    cpu_fprintf(f, "%%%c%d: " TARGET_FMT_lx "\t",
1608 1652
		    (x == 0 ? 'o' : x == 1 ? 'l' : 'i'), i,
1609 1653
		    env->regwptr[i + x * 8]);
1610 1654
	cpu_fprintf(f, "\n");
......
1626 1670
}
1627 1671

  
1628 1672
#if defined(CONFIG_USER_ONLY)
1629
target_ulong cpu_get_phys_page_debug(CPUState *env, target_ulong addr)
1673
target_phys_addr_t cpu_get_phys_page_debug(CPUState *env, target_ulong addr)
1630 1674
{
1631 1675
    return addr;
1632 1676
}
1633 1677

  
1634 1678
#else
1635
extern int get_physical_address (CPUState *env, uint32_t *physical, int *prot,
1636
                                 int *access_index, uint32_t address, int rw,
1679
extern int get_physical_address (CPUState *env, target_phys_addr_t *physical, int *prot,
1680
                                 int *access_index, target_ulong address, int rw,
1637 1681
                                 int is_user);
1638 1682

  
1639
target_ulong cpu_get_phys_page_debug(CPUState *env, target_ulong addr)
1683
target_phys_addr_t cpu_get_phys_page_debug(CPUState *env, target_ulong addr)
1640 1684
{
1641
    uint32_t phys_addr;
1685
    target_phys_addr_t phys_addr;
1642 1686
    int prot, access_index;
1643 1687

  
1644 1688
    if (get_physical_address(env, &phys_addr, &prot, &access_index, addr, 2, 0) != 0)

Also available in: Unified diff