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 50 install -m 644 pc-bios/bios.bin pc-bios/vgabios.bin \
51 51 pc-bios/vgabios-cirrus.bin \
52 52 pc-bios/ppc_rom.bin \
53   - pc-bios/proll.bin \
  53 + pc-bios/proll.elf \
54 54 pc-bios/linux_boot.bin "$(datadir)"
55 55 mkdir -p "$(docdir)"
56 56 install -m 644 qemu-doc.html qemu-tech.html "$(docdir)"
... ... @@ -107,7 +107,7 @@ tarbin:
107 107 $(datadir)/vgabios.bin \
108 108 $(datadir)/vgabios-cirrus.bin \
109 109 $(datadir)/ppc_rom.bin \
110   - $(datadir)/proll.bin \
  110 + $(datadir)/proll.elf \
111 111 $(datadir)/linux_boot.bin \
112 112 $(docdir)/qemu-doc.html \
113 113 $(docdir)/qemu-tech.html \
... ...
Makefile.target
... ... @@ -175,6 +175,7 @@ endif
175 175  
176 176 ifeq ($(CONFIG_DARWIN),yes)
177 177 OP_CFLAGS+= -mdynamic-no-pic
  178 +LIBS+=-lmx
178 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 301 VL_OBJS+= ppc_prep.o ppc_chrp.o cuda.o adb.o openpic.o mixeng.o
301 302 endif
302 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 305 endif
305 306 ifdef CONFIG_GDBSTUB
306 307 VL_OBJS+=gdbstub.o
... ...
cpu-exec.c
... ... @@ -261,7 +261,7 @@ int cpu_exec(CPUState *env1)
261 261 }
262 262 #elif defined(TARGET_SPARC)
263 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 265 env->interrupt_request &= ~CPU_INTERRUPT_HARD;
266 266 } else if (interrupt_request & CPU_INTERRUPT_TIMER) {
267 267 //do_interrupt(0, 0, 0, 0, 0);
... ...
... ... @@ -9,9 +9,7 @@
9 9 #include "disas.h"
10 10  
11 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 14 /* Get LENGTH bytes from info's buffer, at target address memaddr.
17 15 Transfer them to myaddr. */
... ... @@ -203,19 +201,23 @@ const char *lookup_symbol(void *orig_addr)
203 201 {
204 202 unsigned int i;
205 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 222 return "";
221 223 }
... ...
... ... @@ -9,7 +9,11 @@ void monitor_disas(target_ulong pc, int nb_insn, int is_physical, int flags);
9 9 const char *lookup_symbol(void *orig_addr);
10 10  
11 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 19 #endif /* _QEMU_DISAS_H */
... ...
gdbstub.c
... ... @@ -298,11 +298,7 @@ static int cpu_gdb_read_registers(CPUState *env, uint8_t *mem_buf)
298 298 }
299 299 /* Y, PSR, WIM, TBR, PC, NPC, FPSR, CPSR */
300 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 302 registers[65] = tswapl(tmp);
307 303 registers[66] = tswapl(env->wim);
308 304 registers[67] = tswapl(env->tbr);
... ... @@ -317,7 +313,7 @@ static int cpu_gdb_read_registers(CPUState *env, uint8_t *mem_buf)
317 313  
318 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 317 int i;
322 318  
323 319 /* fill in g0..g7 */
... ... @@ -334,12 +330,7 @@ static void cpu_gdb_write_registers(CPUState *env, uint8_t *mem_buf, int size)
334 330 }
335 331 /* Y, PSR, WIM, TBR, PC, NPC, FPSR, CPSR */
336 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 334 env->wim = tswapl(registers[66]);
344 335 env->tbr = tswapl(registers[67]);
345 336 env->pc = tswapl(registers[68]);
... ... @@ -495,8 +486,10 @@ static void gdb_vm_stopped(void *opaque, int reason)
495 486 /* disable single step if it was enable */
496 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 491 ret = SIGTRAP;
  492 + }
500 493 else
501 494 ret = 0;
502 495 snprintf(buf, sizeof(buf), "S%02x", ret);
... ...
hw/fdc.c
... ... @@ -21,6 +21,10 @@
21 21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 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 28 #include "vl.h"
25 29  
26 30 /********************************************************/
... ... @@ -90,6 +94,16 @@ typedef struct fdrive_t {
90 94 uint8_t ro; /* Is read-only */
91 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 107 static void fd_init (fdrive_t *drv, BlockDriverState *bs)
94 108 {
95 109 /* Drive */
... ... @@ -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 484 static void fd_change_cb (void *opaque)
459 485 {
460 486 fdrive_t *drv = opaque;
... ... @@ -473,7 +499,7 @@ fdctrl_t *fdctrl_init (int irq_lvl, int dma_chann, int mem_mapped,
473 499 BlockDriverState **fds)
474 500 {
475 501 fdctrl_t *fdctrl;
476   -// int io_mem;
  502 + int io_mem;
477 503 int i;
478 504  
479 505 FLOPPY_DPRINTF("init controller\n");
... ... @@ -504,11 +530,8 @@ fdctrl_t *fdctrl_init (int irq_lvl, int dma_chann, int mem_mapped,
504 530 fdctrl_reset(fdctrl, 0);
505 531 fdctrl->state = FD_CTRL_ACTIVE;
506 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 535 } else {
513 536 register_ioport_read(io_base + 0x01, 5, 1, &fdctrl_read, fdctrl);
514 537 register_ioport_read(io_base + 0x07, 1, 1, &fdctrl_read, fdctrl);
... ...
hw/iommu.c
... ... @@ -117,8 +117,6 @@ typedef struct IOMMUState {
117 117 uint32_t iostart;
118 118 } IOMMUState;
119 119  
120   -static IOMMUState *ps;
121   -
122 120 static uint32_t iommu_mem_readw(void *opaque, target_phys_addr_t addr)
123 121 {
124 122 IOMMUState *s = opaque;
... ... @@ -187,25 +185,61 @@ static CPUWriteMemoryFunc *iommu_mem_write[3] = {
187 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 195 bswap32s(&pa);
197 196 pa = (pa & IOPTE_PAGE) << 4; /* Loose higher bits of 36 */
198 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 237 IOMMUState *s;
204 238 int iommu_io_memory;
205 239  
206 240 s = qemu_mallocz(sizeof(IOMMUState));
207 241 if (!s)
208   - return;
  242 + return NULL;
209 243  
210 244 s->addr = addr;
211 245  
... ... @@ -213,6 +247,8 @@ void iommu_init(uint32_t addr)
213 247 cpu_register_physical_memory(addr, sizeof(struct iommu_regs),
214 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 147 };
148 148  
149 149 #define LEDMA_REGS 4
  150 +#define LEDMA_MAXADDR (LEDMA_REGS * 4 - 1)
150 151 #if 0
151 152 /* Structure to describe the current status of DMA registers on the Sparc */
152 153 struct sparc_dma_registers {
... ... @@ -157,32 +158,28 @@ struct sparc_dma_registers {
157 158 };
158 159 #endif
159 160  
160   -typedef struct LEDMAState {
161   - uint32_t addr;
162   - uint32_t regs[LEDMA_REGS];
163   -} LEDMAState;
164   -
165 161 typedef struct LANCEState {
166   - uint32_t paddr;
167 162 NetDriverState *nd;
168 163 uint32_t leptr;
169 164 uint16_t addr;
170 165 uint16_t regs[LE_MAXREG];
171 166 uint8_t phys[6]; /* mac address */
172 167 int irq;
173   - LEDMAState *ledma;
  168 + unsigned int rxptr, txptr;
  169 + uint32_t ledmaregs[LEDMA_REGS];
174 170 } LANCEState;
175 171  
176   -static unsigned int rxptr, txptr;
177   -
178 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 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 181 s->regs[LE_CSR0] = LE_C0_STOP;
  182 + memset(s->ledmaregs, 0, LEDMA_REGS * 4);
186 183 }
187 184  
188 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 187 LANCEState *s = opaque;
191 188 uint32_t saddr;
192 189  
193   - saddr = addr - s->paddr;
  190 + saddr = addr & LE_MAXREG;
194 191 switch (saddr >> 1) {
195 192 case LE_RDP:
196 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 205 uint32_t saddr;
209 206 uint16_t reg;
210 207  
211   - saddr = addr - s->paddr;
  208 + saddr = addr & LE_MAXREG;
212 209 switch (saddr >> 1) {
213 210 case LE_RDP:
214 211 switch(s->addr) {
... ... @@ -292,7 +289,7 @@ static CPUWriteMemoryFunc *lance_mem_write[3] = {
292 289 static int lance_can_receive(void *opaque)
293 290 {
294 291 LANCEState *s = opaque;
295   - void *dmaptr = (void *) (s->leptr + s->ledma->regs[3]);
  292 + uint32_t dmaptr = s->leptr + s->ledmaregs[3];
296 293 struct lance_init_block *ib;
297 294 int i;
298 295 uint16_t temp;
... ... @@ -303,7 +300,7 @@ static int lance_can_receive(void *opaque)
303 300 ib = (void *) iommu_translate(dmaptr);
304 301  
305 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 304 temp &= 0xff;
308 305 if (temp == (LE_R1_OWN)) {
309 306 #ifdef DEBUG_LANCE
... ... @@ -323,7 +320,7 @@ static int lance_can_receive(void *opaque)
323 320 static void lance_receive(void *opaque, const uint8_t *buf, int size)
324 321 {
325 322 LANCEState *s = opaque;
326   - void *dmaptr = (void *) (s->leptr + s->ledma->regs[3]);
  323 + uint32_t dmaptr = s->leptr + s->ledmaregs[3];
327 324 struct lance_init_block *ib;
328 325 unsigned int i, old_rxptr, j;
329 326 uint16_t temp;
... ... @@ -333,23 +330,23 @@ static void lance_receive(void *opaque, const uint8_t *buf, int size)
333 330  
334 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 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 338 temp = size;
342 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 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 343 #else
347 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 347 #endif
351 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 350 s->regs[LE_CSR0] |= LE_C0_RINT | LE_C0_INTR;
354 351 if ((s->regs[LE_CSR0] & LE_C0_INTR) && (s->regs[LE_CSR0] & LE_C0_INEA))
355 352 pic_set_irq(s->irq, 1);
... ... @@ -364,7 +361,7 @@ static void lance_receive(void *opaque, const uint8_t *buf, int size)
364 361 static void lance_send(void *opaque)
365 362 {
366 363 LANCEState *s = opaque;
367   - void *dmaptr = (void *) (s->leptr + s->ledma->regs[3]);
  364 + uint32_t dmaptr = s->leptr + s->ledmaregs[3];
368 365 struct lance_init_block *ib;
369 366 unsigned int i, old_txptr, j;
370 367 uint16_t temp;
... ... @@ -375,18 +372,18 @@ static void lance_send(void *opaque)
375 372  
376 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 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 380 bswap16s(&temp);
384 381 temp = (~temp) + 1;
385 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 384 #else
388 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 388 #endif
392 389  
... ... @@ -395,8 +392,8 @@ static void lance_send(void *opaque)
395 392 #endif
396 393 qemu_send_packet(s->nd, pkt_buf, temp);
397 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 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 401  
405 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 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 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 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 420 static CPUReadMemoryFunc *ledma_mem_read[3] = {
... ... @@ -436,33 +429,61 @@ static CPUWriteMemoryFunc *ledma_mem_write[3] = {
436 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 466 void lance_init(NetDriverState *nd, int irq, uint32_t leaddr, uint32_t ledaddr)
440 467 {
441 468 LANCEState *s;
442   - LEDMAState *led;
443 469 int lance_io_memory, ledma_io_memory;
444 470  
445 471 s = qemu_mallocz(sizeof(LANCEState));
446 472 if (!s)
447 473 return;
448 474  
449   - s->paddr = leaddr;
450 475 s->nd = nd;
451 476 s->irq = irq;
452 477  
453 478 lance_io_memory = cpu_register_io_memory(0, lance_mem_read, lance_mem_write, s);
454 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 482 cpu_register_physical_memory(ledaddr, 16, ledma_io_memory);
464 483  
465 484 lance_reset(s);
466 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 32 #define NVRAM_PRINTF(fmt, args...) do { } while (0)
33 33 #endif
34 34  
35   -#define NVRAM_MAX_MEM 0xfff0
  35 +#define NVRAM_MAX_MEM 0x1ff0
  36 +#define NVRAM_MAXADDR 0x1fff
36 37  
37 38 struct m48t08_t {
38   - /* Hardware parameters */
39   - int mem_index;
40   - uint32_t mem_base;
41   - uint16_t size;
42 39 /* RTC management */
43 40 time_t time_offset;
44 41 time_t stop_time;
45 42 /* NVRAM storage */
46   - uint8_t lock;
47   - uint16_t addr;
48 43 uint8_t *buffer;
49 44 };
50 45  
... ... @@ -83,14 +78,13 @@ static void set_time (m48t08_t *NVRAM, struct tm *tm)
83 78 }
84 79  
85 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 83 struct tm tm;
89 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 88 case 0x1FF8:
95 89 /* control */
96 90 NVRAM->buffer[0x1FF8] = (val & ~0xA0) | 0x90;
... ... @@ -167,25 +161,18 @@ void m48t08_write (m48t08_t *NVRAM, uint32_t val)
167 161 }
168 162 break;
169 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 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 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 176 case 0x1FF8:
190 177 /* control */
191 178 goto do_read;
... ... @@ -225,65 +212,36 @@ uint32_t m48t08_read (m48t08_t *NVRAM)
225 212 retval = toBCD(tm.tm_year);
226 213 break;
227 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 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 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 222 static void nvram_writeb (void *opaque, target_phys_addr_t addr, uint32_t value)
257 223 {
258 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 229 static void nvram_writew (void *opaque, target_phys_addr_t addr, uint32_t value)
266 230 {
267 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 237 static void nvram_writel (void *opaque, target_phys_addr_t addr, uint32_t value)
277 238 {
278 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 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 249 m48t08_t *NVRAM = opaque;
292 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 253 return retval;
299 254 }
300 255  
... ... @@ -303,12 +258,8 @@ static uint32_t nvram_readw (void *opaque, target_phys_addr_t addr)
303 258 m48t08_t *NVRAM = opaque;
304 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 263 return retval;
313 264 }
314 265  
... ... @@ -317,14 +268,10 @@ static uint32_t nvram_readl (void *opaque, target_phys_addr_t addr)
317 268 m48t08_t *NVRAM = opaque;
318 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 275 return retval;
329 276 }
330 277  
... ... @@ -340,12 +287,42 @@ static CPUReadMemoryFunc *nvram_read[] = {
340 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 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 324 m48t08_t *s;
347   - int i;
348   - unsigned char tmp = 0;
  325 + int mem_index;
349 326  
350 327 s = qemu_mallocz(sizeof(m48t08_t));
351 328 if (!s)
... ... @@ -355,25 +332,13 @@ m48t08_t *m48t08_init(uint32_t mem_base, uint16_t size, uint8_t *macaddr)
355 332 qemu_free(s);
356 333 return NULL;
357 334 }
358   - s->size = size;
359   - s->mem_base = mem_base;
360   - s->addr = 0;
361 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 342 return s;
378 343 }
379 344  
... ...
hw/m48t08.h
... ... @@ -3,10 +3,8 @@
3 3  
4 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 10 #endif /* !defined (__M48T08_H__) */
... ...
hw/magic-load.c
1 1 #include "vl.h"
2 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 53 #define ELF_CLASS ELFCLASS32
5 54 #define ELF_DATA ELFDATA2MSB
... ... @@ -103,27 +152,27 @@ static void *find_shdr(struct elfhdr *ehdr, int fd, struct elf_shdr *shdr, uint3
103 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 157 int retval;
109 158  
110 159 retval = lseek(fd, ehdr->e_shoff + sizeof(struct elf_shdr) * symtab->sh_link, SEEK_SET);
111 160 if (retval < 0)
112   - return -1;
  161 + return NULL;
113 162  
114 163 retval = read(fd, shdr, sizeof(*shdr));
115 164 if (retval < 0)
116   - return -1;
  165 + return NULL;
117 166 bswap_shdr(shdr);
118 167 if (shdr->sh_type == SHT_STRTAB)
119 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 174 int retval;
126   - retval = lseek(fd, 0x4000, SEEK_SET);
  175 + retval = lseek(fd, phdr->p_offset + entry - phdr->p_vaddr, SEEK_SET);
127 176 if (retval < 0)
128 177 return -1;
129 178 return read(fd, dst, phdr->p_filesz);
... ... @@ -178,6 +227,7 @@ static void load_symbols(struct elfhdr *ehdr, int fd)
178 227 {
179 228 struct elf_shdr symtab, strtab;
180 229 struct elf_sym *syms;
  230 + struct syminfo *s;
181 231 int nsyms, i;
182 232 char *str;
183 233  
... ... @@ -196,20 +246,19 @@ static void load_symbols(struct elfhdr *ehdr, int fd)
196 246 goto error_freesyms;
197 247  
198 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 255 return;
207 256 error_freesyms:
208 257 qemu_free(syms);
209 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 263 struct elfhdr ehdr;
215 264 struct elf_phdr phdr;
... ... @@ -227,12 +276,13 @@ int load_elf(const char * filename, uint8_t *addr)
227 276  
228 277 if (ehdr.e_ident[0] != 0x7f || ehdr.e_ident[1] != 'E'
229 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 281 goto error;
232 282  
233 283 if (find_phdr(&ehdr, fd, &phdr, PT_LOAD))
234 284 goto error;
235   - retval = read_program(fd, &phdr, addr);
  285 + retval = read_program(fd, &phdr, addr, ehdr.e_entry);
236 286 if (retval < 0)
237 287 goto error;
238 288  
... ... @@ -245,17 +295,45 @@ int load_elf(const char * filename, uint8_t *addr)
245 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 304 fd = open(filename, O_RDONLY | O_BINARY);
253 305 if (fd < 0)
254 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 309 if (size < 0)
258 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 337 close(fd);
260 338 return size;
261 339 fail:
... ... @@ -263,64 +341,3 @@ int load_kernel(const char *filename, uint8_t *addr)
263 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 25 #include "m48t08.h"
26 26  
27 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 29 #define PROM_FILENAMEB "proll.bin"
33 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 32 #define PHYS_JJ_IDPROM_OFF 0x1FD8
37 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 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 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 55 /* TSC handling */
53 56  
... ... @@ -57,13 +60,73 @@ uint64_t cpu_get_tsc()
57 60 }
58 61  
59 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 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 130 /* Sun4m hardware initialisation */
68 131 void sun4m_init(int ram_size, int vga_ram_size, int boot_device,
69 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 135 {
73 136 char buf[1024];
74 137 int ret, linux_boot;
75   - unsigned long bios_offset;
  138 + unsigned long vram_size = 0x100000, prom_offset;
76 139  
77 140 linux_boot = (kernel_filename != NULL);
78 141  
79 142 /* allocate RAM */
80 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 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 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 178 if (ret < 0) {
99 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 25  
26 26 #define MAXX 1024
27 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 34 #define XSZ (8*80)
29 35 #define YSZ (24*11)
30 36 #define XOFF (MAXX-XSZ)
31 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 45 typedef struct TCXState {
34 46 uint32_t addr;
35 47 DisplayState *ds;
36 48 uint8_t *vram;
  49 + unsigned long vram_offset;
  50 + uint8_t r[256], g[256], b[256];
37 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 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 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 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 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 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 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 235 TCXState *s;
162   - int tcx_io_memory;
163 236  
164 237 s = qemu_mallocz(sizeof(TCXState));
165 238 if (!s)
166   - return;
  239 + return NULL;
167 240 s->ds = ds;
168 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 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 257 FILE *f;
181   - uint8_t *d, *d1;
182   - unsigned int v;
  258 + uint8_t *d, *d1, v;
183 259 int y, x;
184 260  
185 261 f = fopen(filename, "wb");
186 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 266 for(y = 0; y < YSZ; y++) {
192 267 d = d1;
193 268 for(x = 0; x < XSZ; x++) {
194 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 273 d++;
199 274 }
200   - d1 += XSZ;
  275 + d1 += MAXX;
201 276 }
202 277 fclose(f);
203 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 841 unsigned int i;
842 842 struct elf_shdr sechdr, symtab, strtab;
843 843 char *strings;
  844 + struct syminfo *s;
844 845  
845 846 lseek(fd, hdr->e_shoff, SEEK_SET);
846 847 for (i = 0; i < hdr->e_shnum; i++) {
... ... @@ -866,24 +867,27 @@ static void load_symbols(struct elfhdr *hdr, int fd)
866 867  
867 868 found:
868 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 874 return;
873 875  
874 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 878 return;
877 879  
878 880 #ifdef BSWAP_NEEDED
879 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 883 #endif
882 884  
883 885 lseek(fd, strtab.sh_offset, SEEK_SET);
884 886 if (read(fd, strings, strtab.sh_size) != strtab.sh_size)
885 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 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 497 case TT_WIN_UNF: /* window underflow */
498 498 restore_window(env);
499 499 break;
  500 + case 0x100: // XXX, why do we get these?
  501 + break;
500 502 default:
501 503 printf ("Unhandled trap: 0x%x\n", trapnr);
502 504 cpu_dump_state(env, stderr, fprintf, 0);
... ...
linux-user/signal.c
... ... @@ -1354,13 +1354,14 @@ struct target_rt_signal_frame {
1354 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 1365 #define UREG_FP UREG_I6
1365 1366 #define UREG_SP UREG_O6
1366 1367  
... ... @@ -1385,23 +1386,20 @@ setup___siginfo(__siginfo_t *si, CPUState *env, target_ulong mask)
1385 1386 {
1386 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 1389 err |= __put_user(env->psr, &si->si_regs.psr);
1390   - fprintf(stderr, "2.a1 pc:%lx\n", si->si_regs.pc);
1391 1390 err |= __put_user(env->pc, &si->si_regs.pc);
1392 1391 err |= __put_user(env->npc, &si->si_regs.npc);
1393 1392 err |= __put_user(env->y, &si->si_regs.y);
1394   - fprintf(stderr, "2.b\n");
1395 1393 for (i=0; i < 7; i++) {
1396 1394 err |= __put_user(env->gregs[i], &si->si_regs.u_regs[i]);
1397 1395 }
1398 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 1399 err |= __put_user(mask, &si->si_mask);
1403 1400 return err;
1404 1401 }
  1402 +
1405 1403 static int
1406 1404 setup_sigcontext(struct target_sigcontext *sc, /*struct _fpstate *fpstate,*/
1407 1405 CPUState *env, unsigned long mask)
... ... @@ -1434,6 +1432,7 @@ static void setup_frame(int sig, struct emulated_sigaction *ka,
1434 1432 sf = (struct target_signal_frame *)
1435 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 1436 #if 0
1438 1437 if (invalid_frame_pointer(sf, sigframe_size))
1439 1438 goto sigill_and_return;
... ... @@ -1451,13 +1450,11 @@ static void setup_frame(int sig, struct emulated_sigaction *ka,
1451 1450 }
1452 1451  
1453 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 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 1458 if (err)
1462 1459 goto sigsegv;
1463 1460  
... ... @@ -1486,13 +1483,15 @@ static void setup_frame(int sig, struct emulated_sigaction *ka,
1486 1483  
1487 1484 /* Flush instruction space. */
1488 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 1489 return;
1492 1490  
1493 1491 sigill_and_return:
1494 1492 force_sig(TARGET_SIGILL);
1495 1493 sigsegv:
  1494 + //fprintf(stderr, "force_sig\n");
1496 1495 force_sig(TARGET_SIGSEGV);
1497 1496 }
1498 1497 static inline int
... ... @@ -1542,13 +1541,16 @@ static void setup_rt_frame(int sig, struct emulated_sigaction *ka,
1542 1541 long do_sigreturn(CPUState *env)
1543 1542 {
1544 1543 struct target_signal_frame *sf;
1545   - unsigned long up_psr, pc, npc;
  1544 + uint32_t up_psr, pc, npc;
1546 1545 target_sigset_t set;
  1546 + sigset_t host_set;
1547 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 1555 /* 1. Make sure we are not getting garbage from the user */
1554 1556 #if 0
... ... @@ -1567,36 +1569,41 @@ long do_sigreturn(CPUState *env)
1567 1569 goto segv_and_exit;
1568 1570  
1569 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 1574 /* User can only change condition codes and FPU enabling in %psr. */
1574 1575 env->psr = (up_psr & ~(PSR_ICC /* | PSR_EF */))
1575 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 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 1593 /* This is pretty much atomic, no amount locking would prevent
1584 1594 * the races which exist anyways.
1585 1595 */
1586 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 1604 if (err)
1591 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 1607 fprintf(stderr, "returning %lx\n", env->regwptr[0]);
1601 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