Commit e80cfcfc8884400e826328b772971913a14d0f44

Authored by bellard
1 parent 9772c73b

SPARC merge


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1179 c046a42c-6fe2-441c-8c8c-71466251a162

Too many changes to show.

To preserve performance only 24 of 37 files are displayed.

Makefile
@@ -50,7 +50,7 @@ install: all @@ -50,7 +50,7 @@ install: all
50 install -m 644 pc-bios/bios.bin pc-bios/vgabios.bin \ 50 install -m 644 pc-bios/bios.bin pc-bios/vgabios.bin \
51 pc-bios/vgabios-cirrus.bin \ 51 pc-bios/vgabios-cirrus.bin \
52 pc-bios/ppc_rom.bin \ 52 pc-bios/ppc_rom.bin \
53 - pc-bios/proll.bin \ 53 + pc-bios/proll.elf \
54 pc-bios/linux_boot.bin "$(datadir)" 54 pc-bios/linux_boot.bin "$(datadir)"
55 mkdir -p "$(docdir)" 55 mkdir -p "$(docdir)"
56 install -m 644 qemu-doc.html qemu-tech.html "$(docdir)" 56 install -m 644 qemu-doc.html qemu-tech.html "$(docdir)"
@@ -107,7 +107,7 @@ tarbin: @@ -107,7 +107,7 @@ tarbin:
107 $(datadir)/vgabios.bin \ 107 $(datadir)/vgabios.bin \
108 $(datadir)/vgabios-cirrus.bin \ 108 $(datadir)/vgabios-cirrus.bin \
109 $(datadir)/ppc_rom.bin \ 109 $(datadir)/ppc_rom.bin \
110 - $(datadir)/proll.bin \ 110 + $(datadir)/proll.elf \
111 $(datadir)/linux_boot.bin \ 111 $(datadir)/linux_boot.bin \
112 $(docdir)/qemu-doc.html \ 112 $(docdir)/qemu-doc.html \
113 $(docdir)/qemu-tech.html \ 113 $(docdir)/qemu-tech.html \
Makefile.target
@@ -175,6 +175,7 @@ endif @@ -175,6 +175,7 @@ endif
175 175
176 ifeq ($(CONFIG_DARWIN),yes) 176 ifeq ($(CONFIG_DARWIN),yes)
177 OP_CFLAGS+= -mdynamic-no-pic 177 OP_CFLAGS+= -mdynamic-no-pic
  178 +LIBS+=-lmx
178 endif 179 endif
179 180
180 ######################################################### 181 #########################################################
@@ -300,7 +301,7 @@ VL_OBJS+= mc146818rtc.o serial.o i8259.o i8254.o fdc.o m48t59.o @@ -300,7 +301,7 @@ VL_OBJS+= mc146818rtc.o serial.o i8259.o i8254.o fdc.o m48t59.o
300 VL_OBJS+= ppc_prep.o ppc_chrp.o cuda.o adb.o openpic.o mixeng.o 301 VL_OBJS+= ppc_prep.o ppc_chrp.o cuda.o adb.o openpic.o mixeng.o
301 endif 302 endif
302 ifeq ($(TARGET_ARCH), sparc) 303 ifeq ($(TARGET_ARCH), sparc)
303 -VL_OBJS+= sun4m.o tcx.o lance.o iommu.o sched.o m48t08.o magic-load.o timer.o 304 +VL_OBJS+= sun4m.o tcx.o lance.o iommu.o m48t08.o magic-load.o slavio_intctl.o slavio_timer.o slavio_serial.o fdc.o
304 endif 305 endif
305 ifdef CONFIG_GDBSTUB 306 ifdef CONFIG_GDBSTUB
306 VL_OBJS+=gdbstub.o 307 VL_OBJS+=gdbstub.o
cpu-exec.c
@@ -261,7 +261,7 @@ int cpu_exec(CPUState *env1) @@ -261,7 +261,7 @@ int cpu_exec(CPUState *env1)
261 } 261 }
262 #elif defined(TARGET_SPARC) 262 #elif defined(TARGET_SPARC)
263 if (interrupt_request & CPU_INTERRUPT_HARD) { 263 if (interrupt_request & CPU_INTERRUPT_HARD) {
264 - do_interrupt(0, 0, 0, 0, 0); 264 + do_interrupt(env->interrupt_index, 0, 0, 0, 0);
265 env->interrupt_request &= ~CPU_INTERRUPT_HARD; 265 env->interrupt_request &= ~CPU_INTERRUPT_HARD;
266 } else if (interrupt_request & CPU_INTERRUPT_TIMER) { 266 } else if (interrupt_request & CPU_INTERRUPT_TIMER) {
267 //do_interrupt(0, 0, 0, 0, 0); 267 //do_interrupt(0, 0, 0, 0, 0);
@@ -9,9 +9,7 @@ @@ -9,9 +9,7 @@
9 #include "disas.h" 9 #include "disas.h"
10 10
11 /* Filled in by elfload.c. Simplistic, but will do for now. */ 11 /* Filled in by elfload.c. Simplistic, but will do for now. */
12 -unsigned int disas_num_syms;  
13 -void *disas_symtab;  
14 -const char *disas_strtab; 12 +struct syminfo *syminfos = NULL;
15 13
16 /* Get LENGTH bytes from info's buffer, at target address memaddr. 14 /* Get LENGTH bytes from info's buffer, at target address memaddr.
17 Transfer them to myaddr. */ 15 Transfer them to myaddr. */
@@ -203,19 +201,23 @@ const char *lookup_symbol(void *orig_addr) @@ -203,19 +201,23 @@ const char *lookup_symbol(void *orig_addr)
203 { 201 {
204 unsigned int i; 202 unsigned int i;
205 /* Hack, because we know this is x86. */ 203 /* Hack, because we know this is x86. */
206 - Elf32_Sym *sym = disas_symtab;  
207 -  
208 - for (i = 0; i < disas_num_syms; i++) {  
209 - if (sym[i].st_shndx == SHN_UNDEF  
210 - || sym[i].st_shndx >= SHN_LORESERVE)  
211 - continue;  
212 -  
213 - if (ELF_ST_TYPE(sym[i].st_info) != STT_FUNC)  
214 - continue;  
215 -  
216 - if ((long)orig_addr >= sym[i].st_value  
217 - && (long)orig_addr < sym[i].st_value + sym[i].st_size)  
218 - return disas_strtab + sym[i].st_name; 204 + Elf32_Sym *sym;
  205 + struct syminfo *s;
  206 +
  207 + for (s = syminfos; s; s = s->next) {
  208 + sym = s->disas_symtab;
  209 + for (i = 0; i < s->disas_num_syms; i++) {
  210 + if (sym[i].st_shndx == SHN_UNDEF
  211 + || sym[i].st_shndx >= SHN_LORESERVE)
  212 + continue;
  213 +
  214 + if (ELF_ST_TYPE(sym[i].st_info) != STT_FUNC)
  215 + continue;
  216 +
  217 + if ((long)orig_addr >= sym[i].st_value
  218 + && (long)orig_addr < sym[i].st_value + sym[i].st_size)
  219 + return s->disas_strtab + sym[i].st_name;
  220 + }
219 } 221 }
220 return ""; 222 return "";
221 } 223 }
@@ -9,7 +9,11 @@ void monitor_disas(target_ulong pc, int nb_insn, int is_physical, int flags); @@ -9,7 +9,11 @@ void monitor_disas(target_ulong pc, int nb_insn, int is_physical, int flags);
9 const char *lookup_symbol(void *orig_addr); 9 const char *lookup_symbol(void *orig_addr);
10 10
11 /* Filled in by elfload.c. Simplistic, but will do for now. */ 11 /* Filled in by elfload.c. Simplistic, but will do for now. */
12 -extern unsigned int disas_num_syms;  
13 -extern void *disas_symtab; /* FIXME: includes are a mess --RR */  
14 -extern const char *disas_strtab; 12 +extern struct syminfo {
  13 + unsigned int disas_num_syms;
  14 + void *disas_symtab;
  15 + const char *disas_strtab;
  16 + struct syminfo *next;
  17 +} *syminfos;
  18 +
15 #endif /* _QEMU_DISAS_H */ 19 #endif /* _QEMU_DISAS_H */
gdbstub.c
@@ -298,11 +298,7 @@ static int cpu_gdb_read_registers(CPUState *env, uint8_t *mem_buf) @@ -298,11 +298,7 @@ static int cpu_gdb_read_registers(CPUState *env, uint8_t *mem_buf)
298 } 298 }
299 /* Y, PSR, WIM, TBR, PC, NPC, FPSR, CPSR */ 299 /* Y, PSR, WIM, TBR, PC, NPC, FPSR, CPSR */
300 registers[64] = tswapl(env->y); 300 registers[64] = tswapl(env->y);
301 - tmp = (0<<28) | (4<<24) | env->psr \  
302 - | (env->psrs? PSR_S : 0) \  
303 - | (env->psrs? PSR_PS : 0) \  
304 - | (env->psret? PSR_ET : 0) \  
305 - | env->cwp; 301 + tmp = GET_PSR(env);
306 registers[65] = tswapl(tmp); 302 registers[65] = tswapl(tmp);
307 registers[66] = tswapl(env->wim); 303 registers[66] = tswapl(env->wim);
308 registers[67] = tswapl(env->tbr); 304 registers[67] = tswapl(env->tbr);
@@ -317,7 +313,7 @@ static int cpu_gdb_read_registers(CPUState *env, uint8_t *mem_buf) @@ -317,7 +313,7 @@ static int cpu_gdb_read_registers(CPUState *env, uint8_t *mem_buf)
317 313
318 static void cpu_gdb_write_registers(CPUState *env, uint8_t *mem_buf, int size) 314 static void cpu_gdb_write_registers(CPUState *env, uint8_t *mem_buf, int size)
319 { 315 {
320 - uint32_t *registers = (uint32_t *)mem_buf, tmp; 316 + uint32_t *registers = (uint32_t *)mem_buf;
321 int i; 317 int i;
322 318
323 /* fill in g0..g7 */ 319 /* fill in g0..g7 */
@@ -334,12 +330,7 @@ static void cpu_gdb_write_registers(CPUState *env, uint8_t *mem_buf, int size) @@ -334,12 +330,7 @@ static void cpu_gdb_write_registers(CPUState *env, uint8_t *mem_buf, int size)
334 } 330 }
335 /* Y, PSR, WIM, TBR, PC, NPC, FPSR, CPSR */ 331 /* Y, PSR, WIM, TBR, PC, NPC, FPSR, CPSR */
336 env->y = tswapl(registers[64]); 332 env->y = tswapl(registers[64]);
337 - tmp = tswapl(registers[65]);  
338 - env->psr = tmp & ~PSR_ICC;  
339 - env->psrs = (tmp & PSR_S)? 1 : 0;  
340 - env->psrps = (tmp & PSR_PS)? 1 : 0;  
341 - env->psret = (tmp & PSR_ET)? 1 : 0;  
342 - env->cwp = (tmp & PSR_CWP); 333 + PUT_PSR(env, tswapl(registers[65]));
343 env->wim = tswapl(registers[66]); 334 env->wim = tswapl(registers[66]);
344 env->tbr = tswapl(registers[67]); 335 env->tbr = tswapl(registers[67]);
345 env->pc = tswapl(registers[68]); 336 env->pc = tswapl(registers[68]);
@@ -495,8 +486,10 @@ static void gdb_vm_stopped(void *opaque, int reason) @@ -495,8 +486,10 @@ static void gdb_vm_stopped(void *opaque, int reason)
495 /* disable single step if it was enable */ 486 /* disable single step if it was enable */
496 cpu_single_step(cpu_single_env, 0); 487 cpu_single_step(cpu_single_env, 0);
497 488
498 - if (reason == EXCP_DEBUG) 489 + if (reason == EXCP_DEBUG) {
  490 + tb_flush(cpu_single_env);
499 ret = SIGTRAP; 491 ret = SIGTRAP;
  492 + }
500 else 493 else
501 ret = 0; 494 ret = 0;
502 snprintf(buf, sizeof(buf), "S%02x", ret); 495 snprintf(buf, sizeof(buf), "S%02x", ret);
hw/fdc.c
@@ -21,6 +21,10 @@ @@ -21,6 +21,10 @@
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 * THE SOFTWARE. 22 * THE SOFTWARE.
23 */ 23 */
  24 +/*
  25 + * The controller is used in Sun4m systems in a slightly different
  26 + * way. There are changes in DOR register and DMA is not available.
  27 + */
24 #include "vl.h" 28 #include "vl.h"
25 29
26 /********************************************************/ 30 /********************************************************/
@@ -90,6 +94,16 @@ typedef struct fdrive_t { @@ -90,6 +94,16 @@ typedef struct fdrive_t {
90 uint8_t ro; /* Is read-only */ 94 uint8_t ro; /* Is read-only */
91 } fdrive_t; 95 } fdrive_t;
92 96
  97 +#ifdef TARGET_SPARC
  98 +#define DMA_read_memory(a,b,c,d)
  99 +#define DMA_write_memory(a,b,c,d)
  100 +#define DMA_register_channel(a,b,c)
  101 +#define DMA_hold_DREQ(a)
  102 +#define DMA_release_DREQ(a)
  103 +#define DMA_get_channel_mode(a) (0)
  104 +#define DMA_schedule(a)
  105 +#endif
  106 +
93 static void fd_init (fdrive_t *drv, BlockDriverState *bs) 107 static void fd_init (fdrive_t *drv, BlockDriverState *bs)
94 { 108 {
95 /* Drive */ 109 /* Drive */
@@ -455,6 +469,18 @@ static void fdctrl_write (void *opaque, uint32_t reg, uint32_t value) @@ -455,6 +469,18 @@ static void fdctrl_write (void *opaque, uint32_t reg, uint32_t value)
455 } 469 }
456 } 470 }
457 471
  472 +static CPUReadMemoryFunc *fdctrl_mem_read[3] = {
  473 + fdctrl_read,
  474 + fdctrl_read,
  475 + fdctrl_read,
  476 +};
  477 +
  478 +static CPUWriteMemoryFunc *fdctrl_mem_write[3] = {
  479 + fdctrl_write,
  480 + fdctrl_write,
  481 + fdctrl_write,
  482 +};
  483 +
458 static void fd_change_cb (void *opaque) 484 static void fd_change_cb (void *opaque)
459 { 485 {
460 fdrive_t *drv = opaque; 486 fdrive_t *drv = opaque;
@@ -473,7 +499,7 @@ fdctrl_t *fdctrl_init (int irq_lvl, int dma_chann, int mem_mapped, @@ -473,7 +499,7 @@ fdctrl_t *fdctrl_init (int irq_lvl, int dma_chann, int mem_mapped,
473 BlockDriverState **fds) 499 BlockDriverState **fds)
474 { 500 {
475 fdctrl_t *fdctrl; 501 fdctrl_t *fdctrl;
476 -// int io_mem; 502 + int io_mem;
477 int i; 503 int i;
478 504
479 FLOPPY_DPRINTF("init controller\n"); 505 FLOPPY_DPRINTF("init controller\n");
@@ -504,11 +530,8 @@ fdctrl_t *fdctrl_init (int irq_lvl, int dma_chann, int mem_mapped, @@ -504,11 +530,8 @@ fdctrl_t *fdctrl_init (int irq_lvl, int dma_chann, int mem_mapped,
504 fdctrl_reset(fdctrl, 0); 530 fdctrl_reset(fdctrl, 0);
505 fdctrl->state = FD_CTRL_ACTIVE; 531 fdctrl->state = FD_CTRL_ACTIVE;
506 if (mem_mapped) { 532 if (mem_mapped) {
507 - FLOPPY_ERROR("memory mapped floppy not supported by now !\n");  
508 -#if 0  
509 - io_mem = cpu_register_io_memory(0, fdctrl_mem_read, fdctrl_mem_write);  
510 - cpu_register_physical_memory(base, 0x08, io_mem);  
511 -#endif 533 + io_mem = cpu_register_io_memory(0, fdctrl_mem_read, fdctrl_mem_write, fdctrl);
  534 + cpu_register_physical_memory(io_base, 0x08, io_mem);
512 } else { 535 } else {
513 register_ioport_read(io_base + 0x01, 5, 1, &fdctrl_read, fdctrl); 536 register_ioport_read(io_base + 0x01, 5, 1, &fdctrl_read, fdctrl);
514 register_ioport_read(io_base + 0x07, 1, 1, &fdctrl_read, fdctrl); 537 register_ioport_read(io_base + 0x07, 1, 1, &fdctrl_read, fdctrl);
hw/iommu.c
@@ -117,8 +117,6 @@ typedef struct IOMMUState { @@ -117,8 +117,6 @@ typedef struct IOMMUState {
117 uint32_t iostart; 117 uint32_t iostart;
118 } IOMMUState; 118 } IOMMUState;
119 119
120 -static IOMMUState *ps;  
121 -  
122 static uint32_t iommu_mem_readw(void *opaque, target_phys_addr_t addr) 120 static uint32_t iommu_mem_readw(void *opaque, target_phys_addr_t addr)
123 { 121 {
124 IOMMUState *s = opaque; 122 IOMMUState *s = opaque;
@@ -187,25 +185,61 @@ static CPUWriteMemoryFunc *iommu_mem_write[3] = { @@ -187,25 +185,61 @@ static CPUWriteMemoryFunc *iommu_mem_write[3] = {
187 iommu_mem_writew, 185 iommu_mem_writew,
188 }; 186 };
189 187
190 -uint32_t iommu_translate(uint32_t addr) 188 +uint32_t iommu_translate_local(void *opaque, uint32_t addr)
191 { 189 {
192 - uint32_t *iopte = (void *)(ps->regs[1] << 4), pa; 190 + IOMMUState *s = opaque;
  191 + uint32_t *iopte = (void *)(s->regs[1] << 4), pa;
193 192
194 - iopte += ((addr - ps->iostart) >> PAGE_SHIFT);  
195 - cpu_physical_memory_rw((uint32_t)iopte, (void *) &pa, 4, 0); 193 + iopte += ((addr - s->iostart) >> PAGE_SHIFT);
  194 + cpu_physical_memory_read((uint32_t)iopte, (void *) &pa, 4);
196 bswap32s(&pa); 195 bswap32s(&pa);
197 pa = (pa & IOPTE_PAGE) << 4; /* Loose higher bits of 36 */ 196 pa = (pa & IOPTE_PAGE) << 4; /* Loose higher bits of 36 */
198 return pa + (addr & PAGE_MASK); 197 return pa + (addr & PAGE_MASK);
199 } 198 }
200 199
201 -void iommu_init(uint32_t addr) 200 +static void iommu_save(QEMUFile *f, void *opaque)
  201 +{
  202 + IOMMUState *s = opaque;
  203 + int i;
  204 +
  205 + qemu_put_be32s(f, &s->addr);
  206 + for (i = 0; i < sizeof(struct iommu_regs); i += 4)
  207 + qemu_put_be32s(f, &s->regs[i]);
  208 + qemu_put_be32s(f, &s->iostart);
  209 +}
  210 +
  211 +static int iommu_load(QEMUFile *f, void *opaque, int version_id)
  212 +{
  213 + IOMMUState *s = opaque;
  214 + int i;
  215 +
  216 + if (version_id != 1)
  217 + return -EINVAL;
  218 +
  219 + qemu_get_be32s(f, &s->addr);
  220 + for (i = 0; i < sizeof(struct iommu_regs); i += 4)
  221 + qemu_put_be32s(f, &s->regs[i]);
  222 + qemu_get_be32s(f, &s->iostart);
  223 +
  224 + return 0;
  225 +}
  226 +
  227 +static void iommu_reset(void *opaque)
  228 +{
  229 + IOMMUState *s = opaque;
  230 +
  231 + memset(s->regs, 0, sizeof(struct iommu_regs));
  232 + s->iostart = 0;
  233 +}
  234 +
  235 +void *iommu_init(uint32_t addr)
202 { 236 {
203 IOMMUState *s; 237 IOMMUState *s;
204 int iommu_io_memory; 238 int iommu_io_memory;
205 239
206 s = qemu_mallocz(sizeof(IOMMUState)); 240 s = qemu_mallocz(sizeof(IOMMUState));
207 if (!s) 241 if (!s)
208 - return; 242 + return NULL;
209 243
210 s->addr = addr; 244 s->addr = addr;
211 245
@@ -213,6 +247,8 @@ void iommu_init(uint32_t addr) @@ -213,6 +247,8 @@ void iommu_init(uint32_t addr)
213 cpu_register_physical_memory(addr, sizeof(struct iommu_regs), 247 cpu_register_physical_memory(addr, sizeof(struct iommu_regs),
214 iommu_io_memory); 248 iommu_io_memory);
215 249
216 - ps = s; 250 + register_savevm("iommu", addr, 1, iommu_save, iommu_load, s);
  251 + qemu_register_reset(iommu_reset, s);
  252 + return s;
217 } 253 }
218 254
hw/lance.c
@@ -147,6 +147,7 @@ struct lance_init_block { @@ -147,6 +147,7 @@ struct lance_init_block {
147 }; 147 };
148 148
149 #define LEDMA_REGS 4 149 #define LEDMA_REGS 4
  150 +#define LEDMA_MAXADDR (LEDMA_REGS * 4 - 1)
150 #if 0 151 #if 0
151 /* Structure to describe the current status of DMA registers on the Sparc */ 152 /* Structure to describe the current status of DMA registers on the Sparc */
152 struct sparc_dma_registers { 153 struct sparc_dma_registers {
@@ -157,32 +158,28 @@ struct sparc_dma_registers { @@ -157,32 +158,28 @@ struct sparc_dma_registers {
157 }; 158 };
158 #endif 159 #endif
159 160
160 -typedef struct LEDMAState {  
161 - uint32_t addr;  
162 - uint32_t regs[LEDMA_REGS];  
163 -} LEDMAState;  
164 -  
165 typedef struct LANCEState { 161 typedef struct LANCEState {
166 - uint32_t paddr;  
167 NetDriverState *nd; 162 NetDriverState *nd;
168 uint32_t leptr; 163 uint32_t leptr;
169 uint16_t addr; 164 uint16_t addr;
170 uint16_t regs[LE_MAXREG]; 165 uint16_t regs[LE_MAXREG];
171 uint8_t phys[6]; /* mac address */ 166 uint8_t phys[6]; /* mac address */
172 int irq; 167 int irq;
173 - LEDMAState *ledma; 168 + unsigned int rxptr, txptr;
  169 + uint32_t ledmaregs[LEDMA_REGS];
174 } LANCEState; 170 } LANCEState;
175 171
176 -static unsigned int rxptr, txptr;  
177 -  
178 static void lance_send(void *opaque); 172 static void lance_send(void *opaque);
179 173
180 -static void lance_reset(LANCEState *s) 174 +static void lance_reset(void *opaque)
181 { 175 {
  176 + LANCEState *s = opaque;
182 memcpy(s->phys, s->nd->macaddr, 6); 177 memcpy(s->phys, s->nd->macaddr, 6);
183 - rxptr = 0;  
184 - txptr = 0; 178 + s->rxptr = 0;
  179 + s->txptr = 0;
  180 + memset(s->regs, 0, LE_MAXREG * 2);
185 s->regs[LE_CSR0] = LE_C0_STOP; 181 s->regs[LE_CSR0] = LE_C0_STOP;
  182 + memset(s->ledmaregs, 0, LEDMA_REGS * 4);
186 } 183 }
187 184
188 static uint32_t lance_mem_readw(void *opaque, target_phys_addr_t addr) 185 static uint32_t lance_mem_readw(void *opaque, target_phys_addr_t addr)
@@ -190,7 +187,7 @@ static uint32_t lance_mem_readw(void *opaque, target_phys_addr_t addr) @@ -190,7 +187,7 @@ static uint32_t lance_mem_readw(void *opaque, target_phys_addr_t addr)
190 LANCEState *s = opaque; 187 LANCEState *s = opaque;
191 uint32_t saddr; 188 uint32_t saddr;
192 189
193 - saddr = addr - s->paddr; 190 + saddr = addr & LE_MAXREG;
194 switch (saddr >> 1) { 191 switch (saddr >> 1) {
195 case LE_RDP: 192 case LE_RDP:
196 return s->regs[s->addr]; 193 return s->regs[s->addr];
@@ -208,7 +205,7 @@ static void lance_mem_writew(void *opaque, target_phys_addr_t addr, uint32_t val @@ -208,7 +205,7 @@ static void lance_mem_writew(void *opaque, target_phys_addr_t addr, uint32_t val
208 uint32_t saddr; 205 uint32_t saddr;
209 uint16_t reg; 206 uint16_t reg;
210 207
211 - saddr = addr - s->paddr; 208 + saddr = addr & LE_MAXREG;
212 switch (saddr >> 1) { 209 switch (saddr >> 1) {
213 case LE_RDP: 210 case LE_RDP:
214 switch(s->addr) { 211 switch(s->addr) {
@@ -292,7 +289,7 @@ static CPUWriteMemoryFunc *lance_mem_write[3] = { @@ -292,7 +289,7 @@ static CPUWriteMemoryFunc *lance_mem_write[3] = {
292 static int lance_can_receive(void *opaque) 289 static int lance_can_receive(void *opaque)
293 { 290 {
294 LANCEState *s = opaque; 291 LANCEState *s = opaque;
295 - void *dmaptr = (void *) (s->leptr + s->ledma->regs[3]); 292 + uint32_t dmaptr = s->leptr + s->ledmaregs[3];
296 struct lance_init_block *ib; 293 struct lance_init_block *ib;
297 int i; 294 int i;
298 uint16_t temp; 295 uint16_t temp;
@@ -303,7 +300,7 @@ static int lance_can_receive(void *opaque) @@ -303,7 +300,7 @@ static int lance_can_receive(void *opaque)
303 ib = (void *) iommu_translate(dmaptr); 300 ib = (void *) iommu_translate(dmaptr);
304 301
305 for (i = 0; i < RX_RING_SIZE; i++) { 302 for (i = 0; i < RX_RING_SIZE; i++) {
306 - cpu_physical_memory_read(&ib->brx_ring[i].rmd1_bits, (void *) &temp, 1); 303 + cpu_physical_memory_read((uint32_t)&ib->brx_ring[i].rmd1_bits, (void *) &temp, 1);
307 temp &= 0xff; 304 temp &= 0xff;
308 if (temp == (LE_R1_OWN)) { 305 if (temp == (LE_R1_OWN)) {
309 #ifdef DEBUG_LANCE 306 #ifdef DEBUG_LANCE
@@ -323,7 +320,7 @@ static int lance_can_receive(void *opaque) @@ -323,7 +320,7 @@ static int lance_can_receive(void *opaque)
323 static void lance_receive(void *opaque, const uint8_t *buf, int size) 320 static void lance_receive(void *opaque, const uint8_t *buf, int size)
324 { 321 {
325 LANCEState *s = opaque; 322 LANCEState *s = opaque;
326 - void *dmaptr = (void *) (s->leptr + s->ledma->regs[3]); 323 + uint32_t dmaptr = s->leptr + s->ledmaregs[3];
327 struct lance_init_block *ib; 324 struct lance_init_block *ib;
328 unsigned int i, old_rxptr, j; 325 unsigned int i, old_rxptr, j;
329 uint16_t temp; 326 uint16_t temp;
@@ -333,23 +330,23 @@ static void lance_receive(void *opaque, const uint8_t *buf, int size) @@ -333,23 +330,23 @@ static void lance_receive(void *opaque, const uint8_t *buf, int size)
333 330
334 ib = (void *) iommu_translate(dmaptr); 331 ib = (void *) iommu_translate(dmaptr);
335 332
336 - old_rxptr = rxptr;  
337 - for (i = rxptr; i != ((old_rxptr - 1) & RX_RING_MOD_MASK); i = (i + 1) & RX_RING_MOD_MASK) {  
338 - cpu_physical_memory_read(&ib->brx_ring[i].rmd1_bits, (void *) &temp, 1); 333 + old_rxptr = s->rxptr;
  334 + for (i = s->rxptr; i != ((old_rxptr - 1) & RX_RING_MOD_MASK); i = (i + 1) & RX_RING_MOD_MASK) {
  335 + cpu_physical_memory_read((uint32_t)&ib->brx_ring[i].rmd1_bits, (void *) &temp, 1);
339 if (temp == (LE_R1_OWN)) { 336 if (temp == (LE_R1_OWN)) {
340 - rxptr = (rxptr + 1) & RX_RING_MOD_MASK; 337 + s->rxptr = (s->rxptr + 1) & RX_RING_MOD_MASK;
341 temp = size; 338 temp = size;
342 bswap16s(&temp); 339 bswap16s(&temp);
343 - cpu_physical_memory_write(&ib->brx_ring[i].mblength, (void *) &temp, 2); 340 + cpu_physical_memory_write((uint32_t)&ib->brx_ring[i].mblength, (void *) &temp, 2);
344 #if 0 341 #if 0
345 - cpu_physical_memory_write(&ib->rx_buf[i], buf, size); 342 + cpu_physical_memory_write((uint32_t)&ib->rx_buf[i], buf, size);
346 #else 343 #else
347 for (j = 0; j < size; j++) { 344 for (j = 0; j < size; j++) {
348 - cpu_physical_memory_write(((void *)&ib->rx_buf[i]) + j, &buf[j], 1); 345 + cpu_physical_memory_write(((uint32_t)&ib->rx_buf[i]) + j, &buf[j], 1);
349 } 346 }
350 #endif 347 #endif
351 temp = LE_R1_POK; 348 temp = LE_R1_POK;
352 - cpu_physical_memory_write(&ib->brx_ring[i].rmd1_bits, (void *) &temp, 1); 349 + cpu_physical_memory_write((uint32_t)&ib->brx_ring[i].rmd1_bits, (void *) &temp, 1);
353 s->regs[LE_CSR0] |= LE_C0_RINT | LE_C0_INTR; 350 s->regs[LE_CSR0] |= LE_C0_RINT | LE_C0_INTR;
354 if ((s->regs[LE_CSR0] & LE_C0_INTR) && (s->regs[LE_CSR0] & LE_C0_INEA)) 351 if ((s->regs[LE_CSR0] & LE_C0_INTR) && (s->regs[LE_CSR0] & LE_C0_INEA))
355 pic_set_irq(s->irq, 1); 352 pic_set_irq(s->irq, 1);
@@ -364,7 +361,7 @@ static void lance_receive(void *opaque, const uint8_t *buf, int size) @@ -364,7 +361,7 @@ static void lance_receive(void *opaque, const uint8_t *buf, int size)
364 static void lance_send(void *opaque) 361 static void lance_send(void *opaque)
365 { 362 {
366 LANCEState *s = opaque; 363 LANCEState *s = opaque;
367 - void *dmaptr = (void *) (s->leptr + s->ledma->regs[3]); 364 + uint32_t dmaptr = s->leptr + s->ledmaregs[3];
368 struct lance_init_block *ib; 365 struct lance_init_block *ib;
369 unsigned int i, old_txptr, j; 366 unsigned int i, old_txptr, j;
370 uint16_t temp; 367 uint16_t temp;
@@ -375,18 +372,18 @@ static void lance_send(void *opaque) @@ -375,18 +372,18 @@ static void lance_send(void *opaque)
375 372
376 ib = (void *) iommu_translate(dmaptr); 373 ib = (void *) iommu_translate(dmaptr);
377 374
378 - old_txptr = txptr;  
379 - for (i = txptr; i != ((old_txptr - 1) & TX_RING_MOD_MASK); i = (i + 1) & TX_RING_MOD_MASK) {  
380 - cpu_physical_memory_read(&ib->btx_ring[i].tmd1_bits, (void *) &temp, 1); 375 + old_txptr = s->txptr;
  376 + for (i = s->txptr; i != ((old_txptr - 1) & TX_RING_MOD_MASK); i = (i + 1) & TX_RING_MOD_MASK) {
  377 + cpu_physical_memory_read((uint32_t)&ib->btx_ring[i].tmd1_bits, (void *) &temp, 1);
381 if (temp == (LE_T1_POK|LE_T1_OWN)) { 378 if (temp == (LE_T1_POK|LE_T1_OWN)) {
382 - cpu_physical_memory_read(&ib->btx_ring[i].length, (void *) &temp, 2); 379 + cpu_physical_memory_read((uint32_t)&ib->btx_ring[i].length, (void *) &temp, 2);
383 bswap16s(&temp); 380 bswap16s(&temp);
384 temp = (~temp) + 1; 381 temp = (~temp) + 1;
385 #if 0 382 #if 0
386 - cpu_physical_memory_read(&ib->tx_buf[i], pkt_buf, temp); 383 + cpu_physical_memory_read((uint32_t)&ib->tx_buf[i], pkt_buf, temp);
387 #else 384 #else
388 for (j = 0; j < temp; j++) { 385 for (j = 0; j < temp; j++) {
389 - cpu_physical_memory_read(((void *)&ib->tx_buf[i]) + j, &pkt_buf[j], 1); 386 + cpu_physical_memory_read((uint32_t)&ib->tx_buf[i] + j, &pkt_buf[j], 1);
390 } 387 }
391 #endif 388 #endif
392 389
@@ -395,8 +392,8 @@ static void lance_send(void *opaque) @@ -395,8 +392,8 @@ static void lance_send(void *opaque)
395 #endif 392 #endif
396 qemu_send_packet(s->nd, pkt_buf, temp); 393 qemu_send_packet(s->nd, pkt_buf, temp);
397 temp = LE_T1_POK; 394 temp = LE_T1_POK;
398 - cpu_physical_memory_write(&ib->btx_ring[i].tmd1_bits, (void *) &temp, 1);  
399 - txptr = (txptr + 1) & TX_RING_MOD_MASK; 395 + cpu_physical_memory_write((uint32_t)&ib->btx_ring[i].tmd1_bits, (void *) &temp, 1);
  396 + s->txptr = (s->txptr + 1) & TX_RING_MOD_MASK;
400 s->regs[LE_CSR0] |= LE_C0_TINT | LE_C0_INTR; 397 s->regs[LE_CSR0] |= LE_C0_TINT | LE_C0_INTR;
401 } 398 }
402 } 399 }
@@ -404,24 +401,20 @@ static void lance_send(void *opaque) @@ -404,24 +401,20 @@ static void lance_send(void *opaque)
404 401
405 static uint32_t ledma_mem_readl(void *opaque, target_phys_addr_t addr) 402 static uint32_t ledma_mem_readl(void *opaque, target_phys_addr_t addr)
406 { 403 {
407 - LEDMAState *s = opaque; 404 + LANCEState *s = opaque;
408 uint32_t saddr; 405 uint32_t saddr;
409 406
410 - saddr = (addr - s->addr) >> 2;  
411 - if (saddr < LEDMA_REGS)  
412 - return s->regs[saddr];  
413 - else  
414 - return 0; 407 + saddr = (addr & LEDMA_MAXADDR) >> 2;
  408 + return s->ledmaregs[saddr];
415 } 409 }
416 410
417 static void ledma_mem_writel(void *opaque, target_phys_addr_t addr, uint32_t val) 411 static void ledma_mem_writel(void *opaque, target_phys_addr_t addr, uint32_t val)
418 { 412 {
419 - LEDMAState *s = opaque; 413 + LANCEState *s = opaque;
420 uint32_t saddr; 414 uint32_t saddr;
421 415
422 - saddr = (addr - s->addr) >> 2;  
423 - if (saddr < LEDMA_REGS)  
424 - s->regs[saddr] = val; 416 + saddr = (addr & LEDMA_MAXADDR) >> 2;
  417 + s->ledmaregs[saddr] = val;
425 } 418 }
426 419
427 static CPUReadMemoryFunc *ledma_mem_read[3] = { 420 static CPUReadMemoryFunc *ledma_mem_read[3] = {
@@ -436,33 +429,61 @@ static CPUWriteMemoryFunc *ledma_mem_write[3] = { @@ -436,33 +429,61 @@ static CPUWriteMemoryFunc *ledma_mem_write[3] = {
436 ledma_mem_writel, 429 ledma_mem_writel,
437 }; 430 };
438 431
  432 +static void lance_save(QEMUFile *f, void *opaque)
  433 +{
  434 + LANCEState *s = opaque;
  435 + int i;
  436 +
  437 + qemu_put_be32s(f, &s->leptr);
  438 + qemu_put_be16s(f, &s->addr);
  439 + for (i = 0; i < LE_MAXREG; i ++)
  440 + qemu_put_be16s(f, &s->regs[i]);
  441 + qemu_put_buffer(f, s->phys, 6);
  442 + qemu_put_be32s(f, &s->irq);
  443 + for (i = 0; i < LEDMA_REGS; i ++)
  444 + qemu_put_be32s(f, &s->ledmaregs[i]);
  445 +}
  446 +
  447 +static int lance_load(QEMUFile *f, void *opaque, int version_id)
  448 +{
  449 + LANCEState *s = opaque;
  450 + int i;
  451 +
  452 + if (version_id != 1)
  453 + return -EINVAL;
  454 +
  455 + qemu_get_be32s(f, &s->leptr);
  456 + qemu_get_be16s(f, &s->addr);
  457 + for (i = 0; i < LE_MAXREG; i ++)
  458 + qemu_get_be16s(f, &s->regs[i]);
  459 + qemu_get_buffer(f, s->phys, 6);
  460 + qemu_get_be32s(f, &s->irq);
  461 + for (i = 0; i < LEDMA_REGS; i ++)
  462 + qemu_get_be32s(f, &s->ledmaregs[i]);
  463 + return 0;
  464 +}
  465 +
439 void lance_init(NetDriverState *nd, int irq, uint32_t leaddr, uint32_t ledaddr) 466 void lance_init(NetDriverState *nd, int irq, uint32_t leaddr, uint32_t ledaddr)
440 { 467 {
441 LANCEState *s; 468 LANCEState *s;
442 - LEDMAState *led;  
443 int lance_io_memory, ledma_io_memory; 469 int lance_io_memory, ledma_io_memory;
444 470
445 s = qemu_mallocz(sizeof(LANCEState)); 471 s = qemu_mallocz(sizeof(LANCEState));
446 if (!s) 472 if (!s)
447 return; 473 return;
448 474
449 - s->paddr = leaddr;  
450 s->nd = nd; 475 s->nd = nd;
451 s->irq = irq; 476 s->irq = irq;
452 477
453 lance_io_memory = cpu_register_io_memory(0, lance_mem_read, lance_mem_write, s); 478 lance_io_memory = cpu_register_io_memory(0, lance_mem_read, lance_mem_write, s);
454 cpu_register_physical_memory(leaddr, 8, lance_io_memory); 479 cpu_register_physical_memory(leaddr, 8, lance_io_memory);
455 480
456 - led = qemu_mallocz(sizeof(LEDMAState));  
457 - if (!led)  
458 - return;  
459 -  
460 - s->ledma = led;  
461 - led->addr = ledaddr;  
462 - ledma_io_memory = cpu_register_io_memory(0, ledma_mem_read, ledma_mem_write, led); 481 + ledma_io_memory = cpu_register_io_memory(0, ledma_mem_read, ledma_mem_write, s);
463 cpu_register_physical_memory(ledaddr, 16, ledma_io_memory); 482 cpu_register_physical_memory(ledaddr, 16, ledma_io_memory);
464 483
465 lance_reset(s); 484 lance_reset(s);
466 qemu_add_read_packet(nd, lance_can_receive, lance_receive, s); 485 qemu_add_read_packet(nd, lance_can_receive, lance_receive, s);
  486 + register_savevm("lance", leaddr, 1, lance_save, lance_load, s);
  487 + qemu_register_reset(lance_reset, s);
467 } 488 }
468 489
hw/m48t08.c
@@ -32,19 +32,14 @@ @@ -32,19 +32,14 @@
32 #define NVRAM_PRINTF(fmt, args...) do { } while (0) 32 #define NVRAM_PRINTF(fmt, args...) do { } while (0)
33 #endif 33 #endif
34 34
35 -#define NVRAM_MAX_MEM 0xfff0 35 +#define NVRAM_MAX_MEM 0x1ff0
  36 +#define NVRAM_MAXADDR 0x1fff
36 37
37 struct m48t08_t { 38 struct m48t08_t {
38 - /* Hardware parameters */  
39 - int mem_index;  
40 - uint32_t mem_base;  
41 - uint16_t size;  
42 /* RTC management */ 39 /* RTC management */
43 time_t time_offset; 40 time_t time_offset;
44 time_t stop_time; 41 time_t stop_time;
45 /* NVRAM storage */ 42 /* NVRAM storage */
46 - uint8_t lock;  
47 - uint16_t addr;  
48 uint8_t *buffer; 43 uint8_t *buffer;
49 }; 44 };
50 45
@@ -83,14 +78,13 @@ static void set_time (m48t08_t *NVRAM, struct tm *tm) @@ -83,14 +78,13 @@ static void set_time (m48t08_t *NVRAM, struct tm *tm)
83 } 78 }
84 79
85 /* Direct access to NVRAM */ 80 /* Direct access to NVRAM */
86 -void m48t08_write (m48t08_t *NVRAM, uint32_t val) 81 +void m48t08_write (m48t08_t *NVRAM, uint32_t addr, uint8_t val)
87 { 82 {
88 struct tm tm; 83 struct tm tm;
89 int tmp; 84 int tmp;
90 85
91 - if (NVRAM->addr > NVRAM_MAX_MEM && NVRAM->addr < 0x2000)  
92 - NVRAM_PRINTF("%s: 0x%08x => 0x%08x\n", __func__, NVRAM->addr, val);  
93 - switch (NVRAM->addr) { 86 + addr &= NVRAM_MAXADDR;
  87 + switch (addr) {
94 case 0x1FF8: 88 case 0x1FF8:
95 /* control */ 89 /* control */
96 NVRAM->buffer[0x1FF8] = (val & ~0xA0) | 0x90; 90 NVRAM->buffer[0x1FF8] = (val & ~0xA0) | 0x90;
@@ -167,25 +161,18 @@ void m48t08_write (m48t08_t *NVRAM, uint32_t val) @@ -167,25 +161,18 @@ void m48t08_write (m48t08_t *NVRAM, uint32_t val)
167 } 161 }
168 break; 162 break;
169 default: 163 default:
170 - /* Check lock registers state */  
171 - if (NVRAM->addr >= 0x20 && NVRAM->addr <= 0x2F && (NVRAM->lock & 1))  
172 - break;  
173 - if (NVRAM->addr >= 0x30 && NVRAM->addr <= 0x3F && (NVRAM->lock & 2))  
174 - break;  
175 - if (NVRAM->addr < NVRAM_MAX_MEM ||  
176 - (NVRAM->addr > 0x1FFF && NVRAM->addr < NVRAM->size)) {  
177 - NVRAM->buffer[NVRAM->addr] = val & 0xFF;  
178 - } 164 + NVRAM->buffer[addr] = val & 0xFF;
179 break; 165 break;
180 } 166 }
181 } 167 }
182 168
183 -uint32_t m48t08_read (m48t08_t *NVRAM) 169 +uint8_t m48t08_read (m48t08_t *NVRAM, uint32_t addr)
184 { 170 {
185 struct tm tm; 171 struct tm tm;
186 - uint32_t retval = 0xFF; 172 + uint8_t retval = 0xFF;
187 173
188 - switch (NVRAM->addr) { 174 + addr &= NVRAM_MAXADDR;
  175 + switch (addr) {
189 case 0x1FF8: 176 case 0x1FF8:
190 /* control */ 177 /* control */
191 goto do_read; 178 goto do_read;
@@ -225,65 +212,36 @@ uint32_t m48t08_read (m48t08_t *NVRAM) @@ -225,65 +212,36 @@ uint32_t m48t08_read (m48t08_t *NVRAM)
225 retval = toBCD(tm.tm_year); 212 retval = toBCD(tm.tm_year);
226 break; 213 break;
227 default: 214 default:
228 - /* Check lock registers state */  
229 - if (NVRAM->addr >= 0x20 && NVRAM->addr <= 0x2F && (NVRAM->lock & 1))  
230 - break;  
231 - if (NVRAM->addr >= 0x30 && NVRAM->addr <= 0x3F && (NVRAM->lock & 2))  
232 - break;  
233 - if (NVRAM->addr < NVRAM_MAX_MEM ||  
234 - (NVRAM->addr > 0x1FFF && NVRAM->addr < NVRAM->size)) {  
235 - do_read:  
236 - retval = NVRAM->buffer[NVRAM->addr];  
237 - } 215 + do_read:
  216 + retval = NVRAM->buffer[addr];
238 break; 217 break;
239 } 218 }
240 - if (NVRAM->addr > NVRAM_MAX_MEM + 1 && NVRAM->addr < 0x2000)  
241 - NVRAM_PRINTF("0x%08x <= 0x%08x\n", NVRAM->addr, retval);  
242 -  
243 return retval; 219 return retval;
244 } 220 }
245 221
246 -void m48t08_set_addr (m48t08_t *NVRAM, uint32_t addr)  
247 -{  
248 - NVRAM->addr = addr;  
249 -}  
250 -  
251 -void m48t08_toggle_lock (m48t08_t *NVRAM, int lock)  
252 -{  
253 - NVRAM->lock ^= 1 << lock;  
254 -}  
255 -  
256 static void nvram_writeb (void *opaque, target_phys_addr_t addr, uint32_t value) 222 static void nvram_writeb (void *opaque, target_phys_addr_t addr, uint32_t value)
257 { 223 {
258 m48t08_t *NVRAM = opaque; 224 m48t08_t *NVRAM = opaque;
259 225
260 - addr -= NVRAM->mem_base;  
261 - if (addr < NVRAM_MAX_MEM)  
262 - NVRAM->buffer[addr] = value; 226 + m48t08_write(NVRAM, addr, value);
263 } 227 }
264 228
265 static void nvram_writew (void *opaque, target_phys_addr_t addr, uint32_t value) 229 static void nvram_writew (void *opaque, target_phys_addr_t addr, uint32_t value)
266 { 230 {
267 m48t08_t *NVRAM = opaque; 231 m48t08_t *NVRAM = opaque;
268 232
269 - addr -= NVRAM->mem_base;  
270 - if (addr < NVRAM_MAX_MEM) {  
271 - NVRAM->buffer[addr] = value >> 8;  
272 - NVRAM->buffer[addr + 1] = value;  
273 - } 233 + m48t08_write(NVRAM, addr, value);
  234 + m48t08_write(NVRAM, addr + 1, value >> 8);
274 } 235 }
275 236
276 static void nvram_writel (void *opaque, target_phys_addr_t addr, uint32_t value) 237 static void nvram_writel (void *opaque, target_phys_addr_t addr, uint32_t value)
277 { 238 {
278 m48t08_t *NVRAM = opaque; 239 m48t08_t *NVRAM = opaque;
279 240
280 - addr -= NVRAM->mem_base;  
281 - if (addr < NVRAM_MAX_MEM) {  
282 - NVRAM->buffer[addr] = value >> 24;  
283 - NVRAM->buffer[addr + 1] = value >> 16;  
284 - NVRAM->buffer[addr + 2] = value >> 8;  
285 - NVRAM->buffer[addr + 3] = value;  
286 - } 241 + m48t08_write(NVRAM, addr, value);
  242 + m48t08_write(NVRAM, addr + 1, value >> 8);
  243 + m48t08_write(NVRAM, addr + 2, value >> 16);
  244 + m48t08_write(NVRAM, addr + 3, value >> 24);
287 } 245 }
288 246
289 static uint32_t nvram_readb (void *opaque, target_phys_addr_t addr) 247 static uint32_t nvram_readb (void *opaque, target_phys_addr_t addr)
@@ -291,10 +249,7 @@ static uint32_t nvram_readb (void *opaque, target_phys_addr_t addr) @@ -291,10 +249,7 @@ static uint32_t nvram_readb (void *opaque, target_phys_addr_t addr)
291 m48t08_t *NVRAM = opaque; 249 m48t08_t *NVRAM = opaque;
292 uint32_t retval = 0; 250 uint32_t retval = 0;
293 251
294 - addr -= NVRAM->mem_base;  
295 - if (addr < NVRAM_MAX_MEM)  
296 - retval = NVRAM->buffer[addr];  
297 - 252 + retval = m48t08_read(NVRAM, addr);
298 return retval; 253 return retval;
299 } 254 }
300 255
@@ -303,12 +258,8 @@ static uint32_t nvram_readw (void *opaque, target_phys_addr_t addr) @@ -303,12 +258,8 @@ static uint32_t nvram_readw (void *opaque, target_phys_addr_t addr)
303 m48t08_t *NVRAM = opaque; 258 m48t08_t *NVRAM = opaque;
304 uint32_t retval = 0; 259 uint32_t retval = 0;
305 260
306 - addr -= NVRAM->mem_base;  
307 - if (addr < NVRAM_MAX_MEM) {  
308 - retval = NVRAM->buffer[addr] << 8;  
309 - retval |= NVRAM->buffer[addr + 1];  
310 - }  
311 - 261 + retval = m48t08_read(NVRAM, addr) << 8;
  262 + retval |= m48t08_read(NVRAM, addr + 1);
312 return retval; 263 return retval;
313 } 264 }
314 265
@@ -317,14 +268,10 @@ static uint32_t nvram_readl (void *opaque, target_phys_addr_t addr) @@ -317,14 +268,10 @@ static uint32_t nvram_readl (void *opaque, target_phys_addr_t addr)
317 m48t08_t *NVRAM = opaque; 268 m48t08_t *NVRAM = opaque;
318 uint32_t retval = 0; 269 uint32_t retval = 0;
319 270
320 - addr -= NVRAM->mem_base;  
321 - if (addr < NVRAM_MAX_MEM) {  
322 - retval = NVRAM->buffer[addr] << 24;  
323 - retval |= NVRAM->buffer[addr + 1] << 16;  
324 - retval |= NVRAM->buffer[addr + 2] << 8;  
325 - retval |= NVRAM->buffer[addr + 3];  
326 - }  
327 - 271 + retval = m48t08_read(NVRAM, addr) << 24;
  272 + retval |= m48t08_read(NVRAM, addr + 1) << 16;
  273 + retval |= m48t08_read(NVRAM, addr + 2) << 8;
  274 + retval |= m48t08_read(NVRAM, addr + 3);
328 return retval; 275 return retval;
329 } 276 }
330 277
@@ -340,12 +287,42 @@ static CPUReadMemoryFunc *nvram_read[] = { @@ -340,12 +287,42 @@ static CPUReadMemoryFunc *nvram_read[] = {
340 &nvram_readl, 287 &nvram_readl,
341 }; 288 };
342 289
  290 +static void nvram_save(QEMUFile *f, void *opaque)
  291 +{
  292 + m48t08_t *s = opaque;
  293 +
  294 + qemu_put_be32s(f, (uint32_t *)&s->time_offset);
  295 + qemu_put_be32s(f, (uint32_t *)&s->stop_time);
  296 + qemu_put_buffer(f, s->buffer, 0x2000);
  297 +}
  298 +
  299 +static int nvram_load(QEMUFile *f, void *opaque, int version_id)
  300 +{
  301 + m48t08_t *s = opaque;
  302 +
  303 + if (version_id != 1)
  304 + return -EINVAL;
  305 +
  306 + qemu_get_be32s(f, (uint32_t *)&s->time_offset);
  307 + qemu_get_be32s(f, (uint32_t *)&s->stop_time);
  308 + qemu_get_buffer(f, s->buffer, 0x2000);
  309 + return 0;
  310 +}
  311 +
  312 +static void m48t08_reset(void *opaque)
  313 +{
  314 + m48t08_t *s = opaque;
  315 +
  316 + s->time_offset = 0;
  317 + s->stop_time = 0;
  318 +}
  319 +
  320 +
343 /* Initialisation routine */ 321 /* Initialisation routine */
344 -m48t08_t *m48t08_init(uint32_t mem_base, uint16_t size, uint8_t *macaddr) 322 +m48t08_t *m48t08_init(uint32_t mem_base, uint16_t size)
345 { 323 {
346 m48t08_t *s; 324 m48t08_t *s;
347 - int i;  
348 - unsigned char tmp = 0; 325 + int mem_index;
349 326
350 s = qemu_mallocz(sizeof(m48t08_t)); 327 s = qemu_mallocz(sizeof(m48t08_t));
351 if (!s) 328 if (!s)
@@ -355,25 +332,13 @@ m48t08_t *m48t08_init(uint32_t mem_base, uint16_t size, uint8_t *macaddr) @@ -355,25 +332,13 @@ m48t08_t *m48t08_init(uint32_t mem_base, uint16_t size, uint8_t *macaddr)
355 qemu_free(s); 332 qemu_free(s);
356 return NULL; 333 return NULL;
357 } 334 }
358 - s->size = size;  
359 - s->mem_base = mem_base;  
360 - s->addr = 0;  
361 if (mem_base != 0) { 335 if (mem_base != 0) {
362 - s->mem_index = cpu_register_io_memory(0, nvram_read, nvram_write, s);  
363 - cpu_register_physical_memory(mem_base, 0x4000, s->mem_index); 336 + mem_index = cpu_register_io_memory(0, nvram_read, nvram_write, s);
  337 + cpu_register_physical_memory(mem_base, 0x2000, mem_index);
364 } 338 }
365 - s->lock = 0;  
366 339
367 - i = 0x1fd8;  
368 - s->buffer[i++] = 0x01;  
369 - s->buffer[i++] = 0x80; /* Sun4m OBP */  
370 - memcpy(&s->buffer[i], macaddr, 6);  
371 -  
372 - /* Calculate checksum */  
373 - for (i = 0x1fd8; i < 0x1fe7; i++) {  
374 - tmp ^= s->buffer[i];  
375 - }  
376 - s->buffer[0x1fe7] = tmp; 340 + register_savevm("nvram", mem_base, 1, nvram_save, nvram_load, s);
  341 + qemu_register_reset(m48t08_reset, s);
377 return s; 342 return s;
378 } 343 }
379 344
hw/m48t08.h
@@ -3,10 +3,8 @@ @@ -3,10 +3,8 @@
3 3
4 typedef struct m48t08_t m48t08_t; 4 typedef struct m48t08_t m48t08_t;
5 5
6 -void m48t08_write (m48t08_t *NVRAM, uint32_t val);  
7 -uint32_t m48t08_read (m48t08_t *NVRAM);  
8 -void m48t08_set_addr (m48t08_t *NVRAM, uint32_t addr);  
9 -void m48t08_toggle_lock (m48t08_t *NVRAM, int lock);  
10 -m48t08_t *m48t08_init(uint32_t mem_base, uint16_t size, uint8_t *macaddr); 6 +void m48t08_write (m48t08_t *NVRAM, uint32_t addr, uint8_t val);
  7 +uint8_t m48t08_read (m48t08_t *NVRAM, uint32_t addr);
  8 +m48t08_t *m48t08_init(uint32_t mem_base, uint16_t size);
11 9
12 #endif /* !defined (__M48T08_H__) */ 10 #endif /* !defined (__M48T08_H__) */
hw/magic-load.c
1 #include "vl.h" 1 #include "vl.h"
2 #include "disas.h" 2 #include "disas.h"
  3 +#include "exec-all.h"
  4 +
  5 +struct exec
  6 +{
  7 + uint32_t a_info; /* Use macros N_MAGIC, etc for access */
  8 + uint32_t a_text; /* length of text, in bytes */
  9 + uint32_t a_data; /* length of data, in bytes */
  10 + uint32_t a_bss; /* length of uninitialized data area, in bytes */
  11 + uint32_t a_syms; /* length of symbol table data in file, in bytes */
  12 + uint32_t a_entry; /* start address */
  13 + uint32_t a_trsize; /* length of relocation info for text, in bytes */
  14 + uint32_t a_drsize; /* length of relocation info for data, in bytes */
  15 +};
  16 +
  17 +#ifdef BSWAP_NEEDED
  18 +static void bswap_ahdr(struct exec *e)
  19 +{
  20 + bswap32s(&e->a_info);
  21 + bswap32s(&e->a_text);
  22 + bswap32s(&e->a_data);
  23 + bswap32s(&e->a_bss);
  24 + bswap32s(&e->a_syms);
  25 + bswap32s(&e->a_entry);
  26 + bswap32s(&e->a_trsize);
  27 + bswap32s(&e->a_drsize);
  28 +}
  29 +#else
  30 +#define bswap_ahdr(x) do { } while (0)
  31 +#endif
  32 +
  33 +#define N_MAGIC(exec) ((exec).a_info & 0xffff)
  34 +#define OMAGIC 0407
  35 +#define NMAGIC 0410
  36 +#define ZMAGIC 0413
  37 +#define QMAGIC 0314
  38 +#define _N_HDROFF(x) (1024 - sizeof (struct exec))
  39 +#define N_TXTOFF(x) \
  40 + (N_MAGIC(x) == ZMAGIC ? _N_HDROFF((x)) + sizeof (struct exec) : \
  41 + (N_MAGIC(x) == QMAGIC ? 0 : sizeof (struct exec)))
  42 +#define N_TXTADDR(x) (N_MAGIC(x) == QMAGIC ? TARGET_PAGE_SIZE : 0)
  43 +#define N_DATOFF(x) (N_TXTOFF(x) + (x).a_text)
  44 +#define _N_SEGMENT_ROUND(x) (((x) + TARGET_PAGE_SIZE - 1) & ~(TARGET_PAGE_SIZE - 1))
  45 +
  46 +#define _N_TXTENDADDR(x) (N_TXTADDR(x)+(x).a_text)
  47 +
  48 +#define N_DATADDR(x) \
  49 + (N_MAGIC(x)==OMAGIC? (_N_TXTENDADDR(x)) \
  50 + : (_N_SEGMENT_ROUND (_N_TXTENDADDR(x))))
  51 +
3 52
4 #define ELF_CLASS ELFCLASS32 53 #define ELF_CLASS ELFCLASS32
5 #define ELF_DATA ELFDATA2MSB 54 #define ELF_DATA ELFDATA2MSB
@@ -103,27 +152,27 @@ static void *find_shdr(struct elfhdr *ehdr, int fd, struct elf_shdr *shdr, uint3 @@ -103,27 +152,27 @@ static void *find_shdr(struct elfhdr *ehdr, int fd, struct elf_shdr *shdr, uint3
103 return NULL; 152 return NULL;
104 } 153 }
105 154
106 -static int find_strtab(struct elfhdr *ehdr, int fd, struct elf_shdr *shdr, struct elf_shdr *symtab) 155 +static void *find_strtab(struct elfhdr *ehdr, int fd, struct elf_shdr *shdr, struct elf_shdr *symtab)
107 { 156 {
108 int retval; 157 int retval;
109 158
110 retval = lseek(fd, ehdr->e_shoff + sizeof(struct elf_shdr) * symtab->sh_link, SEEK_SET); 159 retval = lseek(fd, ehdr->e_shoff + sizeof(struct elf_shdr) * symtab->sh_link, SEEK_SET);
111 if (retval < 0) 160 if (retval < 0)
112 - return -1; 161 + return NULL;
113 162
114 retval = read(fd, shdr, sizeof(*shdr)); 163 retval = read(fd, shdr, sizeof(*shdr));
115 if (retval < 0) 164 if (retval < 0)
116 - return -1; 165 + return NULL;
117 bswap_shdr(shdr); 166 bswap_shdr(shdr);
118 if (shdr->sh_type == SHT_STRTAB) 167 if (shdr->sh_type == SHT_STRTAB)
119 return qemu_malloc(shdr->sh_size);; 168 return qemu_malloc(shdr->sh_size);;
120 - return 0; 169 + return NULL;
121 } 170 }
122 171
123 -static int read_program(int fd, struct elf_phdr *phdr, void *dst) 172 +static int read_program(int fd, struct elf_phdr *phdr, void *dst, uint32_t entry)
124 { 173 {
125 int retval; 174 int retval;
126 - retval = lseek(fd, 0x4000, SEEK_SET); 175 + retval = lseek(fd, phdr->p_offset + entry - phdr->p_vaddr, SEEK_SET);
127 if (retval < 0) 176 if (retval < 0)
128 return -1; 177 return -1;
129 return read(fd, dst, phdr->p_filesz); 178 return read(fd, dst, phdr->p_filesz);
@@ -178,6 +227,7 @@ static void load_symbols(struct elfhdr *ehdr, int fd) @@ -178,6 +227,7 @@ static void load_symbols(struct elfhdr *ehdr, int fd)
178 { 227 {
179 struct elf_shdr symtab, strtab; 228 struct elf_shdr symtab, strtab;
180 struct elf_sym *syms; 229 struct elf_sym *syms;
  230 + struct syminfo *s;
181 int nsyms, i; 231 int nsyms, i;
182 char *str; 232 char *str;
183 233
@@ -196,20 +246,19 @@ static void load_symbols(struct elfhdr *ehdr, int fd) @@ -196,20 +246,19 @@ static void load_symbols(struct elfhdr *ehdr, int fd)
196 goto error_freesyms; 246 goto error_freesyms;
197 247
198 /* Commit */ 248 /* Commit */
199 - if (disas_symtab)  
200 - qemu_free(disas_symtab); /* XXX Merge with old symbols? */  
201 - if (disas_strtab)  
202 - qemu_free(disas_strtab);  
203 - disas_symtab = syms;  
204 - disas_num_syms = nsyms;  
205 - disas_strtab = str; 249 + s = qemu_mallocz(sizeof(*s));
  250 + s->disas_symtab = syms;
  251 + s->disas_num_syms = nsyms;
  252 + s->disas_strtab = str;
  253 + s->next = syminfos;
  254 + syminfos = s;
206 return; 255 return;
207 error_freesyms: 256 error_freesyms:
208 qemu_free(syms); 257 qemu_free(syms);
209 return; 258 return;
210 } 259 }
211 260
212 -int load_elf(const char * filename, uint8_t *addr) 261 +int load_elf(const char *filename, uint8_t *addr)
213 { 262 {
214 struct elfhdr ehdr; 263 struct elfhdr ehdr;
215 struct elf_phdr phdr; 264 struct elf_phdr phdr;
@@ -227,12 +276,13 @@ int load_elf(const char * filename, uint8_t *addr) @@ -227,12 +276,13 @@ int load_elf(const char * filename, uint8_t *addr)
227 276
228 if (ehdr.e_ident[0] != 0x7f || ehdr.e_ident[1] != 'E' 277 if (ehdr.e_ident[0] != 0x7f || ehdr.e_ident[1] != 'E'
229 || ehdr.e_ident[2] != 'L' || ehdr.e_ident[3] != 'F' 278 || ehdr.e_ident[2] != 'L' || ehdr.e_ident[3] != 'F'
230 - || ehdr.e_machine != EM_SPARC) 279 + || (ehdr.e_machine != EM_SPARC
  280 + && ehdr.e_machine != EM_SPARC32PLUS))
231 goto error; 281 goto error;
232 282
233 if (find_phdr(&ehdr, fd, &phdr, PT_LOAD)) 283 if (find_phdr(&ehdr, fd, &phdr, PT_LOAD))
234 goto error; 284 goto error;
235 - retval = read_program(fd, &phdr, addr); 285 + retval = read_program(fd, &phdr, addr, ehdr.e_entry);
236 if (retval < 0) 286 if (retval < 0)
237 goto error; 287 goto error;
238 288
@@ -245,17 +295,45 @@ int load_elf(const char * filename, uint8_t *addr) @@ -245,17 +295,45 @@ int load_elf(const char * filename, uint8_t *addr)
245 return -1; 295 return -1;
246 } 296 }
247 297
248 -int load_kernel(const char *filename, uint8_t *addr) 298 +int load_aout(const char *filename, uint8_t *addr)
249 { 299 {
250 - int fd, size; 300 + int fd, size, ret;
  301 + struct exec e;
  302 + uint32_t magic;
251 303
252 fd = open(filename, O_RDONLY | O_BINARY); 304 fd = open(filename, O_RDONLY | O_BINARY);
253 if (fd < 0) 305 if (fd < 0)
254 return -1; 306 return -1;
255 - /* load 32 bit code */  
256 - size = read(fd, addr, 16 * 1024 * 1024); 307 +
  308 + size = read(fd, &e, sizeof(e));
257 if (size < 0) 309 if (size < 0)
258 goto fail; 310 goto fail;
  311 +
  312 + bswap_ahdr(&e);
  313 +
  314 + magic = N_MAGIC(e);
  315 + switch (magic) {
  316 + case ZMAGIC:
  317 + case QMAGIC:
  318 + case OMAGIC:
  319 + lseek(fd, N_TXTOFF(e), SEEK_SET);
  320 + size = read(fd, addr, e.a_text + e.a_data);
  321 + if (size < 0)
  322 + goto fail;
  323 + break;
  324 + case NMAGIC:
  325 + lseek(fd, N_TXTOFF(e), SEEK_SET);
  326 + size = read(fd, addr, e.a_text);
  327 + if (size < 0)
  328 + goto fail;
  329 + ret = read(fd, addr + N_DATADDR(e), e.a_data);
  330 + if (ret < 0)
  331 + goto fail;
  332 + size += ret;
  333 + break;
  334 + default:
  335 + goto fail;
  336 + }
259 close(fd); 337 close(fd);
260 return size; 338 return size;
261 fail: 339 fail:
@@ -263,64 +341,3 @@ int load_kernel(const char *filename, uint8_t *addr) @@ -263,64 +341,3 @@ int load_kernel(const char *filename, uint8_t *addr)
263 return -1; 341 return -1;
264 } 342 }
265 343
266 -typedef struct MAGICState {  
267 - uint32_t addr;  
268 - uint32_t saved_addr;  
269 - int magic_state;  
270 - char saved_kfn[1024];  
271 -} MAGICState;  
272 -  
273 -static uint32_t magic_mem_readl(void *opaque, target_phys_addr_t addr)  
274 -{  
275 - int ret;  
276 - MAGICState *s = opaque;  
277 -  
278 - if (s->magic_state == 0) {  
279 - ret = load_elf(s->saved_kfn, (uint8_t *)s->saved_addr);  
280 - if (ret < 0)  
281 - ret = load_kernel(s->saved_kfn, (uint8_t *)s->saved_addr);  
282 - if (ret < 0) {  
283 - fprintf(stderr, "qemu: could not load kernel '%s'\n",  
284 - s->saved_kfn);  
285 - }  
286 - s->magic_state = 1; /* No more magic */  
287 - tb_flush();  
288 - return bswap32(ret);  
289 - }  
290 - return 0;  
291 -}  
292 -  
293 -static void magic_mem_writel(void *opaque, target_phys_addr_t addr, uint32_t val)  
294 -{  
295 -}  
296 -  
297 -  
298 -static CPUReadMemoryFunc *magic_mem_read[3] = {  
299 - magic_mem_readl,  
300 - magic_mem_readl,  
301 - magic_mem_readl,  
302 -};  
303 -  
304 -static CPUWriteMemoryFunc *magic_mem_write[3] = {  
305 - magic_mem_writel,  
306 - magic_mem_writel,  
307 - magic_mem_writel,  
308 -};  
309 -  
310 -void magic_init(const char *kfn, int kloadaddr, uint32_t addr)  
311 -{  
312 - int magic_io_memory;  
313 - MAGICState *s;  
314 -  
315 - s = qemu_mallocz(sizeof(MAGICState));  
316 - if (!s)  
317 - return;  
318 -  
319 - strcpy(s->saved_kfn, kfn);  
320 - s->saved_addr = kloadaddr;  
321 - s->magic_state = 0;  
322 - s->addr = addr;  
323 - magic_io_memory = cpu_register_io_memory(0, magic_mem_read, magic_mem_write, s);  
324 - cpu_register_physical_memory(addr, 4, magic_io_memory);  
325 -}  
326 -  
hw/sched.c deleted 100644 → 0
1 -/*  
2 - * QEMU interrupt controller emulation  
3 - *  
4 - * Copyright (c) 2003-2004 Fabrice Bellard  
5 - *  
6 - * Permission is hereby granted, free of charge, to any person obtaining a copy  
7 - * of this software and associated documentation files (the "Software"), to deal  
8 - * in the Software without restriction, including without limitation the rights  
9 - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell  
10 - * copies of the Software, and to permit persons to whom the Software is  
11 - * furnished to do so, subject to the following conditions:  
12 - *  
13 - * The above copyright notice and this permission notice shall be included in  
14 - * all copies or substantial portions of the Software.  
15 - *  
16 - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR  
17 - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,  
18 - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL  
19 - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER  
20 - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,  
21 - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN  
22 - * THE SOFTWARE.  
23 - */  
24 -#include "vl.h"  
25 -//#define DEBUG_IRQ_COUNT  
26 -  
27 -/* These registers are used for sending/receiving irqs from/to  
28 - * different cpu's.  
29 - */  
30 -struct sun4m_intreg_percpu {  
31 - unsigned int tbt; /* Intrs pending for this cpu, by PIL. */  
32 - /* These next two registers are WRITE-ONLY and are only  
33 - * "on bit" sensitive, "off bits" written have NO affect.  
34 - */  
35 - unsigned int clear; /* Clear this cpus irqs here. */  
36 - unsigned int set; /* Set this cpus irqs here. */  
37 -};  
38 -/*  
39 - * djhr  
40 - * Actually the clear and set fields in this struct are misleading..  
41 - * according to the SLAVIO manual (and the same applies for the SEC)  
42 - * the clear field clears bits in the mask which will ENABLE that IRQ  
43 - * the set field sets bits in the mask to DISABLE the IRQ.  
44 - *  
45 - * Also the undirected_xx address in the SLAVIO is defined as  
46 - * RESERVED and write only..  
47 - *  
48 - * DAVEM_NOTE: The SLAVIO only specifies behavior on uniprocessor  
49 - * sun4m machines, for MP the layout makes more sense.  
50 - */  
51 -struct sun4m_intreg_master {  
52 - unsigned int tbt; /* IRQ's that are pending, see sun4m masks. */  
53 - unsigned int irqs; /* Master IRQ bits. */  
54 -  
55 - /* Again, like the above, two these registers are WRITE-ONLY. */  
56 - unsigned int clear; /* Clear master IRQ's by setting bits here. */  
57 - unsigned int set; /* Set master IRQ's by setting bits here. */  
58 -  
59 - /* This register is both READ and WRITE. */  
60 - unsigned int undirected_target; /* Which cpu gets undirected irqs. */  
61 -};  
62 -  
63 -#define SUN4M_INT_ENABLE 0x80000000  
64 -#define SUN4M_INT_E14 0x00000080  
65 -#define SUN4M_INT_E10 0x00080000  
66 -  
67 -#define SUN4M_HARD_INT(x) (0x000000001 << (x))  
68 -#define SUN4M_SOFT_INT(x) (0x000010000 << (x))  
69 -  
70 -#define SUN4M_INT_MASKALL 0x80000000 /* mask all interrupts */  
71 -#define SUN4M_INT_MODULE_ERR 0x40000000 /* module error */  
72 -#define SUN4M_INT_M2S_WRITE 0x20000000 /* write buffer error */  
73 -#define SUN4M_INT_ECC 0x10000000 /* ecc memory error */  
74 -#define SUN4M_INT_FLOPPY 0x00400000 /* floppy disk */  
75 -#define SUN4M_INT_MODULE 0x00200000 /* module interrupt */  
76 -#define SUN4M_INT_VIDEO 0x00100000 /* onboard video */  
77 -#define SUN4M_INT_REALTIME 0x00080000 /* system timer */  
78 -#define SUN4M_INT_SCSI 0x00040000 /* onboard scsi */  
79 -#define SUN4M_INT_AUDIO 0x00020000 /* audio/isdn */  
80 -#define SUN4M_INT_ETHERNET 0x00010000 /* onboard ethernet */  
81 -#define SUN4M_INT_SERIAL 0x00008000 /* serial ports */  
82 -#define SUN4M_INT_SBUSBITS 0x00003F80 /* sbus int bits */  
83 -  
84 -#define SUN4M_INT_SBUS(x) (1 << (x+7))  
85 -#define SUN4M_INT_VME(x) (1 << (x))  
86 -  
87 -typedef struct SCHEDState {  
88 - uint32_t addr, addrg;  
89 - uint32_t intreg_pending;  
90 - uint32_t intreg_enabled;  
91 - uint32_t intregm_pending;  
92 - uint32_t intregm_enabled;  
93 -} SCHEDState;  
94 -  
95 -static SCHEDState *ps;  
96 -  
97 -#ifdef DEBUG_IRQ_COUNT  
98 -static uint64_t irq_count[32];  
99 -#endif  
100 -  
101 -static uint32_t intreg_mem_readl(void *opaque, target_phys_addr_t addr)  
102 -{  
103 - SCHEDState *s = opaque;  
104 - uint32_t saddr;  
105 -  
106 - saddr = (addr - s->addr) >> 2;  
107 - switch (saddr) {  
108 - case 0:  
109 - return s->intreg_pending;  
110 - break;  
111 - default:  
112 - break;  
113 - }  
114 - return 0;  
115 -}  
116 -  
117 -static void intreg_mem_writel(void *opaque, target_phys_addr_t addr, uint32_t val)  
118 -{  
119 - SCHEDState *s = opaque;  
120 - uint32_t saddr;  
121 -  
122 - saddr = (addr - s->addr) >> 2;  
123 - switch (saddr) {  
124 - case 0:  
125 - s->intreg_pending = val;  
126 - break;  
127 - case 1: // clear  
128 - s->intreg_enabled &= ~val;  
129 - break;  
130 - case 2: // set  
131 - s->intreg_enabled |= val;  
132 - break;  
133 - default:  
134 - break;  
135 - }  
136 -}  
137 -  
138 -static CPUReadMemoryFunc *intreg_mem_read[3] = {  
139 - intreg_mem_readl,  
140 - intreg_mem_readl,  
141 - intreg_mem_readl,  
142 -};  
143 -  
144 -static CPUWriteMemoryFunc *intreg_mem_write[3] = {  
145 - intreg_mem_writel,  
146 - intreg_mem_writel,  
147 - intreg_mem_writel,  
148 -};  
149 -  
150 -static uint32_t intregm_mem_readl(void *opaque, target_phys_addr_t addr)  
151 -{  
152 - SCHEDState *s = opaque;  
153 - uint32_t saddr;  
154 -  
155 - saddr = (addr - s->addrg) >> 2;  
156 - switch (saddr) {  
157 - case 0:  
158 - return s->intregm_pending;  
159 - break;  
160 - case 1:  
161 - return s->intregm_enabled;  
162 - break;  
163 - default:  
164 - break;  
165 - }  
166 - return 0;  
167 -}  
168 -  
169 -static void intregm_mem_writel(void *opaque, target_phys_addr_t addr, uint32_t val)  
170 -{  
171 - SCHEDState *s = opaque;  
172 - uint32_t saddr;  
173 -  
174 - saddr = (addr - s->addrg) >> 2;  
175 - switch (saddr) {  
176 - case 0:  
177 - s->intregm_pending = val;  
178 - break;  
179 - case 1:  
180 - s->intregm_enabled = val;  
181 - break;  
182 - case 2: // clear  
183 - s->intregm_enabled &= ~val;  
184 - break;  
185 - case 3: // set  
186 - s->intregm_enabled |= val;  
187 - break;  
188 - default:  
189 - break;  
190 - }  
191 -}  
192 -  
193 -static CPUReadMemoryFunc *intregm_mem_read[3] = {  
194 - intregm_mem_readl,  
195 - intregm_mem_readl,  
196 - intregm_mem_readl,  
197 -};  
198 -  
199 -static CPUWriteMemoryFunc *intregm_mem_write[3] = {  
200 - intregm_mem_writel,  
201 - intregm_mem_writel,  
202 - intregm_mem_writel,  
203 -};  
204 -  
205 -void pic_info(void)  
206 -{  
207 - term_printf("per-cpu: pending 0x%08x, enabled 0x%08x\n", ps->intreg_pending, ps->intreg_enabled);  
208 - term_printf("master: pending 0x%08x, enabled 0x%08x\n", ps->intregm_pending, ps->intregm_enabled);  
209 -}  
210 -  
211 -void irq_info(void)  
212 -{  
213 -#ifndef DEBUG_IRQ_COUNT  
214 - term_printf("irq statistic code not compiled.\n");  
215 -#else  
216 - int i;  
217 - int64_t count;  
218 -  
219 - term_printf("IRQ statistics:\n");  
220 - for (i = 0; i < 32; i++) {  
221 - count = irq_count[i];  
222 - if (count > 0)  
223 - term_printf("%2d: %lld\n", i, count);  
224 - }  
225 -#endif  
226 -}  
227 -  
228 -static const unsigned int intr_to_mask[16] = {  
229 - 0, 0, 0, 0, 0, 0, SUN4M_INT_ETHERNET, 0,  
230 - 0, 0, 0, 0, 0, 0, 0, 0,  
231 -};  
232 -  
233 -void pic_set_irq(int irq, int level)  
234 -{  
235 - if (irq < 16) {  
236 - unsigned int mask = intr_to_mask[irq];  
237 - ps->intreg_pending |= 1 << irq;  
238 - if (ps->intregm_enabled & mask) {  
239 - cpu_single_env->interrupt_index = irq;  
240 - cpu_interrupt(cpu_single_env, CPU_INTERRUPT_HARD);  
241 - }  
242 - }  
243 -#ifdef DEBUG_IRQ_COUNT  
244 - if (level == 1)  
245 - irq_count[irq]++;  
246 -#endif  
247 -}  
248 -  
249 -void sched_init(uint32_t addr, uint32_t addrg)  
250 -{  
251 - int intreg_io_memory, intregm_io_memory;  
252 - SCHEDState *s;  
253 -  
254 - s = qemu_mallocz(sizeof(SCHEDState));  
255 - if (!s)  
256 - return;  
257 - s->addr = addr;  
258 - s->addrg = addrg;  
259 -  
260 - intreg_io_memory = cpu_register_io_memory(0, intreg_mem_read, intreg_mem_write, s);  
261 - cpu_register_physical_memory(addr, 3, intreg_io_memory);  
262 -  
263 - intregm_io_memory = cpu_register_io_memory(0, intregm_mem_read, intregm_mem_write, s);  
264 - cpu_register_physical_memory(addrg, 5, intregm_io_memory);  
265 -  
266 - ps = s;  
267 -}  
268 -  
hw/slavio_intctl.c 0 → 100644
  1 +/*
  2 + * QEMU Sparc SLAVIO interrupt controller emulation
  3 + *
  4 + * Copyright (c) 2003-2004 Fabrice Bellard
  5 + *
  6 + * Permission is hereby granted, free of charge, to any person obtaining a copy
  7 + * of this software and associated documentation files (the "Software"), to deal
  8 + * in the Software without restriction, including without limitation the rights
  9 + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  10 + * copies of the Software, and to permit persons to whom the Software is
  11 + * furnished to do so, subject to the following conditions:
  12 + *
  13 + * The above copyright notice and this permission notice shall be included in
  14 + * all copies or substantial portions of the Software.
  15 + *
  16 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  19 + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  20 + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  21 + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  22 + * THE SOFTWARE.
  23 + */
  24 +#include "vl.h"
  25 +//#define DEBUG_IRQ_COUNT
  26 +
  27 +/*
  28 + * Registers of interrupt controller in sun4m.
  29 + *
  30 + * This is the interrupt controller part of chip STP2001 (Slave I/O), also
  31 + * produced as NCR89C105. See
  32 + * http://www.ibiblio.org/pub/historic-linux/early-ports/Sparc/NCR/NCR89C105.txt
  33 + *
  34 + * There is a system master controller and one for each cpu.
  35 + *
  36 + */
  37 +
  38 +#define MAX_CPUS 16
  39 +
  40 +typedef struct SLAVIO_INTCTLState {
  41 + uint32_t intreg_pending[MAX_CPUS];
  42 + uint32_t intregm_pending;
  43 + uint32_t intregm_disabled;
  44 + uint32_t target_cpu;
  45 +#ifdef DEBUG_IRQ_COUNT
  46 + uint64_t irq_count[32];
  47 +#endif
  48 +} SLAVIO_INTCTLState;
  49 +
  50 +#define INTCTL_MAXADDR 0xf
  51 +#define INTCTLM_MAXADDR 0xf
  52 +
  53 +// per-cpu interrupt controller
  54 +static uint32_t slavio_intctl_mem_readl(void *opaque, target_phys_addr_t addr)
  55 +{
  56 + SLAVIO_INTCTLState *s = opaque;
  57 + uint32_t saddr;
  58 + int cpu;
  59 +
  60 + cpu = (addr & (MAX_CPUS - 1) * TARGET_PAGE_SIZE) >> 12;
  61 + saddr = (addr & INTCTL_MAXADDR) >> 2;
  62 + switch (saddr) {
  63 + case 0:
  64 + return s->intreg_pending[cpu];
  65 + default:
  66 + break;
  67 + }
  68 + return 0;
  69 +}
  70 +
  71 +static void slavio_intctl_mem_writel(void *opaque, target_phys_addr_t addr, uint32_t val)
  72 +{
  73 + SLAVIO_INTCTLState *s = opaque;
  74 + uint32_t saddr;
  75 + int cpu;
  76 +
  77 + cpu = (addr & (MAX_CPUS - 1) * TARGET_PAGE_SIZE) >> 12;
  78 + saddr = (addr & INTCTL_MAXADDR) >> 2;
  79 + switch (saddr) {
  80 + case 1: // clear pending softints
  81 + if (val & 0x4000)
  82 + val |= 80000000;
  83 + val &= 0xfffe0000;
  84 + s->intreg_pending[cpu] &= ~val;
  85 + break;
  86 + case 2: // set softint
  87 + val &= 0xfffe0000;
  88 + s->intreg_pending[cpu] |= val;
  89 + break;
  90 + default:
  91 + break;
  92 + }
  93 +}
  94 +
  95 +static CPUReadMemoryFunc *slavio_intctl_mem_read[3] = {
  96 + slavio_intctl_mem_readl,
  97 + slavio_intctl_mem_readl,
  98 + slavio_intctl_mem_readl,
  99 +};
  100 +
  101 +static CPUWriteMemoryFunc *slavio_intctl_mem_write[3] = {
  102 + slavio_intctl_mem_writel,
  103 + slavio_intctl_mem_writel,
  104 + slavio_intctl_mem_writel,
  105 +};
  106 +
  107 +// master system interrupt controller
  108 +static uint32_t slavio_intctlm_mem_readl(void *opaque, target_phys_addr_t addr)
  109 +{
  110 + SLAVIO_INTCTLState *s = opaque;
  111 + uint32_t saddr;
  112 +
  113 + saddr = (addr & INTCTLM_MAXADDR) >> 2;
  114 + switch (saddr) {
  115 + case 0:
  116 + return s->intregm_pending;
  117 + case 1:
  118 + return s->intregm_disabled;
  119 + case 4:
  120 + return s->target_cpu;
  121 + default:
  122 + break;
  123 + }
  124 + return 0;
  125 +}
  126 +
  127 +static void slavio_intctlm_mem_writel(void *opaque, target_phys_addr_t addr, uint32_t val)
  128 +{
  129 + SLAVIO_INTCTLState *s = opaque;
  130 + uint32_t saddr;
  131 +
  132 + saddr = (addr & INTCTLM_MAXADDR) >> 2;
  133 + switch (saddr) {
  134 + case 2: // clear (enable)
  135 + // Force unused bits
  136 + val |= 0x7fb2007f;
  137 + s->intregm_disabled &= ~val;
  138 + break;
  139 + case 3: // set (disable, clear pending)
  140 + // Force unused bits
  141 + val &= ~0x7fb2007f;
  142 + s->intregm_disabled |= val;
  143 + s->intregm_pending &= ~val;
  144 + break;
  145 + case 4:
  146 + s->target_cpu = val & (MAX_CPUS - 1);
  147 + break;
  148 + default:
  149 + break;
  150 + }
  151 +}
  152 +
  153 +static CPUReadMemoryFunc *slavio_intctlm_mem_read[3] = {
  154 + slavio_intctlm_mem_readl,
  155 + slavio_intctlm_mem_readl,
  156 + slavio_intctlm_mem_readl,
  157 +};
  158 +
  159 +static CPUWriteMemoryFunc *slavio_intctlm_mem_write[3] = {
  160 + slavio_intctlm_mem_writel,
  161 + slavio_intctlm_mem_writel,
  162 + slavio_intctlm_mem_writel,
  163 +};
  164 +
  165 +void slavio_pic_info(void *opaque)
  166 +{
  167 + SLAVIO_INTCTLState *s = opaque;
  168 + int i;
  169 +
  170 + for (i = 0; i < MAX_CPUS; i++) {
  171 + term_printf("per-cpu %d: pending 0x%08x\n", i, s->intreg_pending[i]);
  172 + }
  173 + term_printf("master: pending 0x%08x, disabled 0x%08x\n", s->intregm_pending, s->intregm_disabled);
  174 +}
  175 +
  176 +void slavio_irq_info(void *opaque)
  177 +{
  178 +#ifndef DEBUG_IRQ_COUNT
  179 + term_printf("irq statistic code not compiled.\n");
  180 +#else
  181 + SLAVIO_INTCTLState *s = opaque;
  182 + int i;
  183 + int64_t count;
  184 +
  185 + term_printf("IRQ statistics:\n");
  186 + for (i = 0; i < 32; i++) {
  187 + count = s->irq_count[i];
  188 + if (count > 0)
  189 + term_printf("%2d: %lld\n", i, count);
  190 + }
  191 +#endif
  192 +}
  193 +
  194 +static const uint32_t intbit_to_level[32] = {
  195 + 2, 3, 5, 7, 9, 11, 0, 14, 3, 5, 7, 9, 11, 13, 12, 12,
  196 + 6, 0, 4, 10, 8, 0, 11, 0, 0, 0, 0, 0, 15, 0, 0, 0,
  197 +};
  198 +
  199 +/*
  200 + * "irq" here is the bit number in the system interrupt register to
  201 + * separate serial and keyboard interrupts sharing a level.
  202 + */
  203 +void slavio_pic_set_irq(void *opaque, int irq, int level)
  204 +{
  205 + SLAVIO_INTCTLState *s = opaque;
  206 +
  207 + if (irq < 32) {
  208 + uint32_t mask = 1 << irq;
  209 + uint32_t pil = intbit_to_level[irq];
  210 + if (pil > 0) {
  211 + if (level) {
  212 + s->intregm_pending |= mask;
  213 + s->intreg_pending[s->target_cpu] |= 1 << pil;
  214 + }
  215 + else {
  216 + s->intregm_pending &= ~mask;
  217 + s->intreg_pending[s->target_cpu] &= ~(1 << pil);
  218 + }
  219 + if (level &&
  220 + !(s->intregm_disabled & mask) &&
  221 + !(s->intregm_disabled & 0x80000000) &&
  222 + (pil == 15 || (pil > cpu_single_env->psrpil && cpu_single_env->psret == 1))) {
  223 +#ifdef DEBUG_IRQ_COUNT
  224 + if (level == 1)
  225 + s->irq_count[pil]++;
  226 +#endif
  227 + cpu_single_env->interrupt_index = TT_EXTINT | pil;
  228 + cpu_interrupt(cpu_single_env, CPU_INTERRUPT_HARD);
  229 + }
  230 + }
  231 + }
  232 +}
  233 +
  234 +static void slavio_intctl_save(QEMUFile *f, void *opaque)
  235 +{
  236 + SLAVIO_INTCTLState *s = opaque;
  237 + int i;
  238 +
  239 + for (i = 0; i < MAX_CPUS; i++) {
  240 + qemu_put_be32s(f, &s->intreg_pending[i]);
  241 + }
  242 + qemu_put_be32s(f, &s->intregm_pending);
  243 + qemu_put_be32s(f, &s->intregm_disabled);
  244 + qemu_put_be32s(f, &s->target_cpu);
  245 +}
  246 +
  247 +static int slavio_intctl_load(QEMUFile *f, void *opaque, int version_id)
  248 +{
  249 + SLAVIO_INTCTLState *s = opaque;
  250 + int i;
  251 +
  252 + if (version_id != 1)
  253 + return -EINVAL;
  254 +
  255 + for (i = 0; i < MAX_CPUS; i++) {
  256 + qemu_get_be32s(f, &s->intreg_pending[i]);
  257 + }
  258 + qemu_get_be32s(f, &s->intregm_pending);
  259 + qemu_get_be32s(f, &s->intregm_disabled);
  260 + qemu_get_be32s(f, &s->target_cpu);
  261 + return 0;
  262 +}
  263 +
  264 +static void slavio_intctl_reset(void *opaque)
  265 +{
  266 + SLAVIO_INTCTLState *s = opaque;
  267 + int i;
  268 +
  269 + for (i = 0; i < MAX_CPUS; i++) {
  270 + s->intreg_pending[i] = 0;
  271 + }
  272 + s->intregm_disabled = 0xffffffff;
  273 + s->intregm_pending = 0;
  274 + s->target_cpu = 0;
  275 +}
  276 +
  277 +void *slavio_intctl_init(uint32_t addr, uint32_t addrg)
  278 +{
  279 + int slavio_intctl_io_memory, slavio_intctlm_io_memory, i;
  280 + SLAVIO_INTCTLState *s;
  281 +
  282 + s = qemu_mallocz(sizeof(SLAVIO_INTCTLState));
  283 + if (!s)
  284 + return NULL;
  285 +
  286 + for (i = 0; i < MAX_CPUS; i++) {
  287 + slavio_intctl_io_memory = cpu_register_io_memory(0, slavio_intctl_mem_read, slavio_intctl_mem_write, s);
  288 + cpu_register_physical_memory(addr + i * TARGET_PAGE_SIZE, INTCTL_MAXADDR, slavio_intctl_io_memory);
  289 + }
  290 +
  291 + slavio_intctlm_io_memory = cpu_register_io_memory(0, slavio_intctlm_mem_read, slavio_intctlm_mem_write, s);
  292 + cpu_register_physical_memory(addrg, INTCTLM_MAXADDR, slavio_intctlm_io_memory);
  293 +
  294 + register_savevm("slavio_intctl", addr, 1, slavio_intctl_save, slavio_intctl_load, s);
  295 + qemu_register_reset(slavio_intctl_reset, s);
  296 + slavio_intctl_reset(s);
  297 + return s;
  298 +}
  299 +
hw/slavio_serial.c 0 → 100644
  1 +/*
  2 + * QEMU Sparc SLAVIO serial port emulation
  3 + *
  4 + * Copyright (c) 2003-2004 Fabrice Bellard
  5 + *
  6 + * Permission is hereby granted, free of charge, to any person obtaining a copy
  7 + * of this software and associated documentation files (the "Software"), to deal
  8 + * in the Software without restriction, including without limitation the rights
  9 + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  10 + * copies of the Software, and to permit persons to whom the Software is
  11 + * furnished to do so, subject to the following conditions:
  12 + *
  13 + * The above copyright notice and this permission notice shall be included in
  14 + * all copies or substantial portions of the Software.
  15 + *
  16 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  19 + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  20 + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  21 + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  22 + * THE SOFTWARE.
  23 + */
  24 +#include "vl.h"
  25 +
  26 +//#define DEBUG_SERIAL
  27 +
  28 +/* debug keyboard */
  29 +//#define DEBUG_KBD
  30 +
  31 +/* debug keyboard : only mouse */
  32 +//#define DEBUG_MOUSE
  33 +
  34 +/*
  35 + * This is the serial port, mouse and keyboard part of chip STP2001
  36 + * (Slave I/O), also produced as NCR89C105. See
  37 + * http://www.ibiblio.org/pub/historic-linux/early-ports/Sparc/NCR/NCR89C105.txt
  38 + *
  39 + * The serial ports implement full AMD AM8530 or Zilog Z8530 chips,
  40 + * mouse and keyboard ports don't implement all functions and they are
  41 + * only asynchronous. There is no DMA.
  42 + *
  43 + */
  44 +
  45 +typedef struct ChannelState {
  46 + int irq;
  47 + int reg;
  48 + int rxint, txint;
  49 + uint8_t rx, tx, wregs[16], rregs[16];
  50 + CharDriverState *chr;
  51 +} ChannelState;
  52 +
  53 +struct SerialState {
  54 + struct ChannelState chn[2];
  55 +};
  56 +
  57 +#define SERIAL_MAXADDR 7
  58 +
  59 +static void slavio_serial_update_irq(ChannelState *s)
  60 +{
  61 + if ((s->wregs[1] & 1) && // interrupts enabled
  62 + (((s->wregs[1] & 2) && s->txint == 1) || // tx ints enabled, pending
  63 + ((((s->wregs[1] & 0x18) == 8) || ((s->wregs[1] & 0x18) == 0x10)) &&
  64 + s->rxint == 1) || // rx ints enabled, pending
  65 + ((s->wregs[15] & 0x80) && (s->rregs[0] & 0x80)))) { // break int e&p
  66 + pic_set_irq(s->irq, 1);
  67 + } else {
  68 + pic_set_irq(s->irq, 0);
  69 + }
  70 +}
  71 +
  72 +static void slavio_serial_reset_chn(ChannelState *s)
  73 +{
  74 + int i;
  75 +
  76 + s->reg = 0;
  77 + for (i = 0; i < SERIAL_MAXADDR; i++) {
  78 + s->rregs[i] = 0;
  79 + s->wregs[i] = 0;
  80 + }
  81 + s->wregs[4] = 4;
  82 + s->wregs[9] = 0xc0;
  83 + s->wregs[11] = 8;
  84 + s->wregs[14] = 0x30;
  85 + s->wregs[15] = 0xf8;
  86 + s->rregs[0] = 0x44;
  87 + s->rregs[1] = 6;
  88 +
  89 + s->rx = s->tx = 0;
  90 + s->rxint = s->txint = 0;
  91 +}
  92 +
  93 +static void slavio_serial_reset(void *opaque)
  94 +{
  95 + SerialState *s = opaque;
  96 + slavio_serial_reset_chn(&s->chn[0]);
  97 + slavio_serial_reset_chn(&s->chn[1]);
  98 +}
  99 +
  100 +static void slavio_serial_mem_writeb(void *opaque, uint32_t addr, uint32_t val)
  101 +{
  102 + SerialState *ser = opaque;
  103 + ChannelState *s;
  104 + uint32_t saddr;
  105 + int newreg, channel;
  106 +
  107 + val &= 0xff;
  108 + saddr = (addr & 3) >> 1;
  109 + channel = (addr & SERIAL_MAXADDR) >> 2;
  110 + s = &ser->chn[channel];
  111 + switch (saddr) {
  112 + case 0:
  113 + newreg = 0;
  114 + switch (s->reg) {
  115 + case 0:
  116 + newreg = val & 7;
  117 + val &= 0x38;
  118 + switch (val) {
  119 + case 8:
  120 + s->reg |= 0x8;
  121 + break;
  122 + case 0x20:
  123 + s->rxint = 0;
  124 + break;
  125 + case 0x28:
  126 + s->txint = 0;
  127 + break;
  128 + default:
  129 + break;
  130 + }
  131 + break;
  132 + case 1 ... 8:
  133 + case 10 ... 15:
  134 + s->wregs[s->reg] = val;
  135 + break;
  136 + case 9:
  137 + switch (val & 0xc0) {
  138 + case 0:
  139 + default:
  140 + break;
  141 + case 0x40:
  142 + slavio_serial_reset_chn(&ser->chn[1]);
  143 + return;
  144 + case 0x80:
  145 + slavio_serial_reset_chn(&ser->chn[0]);
  146 + return;
  147 + case 0xc0:
  148 + slavio_serial_reset(ser);
  149 + return;
  150 + }
  151 + break;
  152 + default:
  153 + break;
  154 + }
  155 + if (s->reg == 0)
  156 + s->reg = newreg;
  157 + else
  158 + s->reg = 0;
  159 + break;
  160 + case 1:
  161 + if (s->wregs[5] & 8) { // tx enabled
  162 + s->tx = val;
  163 + if (s->chr)
  164 + qemu_chr_write(s->chr, &s->tx, 1);
  165 + s->txint = 1;
  166 + }
  167 + break;
  168 + default:
  169 + break;
  170 + }
  171 +}
  172 +
  173 +static uint32_t slavio_serial_mem_readb(void *opaque, uint32_t addr)
  174 +{
  175 + SerialState *ser = opaque;
  176 + ChannelState *s;
  177 + uint32_t saddr;
  178 + uint32_t ret;
  179 + int channel;
  180 +
  181 + saddr = (addr & 3) >> 1;
  182 + channel = (addr & SERIAL_MAXADDR) >> 2;
  183 + s = &ser->chn[channel];
  184 + switch (saddr) {
  185 + case 0:
  186 + ret = s->rregs[s->reg];
  187 + s->reg = 0;
  188 + return ret;
  189 + case 1:
  190 + s->rregs[0] &= ~1;
  191 + return s->rx;
  192 + default:
  193 + break;
  194 + }
  195 + return 0;
  196 +}
  197 +
  198 +static int serial_can_receive(void *opaque)
  199 +{
  200 + ChannelState *s = opaque;
  201 + if (((s->wregs[3] & 1) == 0) // Rx not enabled
  202 + || ((s->rregs[0] & 1) == 1)) // char already available
  203 + return 0;
  204 + else
  205 + return 1;
  206 +}
  207 +
  208 +static void serial_receive_byte(ChannelState *s, int ch)
  209 +{
  210 + s->rregs[0] |= 1;
  211 + s->rx = ch;
  212 + s->rxint = 1;
  213 + slavio_serial_update_irq(s);
  214 +}
  215 +
  216 +static void serial_receive_break(ChannelState *s)
  217 +{
  218 + s->rregs[0] |= 0x80;
  219 + slavio_serial_update_irq(s);
  220 +}
  221 +
  222 +static void serial_receive1(void *opaque, const uint8_t *buf, int size)
  223 +{
  224 + ChannelState *s = opaque;
  225 + serial_receive_byte(s, buf[0]);
  226 +}
  227 +
  228 +static void serial_event(void *opaque, int event)
  229 +{
  230 + ChannelState *s = opaque;
  231 + if (event == CHR_EVENT_BREAK)
  232 + serial_receive_break(s);
  233 +}
  234 +
  235 +static CPUReadMemoryFunc *slavio_serial_mem_read[3] = {
  236 + slavio_serial_mem_readb,
  237 + slavio_serial_mem_readb,
  238 + slavio_serial_mem_readb,
  239 +};
  240 +
  241 +static CPUWriteMemoryFunc *slavio_serial_mem_write[3] = {
  242 + slavio_serial_mem_writeb,
  243 + slavio_serial_mem_writeb,
  244 + slavio_serial_mem_writeb,
  245 +};
  246 +
  247 +static void slavio_serial_save_chn(QEMUFile *f, ChannelState *s)
  248 +{
  249 + qemu_put_be32s(f, &s->irq);
  250 + qemu_put_be32s(f, &s->reg);
  251 + qemu_put_be32s(f, &s->rxint);
  252 + qemu_put_be32s(f, &s->txint);
  253 + qemu_put_8s(f, &s->rx);
  254 + qemu_put_8s(f, &s->tx);
  255 + qemu_put_buffer(f, s->wregs, 16);
  256 + qemu_put_buffer(f, s->rregs, 16);
  257 +}
  258 +
  259 +static void slavio_serial_save(QEMUFile *f, void *opaque)
  260 +{
  261 + SerialState *s = opaque;
  262 +
  263 + slavio_serial_save_chn(f, &s->chn[0]);
  264 + slavio_serial_save_chn(f, &s->chn[1]);
  265 +}
  266 +
  267 +static int slavio_serial_load_chn(QEMUFile *f, ChannelState *s, int version_id)
  268 +{
  269 + if (version_id != 1)
  270 + return -EINVAL;
  271 +
  272 + qemu_get_be32s(f, &s->irq);
  273 + qemu_get_be32s(f, &s->reg);
  274 + qemu_get_be32s(f, &s->rxint);
  275 + qemu_get_be32s(f, &s->txint);
  276 + qemu_get_8s(f, &s->rx);
  277 + qemu_get_8s(f, &s->tx);
  278 + qemu_get_buffer(f, s->wregs, 16);
  279 + qemu_get_buffer(f, s->rregs, 16);
  280 + return 0;
  281 +}
  282 +
  283 +static int slavio_serial_load(QEMUFile *f, void *opaque, int version_id)
  284 +{
  285 + SerialState *s = opaque;
  286 + int ret;
  287 +
  288 + ret = slavio_serial_load_chn(f, &s->chn[0], version_id);
  289 + if (ret != 0)
  290 + return ret;
  291 + ret = slavio_serial_load_chn(f, &s->chn[1], version_id);
  292 + return ret;
  293 +
  294 +}
  295 +
  296 +SerialState *slavio_serial_init(int base, int irq, CharDriverState *chr1, CharDriverState *chr2)
  297 +{
  298 + int slavio_serial_io_memory;
  299 + SerialState *s;
  300 +
  301 + s = qemu_mallocz(sizeof(SerialState));
  302 + if (!s)
  303 + return NULL;
  304 + s->chn[0].irq = irq;
  305 + s->chn[1].irq = irq;
  306 + s->chn[0].chr = chr1;
  307 + s->chn[1].chr = chr2;
  308 +
  309 + slavio_serial_io_memory = cpu_register_io_memory(0, slavio_serial_mem_read, slavio_serial_mem_write, s);
  310 + cpu_register_physical_memory(base, SERIAL_MAXADDR, slavio_serial_io_memory);
  311 +
  312 + if (chr1) {
  313 + qemu_chr_add_read_handler(chr1, serial_can_receive, serial_receive1, &s->chn[0]);
  314 + qemu_chr_add_event_handler(chr1, serial_event);
  315 + }
  316 + if (chr2) {
  317 + qemu_chr_add_read_handler(chr2, serial_can_receive, serial_receive1, &s->chn[1]);
  318 + qemu_chr_add_event_handler(chr2, serial_event);
  319 + }
  320 + register_savevm("slavio_serial", base, 1, slavio_serial_save, slavio_serial_load, s);
  321 + qemu_register_reset(slavio_serial_reset, s);
  322 + slavio_serial_reset(s);
  323 + return s;
  324 +}
  325 +
  326 +static void sunkbd_event(void *opaque, int ch)
  327 +{
  328 + ChannelState *s = opaque;
  329 + // XXX: PC -> Sun Type 5 translation?
  330 + serial_receive_byte(s, ch);
  331 +}
  332 +
  333 +static void sunmouse_event(void *opaque,
  334 + int dx, int dy, int dz, int buttons_state)
  335 +{
  336 + ChannelState *s = opaque;
  337 + int ch;
  338 +
  339 + // XXX
  340 + ch = 0x42;
  341 + serial_receive_byte(s, ch);
  342 +}
  343 +
  344 +void slavio_serial_ms_kbd_init(int base, int irq)
  345 +{
  346 + int slavio_serial_io_memory;
  347 + SerialState *s;
  348 +
  349 + s = qemu_mallocz(sizeof(SerialState));
  350 + if (!s)
  351 + return;
  352 + s->chn[0].irq = irq;
  353 + s->chn[1].irq = irq;
  354 + s->chn[0].chr = NULL;
  355 + s->chn[1].chr = NULL;
  356 +
  357 + slavio_serial_io_memory = cpu_register_io_memory(0, slavio_serial_mem_read, slavio_serial_mem_write, s);
  358 + cpu_register_physical_memory(base, SERIAL_MAXADDR, slavio_serial_io_memory);
  359 +
  360 + qemu_add_kbd_event_handler(sunkbd_event, &s->chn[0]);
  361 + qemu_add_mouse_event_handler(sunmouse_event, &s->chn[1]);
  362 + qemu_register_reset(slavio_serial_reset, s);
  363 + slavio_serial_reset(s);
  364 +}
hw/slavio_timer.c 0 → 100644
  1 +/*
  2 + * QEMU Sparc SLAVIO timer controller emulation
  3 + *
  4 + * Copyright (c) 2003-2004 Fabrice Bellard
  5 + *
  6 + * Permission is hereby granted, free of charge, to any person obtaining a copy
  7 + * of this software and associated documentation files (the "Software"), to deal
  8 + * in the Software without restriction, including without limitation the rights
  9 + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  10 + * copies of the Software, and to permit persons to whom the Software is
  11 + * furnished to do so, subject to the following conditions:
  12 + *
  13 + * The above copyright notice and this permission notice shall be included in
  14 + * all copies or substantial portions of the Software.
  15 + *
  16 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  19 + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  20 + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  21 + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  22 + * THE SOFTWARE.
  23 + */
  24 +#include "vl.h"
  25 +
  26 +//#define DEBUG_TIMER
  27 +
  28 +/*
  29 + * Registers of hardware timer in sun4m.
  30 + *
  31 + * This is the timer/counter part of chip STP2001 (Slave I/O), also
  32 + * produced as NCR89C105. See
  33 + * http://www.ibiblio.org/pub/historic-linux/early-ports/Sparc/NCR/NCR89C105.txt
  34 + *
  35 + * The 31-bit counter is incremented every 500ns by bit 9. Bits 8..0
  36 + * are zero. Bit 31 is 1 when count has been reached.
  37 + *
  38 + */
  39 +
  40 +typedef struct SLAVIO_TIMERState {
  41 + uint32_t limit, count, counthigh;
  42 + int64_t count_load_time;
  43 + int64_t expire_time;
  44 + int64_t stop_time, tick_offset;
  45 + QEMUTimer *irq_timer;
  46 + int irq;
  47 + int reached, stopped;
  48 + int mode; // 0 = processor, 1 = user, 2 = system
  49 +} SLAVIO_TIMERState;
  50 +
  51 +#define TIMER_MAXADDR 0x1f
  52 +#define CNT_FREQ 2000000
  53 +#define MAX_CPUS 16
  54 +
  55 +// Update count, set irq, update expire_time
  56 +static void slavio_timer_get_out(SLAVIO_TIMERState *s)
  57 +{
  58 + int out;
  59 + int64_t diff, ticks, count;
  60 + uint32_t limit;
  61 +
  62 + // There are three clock tick units: CPU ticks, register units
  63 + // (nanoseconds), and counter ticks (500 ns).
  64 + if (s->mode == 1 && s->stopped)
  65 + ticks = s->stop_time;
  66 + else
  67 + ticks = qemu_get_clock(vm_clock) - s->tick_offset;
  68 +
  69 + out = (ticks >= s->expire_time);
  70 + if (out)
  71 + s->reached = 0x80000000;
  72 + if (!s->limit)
  73 + limit = 0x7fffffff;
  74 + else
  75 + limit = s->limit;
  76 +
  77 + // Convert register units to counter ticks
  78 + limit = limit >> 9;
  79 +
  80 + // Convert cpu ticks to counter ticks
  81 + diff = muldiv64(ticks - s->count_load_time, CNT_FREQ, ticks_per_sec);
  82 +
  83 + // Calculate what the counter should be, convert to register
  84 + // units
  85 + count = diff % limit;
  86 + s->count = count << 9;
  87 + s->counthigh = count >> 22;
  88 +
  89 + // Expire time: CPU ticks left to next interrupt
  90 + // Convert remaining counter ticks to CPU ticks
  91 + s->expire_time = ticks + muldiv64(limit - count, ticks_per_sec, CNT_FREQ);
  92 +
  93 +#ifdef DEBUG_TIMER
  94 + term_printf("timer: irq %d limit %d reached %d d %lld count %d s->c %x diff %lld stopped %d mode %d\n", s->irq, limit, s->reached?1:0, (ticks-s->count_load_time), count, s->count, s->expire_time - ticks, s->stopped, s->mode);
  95 +#endif
  96 + if (s->mode != 1)
  97 + pic_set_irq(s->irq, out);
  98 +}
  99 +
  100 +// timer callback
  101 +static void slavio_timer_irq(void *opaque)
  102 +{
  103 + SLAVIO_TIMERState *s = opaque;
  104 +
  105 + if (!s->irq_timer)
  106 + return;
  107 + slavio_timer_get_out(s);
  108 + if (s->mode != 1)
  109 + qemu_mod_timer(s->irq_timer, s->expire_time);
  110 +}
  111 +
  112 +static uint32_t slavio_timer_mem_readl(void *opaque, target_phys_addr_t addr)
  113 +{
  114 + SLAVIO_TIMERState *s = opaque;
  115 + uint32_t saddr;
  116 +
  117 + saddr = (addr & TIMER_MAXADDR) >> 2;
  118 + switch (saddr) {
  119 + case 0:
  120 + // read limit (system counter mode) or read most signifying
  121 + // part of counter (user mode)
  122 + if (s->mode != 1) {
  123 + // clear irq
  124 + pic_set_irq(s->irq, 0);
  125 + s->count_load_time = qemu_get_clock(vm_clock);
  126 + s->reached = 0;
  127 + return s->limit;
  128 + }
  129 + else {
  130 + slavio_timer_get_out(s);
  131 + return s->counthigh & 0x7fffffff;
  132 + }
  133 + case 1:
  134 + // read counter and reached bit (system mode) or read lsbits
  135 + // of counter (user mode)
  136 + slavio_timer_get_out(s);
  137 + if (s->mode != 1)
  138 + return (s->count & 0x7fffffff) | s->reached;
  139 + else
  140 + return s->count;
  141 + case 3:
  142 + // read start/stop status
  143 + return s->stopped;
  144 + case 4:
  145 + // read user/system mode
  146 + return s->mode & 1;
  147 + default:
  148 + return 0;
  149 + }
  150 +}
  151 +
  152 +static void slavio_timer_mem_writel(void *opaque, target_phys_addr_t addr, uint32_t val)
  153 +{
  154 + SLAVIO_TIMERState *s = opaque;
  155 + uint32_t saddr;
  156 +
  157 + saddr = (addr & TIMER_MAXADDR) >> 2;
  158 + switch (saddr) {
  159 + case 0:
  160 + // set limit, reset counter
  161 + s->count_load_time = qemu_get_clock(vm_clock);
  162 + // fall through
  163 + case 2:
  164 + // set limit without resetting counter
  165 + if (!val)
  166 + s->limit = 0x7fffffff;
  167 + else
  168 + s->limit = val & 0x7fffffff;
  169 + slavio_timer_irq(s);
  170 + break;
  171 + case 3:
  172 + // start/stop user counter
  173 + if (s->mode == 1) {
  174 + if (val & 1) {
  175 + s->stop_time = qemu_get_clock(vm_clock);
  176 + s->stopped = 1;
  177 + }
  178 + else {
  179 + if (s->stopped)
  180 + s->tick_offset += qemu_get_clock(vm_clock) - s->stop_time;
  181 + s->stopped = 0;
  182 + }
  183 + }
  184 + break;
  185 + case 4:
  186 + // bit 0: user (1) or system (0) counter mode
  187 + if (s->mode == 0 || s->mode == 1)
  188 + s->mode = val & 1;
  189 + break;
  190 + default:
  191 + break;
  192 + }
  193 +}
  194 +
  195 +static CPUReadMemoryFunc *slavio_timer_mem_read[3] = {
  196 + slavio_timer_mem_readl,
  197 + slavio_timer_mem_readl,
  198 + slavio_timer_mem_readl,
  199 +};
  200 +
  201 +static CPUWriteMemoryFunc *slavio_timer_mem_write[3] = {
  202 + slavio_timer_mem_writel,
  203 + slavio_timer_mem_writel,
  204 + slavio_timer_mem_writel,
  205 +};
  206 +
  207 +static void slavio_timer_save(QEMUFile *f, void *opaque)
  208 +{
  209 + SLAVIO_TIMERState *s = opaque;
  210 +
  211 + qemu_put_be32s(f, &s->limit);
  212 + qemu_put_be32s(f, &s->count);
  213 + qemu_put_be32s(f, &s->counthigh);
  214 + qemu_put_be64s(f, &s->count_load_time);
  215 + qemu_put_be64s(f, &s->expire_time);
  216 + qemu_put_be64s(f, &s->stop_time);
  217 + qemu_put_be64s(f, &s->tick_offset);
  218 + qemu_put_be32s(f, &s->irq);
  219 + qemu_put_be32s(f, &s->reached);
  220 + qemu_put_be32s(f, &s->stopped);
  221 + qemu_put_be32s(f, &s->mode);
  222 +}
  223 +
  224 +static int slavio_timer_load(QEMUFile *f, void *opaque, int version_id)
  225 +{
  226 + SLAVIO_TIMERState *s = opaque;
  227 +
  228 + if (version_id != 1)
  229 + return -EINVAL;
  230 +
  231 + qemu_get_be32s(f, &s->limit);
  232 + qemu_get_be32s(f, &s->count);
  233 + qemu_get_be32s(f, &s->counthigh);
  234 + qemu_get_be64s(f, &s->count_load_time);
  235 + qemu_get_be64s(f, &s->expire_time);
  236 + qemu_get_be64s(f, &s->stop_time);
  237 + qemu_get_be64s(f, &s->tick_offset);
  238 + qemu_get_be32s(f, &s->irq);
  239 + qemu_get_be32s(f, &s->reached);
  240 + qemu_get_be32s(f, &s->stopped);
  241 + qemu_get_be32s(f, &s->mode);
  242 + return 0;
  243 +}
  244 +
  245 +static void slavio_timer_reset(void *opaque)
  246 +{
  247 + SLAVIO_TIMERState *s = opaque;
  248 +
  249 + s->limit = 0;
  250 + s->count = 0;
  251 + s->count_load_time = qemu_get_clock(vm_clock);;
  252 + s->stop_time = s->count_load_time;
  253 + s->tick_offset = 0;
  254 + s->reached = 0;
  255 + s->mode &= 2;
  256 + s->stopped = 1;
  257 + slavio_timer_get_out(s);
  258 +}
  259 +
  260 +static void slavio_timer_init_internal(uint32_t addr, int irq, int mode)
  261 +{
  262 + int slavio_timer_io_memory;
  263 + SLAVIO_TIMERState *s;
  264 +
  265 + s = qemu_mallocz(sizeof(SLAVIO_TIMERState));
  266 + if (!s)
  267 + return;
  268 + s->irq = irq;
  269 + s->mode = mode;
  270 + s->irq_timer = qemu_new_timer(vm_clock, slavio_timer_irq, s);
  271 +
  272 + slavio_timer_io_memory = cpu_register_io_memory(0, slavio_timer_mem_read,
  273 + slavio_timer_mem_write, s);
  274 + cpu_register_physical_memory(addr, TIMER_MAXADDR, slavio_timer_io_memory);
  275 + register_savevm("slavio_timer", addr, 1, slavio_timer_save, slavio_timer_load, s);
  276 + qemu_register_reset(slavio_timer_reset, s);
  277 + slavio_timer_reset(s);
  278 +}
  279 +
  280 +void slavio_timer_init(uint32_t addr1, int irq1, uint32_t addr2, int irq2)
  281 +{
  282 + int i;
  283 +
  284 + for (i = 0; i < MAX_CPUS; i++) {
  285 + slavio_timer_init_internal(addr1 + i * TARGET_PAGE_SIZE, irq1, 0);
  286 + }
  287 +
  288 + slavio_timer_init_internal(addr2, irq2, 2);
  289 +}
hw/sun4m.c
@@ -25,29 +25,32 @@ @@ -25,29 +25,32 @@
25 #include "m48t08.h" 25 #include "m48t08.h"
26 26
27 #define KERNEL_LOAD_ADDR 0x00004000 27 #define KERNEL_LOAD_ADDR 0x00004000
28 -#define MMU_CONTEXT_TBL 0x00003000  
29 -#define MMU_L1PTP (MMU_CONTEXT_TBL + 0x0400)  
30 -#define MMU_L2PTP (MMU_CONTEXT_TBL + 0x0800)  
31 -#define PROM_ADDR 0xffd04000 28 +#define PROM_ADDR 0xffd00000
32 #define PROM_FILENAMEB "proll.bin" 29 #define PROM_FILENAMEB "proll.bin"
33 #define PROM_FILENAMEE "proll.elf" 30 #define PROM_FILENAMEE "proll.elf"
34 -#define PROLL_MAGIC_ADDR 0x20000000  
35 -#define PHYS_JJ_EEPROM 0x71200000 /* [2000] MK48T08 */ 31 +#define PHYS_JJ_EEPROM 0x71200000 /* m48t08 */
36 #define PHYS_JJ_IDPROM_OFF 0x1FD8 32 #define PHYS_JJ_IDPROM_OFF 0x1FD8
37 #define PHYS_JJ_EEPROM_SIZE 0x2000 33 #define PHYS_JJ_EEPROM_SIZE 0x2000
38 -#define PHYS_JJ_IOMMU 0x10000000 /* First page of sun4m IOMMU */ 34 +// IRQs are not PIL ones, but master interrupt controller register
  35 +// bits
  36 +#define PHYS_JJ_IOMMU 0x10000000 /* I/O MMU */
39 #define PHYS_JJ_TCX_FB 0x50800000 /* Start address, frame buffer body */ 37 #define PHYS_JJ_TCX_FB 0x50800000 /* Start address, frame buffer body */
40 -#define PHYS_JJ_TCX_0E 0x5E000000 /* Top address, one byte used. */  
41 -#define PHYS_JJ_IOMMU 0x10000000 /* First page of sun4m IOMMU */  
42 -#define PHYS_JJ_LEDMA 0x78400010 /* ledma, off by 10 from unused SCSI */  
43 -#define PHYS_JJ_LE 0x78C00000 /* LANCE, typical sun4m */  
44 -#define PHYS_JJ_LE_IRQ 6  
45 -#define PHYS_JJ_CLOCK 0x71D00000  
46 -#define PHYS_JJ_CLOCK_IRQ 10  
47 -#define PHYS_JJ_CLOCK1 0x71D10000  
48 -#define PHYS_JJ_CLOCK1_IRQ 14  
49 -#define PHYS_JJ_INTR0 0x71E00000 /* CPU0 interrupt control registers */ 38 +#define PHYS_JJ_LEDMA 0x78400010 /* Lance DMA controller */
  39 +#define PHYS_JJ_LE 0x78C00000 /* Lance ethernet */
  40 +#define PHYS_JJ_LE_IRQ 16
  41 +#define PHYS_JJ_CLOCK 0x71D00000 /* Per-CPU timer/counter, L14 */
  42 +#define PHYS_JJ_CLOCK_IRQ 7
  43 +#define PHYS_JJ_CLOCK1 0x71D10000 /* System timer/counter, L10 */
  44 +#define PHYS_JJ_CLOCK1_IRQ 19
  45 +#define PHYS_JJ_INTR0 0x71E00000 /* Per-CPU interrupt control registers */
50 #define PHYS_JJ_INTR_G 0x71E10000 /* Master interrupt control registers */ 46 #define PHYS_JJ_INTR_G 0x71E10000 /* Master interrupt control registers */
  47 +#define PHYS_JJ_MS_KBD 0x71000000 /* Mouse and keyboard */
  48 +#define PHYS_JJ_MS_KBD_IRQ 14
  49 +#define PHYS_JJ_SER 0x71100000 /* Serial */
  50 +#define PHYS_JJ_SER_IRQ 15
  51 +#define PHYS_JJ_SCSI_IRQ 18
  52 +#define PHYS_JJ_FDC 0x71400000 /* Floppy */
  53 +#define PHYS_JJ_FLOPPY_IRQ 22
51 54
52 /* TSC handling */ 55 /* TSC handling */
53 56
@@ -57,13 +60,73 @@ uint64_t cpu_get_tsc() @@ -57,13 +60,73 @@ uint64_t cpu_get_tsc()
57 } 60 }
58 61
59 void DMA_run() {} 62 void DMA_run() {}
60 -void SB16_run() {}  
61 -int serial_can_receive(SerialState *s) { return 0; }  
62 -void serial_receive_byte(SerialState *s, int ch) {}  
63 -void serial_receive_break(SerialState *s) {}  
64 63
65 static m48t08_t *nvram; 64 static m48t08_t *nvram;
66 65
  66 +static void nvram_init(m48t08_t *nvram, uint8_t *macaddr)
  67 +{
  68 + unsigned char tmp = 0;
  69 + int i, j;
  70 +
  71 + i = 0x1fd8;
  72 + m48t08_write(nvram, i++, 0x01);
  73 + m48t08_write(nvram, i++, 0x80); /* Sun4m OBP */
  74 + j = 0;
  75 + m48t08_write(nvram, i++, macaddr[j++]);
  76 + m48t08_write(nvram, i++, macaddr[j++]);
  77 + m48t08_write(nvram, i++, macaddr[j++]);
  78 + m48t08_write(nvram, i++, macaddr[j++]);
  79 + m48t08_write(nvram, i++, macaddr[j++]);
  80 + m48t08_write(nvram, i, macaddr[j]);
  81 +
  82 + /* Calculate checksum */
  83 + for (i = 0x1fd8; i < 0x1fe7; i++) {
  84 + tmp ^= m48t08_read(nvram, i);
  85 + }
  86 + m48t08_write(nvram, 0x1fe7, tmp);
  87 +}
  88 +
  89 +static void *slavio_intctl;
  90 +
  91 +void pic_info()
  92 +{
  93 + slavio_pic_info(slavio_intctl);
  94 +}
  95 +
  96 +void irq_info()
  97 +{
  98 + slavio_irq_info(slavio_intctl);
  99 +}
  100 +
  101 +void pic_set_irq(int irq, int level)
  102 +{
  103 + slavio_pic_set_irq(slavio_intctl, irq, level);
  104 +}
  105 +
  106 +static void *tcx;
  107 +
  108 +void vga_update_display()
  109 +{
  110 + tcx_update_display(tcx);
  111 +}
  112 +
  113 +void vga_invalidate_display()
  114 +{
  115 + tcx_invalidate_display(tcx);
  116 +}
  117 +
  118 +void vga_screen_dump(const char *filename)
  119 +{
  120 + tcx_screen_dump(tcx, filename);
  121 +}
  122 +
  123 +static void *iommu;
  124 +
  125 +uint32_t iommu_translate(uint32_t addr)
  126 +{
  127 + return iommu_translate_local(iommu, addr);
  128 +}
  129 +
67 /* Sun4m hardware initialisation */ 130 /* Sun4m hardware initialisation */
68 void sun4m_init(int ram_size, int vga_ram_size, int boot_device, 131 void sun4m_init(int ram_size, int vga_ram_size, int boot_device,
69 DisplayState *ds, const char **fd_filename, int snapshot, 132 DisplayState *ds, const char **fd_filename, int snapshot,
@@ -72,42 +135,50 @@ void sun4m_init(int ram_size, int vga_ram_size, int boot_device, @@ -72,42 +135,50 @@ void sun4m_init(int ram_size, int vga_ram_size, int boot_device,
72 { 135 {
73 char buf[1024]; 136 char buf[1024];
74 int ret, linux_boot; 137 int ret, linux_boot;
75 - unsigned long bios_offset; 138 + unsigned long vram_size = 0x100000, prom_offset;
76 139
77 linux_boot = (kernel_filename != NULL); 140 linux_boot = (kernel_filename != NULL);
78 141
79 /* allocate RAM */ 142 /* allocate RAM */
80 cpu_register_physical_memory(0, ram_size, 0); 143 cpu_register_physical_memory(0, ram_size, 0);
81 - bios_offset = ram_size;  
82 144
83 - iommu_init(PHYS_JJ_IOMMU);  
84 - sched_init(PHYS_JJ_INTR0, PHYS_JJ_INTR_G);  
85 - tcx_init(ds, PHYS_JJ_TCX_FB); 145 + iommu = iommu_init(PHYS_JJ_IOMMU);
  146 + slavio_intctl = slavio_intctl_init(PHYS_JJ_INTR0, PHYS_JJ_INTR_G);
  147 + tcx = tcx_init(ds, PHYS_JJ_TCX_FB, phys_ram_base + ram_size, ram_size, vram_size);
86 lance_init(&nd_table[0], PHYS_JJ_LE_IRQ, PHYS_JJ_LE, PHYS_JJ_LEDMA); 148 lance_init(&nd_table[0], PHYS_JJ_LE_IRQ, PHYS_JJ_LE, PHYS_JJ_LEDMA);
87 - nvram = m48t08_init(PHYS_JJ_EEPROM, PHYS_JJ_EEPROM_SIZE, &nd_table[0].macaddr);  
88 - timer_init(PHYS_JJ_CLOCK, PHYS_JJ_CLOCK_IRQ);  
89 - timer_init(PHYS_JJ_CLOCK1, PHYS_JJ_CLOCK1_IRQ);  
90 - magic_init(kernel_filename, phys_ram_base + KERNEL_LOAD_ADDR, PROLL_MAGIC_ADDR); 149 + nvram = m48t08_init(PHYS_JJ_EEPROM, PHYS_JJ_EEPROM_SIZE);
  150 + nvram_init(nvram, (uint8_t *)&nd_table[0].macaddr);
  151 + slavio_timer_init(PHYS_JJ_CLOCK, PHYS_JJ_CLOCK_IRQ, PHYS_JJ_CLOCK1, PHYS_JJ_CLOCK1_IRQ);
  152 + slavio_serial_ms_kbd_init(PHYS_JJ_MS_KBD, PHYS_JJ_MS_KBD_IRQ);
  153 + slavio_serial_init(PHYS_JJ_SER, PHYS_JJ_SER_IRQ, serial_hds[0], serial_hds[1]);
  154 + fdctrl_init(PHYS_JJ_FLOPPY_IRQ, 0, 1, PHYS_JJ_FDC, fd_table);
91 155
92 - /* We load Proll as the kernel and start it. It will issue a magic  
93 - IO to load the real kernel */  
94 - if (linux_boot) { 156 + prom_offset = ram_size + vram_size;
  157 +
  158 + snprintf(buf, sizeof(buf), "%s/%s", bios_dir, PROM_FILENAMEE);
  159 + ret = load_elf(buf, phys_ram_base + prom_offset);
  160 + if (ret < 0) {
95 snprintf(buf, sizeof(buf), "%s/%s", bios_dir, PROM_FILENAMEB); 161 snprintf(buf, sizeof(buf), "%s/%s", bios_dir, PROM_FILENAMEB);
96 - ret = load_kernel(buf,  
97 - phys_ram_base + KERNEL_LOAD_ADDR); 162 + ret = load_image(buf, phys_ram_base + prom_offset);
  163 + }
  164 + if (ret < 0) {
  165 + fprintf(stderr, "qemu: could not load prom '%s'\n",
  166 + buf);
  167 + exit(1);
  168 + }
  169 + cpu_register_physical_memory(PROM_ADDR, (ret + TARGET_PAGE_SIZE) & TARGET_PAGE_MASK,
  170 + prom_offset | IO_MEM_ROM);
  171 +
  172 + if (linux_boot) {
  173 + ret = load_elf(kernel_filename, phys_ram_base + KERNEL_LOAD_ADDR);
  174 + if (ret < 0)
  175 + ret = load_aout(kernel_filename, phys_ram_base + KERNEL_LOAD_ADDR);
  176 + if (ret < 0)
  177 + ret = load_image(kernel_filename, phys_ram_base + KERNEL_LOAD_ADDR);
98 if (ret < 0) { 178 if (ret < 0) {
99 fprintf(stderr, "qemu: could not load kernel '%s'\n", 179 fprintf(stderr, "qemu: could not load kernel '%s'\n",
100 - buf);  
101 - exit(1); 180 + kernel_filename);
  181 + exit(1);
102 } 182 }
103 } 183 }
104 - /* Setup a MMU entry for entire address space */  
105 - stl_raw(phys_ram_base + MMU_CONTEXT_TBL, (MMU_L1PTP >> 4) | 1);  
106 - stl_raw(phys_ram_base + MMU_L1PTP, (MMU_L2PTP >> 4) | 1);  
107 - stl_raw(phys_ram_base + MMU_L1PTP + (0x01 << 2), (MMU_L2PTP >> 4) | 1); // 01.. == 00..  
108 - stl_raw(phys_ram_base + MMU_L1PTP + (0xff << 2), (MMU_L2PTP >> 4) | 1); // ff.. == 00..  
109 - stl_raw(phys_ram_base + MMU_L1PTP + (0xf0 << 2), (MMU_L2PTP >> 4) | 1); // f0.. == 00..  
110 - /* 3 = U:RWX S:RWX */  
111 - stl_raw(phys_ram_base + MMU_L2PTP, (3 << PTE_ACCESS_SHIFT) | 2);  
112 - stl_raw(phys_ram_base + MMU_L2PTP, ((0x01 << PTE_PPN_SHIFT) >> 4 ) | (3 << PTE_ACCESS_SHIFT) | 2);  
113 } 184 }
hw/tcx.c
@@ -25,179 +25,254 @@ @@ -25,179 +25,254 @@
25 25
26 #define MAXX 1024 26 #define MAXX 1024
27 #define MAXY 768 27 #define MAXY 768
  28 +/*
  29 + * Proll uses only small part of display, we need to switch to full
  30 + * display when we get linux framebuffer console or X11 running. For
  31 + * now it's just slower and awkward.
  32 +*/
  33 +#if 1
28 #define XSZ (8*80) 34 #define XSZ (8*80)
29 #define YSZ (24*11) 35 #define YSZ (24*11)
30 #define XOFF (MAXX-XSZ) 36 #define XOFF (MAXX-XSZ)
31 #define YOFF (MAXY-YSZ) 37 #define YOFF (MAXY-YSZ)
  38 +#else
  39 +#define XSZ MAXX
  40 +#define YSZ MAXY
  41 +#define XOFF 0
  42 +#define YOFF 0
  43 +#endif
32 44
33 typedef struct TCXState { 45 typedef struct TCXState {
34 uint32_t addr; 46 uint32_t addr;
35 DisplayState *ds; 47 DisplayState *ds;
36 uint8_t *vram; 48 uint8_t *vram;
  49 + unsigned long vram_offset;
  50 + uint8_t r[256], g[256], b[256];
37 } TCXState; 51 } TCXState;
38 52
39 -static TCXState *ts;  
40 -  
41 -void vga_update_display() 53 +static void tcx_draw_line32(TCXState *s1, uint8_t *d,
  54 + const uint8_t *s, int width)
42 { 55 {
43 - dpy_update(ts->ds, 0, 0, XSZ, YSZ); 56 + int x;
  57 + uint8_t val;
  58 +
  59 + for(x = 0; x < width; x++) {
  60 + val = *s++;
  61 + *d++ = s1->r[val];
  62 + *d++ = s1->g[val];
  63 + *d++ = s1->b[val];
  64 + d++;
  65 + }
44 } 66 }
45 67
46 -void vga_invalidate_display() {} 68 +static void tcx_draw_line24(TCXState *s1, uint8_t *d,
  69 + const uint8_t *s, int width)
  70 +{
  71 + int x;
  72 + uint8_t val;
47 73
48 -static uint32_t tcx_mem_readb(void *opaque, target_phys_addr_t addr) 74 + for(x = 0; x < width; x++) {
  75 + val = *s++;
  76 + *d++ = s1->r[val];
  77 + *d++ = s1->g[val];
  78 + *d++ = s1->b[val];
  79 + }
  80 +}
  81 +
  82 +static void tcx_draw_line8(TCXState *s1, uint8_t *d,
  83 + const uint8_t *s, int width)
49 { 84 {
50 - TCXState *s = opaque;  
51 - uint32_t saddr;  
52 - unsigned int x, y;  
53 -  
54 - saddr = addr - s->addr - YOFF*MAXX - XOFF;  
55 - y = saddr / MAXX;  
56 - x = saddr - y * MAXX;  
57 - if (x < XSZ && y < YSZ) {  
58 - return s->vram[y * XSZ + x]; 85 + int x;
  86 + uint8_t val;
  87 +
  88 + for(x = 0; x < width; x++) {
  89 + val = *s++;
  90 + /* XXX translate between palettes? */
  91 + *d++ = val;
59 } 92 }
60 - return 0;  
61 } 93 }
62 94
63 -static uint32_t tcx_mem_readw(void *opaque, target_phys_addr_t addr) 95 +/* Fixed line length 1024 allows us to do nice tricks not possible on
  96 + VGA... */
  97 +void tcx_update_display(void *opaque)
64 { 98 {
65 - uint32_t v;  
66 -#ifdef TARGET_WORDS_BIGENDIAN  
67 - v = tcx_mem_readb(opaque, addr) << 8;  
68 - v |= tcx_mem_readb(opaque, addr + 1); 99 + TCXState *ts = opaque;
  100 + uint32_t page;
  101 + int y, page_min, page_max, y_start, dd, ds;
  102 + uint8_t *d, *s;
  103 + void (*f)(TCXState *s1, uint8_t *d, const uint8_t *s, int width);
  104 +
  105 + if (ts->ds->depth == 0)
  106 + return;
  107 +#ifdef LD_BYPASS_OK
  108 + page = ts->vram_offset + YOFF*MAXX;
69 #else 109 #else
70 - v = tcx_mem_readb(opaque, addr);  
71 - v |= tcx_mem_readb(opaque, addr + 1) << 8; 110 + page = ts->addr + YOFF*MAXX;
72 #endif 111 #endif
73 - return v; 112 + y_start = -1;
  113 + page_min = 0x7fffffff;
  114 + page_max = -1;
  115 + d = ts->ds->data;
  116 + s = ts->vram + YOFF*MAXX + XOFF;
  117 + dd = ts->ds->linesize;
  118 + ds = 1024;
  119 +
  120 + switch (ts->ds->depth) {
  121 + case 32:
  122 + f = tcx_draw_line32;
  123 + break;
  124 + case 24:
  125 + f = tcx_draw_line24;
  126 + break;
  127 + default:
  128 + case 8:
  129 + f = tcx_draw_line8;
  130 + break;
  131 + case 0:
  132 + return;
  133 + }
  134 +
  135 + for(y = 0; y < YSZ; y += 4, page += TARGET_PAGE_SIZE) {
  136 + if (cpu_physical_memory_is_dirty(page)) {
  137 + if (y_start < 0)
  138 + y_start = y;
  139 + if (page < page_min)
  140 + page_min = page;
  141 + if (page > page_max)
  142 + page_max = page;
  143 + f(ts, d, s, XSZ);
  144 + d += dd;
  145 + s += ds;
  146 + f(ts, d, s, XSZ);
  147 + d += dd;
  148 + s += ds;
  149 + f(ts, d, s, XSZ);
  150 + d += dd;
  151 + s += ds;
  152 + f(ts, d, s, XSZ);
  153 + d += dd;
  154 + s += ds;
  155 + } else {
  156 + if (y_start >= 0) {
  157 + /* flush to display */
  158 + dpy_update(ts->ds, 0, y_start,
  159 + XSZ, y - y_start);
  160 + y_start = -1;
  161 + }
  162 + d += dd * 4;
  163 + s += ds * 4;
  164 + }
  165 + }
  166 + if (y_start >= 0) {
  167 + /* flush to display */
  168 + dpy_update(ts->ds, 0, y_start,
  169 + XSZ, y - y_start);
  170 + }
  171 + /* reset modified pages */
  172 + if (page_max != -1) {
  173 + cpu_physical_memory_reset_dirty(page_min, page_max + TARGET_PAGE_SIZE);
  174 + }
74 } 175 }
75 176
76 -static uint32_t tcx_mem_readl(void *opaque, target_phys_addr_t addr) 177 +void tcx_invalidate_display(void *opaque)
77 { 178 {
78 - uint32_t v;  
79 -#ifdef TARGET_WORDS_BIGENDIAN  
80 - v = tcx_mem_readb(opaque, addr) << 24;  
81 - v |= tcx_mem_readb(opaque, addr + 1) << 16;  
82 - v |= tcx_mem_readb(opaque, addr + 2) << 8;  
83 - v |= tcx_mem_readb(opaque, addr + 3); 179 + TCXState *s = opaque;
  180 + int i;
  181 +
  182 + for (i = 0; i < MAXX*MAXY; i += TARGET_PAGE_SIZE) {
  183 +#ifdef LD_BYPASS_OK
  184 + cpu_physical_memory_set_dirty(s->vram_offset + i);
84 #else 185 #else
85 - v = tcx_mem_readb(opaque, addr);  
86 - v |= tcx_mem_readb(opaque, addr + 1) << 8;  
87 - v |= tcx_mem_readb(opaque, addr + 2) << 16;  
88 - v |= tcx_mem_readb(opaque, addr + 3) << 24; 186 + cpu_physical_memory_set_dirty(s->addr + i);
89 #endif 187 #endif
90 - return v; 188 + }
91 } 189 }
92 190
93 -static void tcx_mem_writeb(void *opaque, target_phys_addr_t addr, uint32_t val) 191 +static void tcx_save(QEMUFile *f, void *opaque)
94 { 192 {
95 TCXState *s = opaque; 193 TCXState *s = opaque;
96 - uint32_t saddr;  
97 - unsigned int x, y;  
98 - char *sptr;  
99 -  
100 - saddr = addr - s->addr - YOFF*MAXX - XOFF;  
101 - y = saddr / MAXX;  
102 - x = saddr - y * MAXX;  
103 - if (x < XSZ && y < YSZ) {  
104 - sptr = s->ds->data;  
105 - if (sptr) {  
106 - if (s->ds->depth == 24 || s->ds->depth == 32) {  
107 - /* XXX need to do CLUT translation */  
108 - sptr[y * s->ds->linesize + x*4] = val & 0xff;  
109 - sptr[y * s->ds->linesize + x*4+1] = val & 0xff;  
110 - sptr[y * s->ds->linesize + x*4+2] = val & 0xff;  
111 - }  
112 - else if (s->ds->depth == 8) {  
113 - sptr[y * s->ds->linesize + x] = val & 0xff;  
114 - }  
115 - }  
116 - cpu_physical_memory_set_dirty(addr);  
117 - s->vram[y * XSZ + x] = val & 0xff;  
118 - } 194 +
  195 + qemu_put_be32s(f, (uint32_t *)&s->addr);
  196 + qemu_put_be32s(f, (uint32_t *)&s->vram);
  197 + qemu_put_buffer(f, s->r, 256);
  198 + qemu_put_buffer(f, s->g, 256);
  199 + qemu_put_buffer(f, s->b, 256);
119 } 200 }
120 201
121 -static void tcx_mem_writew(void *opaque, target_phys_addr_t addr, uint32_t val) 202 +static int tcx_load(QEMUFile *f, void *opaque, int version_id)
122 { 203 {
123 -#ifdef TARGET_WORDS_BIGENDIAN  
124 - tcx_mem_writeb(opaque, addr, (val >> 8) & 0xff);  
125 - tcx_mem_writeb(opaque, addr + 1, val & 0xff);  
126 -#else  
127 - tcx_mem_writeb(opaque, addr, val & 0xff);  
128 - tcx_mem_writeb(opaque, addr + 1, (val >> 8) & 0xff);  
129 -#endif 204 + TCXState *s = opaque;
  205 +
  206 + if (version_id != 1)
  207 + return -EINVAL;
  208 +
  209 + qemu_get_be32s(f, (uint32_t *)&s->addr);
  210 + qemu_get_be32s(f, (uint32_t *)&s->vram);
  211 + qemu_get_buffer(f, s->r, 256);
  212 + qemu_get_buffer(f, s->g, 256);
  213 + qemu_get_buffer(f, s->b, 256);
  214 + return 0;
130 } 215 }
131 216
132 -static void tcx_mem_writel(void *opaque, target_phys_addr_t addr, uint32_t val) 217 +static void tcx_reset(void *opaque)
133 { 218 {
134 -#ifdef TARGET_WORDS_BIGENDIAN  
135 - tcx_mem_writeb(opaque, addr, (val >> 24) & 0xff);  
136 - tcx_mem_writeb(opaque, addr + 1, (val >> 16) & 0xff);  
137 - tcx_mem_writeb(opaque, addr + 2, (val >> 8) & 0xff);  
138 - tcx_mem_writeb(opaque, addr + 3, val & 0xff);  
139 -#else  
140 - tcx_mem_writeb(opaque, addr, val & 0xff);  
141 - tcx_mem_writeb(opaque, addr + 1, (val >> 8) & 0xff);  
142 - tcx_mem_writeb(opaque, addr + 2, (val >> 16) & 0xff);  
143 - tcx_mem_writeb(opaque, addr + 3, (val >> 24) & 0xff); 219 + TCXState *s = opaque;
  220 +
  221 + /* Initialize palette */
  222 + memset(s->r, 0, 256);
  223 + memset(s->g, 0, 256);
  224 + memset(s->b, 0, 256);
  225 + s->r[255] = s->g[255] = s->b[255] = 255;
  226 + memset(s->vram, 0, MAXX*MAXY);
  227 +#ifdef LD_BYPASS_OK
  228 + cpu_physical_memory_reset_dirty(s->vram_offset, s->vram_offset + MAXX*MAXY - 1);
144 #endif 229 #endif
145 } 230 }
146 231
147 -static CPUReadMemoryFunc *tcx_mem_read[3] = {  
148 - tcx_mem_readb,  
149 - tcx_mem_readw,  
150 - tcx_mem_readl,  
151 -};  
152 -  
153 -static CPUWriteMemoryFunc *tcx_mem_write[3] = {  
154 - tcx_mem_writeb,  
155 - tcx_mem_writew,  
156 - tcx_mem_writel,  
157 -};  
158 -  
159 -void tcx_init(DisplayState *ds, uint32_t addr) 232 +void *tcx_init(DisplayState *ds, uint32_t addr, uint8_t *vram_base,
  233 + unsigned long vram_offset, int vram_size)
160 { 234 {
161 TCXState *s; 235 TCXState *s;
162 - int tcx_io_memory;  
163 236
164 s = qemu_mallocz(sizeof(TCXState)); 237 s = qemu_mallocz(sizeof(TCXState));
165 if (!s) 238 if (!s)
166 - return; 239 + return NULL;
167 s->ds = ds; 240 s->ds = ds;
168 s->addr = addr; 241 s->addr = addr;
169 - ts = s;  
170 - tcx_io_memory = cpu_register_io_memory(0, tcx_mem_read, tcx_mem_write, s);  
171 - cpu_register_physical_memory(addr, 0x100000,  
172 - tcx_io_memory);  
173 - s->vram = qemu_mallocz(XSZ*YSZ); 242 + s->vram = vram_base;
  243 + s->vram_offset = vram_offset;
  244 +
  245 + cpu_register_physical_memory(addr, vram_size, vram_offset);
  246 +
  247 + register_savevm("tcx", addr, 1, tcx_save, tcx_load, s);
  248 + qemu_register_reset(tcx_reset, s);
  249 + tcx_reset(s);
174 dpy_resize(s->ds, XSZ, YSZ); 250 dpy_resize(s->ds, XSZ, YSZ);
  251 + return s;
175 } 252 }
176 253
177 -void vga_screen_dump(const char *filename) 254 +void tcx_screen_dump(void *opaque, const char *filename)
178 { 255 {
179 - TCXState *s = ts; 256 + TCXState *s = opaque;
180 FILE *f; 257 FILE *f;
181 - uint8_t *d, *d1;  
182 - unsigned int v; 258 + uint8_t *d, *d1, v;
183 int y, x; 259 int y, x;
184 260
185 f = fopen(filename, "wb"); 261 f = fopen(filename, "wb");
186 if (!f) 262 if (!f)
187 - return -1;  
188 - fprintf(f, "P6\n%d %d\n%d\n",  
189 - XSZ, YSZ, 255);  
190 - d1 = s->vram; 263 + return;
  264 + fprintf(f, "P6\n%d %d\n%d\n", XSZ, YSZ, 255);
  265 + d1 = s->vram + YOFF*MAXX + XOFF;
191 for(y = 0; y < YSZ; y++) { 266 for(y = 0; y < YSZ; y++) {
192 d = d1; 267 d = d1;
193 for(x = 0; x < XSZ; x++) { 268 for(x = 0; x < XSZ; x++) {
194 v = *d; 269 v = *d;
195 - fputc((v) & 0xff, f);  
196 - fputc((v) & 0xff, f);  
197 - fputc((v) & 0xff, f); 270 + fputc(s->r[v], f);
  271 + fputc(s->g[v], f);
  272 + fputc(s->b[v], f);
198 d++; 273 d++;
199 } 274 }
200 - d1 += XSZ; 275 + d1 += MAXX;
201 } 276 }
202 fclose(f); 277 fclose(f);
203 return; 278 return;
hw/timer.c deleted 100644 → 0
1 -/*  
2 - * QEMU Sparc timer controller emulation  
3 - *  
4 - * Copyright (c) 2003-2004 Fabrice Bellard  
5 - *  
6 - * Permission is hereby granted, free of charge, to any person obtaining a copy  
7 - * of this software and associated documentation files (the "Software"), to deal  
8 - * in the Software without restriction, including without limitation the rights  
9 - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell  
10 - * copies of the Software, and to permit persons to whom the Software is  
11 - * furnished to do so, subject to the following conditions:  
12 - *  
13 - * The above copyright notice and this permission notice shall be included in  
14 - * all copies or substantial portions of the Software.  
15 - *  
16 - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR  
17 - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,  
18 - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL  
19 - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER  
20 - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,  
21 - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN  
22 - * THE SOFTWARE.  
23 - */  
24 -#include "vl.h"  
25 -  
26 -/*  
27 - * Registers of hardware timer in sun4m.  
28 - */  
29 -struct sun4m_timer_percpu {  
30 - volatile unsigned int l14_timer_limit; /* Initial value is 0x009c4000 */  
31 - volatile unsigned int l14_cur_count;  
32 -};  
33 -  
34 -struct sun4m_timer_global {  
35 - volatile unsigned int l10_timer_limit;  
36 - volatile unsigned int l10_cur_count;  
37 -};  
38 -  
39 -typedef struct TIMERState {  
40 - uint32_t addr;  
41 - uint32_t timer_regs[2];  
42 - int irq;  
43 -} TIMERState;  
44 -  
45 -static uint32_t timer_mem_readl(void *opaque, target_phys_addr_t addr)  
46 -{  
47 - TIMERState *s = opaque;  
48 - uint32_t saddr;  
49 -  
50 - saddr = (addr - s->addr) >> 2;  
51 - switch (saddr) {  
52 - default:  
53 - return s->timer_regs[saddr];  
54 - break;  
55 - }  
56 - return 0;  
57 -}  
58 -  
59 -static void timer_mem_writel(void *opaque, target_phys_addr_t addr, uint32_t val)  
60 -{  
61 - TIMERState *s = opaque;  
62 - uint32_t saddr;  
63 -  
64 - saddr = (addr - s->addr) >> 2;  
65 - switch (saddr) {  
66 - default:  
67 - s->timer_regs[saddr] = val;  
68 - break;  
69 - }  
70 -}  
71 -  
72 -static CPUReadMemoryFunc *timer_mem_read[3] = {  
73 - timer_mem_readl,  
74 - timer_mem_readl,  
75 - timer_mem_readl,  
76 -};  
77 -  
78 -static CPUWriteMemoryFunc *timer_mem_write[3] = {  
79 - timer_mem_writel,  
80 - timer_mem_writel,  
81 - timer_mem_writel,  
82 -};  
83 -  
84 -void timer_init(uint32_t addr, int irq)  
85 -{  
86 - int timer_io_memory;  
87 - TIMERState *s;  
88 -  
89 - s = qemu_mallocz(sizeof(TIMERState));  
90 - if (!s)  
91 - return;  
92 - s->addr = addr;  
93 - s->irq = irq;  
94 -  
95 - timer_io_memory = cpu_register_io_memory(0, timer_mem_read, timer_mem_write, s);  
96 - cpu_register_physical_memory(addr, 2, timer_io_memory);  
97 -}  
linux-user/elfload.c
@@ -841,6 +841,7 @@ static void load_symbols(struct elfhdr *hdr, int fd) @@ -841,6 +841,7 @@ static void load_symbols(struct elfhdr *hdr, int fd)
841 unsigned int i; 841 unsigned int i;
842 struct elf_shdr sechdr, symtab, strtab; 842 struct elf_shdr sechdr, symtab, strtab;
843 char *strings; 843 char *strings;
  844 + struct syminfo *s;
844 845
845 lseek(fd, hdr->e_shoff, SEEK_SET); 846 lseek(fd, hdr->e_shoff, SEEK_SET);
846 for (i = 0; i < hdr->e_shnum; i++) { 847 for (i = 0; i < hdr->e_shnum; i++) {
@@ -866,24 +867,27 @@ static void load_symbols(struct elfhdr *hdr, int fd) @@ -866,24 +867,27 @@ static void load_symbols(struct elfhdr *hdr, int fd)
866 867
867 found: 868 found:
868 /* Now know where the strtab and symtab are. Snarf them. */ 869 /* Now know where the strtab and symtab are. Snarf them. */
869 - disas_symtab = malloc(symtab.sh_size);  
870 - disas_strtab = strings = malloc(strtab.sh_size);  
871 - if (!disas_symtab || !disas_strtab) 870 + s = malloc(sizeof(*s));
  871 + s->disas_symtab = malloc(symtab.sh_size);
  872 + s->disas_strtab = strings = malloc(strtab.sh_size);
  873 + if (!s->disas_symtab || !s->disas_strtab)
872 return; 874 return;
873 875
874 lseek(fd, symtab.sh_offset, SEEK_SET); 876 lseek(fd, symtab.sh_offset, SEEK_SET);
875 - if (read(fd, disas_symtab, symtab.sh_size) != symtab.sh_size) 877 + if (read(fd, s->disas_symtab, symtab.sh_size) != symtab.sh_size)
876 return; 878 return;
877 879
878 #ifdef BSWAP_NEEDED 880 #ifdef BSWAP_NEEDED
879 for (i = 0; i < symtab.sh_size / sizeof(struct elf_sym); i++) 881 for (i = 0; i < symtab.sh_size / sizeof(struct elf_sym); i++)
880 - bswap_sym(disas_symtab + sizeof(struct elf_sym)*i); 882 + bswap_sym(s->disas_symtab + sizeof(struct elf_sym)*i);
881 #endif 883 #endif
882 884
883 lseek(fd, strtab.sh_offset, SEEK_SET); 885 lseek(fd, strtab.sh_offset, SEEK_SET);
884 if (read(fd, strings, strtab.sh_size) != strtab.sh_size) 886 if (read(fd, strings, strtab.sh_size) != strtab.sh_size)
885 return; 887 return;
886 - disas_num_syms = symtab.sh_size / sizeof(struct elf_sym); 888 + s->disas_num_syms = symtab.sh_size / sizeof(struct elf_sym);
  889 + s->next = syminfos;
  890 + syminfos = s;
887 } 891 }
888 892
889 static int load_elf_binary(struct linux_binprm * bprm, struct target_pt_regs * regs, 893 static int load_elf_binary(struct linux_binprm * bprm, struct target_pt_regs * regs,
linux-user/main.c
@@ -497,6 +497,8 @@ void cpu_loop (CPUSPARCState *env) @@ -497,6 +497,8 @@ void cpu_loop (CPUSPARCState *env)
497 case TT_WIN_UNF: /* window underflow */ 497 case TT_WIN_UNF: /* window underflow */
498 restore_window(env); 498 restore_window(env);
499 break; 499 break;
  500 + case 0x100: // XXX, why do we get these?
  501 + break;
500 default: 502 default:
501 printf ("Unhandled trap: 0x%x\n", trapnr); 503 printf ("Unhandled trap: 0x%x\n", trapnr);
502 cpu_dump_state(env, stderr, fprintf, 0); 504 cpu_dump_state(env, stderr, fprintf, 0);
linux-user/signal.c
@@ -1354,13 +1354,14 @@ struct target_rt_signal_frame { @@ -1354,13 +1354,14 @@ struct target_rt_signal_frame {
1354 __siginfo_fpu_t fpu_state; 1354 __siginfo_fpu_t fpu_state;
1355 }; 1355 };
1356 1356
1357 -#define UREG_O0 0  
1358 -#define UREG_O6 6  
1359 -#define UREG_I0 16  
1360 -#define UREG_I1 17  
1361 -#define UREG_I2 18  
1362 -#define UREG_I6 22  
1363 -#define UREG_I7 23 1357 +#define UREG_O0 16
  1358 +#define UREG_O6 22
  1359 +#define UREG_I0 0
  1360 +#define UREG_I1 1
  1361 +#define UREG_I2 2
  1362 +#define UREG_I6 6
  1363 +#define UREG_I7 7
  1364 +#define UREG_L0 8
1364 #define UREG_FP UREG_I6 1365 #define UREG_FP UREG_I6
1365 #define UREG_SP UREG_O6 1366 #define UREG_SP UREG_O6
1366 1367
@@ -1385,23 +1386,20 @@ setup___siginfo(__siginfo_t *si, CPUState *env, target_ulong mask) @@ -1385,23 +1386,20 @@ setup___siginfo(__siginfo_t *si, CPUState *env, target_ulong mask)
1385 { 1386 {
1386 int err = 0, i; 1387 int err = 0, i;
1387 1388
1388 - fprintf(stderr, "2.a %lx psr: %lx regs: %lx\n", si, env->psr, si->si_regs.psr);  
1389 err |= __put_user(env->psr, &si->si_regs.psr); 1389 err |= __put_user(env->psr, &si->si_regs.psr);
1390 - fprintf(stderr, "2.a1 pc:%lx\n", si->si_regs.pc);  
1391 err |= __put_user(env->pc, &si->si_regs.pc); 1390 err |= __put_user(env->pc, &si->si_regs.pc);
1392 err |= __put_user(env->npc, &si->si_regs.npc); 1391 err |= __put_user(env->npc, &si->si_regs.npc);
1393 err |= __put_user(env->y, &si->si_regs.y); 1392 err |= __put_user(env->y, &si->si_regs.y);
1394 - fprintf(stderr, "2.b\n");  
1395 for (i=0; i < 7; i++) { 1393 for (i=0; i < 7; i++) {
1396 err |= __put_user(env->gregs[i], &si->si_regs.u_regs[i]); 1394 err |= __put_user(env->gregs[i], &si->si_regs.u_regs[i]);
1397 } 1395 }
1398 for (i=0; i < 7; i++) { 1396 for (i=0; i < 7; i++) {
1399 - err |= __put_user(env->regwptr[i+16], &si->si_regs.u_regs[i+8]); 1397 + err |= __put_user(env->regwptr[UREG_I0 + i], &si->si_regs.u_regs[i+8]);
1400 } 1398 }
1401 - fprintf(stderr, "2.c\n");  
1402 err |= __put_user(mask, &si->si_mask); 1399 err |= __put_user(mask, &si->si_mask);
1403 return err; 1400 return err;
1404 } 1401 }
  1402 +
1405 static int 1403 static int
1406 setup_sigcontext(struct target_sigcontext *sc, /*struct _fpstate *fpstate,*/ 1404 setup_sigcontext(struct target_sigcontext *sc, /*struct _fpstate *fpstate,*/
1407 CPUState *env, unsigned long mask) 1405 CPUState *env, unsigned long mask)
@@ -1434,6 +1432,7 @@ static void setup_frame(int sig, struct emulated_sigaction *ka, @@ -1434,6 +1432,7 @@ static void setup_frame(int sig, struct emulated_sigaction *ka,
1434 sf = (struct target_signal_frame *) 1432 sf = (struct target_signal_frame *)
1435 get_sigframe(ka, env, sigframe_size); 1433 get_sigframe(ka, env, sigframe_size);
1436 1434
  1435 + //fprintf(stderr, "sf: %x pc %x fp %x sp %x\n", sf, env->pc, env->regwptr[UREG_FP], env->regwptr[UREG_SP]);
1437 #if 0 1436 #if 0
1438 if (invalid_frame_pointer(sf, sigframe_size)) 1437 if (invalid_frame_pointer(sf, sigframe_size))
1439 goto sigill_and_return; 1438 goto sigill_and_return;
@@ -1451,13 +1450,11 @@ static void setup_frame(int sig, struct emulated_sigaction *ka, @@ -1451,13 +1450,11 @@ static void setup_frame(int sig, struct emulated_sigaction *ka,
1451 } 1450 }
1452 1451
1453 for (i = 0; i < 7; i++) { 1452 for (i = 0; i < 7; i++) {
1454 - err |= __put_user(env->regwptr[i + 8], &sf->ss.locals[i]); 1453 + err |= __put_user(env->regwptr[i + UREG_L0], &sf->ss.locals[i]);
1455 } 1454 }
1456 for (i = 0; i < 7; i++) { 1455 for (i = 0; i < 7; i++) {
1457 - err |= __put_user(env->regwptr[i + 16], &sf->ss.ins[i]); 1456 + err |= __put_user(env->regwptr[i + UREG_I0], &sf->ss.ins[i]);
1458 } 1457 }
1459 - //err |= __copy_to_user(sf, (char *) regs->u_regs[UREG_FP],  
1460 - // sizeof(struct reg_window));  
1461 if (err) 1458 if (err)
1462 goto sigsegv; 1459 goto sigsegv;
1463 1460
@@ -1486,13 +1483,15 @@ static void setup_frame(int sig, struct emulated_sigaction *ka, @@ -1486,13 +1483,15 @@ static void setup_frame(int sig, struct emulated_sigaction *ka,
1486 1483
1487 /* Flush instruction space. */ 1484 /* Flush instruction space. */
1488 //flush_sig_insns(current->mm, (unsigned long) &(sf->insns[0])); 1485 //flush_sig_insns(current->mm, (unsigned long) &(sf->insns[0]));
1489 - //tb_flush(env); 1486 + tb_flush(env);
1490 } 1487 }
  1488 + //cpu_dump_state(env, stderr, fprintf, 0);
1491 return; 1489 return;
1492 1490
1493 sigill_and_return: 1491 sigill_and_return:
1494 force_sig(TARGET_SIGILL); 1492 force_sig(TARGET_SIGILL);
1495 sigsegv: 1493 sigsegv:
  1494 + //fprintf(stderr, "force_sig\n");
1496 force_sig(TARGET_SIGSEGV); 1495 force_sig(TARGET_SIGSEGV);
1497 } 1496 }
1498 static inline int 1497 static inline int
@@ -1542,13 +1541,16 @@ static void setup_rt_frame(int sig, struct emulated_sigaction *ka, @@ -1542,13 +1541,16 @@ static void setup_rt_frame(int sig, struct emulated_sigaction *ka,
1542 long do_sigreturn(CPUState *env) 1541 long do_sigreturn(CPUState *env)
1543 { 1542 {
1544 struct target_signal_frame *sf; 1543 struct target_signal_frame *sf;
1545 - unsigned long up_psr, pc, npc; 1544 + uint32_t up_psr, pc, npc;
1546 target_sigset_t set; 1545 target_sigset_t set;
  1546 + sigset_t host_set;
1547 __siginfo_fpu_t *fpu_save; 1547 __siginfo_fpu_t *fpu_save;
1548 - int err; 1548 + int err, i;
1549 1549
1550 - sf = (struct new_signal_frame *) env->regwptr[UREG_FP];  
1551 - fprintf(stderr, "sigreturn sf: %lx\n", &sf); 1550 + sf = (struct target_signal_frame *) env->regwptr[UREG_FP];
  1551 + fprintf(stderr, "sigreturn\n");
  1552 + fprintf(stderr, "sf: %x pc %x fp %x sp %x\n", sf, env->pc, env->regwptr[UREG_FP], env->regwptr[UREG_SP]);
  1553 + //cpu_dump_state(env, stderr, fprintf, 0);
1552 1554
1553 /* 1. Make sure we are not getting garbage from the user */ 1555 /* 1. Make sure we are not getting garbage from the user */
1554 #if 0 1556 #if 0
@@ -1567,36 +1569,41 @@ long do_sigreturn(CPUState *env) @@ -1567,36 +1569,41 @@ long do_sigreturn(CPUState *env)
1567 goto segv_and_exit; 1569 goto segv_and_exit;
1568 1570
1569 /* 2. Restore the state */ 1571 /* 2. Restore the state */
1570 - up_psr = env->psr;  
1571 - //err |= __copy_from_user(regs, &sf->info.si_regs, sizeof (struct pt_regs)  
1572 - //); 1572 + err |= __get_user(up_psr, &sf->info.si_regs.psr);
  1573 +
1573 /* User can only change condition codes and FPU enabling in %psr. */ 1574 /* User can only change condition codes and FPU enabling in %psr. */
1574 env->psr = (up_psr & ~(PSR_ICC /* | PSR_EF */)) 1575 env->psr = (up_psr & ~(PSR_ICC /* | PSR_EF */))
1575 | (env->psr & (PSR_ICC /* | PSR_EF */)); 1576 | (env->psr & (PSR_ICC /* | PSR_EF */));
1576 - fprintf(stderr, "psr: %lx\n", env->psr); 1577 + fprintf(stderr, "psr: %x\n", env->psr);
  1578 + env->pc = pc-4;
  1579 + env->npc = pc;
  1580 + err |= __get_user(env->y, &sf->info.si_regs.y);
  1581 + for (i=0; i < 7; i++) {
  1582 + err |= __get_user(env->gregs[i], &sf->info.si_regs.u_regs[i]);
  1583 + }
  1584 + for (i=0; i < 7; i++) {
  1585 + err |= __get_user(env->regwptr[i + UREG_I0], &sf->info.si_regs.u_regs[i+8]);
  1586 + }
1577 1587
1578 err |= __get_user(fpu_save, &sf->fpu_save); 1588 err |= __get_user(fpu_save, &sf->fpu_save);
1579 1589
1580 - if (fpu_save)  
1581 - err |= restore_fpu_state(env, fpu_save); 1590 + //if (fpu_save)
  1591 + // err |= restore_fpu_state(env, fpu_save);
1582 1592
1583 /* This is pretty much atomic, no amount locking would prevent 1593 /* This is pretty much atomic, no amount locking would prevent
1584 * the races which exist anyways. 1594 * the races which exist anyways.
1585 */ 1595 */
1586 err |= __get_user(set.sig[0], &sf->info.si_mask); 1596 err |= __get_user(set.sig[0], &sf->info.si_mask);
1587 - //err |= __copy_from_user(&set.sig[1], &sf->extramask,  
1588 - // (_NSIG_WORDS-1) * sizeof(unsigned int)); 1597 + for(i = 1; i < TARGET_NSIG_WORDS; i++) {
  1598 + err |= (__get_user(set.sig[i], &sf->extramask[i - 1]));
  1599 + }
  1600 +
  1601 + target_to_host_sigset_internal(&host_set, &set);
  1602 + sigprocmask(SIG_SETMASK, &host_set, NULL);
1589 1603
1590 if (err) 1604 if (err)
1591 goto segv_and_exit; 1605 goto segv_and_exit;
1592 1606
1593 -#if 0  
1594 - sigdelsetmask(&set, ~_BLOCKABLE);  
1595 - spin_lock_irq(&current->sigmask_lock);  
1596 - current->blocked = set;  
1597 - recalc_sigpending(current);  
1598 - spin_unlock_irq(&current->sigmask_lock);  
1599 -#endif  
1600 fprintf(stderr, "returning %lx\n", env->regwptr[0]); 1607 fprintf(stderr, "returning %lx\n", env->regwptr[0]);
1601 return env->regwptr[0]; 1608 return env->regwptr[0];
1602 1609
pc-bios/proll.bin deleted 100644 → 0
No preview for this file type
pc-bios/proll.elf 0 → 100644
No preview for this file type