--- trunk/src/devices/dev_cons.c 2007/10/08 16:18:00 4 +++ trunk/src/devices/dev_cons.c 2007/10/08 16:18:38 12 @@ -25,9 +25,9 @@ * SUCH DAMAGE. * * - * $Id: dev_cons.c,v 1.24 2005/02/19 11:51:33 debug Exp $ + * $Id: dev_cons.c,v 1.27 2005/07/12 08:49:13 debug Exp $ * - * A console device. (Fake, only useful for simple tests.) + * A simple console device, useful for simple tests. * * This device provides memory mapped I/O for a simple console supporting * putchar (writing to memory) and getchar (reading from memory), and @@ -41,6 +41,7 @@ #include "console.h" #include "cpu.h" +#include "device.h" #include "devices.h" #include "machine.h" #include "memory.h" @@ -49,23 +50,19 @@ #define CONS_TICK_SHIFT 14 -struct cons_data { - int console_handle; - int irq_nr; -}; - /* * dev_cons_tick(): */ void dev_cons_tick(struct cpu *cpu, void *extra) { + struct cpu *c = cpu->machine->cpus[0]; struct cons_data *d = extra; - cpu_interrupt_ack(cpu, d->irq_nr); + cpu_interrupt_ack(c, d->irq_nr); if (console_charavail(d->console_handle)) - cpu_interrupt(cpu, d->irq_nr); + cpu_interrupt(c, d->irq_nr); } @@ -116,13 +113,13 @@ /* - * dev_cons_init(): + * devinit_cons(): */ -int dev_cons_init(struct machine *machine, struct memory *mem, - uint64_t baseaddr, char *name, int irq_nr) +int devinit_cons(struct devinit *devinit) { struct cons_data *d; - char *name2; + char *name3; + size_t nlen; d = malloc(sizeof(struct cons_data)); if (d == NULL) { @@ -130,23 +127,30 @@ exit(1); } memset(d, 0, sizeof(struct cons_data)); - d->irq_nr = irq_nr; - d->console_handle = console_start_slave(machine, name); - name2 = malloc(strlen(name) + 20); - if (name2 == NULL) { + nlen = strlen(devinit->name) + 10; + if (devinit->name2 != NULL) + nlen += strlen(devinit->name2) + 10; + name3 = malloc(nlen); + if (name3 == NULL) { fprintf(stderr, "out of memory in dev_cons_init()\n"); exit(1); } - if (name != NULL && name[0]) - sprintf(name2, "cons [%s]", name); + if (devinit->name2 != NULL && devinit->name2[0]) + snprintf(name3, nlen, "%s [%s]", devinit->name, devinit->name2); else - sprintf(name2, "cons"); + snprintf(name3, nlen, "%s", devinit->name); + + d->irq_nr = devinit->irq_nr; + d->console_handle = console_start_slave(devinit->machine, name3); - memory_device_register(mem, name2, baseaddr, DEV_CONS_LENGTH, - dev_cons_access, d, MEM_DEFAULT, NULL); - machine_add_tickfunction(machine, dev_cons_tick, d, CONS_TICK_SHIFT); + memory_device_register(devinit->machine->memory, name3, + devinit->addr, DEV_CONS_LENGTH, dev_cons_access, d, + MEM_DEFAULT, NULL); + machine_add_tickfunction(devinit->machine, dev_cons_tick, + d, CONS_TICK_SHIFT); - return d->console_handle; + devinit->return_ptr = d; + return 1; }