Changeset 7688b5d in mainline
- Timestamp:
- 2006-10-18T09:54:13Z (18 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 6fb30a1
- Parents:
- 19de05f
- Location:
- kernel/arch/mips32
- Files:
-
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/mips32/include/console.h
r19de05f r7688b5d 36 36 #define KERN_mips32_CONSOLE_H_ 37 37 38 void console_init(void);38 extern void console_init(devno_t devno); 39 39 40 40 #endif -
kernel/arch/mips32/include/drivers/msim.h
r19de05f r7688b5d 38 38 #include <console/chardev.h> 39 39 40 #define MSIM_VIDEORAM 0xB0000000 41 /** Address of 'keyboard' device. */ 42 #define MSIM_KBD_ADDRESS 0xB0000000 43 #define MSIM_KBD_IRQ 2 44 45 void msim_console(void); 40 void msim_console(devno_t devno); 46 41 void msim_kbd_release(void); 47 42 void msim_kbd_grab(void); -
kernel/arch/mips32/include/drivers/serial.h
r19de05f r7688b5d 63 63 }serial_t; 64 64 65 void serial_console(void);66 int serial_init(void);65 extern void serial_console(devno_t devno); 66 extern int serial_init(void); 67 67 68 68 #endif -
kernel/arch/mips32/include/interrupt.h
r19de05f r7688b5d 38 38 #include <arch/exception.h> 39 39 40 #define IVT_ITEMS 40 41 #define INT_OFFSET 32 42 #define IRQ_COUNT 8 40 #define IVT_ITEMS 32 41 #define IVT_FIRST 0 43 42 44 #define int_register(it, name, handler) exc_register(((it)+INT_OFFSET),name,handler) 45 46 #define IRQ2 2 47 #define IRQ3 3 48 #define IRQ7 7 49 50 #define TIMER_IRQ IRQ7 43 extern function timer_fnc; 51 44 52 45 extern void interrupt_init(void); -
kernel/arch/mips32/src/console.c
r19de05f r7688b5d 39 39 #include <arch/drivers/msim.h> 40 40 41 void console_init( void)41 void console_init(devno_t devno) 42 42 { 43 43 if (arc_enabled()) { 44 44 arc_console(); 45 45 } else if (serial_init()) { 46 serial_console( );46 serial_console(devno); 47 47 } else { 48 msim_console( );48 msim_console(devno); 49 49 } 50 50 } … … 57 57 msim_kbd_grab(); 58 58 } 59 59 60 /** Return console to userspace 60 61 * -
kernel/arch/mips32/src/drivers/arc.c
r19de05f r7688b5d 354 354 }; 355 355 356 iroutine old_timer;357 /** Do polling on timer interrupt */358 static void timer_replace(int n, istate_t *istate)359 {360 arc_keyboard_poll();361 old_timer(n, istate);362 arc_keyboard_poll();363 }364 365 356 void arc_console(void) 366 357 { … … 368 359 369 360 chardev_initialize("arc_console", &console, &arc_ops); 370 old_timer = int_register(TIMER_IRQ, "arc_kb_poll", timer_replace);361 timer_fnc = &arc_keyboard_poll; 371 362 stdin = &console; 372 363 stdout = &console; -
kernel/arch/mips32/src/drivers/msim.c
r19de05f r7688b5d 38 38 #include <arch/cp0.h> 39 39 #include <console/console.h> 40 #include <ddi/irq.h> 41 #include <sysinfo/sysinfo.h> 42 43 /** Address of devices. */ 44 #define MSIM_VIDEORAM 0xB0000000 45 #define MSIM_KBD_ADDRESS 0xB0000000 46 #define MSIM_KBD_IRQ 2 40 47 41 48 static chardev_t console; 49 static irq_t msim_irq; 42 50 43 51 static void msim_write(chardev_t *dev, const char ch); … … 90 98 91 99 /** Process keyboard interrupt. */ 92 static void msim_i nterrupt(int n, istate_t *istate)100 static void msim_irq_handler(irq_t *irq, void *arg, ...) 93 101 { 94 char ch = 0; 102 if ((irq->notif_cfg.notify) && (irq->notif_cfg.answerbox)) 103 ipc_irq_send_notif(irq); 104 else { 105 char ch = 0; 106 107 ch = *((char *) MSIM_KBD_ADDRESS); 108 if (ch =='\r') 109 ch = '\n'; 110 if (ch == 0x7f) 111 ch = '\b'; 112 chardev_push_character(&console, ch); 113 } 114 } 95 115 96 ch = *((char *) MSIM_KBD_ADDRESS); 97 if (ch =='\r') 98 ch = '\n'; 99 if (ch == 0x7f) 100 ch = '\b'; 101 chardev_push_character(&console, ch); 116 static irq_ownership_t msim_claim(void) 117 { 118 return IRQ_ACCEPT; 119 } 120 121 void msim_kbd_grab(void) 122 { 123 msim_irq.notif_cfg.notify = false; 124 } 125 126 void msim_kbd_release(void) 127 { 128 if (msim_irq.notif_cfg.answerbox) 129 msim_irq.notif_cfg.notify = true; 102 130 } 103 131 104 132 105 133 /* Return console object representing msim console */ 106 void msim_console( void)134 void msim_console(devno_t devno) 107 135 { 108 136 chardev_initialize("msim_console", &console, &msim_ops); 109 110 int_register(MSIM_KBD_IRQ, "msim_kbd", msim_interrupt);111 112 cp0_unmask_int(MSIM_KBD_IRQ);113 114 137 stdin = &console; 115 138 stdout = &console; 116 } 117 118 static iroutine oldvector; 119 void msim_kbd_grab(void) 120 { 121 oldvector = int_register(MSIM_KBD_IRQ, "msim_kbd", msim_interrupt); 122 } 123 void msim_kbd_release(void) 124 { 125 if (oldvector) 126 int_register(MSIM_KBD_IRQ, "user_interrupt", oldvector); 139 140 irq_initialize(&msim_irq); 141 msim_irq.devno = devno; 142 msim_irq.inr = MSIM_KBD_IRQ; 143 msim_irq.claim = msim_claim; 144 msim_irq.handler = msim_irq_handler; 145 irq_register(&msim_irq); 146 147 cp0_unmask_int(MSIM_KBD_IRQ); 148 149 sysinfo_set_item_val("kbd", NULL, true); 150 sysinfo_set_item_val("kbd.devno", NULL, devno); 151 sysinfo_set_item_val("kbd.inr", NULL, MSIM_KBD_IRQ); 152 sysinfo_set_item_val("kbd.address.virtual", NULL, MSIM_KBD_ADDRESS); 127 153 } 128 154 -
kernel/arch/mips32/src/drivers/serial.c
r19de05f r7688b5d 38 38 #include <console/chardev.h> 39 39 #include <console/console.h> 40 #include <ddi/irq.h> 40 41 42 #define SERIAL_IRQ 2 43 44 static irq_t serial_irq; 41 45 static chardev_t console; 42 46 static serial_t sconf[SERIAL_MAX]; … … 92 96 } 93 97 94 95 /** Process keyboard interrupt. Does not work in simics? */ 96 static void serial_interrupt(int n, void *stack) 98 static void serial_handler(void) 97 99 { 98 serial_t *sd = (serial_t *) console.data;100 serial_t *sd = (serial_t *) console.data; 99 101 char ch; 100 102 … … 108 110 } 109 111 112 /** Process keyboard interrupt. Does not work in simics? */ 113 static void serial_irq_handler(irq_t *irq, void *arg, ...) 114 { 115 if ((irq->notif_cfg.notify) && (irq->notif_cfg.answerbox)) 116 ipc_irq_send_notif(irq); 117 else 118 serial_handler(); 119 } 110 120 121 static irq_ownership_t serial_claim(void) 122 { 123 return IRQ_ACCEPT; 124 } 111 125 112 126 static chardev_operations_t serial_ops = { … … 117 131 }; 118 132 119 iroutine old_timer; 120 /** Do polling on timer interrupt */ 121 static void timer_replace(int n, istate_t *istate) 122 { 123 old_timer(n, istate); 124 serial_interrupt(n, istate); 125 } 126 127 void serial_console(void) 133 void serial_console(devno_t devno) 128 134 { 129 135 serial_t *sd = &sconf[0]; … … 133 139 console.data = sd; 134 140 kb_enabled = true; 141 142 irq_initialize(&serial_irq); 143 serial_irq.devno = devno; 144 serial_irq.inr = SERIAL_IRQ; 145 serial_irq.claim = serial_claim; 146 serial_irq.handler = serial_irq_handler; 147 irq_register(&serial_irq); 135 148 136 // int_register(2, "serial_drvr", serial_interrupt);137 149 /* I don't know why, but the serial interrupts simply 138 150 * don't work on simics 139 151 */ 140 old_timer = int_register(TIMER_IRQ, "serial_drvr_poll", timer_replace);152 timer_fnc = &serial_handler; 141 153 142 154 stdin = &console; -
kernel/arch/mips32/src/exception.c
r19de05f r7688b5d 46 46 #include <func.h> 47 47 #include <console/kconsole.h> 48 #include <ddi/irq.h> 48 49 #include <arch/debugger.h> 49 50 … … 146 147 cause = (cp0_cause_read() >> 8) &0xff; 147 148 148 for (i = 0; i < 8; i++) 149 if (cause & (1 << i)) 150 exc_dispatch(i+INT_OFFSET, istate); 149 for (i = 0; i < 8; i++) { 150 if (cause & (1 << i)) { 151 irq_t *irq = irq_dispatch_and_lock(i); 152 if (irq) { 153 /* 154 * The IRQ handler was found. 155 */ 156 irq->handler(irq, irq->arg); 157 spinlock_unlock(&irq->lock); 158 } else { 159 /* 160 * Spurious interrupt. 161 */ 162 #ifdef CONFIG_DEBUG 163 printf("cpu%d: spurious interrupt (inum=%d)\n", CPU->id, i); 164 #endif 165 } 166 } 167 } 151 168 } 152 169 … … 162 179 163 180 /* Clear exception table */ 164 for (i =0;i < IVT_ITEMS; i++)181 for (i = 0; i < IVT_ITEMS; i++) 165 182 exc_register(i, "undef", (iroutine) unhandled_exception); 183 166 184 exc_register(EXC_Bp, "bkpoint", (iroutine) breakpoint_exception); 167 185 exc_register(EXC_RI, "resinstr", (iroutine) reserved_instr_exception); -
kernel/arch/mips32/src/interrupt.c
r19de05f r7688b5d 40 40 #include <time/clock.h> 41 41 #include <arch/drivers/arc.h> 42 #include <ipc/sysipc.h> 43 #include <ddi/device.h> 44 #include <ddi/irq.h> 42 45 43 #include <ipc/sysipc.h> 46 #define IRQ_COUNT 8 47 #define TIMER_IRQ 7 48 49 function timer_fnc = NULL; 50 static irq_t timer_irq; 44 51 45 52 /** Disable interrupts. … … 92 99 } 93 100 94 static void timer_exception(int n, istate_t *istate) 101 static irq_ownership_t timer_claim(void) 102 { 103 return IRQ_ACCEPT; 104 } 105 106 static void timer_irq_handler(irq_t *irq, void *arg, ...) 95 107 { 96 108 unsigned long drift; … … 104 116 cp0_compare_write(nextcount); 105 117 clock(); 106 } 107 108 static void swint0(int n, istate_t *istate) 109 { 110 cp0_cause_write(cp0_cause_read() & ~(1 << 8)); /* clear SW0 interrupt */ 111 ipc_irq_send_notif(0); 112 } 113 114 static void swint1(int n, istate_t *istate) 115 { 116 cp0_cause_write(cp0_cause_read() & ~(1 << 9)); /* clear SW1 interrupt */ 117 ipc_irq_send_notif(1); 118 119 if (timer_fnc != NULL) 120 timer_fnc(); 118 121 } 119 122 … … 121 124 void interrupt_init(void) 122 125 { 123 int_register(TIMER_IRQ, "timer", timer_exception); 124 int_register(0, "swint0", swint0); 125 int_register(1, "swint1", swint1); 126 irq_init(IRQ_COUNT, IRQ_COUNT); 127 128 irq_initialize(&timer_irq); 129 timer_irq.devno = device_assign_devno(); 130 timer_irq.inr = TIMER_IRQ; 131 timer_irq.claim = timer_claim; 132 timer_irq.handler = timer_irq_handler; 133 irq_register(&timer_irq); 134 126 135 timer_start(); 127 } 128 129 static void ipc_int(int n, istate_t *istate) 130 { 131 ipc_irq_send_notif(n-INT_OFFSET); 132 } 133 134 /* Reregister irq to be IPC-ready */ 135 void irq_ipc_bind_arch(unative_t irq) 136 { 137 /* Do not allow to redefine timer */ 138 /* Swint0, Swint1 are already handled */ 139 if (irq == TIMER_IRQ || irq < 2) 140 return; 141 int_register(irq, "ipc_int", ipc_int); 136 cp0_unmask_int(TIMER_IRQ); 142 137 } 143 138 -
kernel/arch/mips32/src/mips32.c
r19de05f r7688b5d 55 55 #include <genarch/fb/fb.h> 56 56 #include <macros.h> 57 #include <ddi/device.h> 57 58 58 59 #include <arch/asm/regname.h> … … 99 100 100 101 /* Copy the exception vectors to the right places */ 101 memcpy(TLB_EXC, (char *)tlb_refill_entry, EXCEPTION_JUMP_SIZE); 102 memcpy(NORM_EXC, (char *)exception_entry, EXCEPTION_JUMP_SIZE); 103 memcpy(CACHE_EXC, (char *)cache_error_entry, EXCEPTION_JUMP_SIZE); 104 105 interrupt_init(); 102 memcpy(TLB_EXC, (char *) tlb_refill_entry, EXCEPTION_JUMP_SIZE); 103 memcpy(NORM_EXC, (char *) exception_entry, EXCEPTION_JUMP_SIZE); 104 memcpy(CACHE_EXC, (char *) cache_error_entry, EXCEPTION_JUMP_SIZE); 105 106 106 /* 107 107 * Switch to BEV normal level so that exception vectors point to the kernel. … … 114 114 */ 115 115 cp0_mask_all_int(); 116 117 /* 118 * Unmask hardware clock interrupt. 119 */ 120 cp0_unmask_int(TIMER_IRQ); 121 122 console_init(); 116 123 117 debugger_init(); 124 118 } … … 126 120 void arch_post_mm_init(void) 127 121 { 122 interrupt_init(); 123 console_init(device_assign_devno()); 128 124 #ifdef CONFIG_FB 129 125 fb_init(0x12000000, 640, 480, 24, 1920, false); // gxemul framebuffer 130 126 #endif 131 sysinfo_set_item_val("machine." STRING(MACHINE), NULL,1);127 sysinfo_set_item_val("machine." STRING(MACHINE), NULL, 1); 132 128 } 133 129
Note:
See TracChangeset
for help on using the changeset viewer.