Commit 66321a11a4ef45942b3bee7377a36bb94831365a

Authored by bellard
1 parent c44644bb

sparc update (Blue Swirl)


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1350 c046a42c-6fe2-441c-8c8c-71466251a162
cpu-exec.c
1 /* 1 /*
2 * i386 emulator main execution loop 2 * i386 emulator main execution loop
3 * 3 *
4 - * Copyright (c) 2003 Fabrice Bellard 4 + * Copyright (c) 2003-2005 Fabrice Bellard
5 * 5 *
6 * This library is free software; you can redistribute it and/or 6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public 7 * modify it under the terms of the GNU Lesser General Public
@@ -285,9 +285,18 @@ int cpu_exec(CPUState *env1) @@ -285,9 +285,18 @@ int cpu_exec(CPUState *env1)
285 } 285 }
286 } 286 }
287 #elif defined(TARGET_SPARC) 287 #elif defined(TARGET_SPARC)
288 - if (interrupt_request & CPU_INTERRUPT_HARD) {  
289 - do_interrupt(env->interrupt_index);  
290 - env->interrupt_request &= ~CPU_INTERRUPT_HARD; 288 + if ((interrupt_request & CPU_INTERRUPT_HARD) &&
  289 + (env->psret != 0)) {
  290 + int pil = env->interrupt_index & 15;
  291 + int type = env->interrupt_index & 0xf0;
  292 +
  293 + if (((type == TT_EXTINT) &&
  294 + (pil == 15 || pil > env->psrpil)) ||
  295 + type != TT_EXTINT) {
  296 + env->interrupt_request &= ~CPU_INTERRUPT_HARD;
  297 + do_interrupt(env->interrupt_index);
  298 + env->interrupt_index = 0;
  299 + }
291 } else if (interrupt_request & CPU_INTERRUPT_TIMER) { 300 } else if (interrupt_request & CPU_INTERRUPT_TIMER) {
292 //do_interrupt(0, 0, 0, 0, 0); 301 //do_interrupt(0, 0, 0, 0, 0);
293 env->interrupt_request &= ~CPU_INTERRUPT_TIMER; 302 env->interrupt_request &= ~CPU_INTERRUPT_TIMER;
hw/iommu.c
1 /* 1 /*
2 * QEMU SPARC iommu emulation 2 * QEMU SPARC iommu emulation
3 * 3 *
4 - * Copyright (c) 2003 Fabrice Bellard 4 + * Copyright (c) 2003-2005 Fabrice Bellard
5 * 5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy 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 7 * of this software and associated documentation files (the "Software"), to deal
@@ -26,30 +26,14 @@ @@ -26,30 +26,14 @@
26 /* debug iommu */ 26 /* debug iommu */
27 //#define DEBUG_IOMMU 27 //#define DEBUG_IOMMU
28 28
29 -/* The IOMMU registers occupy three pages in IO space. */  
30 -struct iommu_regs {  
31 - /* First page */  
32 - volatile unsigned long control; /* IOMMU control */  
33 - volatile unsigned long base; /* Physical base of iopte page table */  
34 - volatile unsigned long _unused1[3];  
35 - volatile unsigned long tlbflush; /* write only */  
36 - volatile unsigned long pageflush; /* write only */  
37 - volatile unsigned long _unused2[1017];  
38 - /* Second page */  
39 - volatile unsigned long afsr; /* Async-fault status register */  
40 - volatile unsigned long afar; /* Async-fault physical address */  
41 - volatile unsigned long _unused3[2];  
42 - volatile unsigned long sbuscfg0; /* SBUS configuration registers, per-slot */  
43 - volatile unsigned long sbuscfg1;  
44 - volatile unsigned long sbuscfg2;  
45 - volatile unsigned long sbuscfg3;  
46 - volatile unsigned long mfsr; /* Memory-fault status register */  
47 - volatile unsigned long mfar; /* Memory-fault physical address */  
48 - volatile unsigned long _unused4[1014];  
49 - /* Third page */  
50 - volatile unsigned long mid; /* IOMMU module-id */  
51 -}; 29 +#ifdef DEBUG_IOMMU
  30 +#define DPRINTF(fmt, args...) \
  31 +do { printf("IOMMU: " fmt , ##args); } while (0)
  32 +#else
  33 +#define DPRINTF(fmt, args...)
  34 +#endif
52 35
  36 +#define IOMMU_NREGS (3*4096)
53 #define IOMMU_CTRL_IMPL 0xf0000000 /* Implementation */ 37 #define IOMMU_CTRL_IMPL 0xf0000000 /* Implementation */
54 #define IOMMU_CTRL_VERS 0x0f000000 /* Version */ 38 #define IOMMU_CTRL_VERS 0x0f000000 /* Version */
55 #define IOMMU_CTRL_RNGE 0x0000001c /* Mapping RANGE */ 39 #define IOMMU_CTRL_RNGE 0x0000001c /* Mapping RANGE */
@@ -63,43 +47,6 @@ struct iommu_regs { @@ -63,43 +47,6 @@ struct iommu_regs {
63 #define IOMMU_RNGE_2GB 0x0000001c /* 0x80000000 -> 0xffffffff */ 47 #define IOMMU_RNGE_2GB 0x0000001c /* 0x80000000 -> 0xffffffff */
64 #define IOMMU_CTRL_ENAB 0x00000001 /* IOMMU Enable */ 48 #define IOMMU_CTRL_ENAB 0x00000001 /* IOMMU Enable */
65 49
66 -#define IOMMU_AFSR_ERR 0x80000000 /* LE, TO, or BE asserted */  
67 -#define IOMMU_AFSR_LE 0x40000000 /* SBUS reports error after transaction */  
68 -#define IOMMU_AFSR_TO 0x20000000 /* Write access took more than 12.8 us. */  
69 -#define IOMMU_AFSR_BE 0x10000000 /* Write access received error acknowledge */  
70 -#define IOMMU_AFSR_SIZE 0x0e000000 /* Size of transaction causing error */  
71 -#define IOMMU_AFSR_S 0x01000000 /* Sparc was in supervisor mode */  
72 -#define IOMMU_AFSR_RESV 0x00f00000 /* Reserver, forced to 0x8 by hardware */  
73 -#define IOMMU_AFSR_ME 0x00080000 /* Multiple errors occurred */  
74 -#define IOMMU_AFSR_RD 0x00040000 /* A read operation was in progress */  
75 -#define IOMMU_AFSR_FAV 0x00020000 /* IOMMU afar has valid contents */  
76 -  
77 -#define IOMMU_SBCFG_SAB30 0x00010000 /* Phys-address bit 30 when bypass enabled */  
78 -#define IOMMU_SBCFG_BA16 0x00000004 /* Slave supports 16 byte bursts */  
79 -#define IOMMU_SBCFG_BA8 0x00000002 /* Slave supports 8 byte bursts */  
80 -#define IOMMU_SBCFG_BYPASS 0x00000001 /* Bypass IOMMU, treat all addresses  
81 - produced by this device as pure  
82 - physical. */  
83 -  
84 -#define IOMMU_MFSR_ERR 0x80000000 /* One or more of PERR1 or PERR0 */  
85 -#define IOMMU_MFSR_S 0x01000000 /* Sparc was in supervisor mode */  
86 -#define IOMMU_MFSR_CPU 0x00800000 /* CPU transaction caused parity error */  
87 -#define IOMMU_MFSR_ME 0x00080000 /* Multiple parity errors occurred */  
88 -#define IOMMU_MFSR_PERR 0x00006000 /* high bit indicates parity error occurred  
89 - on the even word of the access, low bit  
90 - indicated odd word caused the parity error */  
91 -#define IOMMU_MFSR_BM 0x00001000 /* Error occurred while in boot mode */  
92 -#define IOMMU_MFSR_C 0x00000800 /* Address causing error was marked cacheable */  
93 -#define IOMMU_MFSR_RTYP 0x000000f0 /* Memory request transaction type */  
94 -  
95 -#define IOMMU_MID_SBAE 0x001f0000 /* SBus arbitration enable */  
96 -#define IOMMU_MID_SE 0x00100000 /* Enables SCSI/ETHERNET arbitration */  
97 -#define IOMMU_MID_SB3 0x00080000 /* Enable SBUS device 3 arbitration */  
98 -#define IOMMU_MID_SB2 0x00040000 /* Enable SBUS device 2 arbitration */  
99 -#define IOMMU_MID_SB1 0x00020000 /* Enable SBUS device 1 arbitration */  
100 -#define IOMMU_MID_SB0 0x00010000 /* Enable SBUS device 0 arbitration */  
101 -#define IOMMU_MID_MID 0x0000000f /* Module-id, hardcoded to 0x8 */  
102 -  
103 /* The format of an iopte in the page tables */ 50 /* The format of an iopte in the page tables */
104 #define IOPTE_PAGE 0x07ffff00 /* Physical page number (PA[30:12]) */ 51 #define IOPTE_PAGE 0x07ffff00 /* Physical page number (PA[30:12]) */
105 #define IOPTE_CACHE 0x00000080 /* Cached (in vme IOCACHE or Viking/MXCC) */ 52 #define IOPTE_CACHE 0x00000080 /* Cached (in vme IOCACHE or Viking/MXCC) */
@@ -113,7 +60,7 @@ struct iommu_regs { @@ -113,7 +60,7 @@ struct iommu_regs {
113 60
114 typedef struct IOMMUState { 61 typedef struct IOMMUState {
115 uint32_t addr; 62 uint32_t addr;
116 - uint32_t regs[sizeof(struct iommu_regs)]; 63 + uint32_t regs[IOMMU_NREGS];
117 uint32_t iostart; 64 uint32_t iostart;
118 } IOMMUState; 65 } IOMMUState;
119 66
@@ -125,6 +72,7 @@ static uint32_t iommu_mem_readw(void *opaque, target_phys_addr_t addr) @@ -125,6 +72,7 @@ static uint32_t iommu_mem_readw(void *opaque, target_phys_addr_t addr)
125 saddr = (addr - s->addr) >> 2; 72 saddr = (addr - s->addr) >> 2;
126 switch (saddr) { 73 switch (saddr) {
127 default: 74 default:
  75 + DPRINTF("read reg[%d] = %x\n", saddr, s->regs[saddr]);
128 return s->regs[saddr]; 76 return s->regs[saddr];
129 break; 77 break;
130 } 78 }
@@ -137,6 +85,7 @@ static void iommu_mem_writew(void *opaque, target_phys_addr_t addr, uint32_t val @@ -137,6 +85,7 @@ static void iommu_mem_writew(void *opaque, target_phys_addr_t addr, uint32_t val
137 uint32_t saddr; 85 uint32_t saddr;
138 86
139 saddr = (addr - s->addr) >> 2; 87 saddr = (addr - s->addr) >> 2;
  88 + DPRINTF("write reg[%d] = %x\n", saddr, val);
140 switch (saddr) { 89 switch (saddr) {
141 case 0: 90 case 0:
142 switch (val & IOMMU_CTRL_RNGE) { 91 switch (val & IOMMU_CTRL_RNGE) {
@@ -166,6 +115,7 @@ static void iommu_mem_writew(void *opaque, target_phys_addr_t addr, uint32_t val @@ -166,6 +115,7 @@ static void iommu_mem_writew(void *opaque, target_phys_addr_t addr, uint32_t val
166 s->iostart = 0x80000000; 115 s->iostart = 0x80000000;
167 break; 116 break;
168 } 117 }
  118 + DPRINTF("iostart = %x\n", s->iostart);
169 /* Fall through */ 119 /* Fall through */
170 default: 120 default:
171 s->regs[saddr] = val; 121 s->regs[saddr] = val;
@@ -188,13 +138,17 @@ static CPUWriteMemoryFunc *iommu_mem_write[3] = { @@ -188,13 +138,17 @@ static CPUWriteMemoryFunc *iommu_mem_write[3] = {
188 uint32_t iommu_translate_local(void *opaque, uint32_t addr) 138 uint32_t iommu_translate_local(void *opaque, uint32_t addr)
189 { 139 {
190 IOMMUState *s = opaque; 140 IOMMUState *s = opaque;
191 - uint32_t *iopte = (void *)(s->regs[1] << 4), pa; 141 + uint32_t iopte, pa, tmppte;
192 142
193 - iopte += ((addr - s->iostart) >> PAGE_SHIFT);  
194 - cpu_physical_memory_read((uint32_t)iopte, (void *) &pa, 4); 143 + iopte = s->regs[1] << 4;
  144 + addr &= ~s->iostart;
  145 + iopte += (addr >> (PAGE_SHIFT - 2)) & ~3;
  146 + cpu_physical_memory_read(iopte, (void *) &pa, 4);
195 bswap32s(&pa); 147 bswap32s(&pa);
196 - pa = (pa & IOPTE_PAGE) << 4; /* Loose higher bits of 36 */  
197 - return pa + (addr & PAGE_MASK); 148 + tmppte = pa;
  149 + pa = ((pa & IOPTE_PAGE) << 4) + (addr & PAGE_MASK);
  150 + DPRINTF("xlate dva %x => pa %x (iopte[%x] = %x)\n", addr, pa, iopte, tmppte);
  151 + return pa;
198 } 152 }
199 153
200 static void iommu_save(QEMUFile *f, void *opaque) 154 static void iommu_save(QEMUFile *f, void *opaque)
@@ -203,7 +157,7 @@ static void iommu_save(QEMUFile *f, void *opaque) @@ -203,7 +157,7 @@ static void iommu_save(QEMUFile *f, void *opaque)
203 int i; 157 int i;
204 158
205 qemu_put_be32s(f, &s->addr); 159 qemu_put_be32s(f, &s->addr);
206 - for (i = 0; i < sizeof(struct iommu_regs); i += 4) 160 + for (i = 0; i < IOMMU_NREGS; i++)
207 qemu_put_be32s(f, &s->regs[i]); 161 qemu_put_be32s(f, &s->regs[i]);
208 qemu_put_be32s(f, &s->iostart); 162 qemu_put_be32s(f, &s->iostart);
209 } 163 }
@@ -217,7 +171,7 @@ static int iommu_load(QEMUFile *f, void *opaque, int version_id) @@ -217,7 +171,7 @@ static int iommu_load(QEMUFile *f, void *opaque, int version_id)
217 return -EINVAL; 171 return -EINVAL;
218 172
219 qemu_get_be32s(f, &s->addr); 173 qemu_get_be32s(f, &s->addr);
220 - for (i = 0; i < sizeof(struct iommu_regs); i += 4) 174 + for (i = 0; i < IOMMU_NREGS; i++)
221 qemu_put_be32s(f, &s->regs[i]); 175 qemu_put_be32s(f, &s->regs[i]);
222 qemu_get_be32s(f, &s->iostart); 176 qemu_get_be32s(f, &s->iostart);
223 177
@@ -228,7 +182,7 @@ static void iommu_reset(void *opaque) @@ -228,7 +182,7 @@ static void iommu_reset(void *opaque)
228 { 182 {
229 IOMMUState *s = opaque; 183 IOMMUState *s = opaque;
230 184
231 - memset(s->regs, 0, sizeof(struct iommu_regs)); 185 + memset(s->regs, 0, IOMMU_NREGS * 4);
232 s->iostart = 0; 186 s->iostart = 0;
233 } 187 }
234 188
@@ -244,8 +198,7 @@ void *iommu_init(uint32_t addr) @@ -244,8 +198,7 @@ void *iommu_init(uint32_t addr)
244 s->addr = addr; 198 s->addr = addr;
245 199
246 iommu_io_memory = cpu_register_io_memory(0, iommu_mem_read, iommu_mem_write, s); 200 iommu_io_memory = cpu_register_io_memory(0, iommu_mem_read, iommu_mem_write, s);
247 - cpu_register_physical_memory(addr, sizeof(struct iommu_regs),  
248 - iommu_io_memory); 201 + cpu_register_physical_memory(addr, IOMMU_NREGS * 4, iommu_io_memory);
249 202
250 register_savevm("iommu", addr, 1, iommu_save, iommu_load, s); 203 register_savevm("iommu", addr, 1, iommu_save, iommu_load, s);
251 qemu_register_reset(iommu_reset, s); 204 qemu_register_reset(iommu_reset, s);
hw/lance.c
1 /* 1 /*
2 * QEMU Lance emulation 2 * QEMU Lance emulation
3 * 3 *
4 - * Copyright (c) 2003-2004 Fabrice Bellard 4 + * Copyright (c) 2003-2005 Fabrice Bellard
5 * 5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy 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 7 * of this software and associated documentation files (the "Software"), to deal
@@ -26,20 +26,24 @@ @@ -26,20 +26,24 @@
26 /* debug LANCE card */ 26 /* debug LANCE card */
27 //#define DEBUG_LANCE 27 //#define DEBUG_LANCE
28 28
  29 +#ifdef DEBUG_LANCE
  30 +#define DPRINTF(fmt, args...) \
  31 +do { printf("LANCE: " fmt , ##args); } while (0)
  32 +#else
  33 +#define DPRINTF(fmt, args...)
  34 +#endif
  35 +
29 #ifndef LANCE_LOG_TX_BUFFERS 36 #ifndef LANCE_LOG_TX_BUFFERS
30 #define LANCE_LOG_TX_BUFFERS 4 37 #define LANCE_LOG_TX_BUFFERS 4
31 #define LANCE_LOG_RX_BUFFERS 4 38 #define LANCE_LOG_RX_BUFFERS 4
32 #endif 39 #endif
33 40
34 -#define CRC_POLYNOMIAL_BE 0x04c11db7UL /* Ethernet CRC, big endian */  
35 -#define CRC_POLYNOMIAL_LE 0xedb88320UL /* Ethernet CRC, little endian */  
36 -  
37 -  
38 #define LE_CSR0 0 41 #define LE_CSR0 0
39 #define LE_CSR1 1 42 #define LE_CSR1 1
40 #define LE_CSR2 2 43 #define LE_CSR2 2
41 #define LE_CSR3 3 44 #define LE_CSR3 3
42 -#define LE_MAXREG (LE_CSR3 + 1) 45 +#define LE_NREGS (LE_CSR3 + 1)
  46 +#define LE_MAXREG LE_CSR3
43 47
44 #define LE_RDP 0 48 #define LE_RDP 0
45 #define LE_RAP 1 49 #define LE_RAP 1
@@ -148,21 +152,12 @@ struct lance_init_block { @@ -148,21 +152,12 @@ struct lance_init_block {
148 152
149 #define LEDMA_REGS 4 153 #define LEDMA_REGS 4
150 #define LEDMA_MAXADDR (LEDMA_REGS * 4 - 1) 154 #define LEDMA_MAXADDR (LEDMA_REGS * 4 - 1)
151 -#if 0  
152 -/* Structure to describe the current status of DMA registers on the Sparc */  
153 -struct sparc_dma_registers {  
154 - uint32_t cond_reg; /* DMA condition register */  
155 - uint32_t st_addr; /* Start address of this transfer */  
156 - uint32_t cnt; /* How many bytes to transfer */  
157 - uint32_t dma_test; /* DMA test register */  
158 -};  
159 -#endif  
160 155
161 typedef struct LANCEState { 156 typedef struct LANCEState {
162 NetDriverState *nd; 157 NetDriverState *nd;
163 uint32_t leptr; 158 uint32_t leptr;
164 uint16_t addr; 159 uint16_t addr;
165 - uint16_t regs[LE_MAXREG]; 160 + uint16_t regs[LE_NREGS];
166 uint8_t phys[6]; /* mac address */ 161 uint8_t phys[6]; /* mac address */
167 int irq; 162 int irq;
168 unsigned int rxptr, txptr; 163 unsigned int rxptr, txptr;
@@ -177,7 +172,7 @@ static void lance_reset(void *opaque) @@ -177,7 +172,7 @@ static void lance_reset(void *opaque)
177 memcpy(s->phys, s->nd->macaddr, 6); 172 memcpy(s->phys, s->nd->macaddr, 6);
178 s->rxptr = 0; 173 s->rxptr = 0;
179 s->txptr = 0; 174 s->txptr = 0;
180 - memset(s->regs, 0, LE_MAXREG * 2); 175 + memset(s->regs, 0, LE_NREGS * 2);
181 s->regs[LE_CSR0] = LE_C0_STOP; 176 s->regs[LE_CSR0] = LE_C0_STOP;
182 memset(s->ledmaregs, 0, LEDMA_REGS * 4); 177 memset(s->ledmaregs, 0, LEDMA_REGS * 4);
183 } 178 }
@@ -190,10 +185,13 @@ static uint32_t lance_mem_readw(void *opaque, target_phys_addr_t addr) @@ -190,10 +185,13 @@ static uint32_t lance_mem_readw(void *opaque, target_phys_addr_t addr)
190 saddr = addr & LE_MAXREG; 185 saddr = addr & LE_MAXREG;
191 switch (saddr >> 1) { 186 switch (saddr >> 1) {
192 case LE_RDP: 187 case LE_RDP:
  188 + DPRINTF("read dreg[%d] = %4.4x\n", s->addr, s->regs[s->addr]);
193 return s->regs[s->addr]; 189 return s->regs[s->addr];
194 case LE_RAP: 190 case LE_RAP:
  191 + DPRINTF("read areg = %4.4x\n", s->addr);
195 return s->addr; 192 return s->addr;
196 default: 193 default:
  194 + DPRINTF("read unknown(%d)\n", saddr>>1);
197 break; 195 break;
198 } 196 }
199 return 0; 197 return 0;
@@ -208,6 +206,7 @@ static void lance_mem_writew(void *opaque, target_phys_addr_t addr, uint32_t val @@ -208,6 +206,7 @@ static void lance_mem_writew(void *opaque, target_phys_addr_t addr, uint32_t val
208 saddr = addr & LE_MAXREG; 206 saddr = addr & LE_MAXREG;
209 switch (saddr >> 1) { 207 switch (saddr >> 1) {
210 case LE_RDP: 208 case LE_RDP:
  209 + DPRINTF("write dreg[%d] = %4.4x\n", s->addr, val);
211 switch(s->addr) { 210 switch(s->addr) {
212 case LE_CSR0: 211 case LE_CSR0:
213 if (val & LE_C0_STOP) { 212 if (val & LE_C0_STOP) {
@@ -242,12 +241,6 @@ static void lance_mem_writew(void *opaque, target_phys_addr_t addr, uint32_t val @@ -242,12 +241,6 @@ static void lance_mem_writew(void *opaque, target_phys_addr_t addr, uint32_t val
242 } 241 }
243 242
244 s->regs[LE_CSR0] = reg; 243 s->regs[LE_CSR0] = reg;
245 -  
246 - // trigger bits  
247 - //if (val & LE_C0_TDMD)  
248 -  
249 - if ((s->regs[LE_CSR0] & LE_C0_INTR) && (s->regs[LE_CSR0] & LE_C0_INEA))  
250 - pic_set_irq(s->irq, 1);  
251 break; 244 break;
252 case LE_CSR1: 245 case LE_CSR1:
253 s->leptr = (s->leptr & 0xffff0000) | (val & 0xffff); 246 s->leptr = (s->leptr & 0xffff0000) | (val & 0xffff);
@@ -263,10 +256,12 @@ static void lance_mem_writew(void *opaque, target_phys_addr_t addr, uint32_t val @@ -263,10 +256,12 @@ static void lance_mem_writew(void *opaque, target_phys_addr_t addr, uint32_t val
263 } 256 }
264 break; 257 break;
265 case LE_RAP: 258 case LE_RAP:
266 - if (val < LE_MAXREG) 259 + DPRINTF("write areg = %4.4x\n", val);
  260 + if (val < LE_NREGS)
267 s->addr = val; 261 s->addr = val;
268 break; 262 break;
269 default: 263 default:
  264 + DPRINTF("write unknown(%d) = %4.4x\n", saddr>>1, val);
270 break; 265 break;
271 } 266 }
272 lance_send(s); 267 lance_send(s);
@@ -292,7 +287,7 @@ static int lance_can_receive(void *opaque) @@ -292,7 +287,7 @@ static int lance_can_receive(void *opaque)
292 uint32_t dmaptr = s->leptr + s->ledmaregs[3]; 287 uint32_t dmaptr = s->leptr + s->ledmaregs[3];
293 struct lance_init_block *ib; 288 struct lance_init_block *ib;
294 int i; 289 int i;
295 - uint16_t temp; 290 + uint8_t temp8;
296 291
297 if ((s->regs[LE_CSR0] & LE_C0_STOP) == LE_C0_STOP) 292 if ((s->regs[LE_CSR0] & LE_C0_STOP) == LE_C0_STOP)
298 return 0; 293 return 0;
@@ -300,18 +295,13 @@ static int lance_can_receive(void *opaque) @@ -300,18 +295,13 @@ static int lance_can_receive(void *opaque)
300 ib = (void *) iommu_translate(dmaptr); 295 ib = (void *) iommu_translate(dmaptr);
301 296
302 for (i = 0; i < RX_RING_SIZE; i++) { 297 for (i = 0; i < RX_RING_SIZE; i++) {
303 - cpu_physical_memory_read((uint32_t)&ib->brx_ring[i].rmd1_bits, (void *) &temp, 1);  
304 - temp &= 0xff;  
305 - if (temp == (LE_R1_OWN)) {  
306 -#ifdef DEBUG_LANCE  
307 - fprintf(stderr, "lance: can receive %d\n", RX_BUFF_SIZE);  
308 -#endif 298 + cpu_physical_memory_read((uint32_t)&ib->brx_ring[i].rmd1_bits, (void *) &temp8, 1);
  299 + if (temp8 == (LE_R1_OWN)) {
  300 + DPRINTF("can receive %d\n", RX_BUFF_SIZE);
309 return RX_BUFF_SIZE; 301 return RX_BUFF_SIZE;
310 } 302 }
311 } 303 }
312 -#ifdef DEBUG_LANCE  
313 - fprintf(stderr, "lance: cannot receive\n");  
314 -#endif 304 + DPRINTF("cannot receive\n");
315 return 0; 305 return 0;
316 } 306 }
317 307
@@ -322,9 +312,11 @@ static void lance_receive(void *opaque, const uint8_t *buf, int size) @@ -322,9 +312,11 @@ static void lance_receive(void *opaque, const uint8_t *buf, int size)
322 LANCEState *s = opaque; 312 LANCEState *s = opaque;
323 uint32_t dmaptr = s->leptr + s->ledmaregs[3]; 313 uint32_t dmaptr = s->leptr + s->ledmaregs[3];
324 struct lance_init_block *ib; 314 struct lance_init_block *ib;
325 - unsigned int i, old_rxptr, j;  
326 - uint16_t temp; 315 + unsigned int i, old_rxptr;
  316 + uint16_t temp16;
  317 + uint8_t temp8;
327 318
  319 + DPRINTF("receive size %d\n", size);
328 if ((s->regs[LE_CSR0] & LE_C0_STOP) == LE_C0_STOP) 320 if ((s->regs[LE_CSR0] & LE_C0_STOP) == LE_C0_STOP)
329 return; 321 return;
330 322
@@ -332,27 +324,19 @@ static void lance_receive(void *opaque, const uint8_t *buf, int size) @@ -332,27 +324,19 @@ static void lance_receive(void *opaque, const uint8_t *buf, int size)
332 324
333 old_rxptr = s->rxptr; 325 old_rxptr = s->rxptr;
334 for (i = s->rxptr; i != ((old_rxptr - 1) & RX_RING_MOD_MASK); i = (i + 1) & RX_RING_MOD_MASK) { 326 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);  
336 - if (temp == (LE_R1_OWN)) { 327 + cpu_physical_memory_read((uint32_t)&ib->brx_ring[i].rmd1_bits, (void *) &temp8, 1);
  328 + if (temp8 == (LE_R1_OWN)) {
337 s->rxptr = (s->rxptr + 1) & RX_RING_MOD_MASK; 329 s->rxptr = (s->rxptr + 1) & RX_RING_MOD_MASK;
338 - temp = size;  
339 - bswap16s(&temp);  
340 - cpu_physical_memory_write((uint32_t)&ib->brx_ring[i].mblength, (void *) &temp, 2);  
341 -#if 0 330 + temp16 = size + 4;
  331 + bswap16s(&temp16);
  332 + cpu_physical_memory_write((uint32_t)&ib->brx_ring[i].mblength, (void *) &temp16, 2);
342 cpu_physical_memory_write((uint32_t)&ib->rx_buf[i], buf, size); 333 cpu_physical_memory_write((uint32_t)&ib->rx_buf[i], buf, size);
343 -#else  
344 - for (j = 0; j < size; j++) {  
345 - cpu_physical_memory_write(((uint32_t)&ib->rx_buf[i]) + j, &buf[j], 1);  
346 - }  
347 -#endif  
348 - temp = LE_R1_POK;  
349 - cpu_physical_memory_write((uint32_t)&ib->brx_ring[i].rmd1_bits, (void *) &temp, 1); 334 + temp8 = LE_R1_POK;
  335 + cpu_physical_memory_write((uint32_t)&ib->brx_ring[i].rmd1_bits, (void *) &temp8, 1);
350 s->regs[LE_CSR0] |= LE_C0_RINT | LE_C0_INTR; 336 s->regs[LE_CSR0] |= LE_C0_RINT | LE_C0_INTR;
351 - if ((s->regs[LE_CSR0] & LE_C0_INTR) && (s->regs[LE_CSR0] & LE_C0_INEA)) 337 + if (s->regs[LE_CSR0] & LE_C0_INEA)
352 pic_set_irq(s->irq, 1); 338 pic_set_irq(s->irq, 1);
353 -#ifdef DEBUG_LANCE  
354 - fprintf(stderr, "lance: got packet, len %d\n", size);  
355 -#endif 339 + DPRINTF("got packet, len %d\n", size);
356 return; 340 return;
357 } 341 }
358 } 342 }
@@ -363,40 +347,36 @@ static void lance_send(void *opaque) @@ -363,40 +347,36 @@ static void lance_send(void *opaque)
363 LANCEState *s = opaque; 347 LANCEState *s = opaque;
364 uint32_t dmaptr = s->leptr + s->ledmaregs[3]; 348 uint32_t dmaptr = s->leptr + s->ledmaregs[3];
365 struct lance_init_block *ib; 349 struct lance_init_block *ib;
366 - unsigned int i, old_txptr, j;  
367 - uint16_t temp; 350 + unsigned int i, old_txptr;
  351 + uint16_t temp16;
  352 + uint8_t temp8;
368 char pkt_buf[PKT_BUF_SZ]; 353 char pkt_buf[PKT_BUF_SZ];
369 354
  355 + DPRINTF("sending packet? (csr0 %4.4x)\n", s->regs[LE_CSR0]);
370 if ((s->regs[LE_CSR0] & LE_C0_STOP) == LE_C0_STOP) 356 if ((s->regs[LE_CSR0] & LE_C0_STOP) == LE_C0_STOP)
371 return; 357 return;
372 358
373 ib = (void *) iommu_translate(dmaptr); 359 ib = (void *) iommu_translate(dmaptr);
374 360
  361 + DPRINTF("sending packet? (dmaptr %8.8x) (ib %p) (btx_ring %p)\n", dmaptr, ib, &ib->btx_ring);
375 old_txptr = s->txptr; 362 old_txptr = s->txptr;
376 for (i = s->txptr; i != ((old_txptr - 1) & TX_RING_MOD_MASK); i = (i + 1) & TX_RING_MOD_MASK) { 363 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);  
378 - if (temp == (LE_T1_POK|LE_T1_OWN)) {  
379 - cpu_physical_memory_read((uint32_t)&ib->btx_ring[i].length, (void *) &temp, 2);  
380 - bswap16s(&temp);  
381 - temp = (~temp) + 1;  
382 -#if 0  
383 - cpu_physical_memory_read((uint32_t)&ib->tx_buf[i], pkt_buf, temp);  
384 -#else  
385 - for (j = 0; j < temp; j++) {  
386 - cpu_physical_memory_read((uint32_t)&ib->tx_buf[i] + j, &pkt_buf[j], 1);  
387 - }  
388 -#endif  
389 -  
390 -#ifdef DEBUG_LANCE  
391 - fprintf(stderr, "lance: sending packet, len %d\n", temp);  
392 -#endif  
393 - qemu_send_packet(s->nd, pkt_buf, temp);  
394 - temp = LE_T1_POK;  
395 - cpu_physical_memory_write((uint32_t)&ib->btx_ring[i].tmd1_bits, (void *) &temp, 1); 364 + cpu_physical_memory_read((uint32_t)&ib->btx_ring[i].tmd1_bits, (void *) &temp8, 1);
  365 + if (temp8 == (LE_T1_POK|LE_T1_OWN)) {
  366 + cpu_physical_memory_read((uint32_t)&ib->btx_ring[i].length, (void *) &temp16, 2);
  367 + bswap16s(&temp16);
  368 + temp16 = (~temp16) + 1;
  369 + cpu_physical_memory_read((uint32_t)&ib->tx_buf[i], pkt_buf, temp16);
  370 + DPRINTF("sending packet, len %d\n", temp16);
  371 + qemu_send_packet(s->nd, pkt_buf, temp16);
  372 + temp8 = LE_T1_POK;
  373 + cpu_physical_memory_write((uint32_t)&ib->btx_ring[i].tmd1_bits, (void *) &temp8, 1);
396 s->txptr = (s->txptr + 1) & TX_RING_MOD_MASK; 374 s->txptr = (s->txptr + 1) & TX_RING_MOD_MASK;
397 s->regs[LE_CSR0] |= LE_C0_TINT | LE_C0_INTR; 375 s->regs[LE_CSR0] |= LE_C0_TINT | LE_C0_INTR;
398 } 376 }
399 } 377 }
  378 + if ((s->regs[LE_CSR0] & LE_C0_INTR) && (s->regs[LE_CSR0] & LE_C0_INEA))
  379 + pic_set_irq(s->irq, 1);
400 } 380 }
401 381
402 static uint32_t ledma_mem_readl(void *opaque, target_phys_addr_t addr) 382 static uint32_t ledma_mem_readl(void *opaque, target_phys_addr_t addr)
@@ -436,7 +416,7 @@ static void lance_save(QEMUFile *f, void *opaque) @@ -436,7 +416,7 @@ static void lance_save(QEMUFile *f, void *opaque)
436 416
437 qemu_put_be32s(f, &s->leptr); 417 qemu_put_be32s(f, &s->leptr);
438 qemu_put_be16s(f, &s->addr); 418 qemu_put_be16s(f, &s->addr);
439 - for (i = 0; i < LE_MAXREG; i ++) 419 + for (i = 0; i < LE_NREGS; i ++)
440 qemu_put_be16s(f, &s->regs[i]); 420 qemu_put_be16s(f, &s->regs[i]);
441 qemu_put_buffer(f, s->phys, 6); 421 qemu_put_buffer(f, s->phys, 6);
442 qemu_put_be32s(f, &s->irq); 422 qemu_put_be32s(f, &s->irq);
@@ -454,7 +434,7 @@ static int lance_load(QEMUFile *f, void *opaque, int version_id) @@ -454,7 +434,7 @@ static int lance_load(QEMUFile *f, void *opaque, int version_id)
454 434
455 qemu_get_be32s(f, &s->leptr); 435 qemu_get_be32s(f, &s->leptr);
456 qemu_get_be16s(f, &s->addr); 436 qemu_get_be16s(f, &s->addr);
457 - for (i = 0; i < LE_MAXREG; i ++) 437 + for (i = 0; i < LE_NREGS; i ++)
458 qemu_get_be16s(f, &s->regs[i]); 438 qemu_get_be16s(f, &s->regs[i]);
459 qemu_get_buffer(f, s->phys, 6); 439 qemu_get_buffer(f, s->phys, 6);
460 qemu_get_be32s(f, &s->irq); 440 qemu_get_be32s(f, &s->irq);
@@ -476,7 +456,7 @@ void lance_init(NetDriverState *nd, int irq, uint32_t leaddr, uint32_t ledaddr) @@ -476,7 +456,7 @@ void lance_init(NetDriverState *nd, int irq, uint32_t leaddr, uint32_t ledaddr)
476 s->irq = irq; 456 s->irq = irq;
477 457
478 lance_io_memory = cpu_register_io_memory(0, lance_mem_read, lance_mem_write, s); 458 lance_io_memory = cpu_register_io_memory(0, lance_mem_read, lance_mem_write, s);
479 - cpu_register_physical_memory(leaddr, 8, lance_io_memory); 459 + cpu_register_physical_memory(leaddr, 4, lance_io_memory);
480 460
481 ledma_io_memory = cpu_register_io_memory(0, ledma_mem_read, ledma_mem_write, s); 461 ledma_io_memory = cpu_register_io_memory(0, ledma_mem_read, ledma_mem_write, s);
482 cpu_register_physical_memory(ledaddr, 16, ledma_io_memory); 462 cpu_register_physical_memory(ledaddr, 16, ledma_io_memory);
hw/slavio_intctl.c
1 /* 1 /*
2 * QEMU Sparc SLAVIO interrupt controller emulation 2 * QEMU Sparc SLAVIO interrupt controller emulation
3 * 3 *
4 - * Copyright (c) 2003-2004 Fabrice Bellard 4 + * Copyright (c) 2003-2005 Fabrice Bellard
5 * 5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy 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 7 * of this software and associated documentation files (the "Software"), to deal
@@ -23,6 +23,14 @@ @@ -23,6 +23,14 @@
23 */ 23 */
24 #include "vl.h" 24 #include "vl.h"
25 //#define DEBUG_IRQ_COUNT 25 //#define DEBUG_IRQ_COUNT
  26 +//#define DEBUG_IRQ
  27 +
  28 +#ifdef DEBUG_IRQ
  29 +#define DPRINTF(fmt, args...) \
  30 +do { printf("IRQ: " fmt , ##args); } while (0)
  31 +#else
  32 +#define DPRINTF(fmt, args...)
  33 +#endif
26 34
27 /* 35 /*
28 * Registers of interrupt controller in sun4m. 36 * Registers of interrupt controller in sun4m.
@@ -49,6 +57,7 @@ typedef struct SLAVIO_INTCTLState { @@ -49,6 +57,7 @@ typedef struct SLAVIO_INTCTLState {
49 57
50 #define INTCTL_MAXADDR 0xf 58 #define INTCTL_MAXADDR 0xf
51 #define INTCTLM_MAXADDR 0xf 59 #define INTCTLM_MAXADDR 0xf
  60 +static void slavio_check_interrupts(void *opaque);
52 61
53 // per-cpu interrupt controller 62 // per-cpu interrupt controller
54 static uint32_t slavio_intctl_mem_readl(void *opaque, target_phys_addr_t addr) 63 static uint32_t slavio_intctl_mem_readl(void *opaque, target_phys_addr_t addr)
@@ -82,10 +91,12 @@ static void slavio_intctl_mem_writel(void *opaque, target_phys_addr_t addr, uint @@ -82,10 +91,12 @@ static void slavio_intctl_mem_writel(void *opaque, target_phys_addr_t addr, uint
82 val |= 80000000; 91 val |= 80000000;
83 val &= 0xfffe0000; 92 val &= 0xfffe0000;
84 s->intreg_pending[cpu] &= ~val; 93 s->intreg_pending[cpu] &= ~val;
  94 + DPRINTF("Cleared cpu %d irq mask %x, curmask %x\n", cpu, val, s->intreg_pending[cpu]);
85 break; 95 break;
86 case 2: // set softint 96 case 2: // set softint
87 val &= 0xfffe0000; 97 val &= 0xfffe0000;
88 s->intreg_pending[cpu] |= val; 98 s->intreg_pending[cpu] |= val;
  99 + DPRINTF("Set cpu %d irq mask %x, curmask %x\n", cpu, val, s->intreg_pending[cpu]);
89 break; 100 break;
90 default: 101 default:
91 break; 102 break;
@@ -135,15 +146,19 @@ static void slavio_intctlm_mem_writel(void *opaque, target_phys_addr_t addr, uin @@ -135,15 +146,19 @@ static void slavio_intctlm_mem_writel(void *opaque, target_phys_addr_t addr, uin
135 // Force clear unused bits 146 // Force clear unused bits
136 val &= ~0x7fb2007f; 147 val &= ~0x7fb2007f;
137 s->intregm_disabled &= ~val; 148 s->intregm_disabled &= ~val;
  149 + DPRINTF("Enabled master irq mask %x, curmask %x\n", val, s->intregm_disabled);
  150 + slavio_check_interrupts(s);
138 break; 151 break;
139 case 3: // set (disable, clear pending) 152 case 3: // set (disable, clear pending)
140 // Force clear unused bits 153 // Force clear unused bits
141 val &= ~0x7fb2007f; 154 val &= ~0x7fb2007f;
142 s->intregm_disabled |= val; 155 s->intregm_disabled |= val;
143 s->intregm_pending &= ~val; 156 s->intregm_pending &= ~val;
  157 + DPRINTF("Disabled master irq mask %x, curmask %x\n", val, s->intregm_disabled);
144 break; 158 break;
145 case 4: 159 case 4:
146 s->target_cpu = val & (MAX_CPUS - 1); 160 s->target_cpu = val & (MAX_CPUS - 1);
  161 + DPRINTF("Set master irq cpu %d\n", s->target_cpu);
147 break; 162 break;
148 default: 163 default:
149 break; 164 break;
@@ -196,6 +211,36 @@ static const uint32_t intbit_to_level[32] = { @@ -196,6 +211,36 @@ static const uint32_t intbit_to_level[32] = {
196 6, 0, 4, 10, 8, 0, 11, 0, 0, 0, 0, 0, 15, 0, 0, 0, 211 6, 0, 4, 10, 8, 0, 11, 0, 0, 0, 0, 0, 15, 0, 0, 0,
197 }; 212 };
198 213
  214 +static void slavio_check_interrupts(void *opaque)
  215 +{
  216 + SLAVIO_INTCTLState *s = opaque;
  217 + uint32_t pending = s->intregm_pending;
  218 + unsigned int i, max = 0;
  219 +
  220 + pending &= ~s->intregm_disabled;
  221 +
  222 + if (pending && !(s->intregm_disabled & 0x80000000)) {
  223 + for (i = 0; i < 32; i++) {
  224 + if (pending & (1 << i)) {
  225 + if (max < intbit_to_level[i])
  226 + max = intbit_to_level[i];
  227 + }
  228 + }
  229 + if (cpu_single_env->interrupt_index == 0) {
  230 + DPRINTF("Triggered pil %d\n", max);
  231 +#ifdef DEBUG_IRQ_COUNT
  232 + s->irq_count[max]++;
  233 +#endif
  234 + cpu_single_env->interrupt_index = TT_EXTINT | max;
  235 + cpu_interrupt(cpu_single_env, CPU_INTERRUPT_HARD);
  236 + }
  237 + else
  238 + DPRINTF("Not triggered (pending %x), pending exception %x\n", pending, cpu_single_env->interrupt_index);
  239 + }
  240 + else
  241 + DPRINTF("Not triggered (pending %x), disabled %x\n", pending, s->intregm_disabled);
  242 +}
  243 +
199 /* 244 /*
200 * "irq" here is the bit number in the system interrupt register to 245 * "irq" here is the bit number in the system interrupt register to
201 * separate serial and keyboard interrupts sharing a level. 246 * separate serial and keyboard interrupts sharing a level.
@@ -204,6 +249,7 @@ void slavio_pic_set_irq(void *opaque, int irq, int level) @@ -204,6 +249,7 @@ void slavio_pic_set_irq(void *opaque, int irq, int level)
204 { 249 {
205 SLAVIO_INTCTLState *s = opaque; 250 SLAVIO_INTCTLState *s = opaque;
206 251
  252 + DPRINTF("Set irq %d level %d\n", irq, level);
207 if (irq < 32) { 253 if (irq < 32) {
208 uint32_t mask = 1 << irq; 254 uint32_t mask = 1 << irq;
209 uint32_t pil = intbit_to_level[irq]; 255 uint32_t pil = intbit_to_level[irq];
@@ -216,19 +262,9 @@ void slavio_pic_set_irq(void *opaque, int irq, int level) @@ -216,19 +262,9 @@ void slavio_pic_set_irq(void *opaque, int irq, int level)
216 s->intregm_pending &= ~mask; 262 s->intregm_pending &= ~mask;
217 s->intreg_pending[s->target_cpu] &= ~(1 << pil); 263 s->intreg_pending[s->target_cpu] &= ~(1 << pil);
218 } 264 }
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 } 265 }
231 } 266 }
  267 + slavio_check_interrupts(s);
232 } 268 }
233 269
234 static void slavio_intctl_save(QEMUFile *f, void *opaque) 270 static void slavio_intctl_save(QEMUFile *f, void *opaque)
hw/slavio_timer.c
1 /* 1 /*
2 * QEMU Sparc SLAVIO timer controller emulation 2 * QEMU Sparc SLAVIO timer controller emulation
3 * 3 *
4 - * Copyright (c) 2003-2004 Fabrice Bellard 4 + * Copyright (c) 2003-2005 Fabrice Bellard
5 * 5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy 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 7 * of this software and associated documentation files (the "Software"), to deal
@@ -25,6 +25,13 @@ @@ -25,6 +25,13 @@
25 25
26 //#define DEBUG_TIMER 26 //#define DEBUG_TIMER
27 27
  28 +#ifdef DEBUG_TIMER
  29 +#define DPRINTF(fmt, args...) \
  30 +do { printf("TIMER: " fmt , ##args); } while (0)
  31 +#else
  32 +#define DPRINTF(fmt, args...)
  33 +#endif
  34 +
28 /* 35 /*
29 * Registers of hardware timer in sun4m. 36 * Registers of hardware timer in sun4m.
30 * 37 *
@@ -90,9 +97,8 @@ static void slavio_timer_get_out(SLAVIO_TIMERState *s) @@ -90,9 +97,8 @@ static void slavio_timer_get_out(SLAVIO_TIMERState *s)
90 // Convert remaining counter ticks to CPU ticks 97 // Convert remaining counter ticks to CPU ticks
91 s->expire_time = ticks + muldiv64(limit - count, ticks_per_sec, CNT_FREQ); 98 s->expire_time = ticks + muldiv64(limit - count, ticks_per_sec, CNT_FREQ);
92 99
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 100 + DPRINTF("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);
  101 +
96 if (s->mode != 1) 102 if (s->mode != 1)
97 pic_set_irq(s->irq, out); 103 pic_set_irq(s->irq, out);
98 } 104 }