45,7 → 45,6 |
#include <arch/machine.h> |
#include <arch/debug/print.h> |
|
|
/* Addresses of devices. */ |
#define GXEMUL_VIDEORAM 0x10000000 |
#define GXEMUL_KBD 0x10000000 |
60,7 → 59,6 |
#define GXEMUL_MP_MEMSIZE_OFFSET 0x0090 |
#define GXEMUL_FB 0x12000000 |
|
|
/* IRQs */ |
#define GXEMUL_KBD_IRQ 2 |
#define GXEMUL_TIMER_IRQ 4 |
88,7 → 86,7 |
/** Returns the mask of active interrupts. */ |
static inline uint32_t gxemul_irqc_get_sources(void) |
{ |
return *(uint32_t*) gxemul_hw_map.irqc; |
return *((uint32_t *) gxemul_hw_map.irqc); |
} |
|
|
98,7 → 96,7 |
*/ |
static inline void gxemul_irqc_mask(uint32_t irq) |
{ |
*(uint32_t*) gxemul_hw_map.irqc_mask = irq; |
*((uint32_t *) gxemul_hw_map.irqc_mask) = irq; |
} |
|
|
108,7 → 106,7 |
*/ |
static inline void gxemul_irqc_unmask(uint32_t irq) |
{ |
*(uint32_t*) gxemul_hw_map.irqc_unmask = irq; |
*((uint32_t *) gxemul_hw_map.irqc_unmask) = irq; |
} |
|
|
123,7 → 121,8 |
gxemul_hw_map.rtc_freq = gxemul_hw_map.rtc + GXEMUL_RTC_FREQ_OFFSET; |
gxemul_hw_map.rtc_ack = gxemul_hw_map.rtc + GXEMUL_RTC_ACK_OFFSET; |
gxemul_hw_map.irqc_mask = gxemul_hw_map.irqc + GXEMUL_IRQC_MASK_OFFSET; |
gxemul_hw_map.irqc_unmask = gxemul_hw_map.irqc + GXEMUL_IRQC_UNMASK_OFFSET; |
gxemul_hw_map.irqc_unmask = gxemul_hw_map.irqc + |
GXEMUL_IRQC_UNMASK_OFFSET; |
|
hw_map_init_called = true; |
} |
139,7 → 138,6 |
*((char *) gxemul_hw_map.videoram) = ch; |
} |
|
|
/** Enables gxemul keyboard (interrupt unmasked). |
* |
* @param dev Not used. |
151,7 → 149,6 |
gxemul_irqc_unmask(GXEMUL_KBD_IRQ); |
} |
|
|
/** Disables gxemul keyboard (interrupt masked). |
* |
* @param dev not used |
163,7 → 160,6 |
gxemul_irqc_mask(GXEMUL_KBD_IRQ); |
} |
|
|
/** Read character using polling, assume interrupts disabled. |
* |
* @param dev Not used. |
184,7 → 180,6 |
} |
} |
|
|
/** Process keyboard interrupt. |
* |
* @param irq IRQ information. |
208,7 → 203,6 |
} |
} |
|
|
static irq_ownership_t gxemul_claim(void) |
{ |
return IRQ_ACCEPT; |
225,7 → 219,6 |
interrupts_restore(ipl); |
} |
|
|
/** Return console to userspace. */ |
void gxemul_release_console(void) |
{ |
238,7 → 231,6 |
interrupts_restore(ipl); |
} |
|
|
/** Initializes console object representing gxemul console. |
* |
* @param devno device number. |
264,8 → 256,6 |
sysinfo_set_item_val("kbd.address.virtual", NULL, gxemul_hw_map.kbd); |
} |
|
|
|
/** Starts gxemul Real Time Clock device, which asserts regular interrupts. |
* |
* @param frequency Interrupts frequency (0 disables RTC). |
272,16 → 262,14 |
*/ |
static void gxemul_timer_start(uint32_t frequency) |
{ |
*(uint32_t*) gxemul_hw_map.rtc_freq = frequency; |
*((uint32_t*) gxemul_hw_map.rtc_freq) = frequency; |
} |
|
|
static irq_ownership_t gxemul_timer_claim(void) |
{ |
return IRQ_ACCEPT; |
} |
|
|
/** Timer interrupt handler. |
* |
* @param irq Interrupt information. |
298,12 → 286,11 |
spinlock_lock(&irq->lock); |
|
/* acknowledge tick */ |
*(uint32_t*) gxemul_hw_map.rtc_ack = 0; |
*((uint32_t*) gxemul_hw_map.rtc_ack) = 0; |
} |
|
|
/** Initializes and registers timer interrupt handler. */ |
static void gxemul_timer_irq_init() |
static void gxemul_timer_irq_init(void) |
{ |
irq_initialize(&gxemul_timer_irq); |
gxemul_timer_irq.devno = device_assign_devno(); |
320,13 → 307,12 |
* Initiates regular timer interrupts after initializing |
* corresponding interrupt handler. |
*/ |
void gxemul_timer_irq_start() |
void gxemul_timer_irq_start(void) |
{ |
gxemul_timer_irq_init(); |
gxemul_timer_start(GXEMUL_TIMER_FREQ); |
} |
|
|
/** Returns the size of emulated memory. |
* |
* @return Size in bytes. |
336,7 → 322,6 |
return *((int*)(GXEMUL_MP + GXEMUL_MP_MEMSIZE_OFFSET)); |
} |
|
|
/** Prints a character. |
* |
* @param ch Character to be printed. |
353,7 → 338,6 |
*(addr) = ch; |
} |
|
|
/** Stops gxemul. */ |
void gxemul_cpu_halt(void) |
{ |
367,7 → 351,6 |
*(addr + GXEMUL_HALT_OFFSET) = '\0'; |
} |
|
|
/** Gxemul specific interrupt exception handler. |
* |
* Determines sources of the interrupt from interrupt controller and |
379,8 → 362,9 |
void gxemul_irq_exception(int exc_no, istate_t *istate) |
{ |
uint32_t sources = gxemul_irqc_get_sources(); |
int i = 0; |
for (; i < GXEMUL_IRQC_MAX_IRQ; i++) { |
int i; |
|
for (i = 0; i < GXEMUL_IRQC_MAX_IRQ; i++) { |
if (sources & (1 << i)) { |
irq_t *irq = irq_dispatch_and_lock(i); |
if (irq) { |
389,7 → 373,8 |
spinlock_unlock(&irq->lock); |
} else { |
/* Spurious interrupt.*/ |
dprintf("cpu%d: spurious interrupt (inum=%d)\n", CPU->id, i); |
dprintf("cpu%d: spurious interrupt (inum=%d)\n", |
CPU->id, i); |
} |
} |
} |