/kernel/trunk/generic/include/ipc/irq.h |
---|
42,6 → 42,7 |
CMD_MEM_WRITE_8, |
CMD_PORT_READ_1, |
CMD_PORT_WRITE_1, |
CMD_IA64_GETCHAR, |
CMD_LAST |
} irq_cmd_type; |
/kernel/trunk/generic/src/ipc/irq.c |
---|
48,6 → 48,7 |
#include <ipc/irq.h> |
#include <atomic.h> |
#include <syscall/copy.h> |
#include <console/console.h> |
typedef struct { |
SPINLOCK_DECLARE(lock); |
103,6 → 104,11 |
outb((long)code->cmds[i].addr, code->cmds[i].value); |
break; |
#endif |
#if defined(ia64) |
case CMD_IA64_GETCHAR: |
IPC_SET_ARG2(call->data, _getc(&ski_uconsole)); |
break; |
#endif |
default: |
break; |
} |
/kernel/trunk/arch/ia64/include/interrupt.h |
---|
33,7 → 33,8 |
#include <arch/types.h> |
#include <arch/register.h> |
#define IRQ_COUNT 1 /* TODO */ |
#define IRQ_COUNT 257 /* 256 NOT suppotred IRQS*//* TODO */ |
#define IRQ_KBD 256 /* One simulated interrupt for ski simulator keyboard*/ |
/** External Interrupt vectors. */ |
#define INTERRUPT_TIMER 0 |
119,6 → 120,7 |
extern void universal_handler(__u64 vector, istate_t *istate); |
extern void nop_handler(__u64 vector, istate_t *istate); |
extern void external_interrupt(__u64 vector, istate_t *istate); |
extern void virtual_interrupt(__u64 irq, void *param); |
extern void disabled_fp_register(__u64 vector, istate_t *istate); |
/kernel/trunk/arch/ia64/include/ski/ski.h |
---|
30,6 → 30,7 |
#define __SKI_H__ |
#include <arch/types.h> |
#include <console/console.h> |
#define SKI_INIT_CONSOLE 20 |
#define SKI_GETCHAR 21 |
36,6 → 37,10 |
#define SKI_PUTCHAR 31 |
extern void ski_init_console(void); |
extern void ski_set_console_sysinfo(void); |
extern void poll_keyboard(void); |
extern chardev_t ski_uconsole; |
extern int kbd_uspace; |
#endif |
/kernel/trunk/arch/ia64/include/arch.h |
---|
31,4 → 31,6 |
#define LOADED_PROG_STACK_PAGES_NO 2 |
#include <arch/ski/ski.h> |
#endif |
/kernel/trunk/arch/ia64/src/ia64.c |
---|
72,6 → 72,7 |
void arch_post_mm_init(void) |
{ |
ski_set_console_sysinfo(); |
} |
void arch_pre_smp_init(void) |
/kernel/trunk/arch/ia64/src/ski/ski.c |
---|
29,9 → 29,13 |
#include <arch/ski/ski.h> |
#include <console/console.h> |
#include <console/chardev.h> |
#include <arch/interrupt.h> |
#include <sysinfo/sysinfo.h> |
static chardev_t ski_console; |
chardev_t ski_console; |
chardev_t ski_uconsole; |
static bool kb_disable; |
int kbd_uspace=0; |
static void ski_putchar(chardev_t *d, const char ch); |
static __s32 ski_getchar(void); |
111,8 → 115,17 |
ch = ski_getchar(); |
if(ch == '\r') |
ch = '\n'; |
if (ch) |
chardev_push_character(&ski_console, ch); |
if (ch){ |
if(kbd_uspace){ |
chardev_push_character(&ski_uconsole, ch); |
virtual_interrupt(IRQ_KBD,NULL); |
} |
else { |
chardev_push_character(&ski_console, ch); |
} |
} |
} |
/* Called from getc(). */ |
152,6 → 165,19 |
); |
chardev_initialize("ski_console", &ski_console, &ski_ops); |
chardev_initialize("ski_uconsole", &ski_uconsole, &ski_ops); |
stdin = &ski_console; |
stdout = &ski_console; |
} |
/** Setup console sysinfo (i.e. Keyboard IRQ) |
* |
* Because sysinfo neads memory allocation/dealocation |
* this functions should be called separetely from init. |
* |
*/ |
void ski_set_console_sysinfo(void) |
{ |
sysinfo_set_item_val("kbd",NULL,true); |
sysinfo_set_item_val("kbd.irq",NULL,IRQ_KBD); |
} |
/kernel/trunk/arch/ia64/src/interrupt.c |
---|
44,6 → 44,8 |
#include <print.h> |
#include <proc/scheduler.h> |
#include <ipc/sysipc.h> |
#include <ipc/irq.h> |
#include <ipc/ipc.h> |
#define VECTORS_64_BUNDLE 20 |
53,6 → 55,7 |
#define BUNDLE_SIZE 16 |
char *vector_names_64_bundle[VECTORS_64_BUNDLE] = { |
"VHPT Translation vector", |
"Instruction TLB vector", |
134,13 → 137,13 |
putchar('\n'); |
printf("Interrupted context dump:\n"); |
printf("ar.bsp=%p\tar.bspstore=%p\n", istate->ar_bsp, istate->ar_bspstore); |
printf("ar.rnat=%#llx\tar.rsc=%$llx\n", istate->ar_rnat, istate->ar_rsc); |
printf("ar.ifs=%#llx\tar.pfs=%#llx\n", istate->ar_ifs, istate->ar_pfs); |
printf("cr.isr=%#llx\tcr.ipsr=%#llx\t\n", istate->cr_isr.value, istate->cr_ipsr); |
printf("ar.rnat=%#018llx\tar.rsc=%#018llx\n", istate->ar_rnat, istate->ar_rsc); |
printf("ar.ifs=%#018llx\tar.pfs=%#018llx\n", istate->ar_ifs, istate->ar_pfs); |
printf("cr.isr=%#018llx\tcr.ipsr=%#018llx\t\n", istate->cr_isr.value, istate->cr_ipsr); |
printf("cr.iip=%#llx, #%d\t(%s)\n", istate->cr_iip, istate->cr_isr.ei, iip ? iip : "?"); |
printf("cr.iipa=%#llx\t(%s)\n", istate->cr_iipa, iipa ? iipa : "?"); |
printf("cr.ifa=%#llx\t(%s)\n", istate->cr_ifa, ifa ? ifa : "?"); |
printf("cr.iip=%#018llx, #%d\t(%s)\n", istate->cr_iip, istate->cr_isr.ei, iip); |
printf("cr.iipa=%#018llx\t(%s)\n", istate->cr_iipa, iipa); |
printf("cr.ifa=%#018llx\t(%s)\n", istate->cr_ifa, ifa); |
} |
void general_exception(__u64 vector, istate_t *istate) |
242,9 → 245,28 |
} |
} |
void virtual_interrupt(__u64 irq,void *param) |
{ |
switch(irq) { |
case IRQ_KBD: |
if(kbd_uspace) ipc_irq_send_notif(irq); |
break; |
default: |
panic("\nUnhandled Virtual Interrupt request %d\n", irq); |
break; |
} |
} |
/* Reregister irq to be IPC-ready */ |
void irq_ipc_bind_arch(__native irq) |
{ |
if(irq==IRQ_KBD) { |
kbd_uspace=1; |
return; |
} |
panic("not implemented\n"); |
/* TODO */ |
} |