Revision 53a5960a linux-user/main.c

b/linux-user/main.c
152 152
                     int flags)
153 153
{
154 154
    unsigned int e1, e2;
155
    uint32_t *p;
155 156
    e1 = (addr << 16) | (limit & 0xffff);
156 157
    e2 = ((addr >> 16) & 0xff) | (addr & 0xff000000) | (limit & 0x000f0000);
157 158
    e2 |= flags;
158
    stl((uint8_t *)ptr, e1);
159
    stl((uint8_t *)ptr + 4, e2);
159
    p = ptr;
160
    p[0] = tswapl(e1);
161
    p[1] = tswapl(e2);
160 162
}
161 163

  
162 164
static void set_gate(void *ptr, unsigned int type, unsigned int dpl, 
163 165
                     unsigned long addr, unsigned int sel)
164 166
{
165 167
    unsigned int e1, e2;
168
    uint32_t *p;
166 169
    e1 = (addr & 0xffff) | (sel << 16);
167 170
    e2 = (addr & 0xffff0000) | 0x8000 | (dpl << 13) | (type << 8);
168
    stl((uint8_t *)ptr, e1);
169
    stl((uint8_t *)ptr + 4, e2);
171
    p = ptr;
172
    p[0] = tswapl(e1);
173
    p[1] = tswapl(e2);
170 174
}
171 175

  
172 176
uint64_t gdt_table[6];
......
343 347

  
344 348
                /* we handle the FPU emulation here, as Linux */
345 349
                /* we get the opcode */
346
                opcode = ldl_raw((uint8_t *)env->regs[15]);
350
                opcode = tget32(env->regs[15]);
347 351
                
348 352
                if (EmulateAll(opcode, &ts->fpa, env) == 0) {
349 353
                    info.si_signo = SIGILL;
......
364 368
                /* system call */
365 369
                if (trapnr == EXCP_BKPT) {
366 370
                    if (env->thumb) {
367
                        insn = lduw((void *)(env->regs[15]));
371
                        insn = tget16(env->regs[15]);
368 372
                        n = insn & 0xff;
369 373
                        env->regs[15] += 2;
370 374
                    } else {
371
                        insn = ldl((void *)(env->regs[15]));
375
                        insn = tget32(env->regs[15]);
372 376
                        n = (insn & 0xf) | ((insn >> 4) & 0xff0);
373 377
                        env->regs[15] += 4;
374 378
                    }
375 379
                } else {
376 380
                    if (env->thumb) {
377
                        insn = lduw((void *)(env->regs[15] - 2));
381
                        insn = tget16(env->regs[15] - 2);
378 382
                        n = insn & 0xff;
379 383
                    } else {
380
                        insn = ldl((void *)(env->regs[15] - 4));
384
                        insn = tget32(env->regs[15] - 4);
381 385
                        n = insn & 0xffffff;
382 386
                    }
383 387
                }
......
475 479
static inline void save_window_offset(CPUSPARCState *env, int cwp1)
476 480
{
477 481
    unsigned int i;
478
    uint32_t *sp_ptr;
482
    target_ulong sp_ptr;
479 483
    
480
    sp_ptr = (uint32_t *)(env->regbase[get_reg_index(env, cwp1, 6)]);
484
    sp_ptr = env->regbase[get_reg_index(env, cwp1, 6)];
481 485
#if defined(DEBUG_WIN)
482 486
    printf("win_overflow: sp_ptr=0x%x save_cwp=%d\n", 
483 487
           (int)sp_ptr, cwp1);
484 488
#endif
485 489
    for(i = 0; i < 16; i++) {
486
        put_user(env->regbase[get_reg_index(env, cwp1, 8 + i)], sp_ptr);
487
        sp_ptr++;
490
        tputl(sp_ptr, env->regbase[get_reg_index(env, cwp1, 8 + i)]);
491
        sp_ptr += sizeof(target_ulong);
488 492
    }
489 493
}
490 494

  
......
500 504
static void restore_window(CPUSPARCState *env)
501 505
{
502 506
    unsigned int new_wim, i, cwp1;
503
    uint32_t *sp_ptr, reg;
507
    target_ulong sp_ptr;
504 508
    
505 509
    new_wim = ((env->wim << 1) | (env->wim >> (NWINDOWS - 1))) &
506 510
        ((1LL << NWINDOWS) - 1);
507 511
    
508 512
    /* restore the invalid window */
509 513
    cwp1 = (env->cwp + 1) & (NWINDOWS - 1);
510
    sp_ptr = (uint32_t *)(env->regbase[get_reg_index(env, cwp1, 6)]);
514
    sp_ptr = env->regbase[get_reg_index(env, cwp1, 6)];
511 515
#if defined(DEBUG_WIN)
512 516
    printf("win_underflow: sp_ptr=0x%x load_cwp=%d\n", 
513 517
           (int)sp_ptr, cwp1);
514 518
#endif
515 519
    for(i = 0; i < 16; i++) {
516
        get_user(reg, sp_ptr);
517
        env->regbase[get_reg_index(env, cwp1, 8 + i)] = reg;
518
        sp_ptr++;
520
        env->regbase[get_reg_index(env, cwp1, 8 + i)] = tgetl(sp_ptr);
521
        sp_ptr += sizeof(target_ulong);
519 522
    }
520 523
    env->wim = new_wim;
521 524
}
......
1304 1307
                    if (nb_args >= 5) {
1305 1308
                        sp_reg = env->gpr[29];
1306 1309
                        /* these arguments are taken from the stack */
1307
                        if (get_user(arg5, (target_ulong *)(sp_reg + 16))) {
1308
                            ret = -EFAULT;
1309
                            goto fail;
1310
                        }
1310
                        arg5 = tgetl(sp_reg + 16);
1311 1311
                        if (nb_args >= 6) {
1312
                            if (get_user(arg6, (target_ulong *)(sp_reg + 20))) {
1313
                                ret = -EFAULT;
1314
                                goto fail;
1315
                            }
1312
                            arg6 = tgetl(sp_reg + 20);
1316 1313
                        } else {
1317 1314
                            arg6 = 0;
1318 1315
                        }
......
1347 1344
            {
1348 1345
                uint32_t insn, op;
1349 1346

  
1350
                if (get_user(insn, (uint32_t *)env->PC) < 0)
1351
                    goto sigill;
1347
                insn = tget32(env->PC);
1352 1348
                op = insn >> 26;
1353 1349
                //                printf("insn=%08x op=%02x\n", insn, op);
1354 1350
                /* XXX: totally dummy FP ops just to be able to launch
......
1531 1527
        fprintf(logfile, "entry       0x%08lx\n" , info->entry);
1532 1528
    }
1533 1529

  
1534
    target_set_brk((char *)info->brk);
1530
    target_set_brk(info->brk);
1535 1531
    syscall_init();
1536 1532
    signal_init();
1537 1533

  
......
1566 1562
    env->eip = regs->eip;
1567 1563

  
1568 1564
    /* linux interrupt setup */
1569
    env->idt.base = (long)idt_table;
1565
    env->idt.base = h2g(idt_table);
1570 1566
    env->idt.limit = sizeof(idt_table) - 1;
1571 1567
    set_idt(0, 0);
1572 1568
    set_idt(1, 0);
......
1591 1587
    set_idt(0x80, 3);
1592 1588

  
1593 1589
    /* linux segment setup */
1594
    env->gdt.base = (long)gdt_table;
1590
    env->gdt.base = h2g(gdt_table);
1595 1591
    env->gdt.limit = sizeof(gdt_table) - 1;
1596 1592
    write_dt(&gdt_table[__USER_CS >> 3], 0, 0xfffff,
1597 1593
             DESC_G_MASK | DESC_B_MASK | DESC_P_MASK | DESC_S_MASK | 

Also available in: Unified diff