/[gxemul]/trunk/src/devices/dev_cons.c
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Annotation of /trunk/src/devices/dev_cons.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 8 - (hide annotations)
Mon Oct 8 16:18:19 2007 UTC (16 years, 5 months ago) by dpavlin
File MIME type: text/plain
File size: 4348 byte(s)
++ trunk/HISTORY	(local)
$Id: HISTORY,v 1.777 2005/06/12 12:31:52 debug Exp $
==============  RELEASE 0.3.3.1  ==============

20050609	Adding simple MIPS IPIs (to dev_mp).
20050611	Adding an ugly hack to track down low-reference bugs
		(define TRACE_NULL_CRASHES, or configure --tracenull).
		Other minor updates.
20050612	Adding a dummy evbmips mode.

==============  RELEASE 0.3.3.2  ==============


1 dpavlin 4 /*
2     * Copyright (C) 2003-2005 Anders Gavare. All rights reserved.
3     *
4     * Redistribution and use in source and binary forms, with or without
5     * modification, are permitted provided that the following conditions are met:
6     *
7     * 1. Redistributions of source code must retain the above copyright
8     * notice, this list of conditions and the following disclaimer.
9     * 2. Redistributions in binary form must reproduce the above copyright
10     * notice, this list of conditions and the following disclaimer in the
11     * documentation and/or other materials provided with the distribution.
12     * 3. The name of the author may not be used to endorse or promote products
13     * derived from this software without specific prior written permission.
14     *
15     * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16     * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17     * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18     * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19     * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20     * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21     * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22     * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23     * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24     * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25     * SUCH DAMAGE.
26     *
27     *
28 dpavlin 8 * $Id: dev_cons.c,v 1.25 2005/06/11 21:04:31 debug Exp $
29 dpavlin 4 *
30     * A console device. (Fake, only useful for simple tests.)
31 dpavlin 8 * It is hardwared to the lowest available MIPS hardware IRQ, and only
32     * interrupts CPU 0.
33 dpavlin 4 *
34     * This device provides memory mapped I/O for a simple console supporting
35     * putchar (writing to memory) and getchar (reading from memory), and
36     * support for halting the emulator. (This is useful for regression tests,
37     * Hello World-style test programs, and other simple experiments.)
38     */
39    
40     #include <stdio.h>
41     #include <stdlib.h>
42     #include <string.h>
43    
44     #include "console.h"
45     #include "cpu.h"
46     #include "devices.h"
47     #include "machine.h"
48     #include "memory.h"
49     #include "misc.h"
50    
51    
52     #define CONS_TICK_SHIFT 14
53    
54     struct cons_data {
55     int console_handle;
56     int irq_nr;
57     };
58    
59    
60     /*
61     * dev_cons_tick():
62     */
63     void dev_cons_tick(struct cpu *cpu, void *extra)
64     {
65 dpavlin 8 struct cpu *c = cpu->machine->cpus[0];
66 dpavlin 4 struct cons_data *d = extra;
67    
68 dpavlin 8 cpu_interrupt_ack(c, d->irq_nr);
69 dpavlin 4
70     if (console_charavail(d->console_handle))
71 dpavlin 8 cpu_interrupt(c, d->irq_nr);
72 dpavlin 4 }
73    
74    
75     /*
76     * dev_cons_access():
77     */
78     int dev_cons_access(struct cpu *cpu, struct memory *mem,
79     uint64_t relative_addr, unsigned char *data, size_t len,
80     int writeflag, void *extra)
81     {
82     struct cons_data *d = extra;
83     int i;
84    
85     /* Exit the emulator: */
86     if (relative_addr == DEV_CONS_HALT) {
87     cpu->running = 0;
88     cpu->machine->exit_without_entering_debugger = 1;
89     return 1;
90     }
91    
92     if (writeflag == MEM_WRITE) {
93     for (i=0; i<len; i++) {
94     if (data[i] != 0) {
95     if (cpu->machine->register_dump ||
96     cpu->machine->instruction_trace)
97     debug("putchar '");
98    
99     console_putchar(d->console_handle, data[i]);
100    
101     if (cpu->machine->register_dump ||
102     cpu->machine->instruction_trace)
103     debug("'\n");
104     fflush(stdout);
105     }
106     }
107     } else {
108     int ch = console_readchar(d->console_handle);
109     if (ch < 0)
110     ch = 0;
111     for (i=0; i<len; i++)
112     data[i] = ch;
113     }
114    
115     dev_cons_tick(cpu, extra);
116    
117     return 1;
118     }
119    
120    
121     /*
122     * dev_cons_init():
123     */
124     int dev_cons_init(struct machine *machine, struct memory *mem,
125     uint64_t baseaddr, char *name, int irq_nr)
126     {
127     struct cons_data *d;
128     char *name2;
129    
130     d = malloc(sizeof(struct cons_data));
131     if (d == NULL) {
132     fprintf(stderr, "out of memory\n");
133     exit(1);
134     }
135     memset(d, 0, sizeof(struct cons_data));
136     d->irq_nr = irq_nr;
137     d->console_handle = console_start_slave(machine, name);
138    
139     name2 = malloc(strlen(name) + 20);
140     if (name2 == NULL) {
141     fprintf(stderr, "out of memory in dev_cons_init()\n");
142     exit(1);
143     }
144     if (name != NULL && name[0])
145     sprintf(name2, "cons [%s]", name);
146     else
147     sprintf(name2, "cons");
148    
149     memory_device_register(mem, name2, baseaddr, DEV_CONS_LENGTH,
150     dev_cons_access, d, MEM_DEFAULT, NULL);
151     machine_add_tickfunction(machine, dev_cons_tick, d, CONS_TICK_SHIFT);
152    
153     return d->console_handle;
154     }
155    

  ViewVC Help
Powered by ViewVC 1.1.26