Revision 52cc07d0

b/hw/slavio_intctl.c
277 277
 * "irq" here is the bit number in the system interrupt register to
278 278
 * separate serial and keyboard interrupts sharing a level.
279 279
 */
280
void slavio_pic_set_irq(void *opaque, int irq, int level)
280
void pic_set_irq_new(void *opaque, int irq, int level)
281 281
{
282 282
    SLAVIO_INTCTLState *s = opaque;
283 283

  
......
299 299
    }
300 300
}
301 301

  
302
void slavio_pic_set_irq_cpu(void *opaque, int irq, int level, unsigned int cpu)
302
void pic_set_irq_cpu(void *opaque, int irq, int level, unsigned int cpu)
303 303
{
304 304
    SLAVIO_INTCTLState *s = opaque;
305 305

  
306 306
    DPRINTF("Set cpu %d local irq %d level %d\n", cpu, irq, level);
307 307
    if (cpu == (unsigned int)-1) {
308
        slavio_pic_set_irq(opaque, irq, level);
308
        pic_set_irq_new(opaque, irq, level);
309 309
        return;
310 310
    }
311 311
    if (irq < 32) {
b/hw/slavio_misc.c
36 36
#ifdef DEBUG_MISC
37 37
#define MISC_DPRINTF(fmt, args...) \
38 38
do { printf("MISC: " fmt , ##args); } while (0)
39
#define pic_set_irq_new(intctl, irq, level)                             \
40
    do { printf("MISC: set_irq(%d): %d\n", (irq), (level));             \
41
        pic_set_irq_new((intctl), (irq),(level));} while (0)
39 42
#else
40 43
#define MISC_DPRINTF(fmt, args...)
41 44
#endif
......
45 48
    uint8_t config;
46 49
    uint8_t aux1, aux2;
47 50
    uint8_t diag, mctrl, sysctrl;
51
    void *intctl;
48 52
} MiscState;
49 53

  
50 54
#define MISC_MAXADDR 1
......
54 58
    MiscState *s = opaque;
55 59

  
56 60
    if ((s->aux2 & 0x4) && (s->config & 0x8)) {
57
        pic_set_irq(s->irq, 1);
61
        pic_set_irq_new(s->intctl, s->irq, 1);
58 62
    } else {
59
        pic_set_irq(s->irq, 0);
63
        pic_set_irq_new(s->intctl, s->irq, 0);
60 64
    }
61 65
}
62 66

  
......
207 211
    return 0;
208 212
}
209 213

  
210
void *slavio_misc_init(uint32_t base, int irq)
214
void *slavio_misc_init(uint32_t base, int irq, void *intctl)
211 215
{
212 216
    int slavio_misc_io_memory;
213 217
    MiscState *s;
......
233 237
    cpu_register_physical_memory(base + 0xa000000, MISC_MAXADDR, slavio_misc_io_memory);
234 238

  
235 239
    s->irq = irq;
240
    s->intctl = intctl;
236 241

  
237 242
    register_savevm("slavio_misc", base, 1, slavio_misc_save, slavio_misc_load, s);
238 243
    qemu_register_reset(slavio_misc_reset, s);
b/hw/slavio_serial.c
52 52
#ifdef DEBUG_SERIAL
53 53
#define SER_DPRINTF(fmt, args...) \
54 54
do { printf("SER: " fmt , ##args); } while (0)
55
#define pic_set_irq(irq, level) \
56
do { printf("SER: set_irq(%d): %d\n", (irq), (level)); pic_set_irq((irq),(level));} while (0)
55
#define pic_set_irq_new(intctl, irq, level)                             \
56
    do { printf("SER: set_irq(%d): %d\n", (irq), (level));              \
57
        pic_set_irq_new((intctl), (irq),(level));} while (0)
57 58
#else
58 59
#define SER_DPRINTF(fmt, args...)
59 60
#endif
......
97 98
    uint8_t rx, tx, wregs[16], rregs[16];
98 99
    SERIOQueue queue;
99 100
    CharDriverState *chr;
101
    void *intctl;
100 102
} ChannelState;
101 103

  
102 104
struct SerialState {
......
164 166
    irq = slavio_serial_update_irq_chn(s);
165 167
    irq |= slavio_serial_update_irq_chn(s->otherchn);
166 168

  
167
    pic_set_irq(s->irq, irq);
169
    pic_set_irq_new(s->intctl, s->irq, irq);
168 170
}
169 171

  
170 172
static void slavio_serial_reset_chn(ChannelState *s)
......
545 547

  
546 548
}
547 549

  
548
SerialState *slavio_serial_init(int base, int irq, CharDriverState *chr1, CharDriverState *chr2)
550
SerialState *slavio_serial_init(int base, int irq, CharDriverState *chr1,
551
                                CharDriverState *chr2, void *intctl)
549 552
{
550 553
    int slavio_serial_io_memory, i;
551 554
    SerialState *s;
......
564 567
	s->chn[i].irq = irq;
565 568
	s->chn[i].chn = 1 - i;
566 569
	s->chn[i].type = ser;
570
        s->chn[i].intctl = intctl;
567 571
	if (s->chn[i].chr) {
568 572
	    qemu_chr_add_handlers(s->chn[i].chr, serial_can_receive,
569 573
                                  serial_receive1, serial_event, &s->chn[i]);
......
661 665
    put_queue(s, 0);
662 666
}
663 667

  
664
void slavio_serial_ms_kbd_init(int base, int irq)
668
void slavio_serial_ms_kbd_init(int base, int irq, void *intctl)
665 669
{
666 670
    int slavio_serial_io_memory, i;
667 671
    SerialState *s;
......
673 677
	s->chn[i].irq = irq;
674 678
	s->chn[i].chn = 1 - i;
675 679
	s->chn[i].chr = NULL;
680
        s->chn[i].intctl = intctl;
676 681
    }
677 682
    s->chn[0].otherchn = &s->chn[1];
678 683
    s->chn[1].otherchn = &s->chn[0];
b/hw/slavio_timer.c
28 28
#ifdef DEBUG_TIMER
29 29
#define DPRINTF(fmt, args...) \
30 30
do { printf("TIMER: " fmt , ##args); } while (0)
31
#define pic_set_irq_new(intctl, irq, level)                             \
32
    do { printf("TIMER: set_irq(%d): %d\n", (irq), (level));            \
33
        pic_set_irq_new((intctl), (irq),(level));} while (0)
31 34
#else
32 35
#define DPRINTF(fmt, args...)
33 36
#endif
......
57 60
    int reached, stopped;
58 61
    int mode; // 0 = processor, 1 = user, 2 = system
59 62
    unsigned int cpu;
63
    void *intctl;
60 64
} SLAVIO_TIMERState;
61 65

  
62 66
#define TIMER_MAXADDR 0x1f
......
103 107
    DPRINTF("irq %d limit %d reached %d d %" PRId64 " count %d s->c %x diff %" PRId64 " 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);
104 108

  
105 109
    if (s->mode != 1)
106
	pic_set_irq_cpu(s->irq, out, s->cpu);
110
	pic_set_irq_cpu(s->intctl, s->irq, out, s->cpu);
107 111
}
108 112

  
109 113
// timer callback
......
130 134
	// part of counter (user mode)
131 135
	if (s->mode != 1) {
132 136
	    // clear irq
133
	    pic_set_irq_cpu(s->irq, 0, s->cpu);
137
	    pic_set_irq_cpu(s->intctl, s->irq, 0, s->cpu);
134 138
	    s->reached = 0;
135 139
	    return s->limit;
136 140
	}
......
265 269
    slavio_timer_get_out(s);
266 270
}
267 271

  
268
void slavio_timer_init(uint32_t addr, int irq, int mode, unsigned int cpu)
272
void slavio_timer_init(uint32_t addr, int irq, int mode, unsigned int cpu,
273
                       void *intctl)
269 274
{
270 275
    int slavio_timer_io_memory;
271 276
    SLAVIO_TIMERState *s;
......
277 282
    s->mode = mode;
278 283
    s->cpu = cpu;
279 284
    s->irq_timer = qemu_new_timer(vm_clock, slavio_timer_irq, s);
285
    s->intctl = intctl;
280 286

  
281 287
    slavio_timer_io_memory = cpu_register_io_memory(0, slavio_timer_mem_read,
282 288
						    slavio_timer_mem_write, s);
b/hw/sun4m.c
184 184

  
185 185
void pic_set_irq(int irq, int level)
186 186
{
187
    slavio_pic_set_irq(slavio_intctl, irq, level);
188
}
189

  
190
void pic_set_irq_new(void *opaque, int irq, int level)
191
{
192
    pic_set_irq(irq, level);
193
}
194

  
195
void pic_set_irq_cpu(int irq, int level, unsigned int cpu)
196
{
197
    slavio_pic_set_irq_cpu(slavio_intctl, irq, level, cpu);
187
    pic_set_irq_new(slavio_intctl, irq, level);
198 188
}
199 189

  
200 190
static void *slavio_misc;
......
261 251
    nvram = m48t59_init(0, hwdef->nvram_base, 0, hwdef->nvram_size, 8);
262 252
    for (i = 0; i < MAX_CPUS; i++) {
263 253
        slavio_timer_init(hwdef->counter_base + i * TARGET_PAGE_SIZE,
264
                          hwdef->clock_irq, 0, i);
254
                          hwdef->clock_irq, 0, i, slavio_intctl);
265 255
    }
266 256
    slavio_timer_init(hwdef->counter_base + 0x10000, hwdef->clock1_irq, 2,
267
                      (unsigned int)-1);
268
    slavio_serial_ms_kbd_init(hwdef->ms_kb_base, hwdef->ms_kb_irq);
257
                      (unsigned int)-1, slavio_intctl);
258
    slavio_serial_ms_kbd_init(hwdef->ms_kb_base, hwdef->ms_kb_irq,
259
                              slavio_intctl);
269 260
    // Slavio TTYA (base+4, Linux ttyS0) is the first Qemu serial device
270 261
    // Slavio TTYB (base+0, Linux ttyS1) is the second Qemu serial device
271 262
    slavio_serial_init(hwdef->serial_base, hwdef->ser_irq,
272
                       serial_hds[1], serial_hds[0]);
263
                       serial_hds[1], serial_hds[0], slavio_intctl);
273 264
    fdctrl_init(hwdef->fd_irq, 0, 1, hwdef->fd_base, fd_table);
274 265
    main_esp = esp_init(bs_table, hwdef->esp_base, dma);
275 266

  
......
279 270
        }
280 271
    }
281 272

  
282
    slavio_misc = slavio_misc_init(hwdef->slavio_base, hwdef->me_irq);
273
    slavio_misc = slavio_misc_init(hwdef->slavio_base, hwdef->me_irq,
274
                                   slavio_intctl);
283 275
    cs_init(hwdef->cs_base, hwdef->cs_irq, slavio_intctl);
284 276
    sparc32_dma_set_reset_data(dma, main_esp, main_lance);
285 277
}
b/vl.h
1144 1144

  
1145 1145
/* sun4m.c */
1146 1146
extern QEMUMachine ss5_machine, ss10_machine;
1147
void pic_set_irq_cpu(int irq, int level, unsigned int cpu);
1148 1147

  
1149 1148
/* iommu.c */
1150 1149
void *iommu_init(uint32_t addr);
......
1169 1168
	       unsigned long vram_offset, int vram_size, int width, int height);
1170 1169

  
1171 1170
/* slavio_intctl.c */
1171
void pic_set_irq_cpu(void *opaque, int irq, int level, unsigned int cpu);
1172 1172
void *slavio_intctl_init(uint32_t addr, uint32_t addrg,
1173 1173
                         const uint32_t *intbit_to_level);
1174 1174
void slavio_intctl_set_cpu(void *opaque, unsigned int cpu, CPUState *env);
......
1185 1185
int load_uboot(const char *filename, target_ulong *ep, int *is_linux);
1186 1186

  
1187 1187
/* slavio_timer.c */
1188
void slavio_timer_init(uint32_t addr, int irq, int mode, unsigned int cpu);
1188
void slavio_timer_init(uint32_t addr, int irq, int mode, unsigned int cpu,
1189
                       void *intctl);
1189 1190

  
1190 1191
/* slavio_serial.c */
1191
SerialState *slavio_serial_init(int base, int irq, CharDriverState *chr1, CharDriverState *chr2);
1192
void slavio_serial_ms_kbd_init(int base, int irq);
1192
SerialState *slavio_serial_init(int base, int irq, CharDriverState *chr1,
1193
                                CharDriverState *chr2, void *intctl);
1194
void slavio_serial_ms_kbd_init(int base, int irq, void *intctl);
1193 1195

  
1194 1196
/* slavio_misc.c */
1195
void *slavio_misc_init(uint32_t base, int irq);
1197
void *slavio_misc_init(uint32_t base, int irq, void *intctl);
1196 1198
void slavio_set_power_fail(void *opaque, int power_failing);
1197 1199

  
1198 1200
/* esp.c */

Also available in: Unified diff