Revision 40ce0a9a

b/cpu-exec.c
181 181
    flags = (((env->pstate & PS_PEF) >> 1) | ((env->fprs & FPRS_FEF) << 2))
182 182
        | (env->pstate & PS_PRIV) | ((env->lsu & (DMMU_E | IMMU_E)) >> 2);
183 183
#else
184
    // FPU enable . MMU enabled . MMU no-fault . Supervisor
185
    flags = (env->psref << 3) | ((env->mmuregs[0] & (MMU_E | MMU_NF)) << 1)
184
    // FPU enable . MMU Boot . MMU enabled . MMU no-fault . Supervisor
185
    flags = (env->psref << 4) | (((env->mmuregs[0] & MMU_BM) >> 14) << 3)
186
        | ((env->mmuregs[0] & (MMU_E | MMU_NF)) << 1)
186 187
        | env->psrs;
187 188
#endif
188 189
    cs_base = env->npc;
b/hw/sun4m.c
50 50
#define CMDLINE_ADDR         0x007ff000
51 51
#define INITRD_LOAD_ADDR     0x00800000
52 52
#define PROM_SIZE_MAX        (256 * 1024)
53
#define PROM_ADDR	     0xffd00000
53
#define PROM_PADDR           0xff0000000ULL
54
#define PROM_VADDR           0xffd00000
54 55
#define PROM_FILENAME	     "openbios-sparc32"
55 56

  
56 57
#define MAX_CPUS 16
......
425 426
    linux_boot = (kernel_filename != NULL);
426 427

  
427 428
    prom_offset = RAM_size + vram_size;
428
    cpu_register_physical_memory(PROM_ADDR,
429
    cpu_register_physical_memory(PROM_PADDR,
429 430
                                 (PROM_SIZE_MAX + TARGET_PAGE_SIZE - 1) & TARGET_PAGE_MASK,
430 431
                                 prom_offset | IO_MEM_ROM);
431 432

  
432 433
    snprintf(buf, sizeof(buf), "%s/%s", bios_dir, PROM_FILENAME);
433
    ret = load_elf(buf, 0, NULL, NULL, NULL);
434
    ret = load_elf(buf, PROM_PADDR - PROM_VADDR, NULL, NULL, NULL);
434 435
    if (ret < 0) {
435 436
	fprintf(stderr, "qemu: could not load prom '%s'\n",
436 437
		buf);
......
588 589
        cpu_model = "TI SuperSparc II";
589 590
    sun4m_common_init(RAM_size, boot_device, ds, kernel_filename,
590 591
                      kernel_cmdline, initrd_filename, cpu_model,
591
                      1, PROM_ADDR); // XXX prom overlap, actually first 4GB ok
592
                      1, 0xffffffff); // XXX actually first 62GB ok
592 593
}
593 594

  
594 595
QEMUMachine ss5_machine = {
b/target-sparc/cpu.h
145 145
/* MMU */
146 146
#define MMU_E     (1<<0)
147 147
#define MMU_NF    (1<<1)
148
#define MMU_BM    (1<<14)
148 149

  
149 150
#define PTE_ENTRYTYPE_MASK 3
150 151
#define PTE_ACCESS_MASK    0x1c
b/target-sparc/helper.c
110 110
    unsigned long page_offset;
111 111

  
112 112
    virt_addr = address & TARGET_PAGE_MASK;
113

  
113 114
    if ((env->mmuregs[0] & MMU_E) == 0) { /* MMU disabled */
115
        // Boot mode: instruction fetches are taken from PROM
116
        if (rw == 2 && (env->mmuregs[0] & MMU_BM)) {
117
            *physical = 0xff0000000ULL | (address & 0x3ffffULL);
118
            *prot = PAGE_READ | PAGE_EXEC;
119
            return 0;
120
        }
114 121
        *physical = address;
115 122
        *prot = PAGE_READ | PAGE_WRITE | PAGE_EXEC;
116 123
        return 0;
b/target-sparc/op_helper.c
337 337
            oldreg = env->mmuregs[reg];
338 338
            switch(reg) {
339 339
            case 0:
340
                env->mmuregs[reg] &= ~(MMU_E | MMU_NF);
341
                env->mmuregs[reg] |= T1 & (MMU_E | MMU_NF);
340
                env->mmuregs[reg] &= ~(MMU_E | MMU_NF | MMU_BM);
341
                env->mmuregs[reg] |= T1 & (MMU_E | MMU_NF | MMU_BM);
342 342
                // Mappings generated during no-fault mode or MMU
343 343
                // disabled mode are invalid in normal mode
344 344
                if (oldreg != env->mmuregs[reg])
b/target-sparc/translate.c
3486 3486
    env->pstate = PS_PRIV;
3487 3487
    env->pc = 0x1fff0000000ULL;
3488 3488
#else
3489
    env->pc = 0xffd00000;
3489
    env->pc = 0;
3490 3490
    env->mmuregs[0] &= ~(MMU_E | MMU_NF);
3491
    env->mmuregs[0] |= MMU_BM;
3491 3492
#endif
3492 3493
    env->npc = env->pc + 4;
3493 3494
#endif
......
3584 3585
    env->version = def->iu_version;
3585 3586
    env->fsr = def->fpu_version;
3586 3587
#if !defined(TARGET_SPARC64)
3587
    env->mmuregs[0] = def->mmu_version;
3588
    env->mmuregs[0] |= def->mmu_version;
3588 3589
#endif
3589 3590
    return 0;
3590 3591
}

Also available in: Unified diff