Changeset de57e060 in mainline
- Timestamp:
- 2006-10-18T20:51:15Z (18 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 80ca47e
- Parents:
- cd13c2a
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/ia64/include/drivers/it.h
rcd13c2a rde57e060 45 45 46 46 extern void it_init(void); 47 extern void it_interrupt(void);48 47 49 48 #endif -
kernel/arch/ia64/include/interrupt.h
rcd13c2a rde57e060 40 40 #include <arch/register.h> 41 41 42 #define IRQ_COUNT 257 /* 256 NOT suppotred IRQS*//* TODO */ 43 #define IRQ_KBD 256 /* One simulated interrupt for ski simulator keyboard*/ 42 /** ia64 has 256 INRs. */ 43 #define INR_COUNT 256 44 45 /* 46 * We need to keep this just to compile. 47 * We might eventually move interrupt/ stuff 48 * to genarch. 49 */ 50 #define IVT_ITEMS 0 51 #define IVT_FIRST 0 44 52 45 53 /** External Interrupt vectors. */ … … 127 135 static inline int istate_from_uspace(istate_t *istate) 128 136 { 129 return (istate->cr_iip) <0xe000000000000000ULL;137 return (istate->cr_iip) < 0xe000000000000000ULL; 130 138 } 131 139 … … 137 145 extern void nop_handler(uint64_t vector, istate_t *istate); 138 146 extern void external_interrupt(uint64_t vector, istate_t *istate); 139 extern void virtual_interrupt(uint64_t irq, void *param);140 147 extern void disabled_fp_register(uint64_t vector, istate_t *istate); 141 148 -
kernel/arch/ia64/include/ski/ski.h
rcd13c2a rde57e060 43 43 #define SKI_PUTCHAR 31 44 44 45 extern chardev_t ski_uconsole; 46 45 47 extern void ski_init_console(void); 46 48 extern void ski_set_console_sysinfo(void); 47 49 extern void poll_keyboard(void); 48 50 49 extern chardev_t ski_uconsole;50 extern int kbd_uspace;51 extern void ski_kbd_grab(void); 52 extern void ski_kbd_release(void); 51 53 52 54 #endif -
kernel/arch/ia64/src/drivers/it.c
rcd13c2a rde57e060 42 42 #include <arch/barrier.h> 43 43 #include <time/clock.h> 44 #include <ddi/irq.h> 45 #include <ddi/device.h> 44 46 #include <arch.h> 45 47 48 #define IT_SERVICE_CLOCKS 64 46 49 47 #define IT_SERVICE_CLOCKS 64 50 static irq_t it_irq; 51 52 static irq_ownership_t it_claim(void); 53 static void it_interrupt(irq_t *irq, void *arg, ...); 48 54 49 55 /** Initialize Interval Timer. */ … … 51 57 { 52 58 cr_itv_t itv; 59 60 irq_initialize(&it_irq); 61 it_irq.inr = INTERRUPT_TIMER; 62 it_irq.devno = device_assign_devno(); 63 it_irq.claim = it_claim; 64 it_irq.handler = it_interrupt; 65 irq_register(&it_irq); 53 66 54 67 /* initialize Interval Timer external interrupt vector */ … … 68 81 } 69 82 83 /** Always claim ownership for this IRQ. 84 * 85 * Other devices are responsible to avoid using INR 0. 86 * 87 * @return Always IRQ_ACCEPT. 88 */ 89 irq_ownership_t it_claim(void) 90 { 91 return IRQ_ACCEPT; 92 } 70 93 71 94 /** Process Interval Timer interrupt. */ 72 void it_interrupt( void)95 void it_interrupt(irq_t *irq, void *arg, ...) 73 96 { 74 97 int64_t c; … … 84 107 85 108 m += IT_DELTA; 86 if (m -c<0)109 if (m - c < 0) 87 110 CPU->missed_clock_ticks++; 88 111 else … … 94 117 95 118 clock(); 119 120 /* 121 * This one is a good candidate for moving to a separate 122 * kernel thread private to ski.c 123 */ 96 124 poll_keyboard(); 97 125 } -
kernel/arch/ia64/src/ia64.c
rcd13c2a rde57e060 50 50 #include <proc/uarg.h> 51 51 #include <syscall/syscall.h> 52 53 static int kbd_release=0; 52 #include <ddi/irq.h> 54 53 55 54 void arch_pre_main(void) … … 81 80 srlz_d(); 82 81 83 ski_init_console();84 it_init();85 82 } 86 83 87 84 void arch_post_mm_init(void) 88 85 { 86 irq_init(INR_COUNT, INR_COUNT); 87 ski_init_console(); 88 it_init(); 89 89 ski_set_console_sysinfo(); 90 90 } … … 146 146 void arch_grab_console(void) 147 147 { 148 kbd_release=kbd_uspace; 149 kbd_uspace=0; 148 ski_kbd_grab(); 150 149 } 151 150 /** Return console to userspace … … 154 153 void arch_release_console(void) 155 154 { 156 kbd_uspace=kbd_release;155 ski_kbd_release(); 157 156 } 158 157 -
kernel/arch/ia64/src/interrupt.c
rcd13c2a rde57e060 35 35 36 36 #include <arch/interrupt.h> 37 #include <interrupt.h> 38 #include <ddi/irq.h> 37 39 #include <panic.h> 38 40 #include <print.h> 41 #include <symtab.h> 42 #include <debug.h> 39 43 #include <console/console.h> 40 44 #include <arch/types.h> … … 42 46 #include <arch/barrier.h> 43 47 #include <arch/register.h> 44 #include <arch/drivers/it.h>45 48 #include <arch.h> 46 #include <symtab.h>47 #include <debug.h>48 49 #include <syscall/syscall.h> 49 50 #include <print.h> … … 52 53 #include <ipc/irq.h> 53 54 #include <ipc/ipc.h> 54 #include <interrupt.h> 55 55 #include <synch/spinlock.h> 56 56 57 57 #define VECTORS_64_BUNDLE 20 … … 61 61 62 62 #define BUNDLE_SIZE 16 63 64 63 65 64 char *vector_names_64_bundle[VECTORS_64_BUNDLE] = { … … 198 197 } 199 198 200 201 199 void nop_handler(uint64_t vector, istate_t *istate) 202 200 { 203 201 } 204 205 202 206 203 /** Handle syscall. */ … … 229 226 void external_interrupt(uint64_t vector, istate_t *istate) 230 227 { 228 irq_t *irq; 231 229 cr_ivr_t ivr; 232 230 … … 234 232 srlz_d(); 235 233 236 switch(ivr.vector) { 237 case INTERRUPT_TIMER: 238 it_interrupt(); 239 break; 240 case INTERRUPT_SPURIOUS: 241 printf("cpu%d: spurious interrupt\n", CPU->id); 242 break; 243 default: 244 panic("\nUnhandled External Interrupt Vector %d\n", ivr.vector); 245 break; 234 irq = irq_dispatch_and_lock(ivr.vector); 235 if (irq) { 236 irq->handler(irq, irq->arg); 237 spinlock_unlock(&irq->lock); 238 } else { 239 switch (ivr.vector) { 240 case INTERRUPT_SPURIOUS: 241 #ifdef CONFIG_DEBUG 242 printf("cpu%d: spurious interrupt\n", CPU->id); 243 #endif 244 break; 245 246 default: 247 panic("\nUnhandled External Interrupt Vector %d\n", ivr.vector); 248 break; 249 } 246 250 } 247 251 } 248 252 249 void virtual_interrupt(uint64_t irq, void *param)250 {251 switch(irq) {252 case IRQ_KBD:253 if (kbd_uspace)254 ipc_irq_send_notif(irq);255 break;256 default:257 panic("\nUnhandled Virtual Interrupt request %d\n", irq);258 break;259 }260 }261 262 253 /** @} 263 254 */ -
kernel/arch/ia64/src/ski/ski.c
rcd13c2a rde57e060 38 38 #include <arch/interrupt.h> 39 39 #include <sysinfo/sysinfo.h> 40 #include <arch/types.h> 41 #include <typedefs.h> 42 #include <ddi/device.h> 43 #include <ddi/irq.h> 44 #include <ipc/irq.h> 45 #include <synch/spinlock.h> 46 #include <arch/asm.h> 47 48 #define SKI_KBD_INR 0 49 50 static irq_t ski_kbd_irq; 51 static devno_t ski_kbd_devno; 40 52 41 53 chardev_t ski_console; 42 54 chardev_t ski_uconsole; 43 static bool kb_disable; 44 int kbd_uspace=0;55 56 static bool kbd_disabled; 45 57 46 58 static void ski_putchar(chardev_t *d, const char ch); … … 58 70 { 59 71 __asm__ volatile ( 60 "mov r15 =%0\n"61 "mov r32 =%1\n"/* r32 is in0 */72 "mov r15 = %0\n" 73 "mov r32 = %1\n" /* r32 is in0 */ 62 74 "break 0x80000\n" /* modifies r8 */ 63 75 : … … 84 96 85 97 __asm__ volatile ( 86 "mov r15 =%1\n"98 "mov r15 = %1\n" 87 99 "break 0x80000;;\n" /* modifies r8 */ 88 "mov %0 =r8;;\n"100 "mov %0 = r8;;\n" 89 101 90 102 : "=r" (ch) 91 103 : "i" (SKI_GETCHAR) 92 : "r15", 104 : "r15", "r8" 93 105 ); 94 106 … … 104 116 int ch; 105 117 106 while(!(ch =ski_getchar()))118 while(!(ch = ski_getchar())) 107 119 ; 108 120 if(ch == '\r') … … 116 128 char ch; 117 129 static char last; 118 119 if (kb_disable) 130 ipl_t ipl; 131 132 ipl = interrupts_disable(); 133 134 if (kbd_disabled) { 135 interrupts_restore(ipl); 120 136 return; 137 } 138 139 spinlock_lock(&ski_kbd_irq.lock); 121 140 122 141 ch = ski_getchar(); 123 142 if(ch == '\r') 124 143 ch = '\n'; 125 if (ch) {126 if (kbd_uspace){144 if (ch) { 145 if (ski_kbd_irq.notif_cfg.notify && ski_kbd_irq.notif_cfg.answerbox) { 127 146 chardev_push_character(&ski_uconsole, ch); 128 virtual_interrupt(IRQ_KBD,NULL); 129 } 130 else { 147 ipc_irq_send_notif(&ski_kbd_irq); 148 } else { 131 149 chardev_push_character(&ski_console, ch); 132 150 } 133 last = ch; 151 last = ch; 152 spinlock_unlock(&ski_kbd_irq.lock); 153 interrupts_restore(ipl); 134 154 return; 135 } 136 137 if (last) {138 if (kbd_uspace){155 } 156 157 if (last) { 158 if (ski_kbd_irq.notif_cfg.notify && ski_kbd_irq.notif_cfg.answerbox) { 139 159 chardev_push_character(&ski_uconsole, 0); 140 virtual_interrupt(IRQ_KBD,NULL);160 ipc_irq_send_notif(&ski_kbd_irq); 141 161 } 142 else {143 }144 last = 0; 145 }146 162 last = 0; 163 } 164 165 spinlock_unlock(&ski_kbd_irq.lock); 166 interrupts_restore(ipl); 147 167 } 148 168 149 169 /* Called from getc(). */ 150 static void ski_kb _enable(chardev_t *d)151 { 152 kb _disable= false;170 static void ski_kbd_enable(chardev_t *d) 171 { 172 kbd_disabled = false; 153 173 } 154 174 155 175 /* Called from getc(). */ 156 static void ski_kb_disable(chardev_t *d) 157 { 158 kb_disable = true; 176 static void ski_kbd_disable(chardev_t *d) 177 { 178 kbd_disabled = true; 179 } 180 181 /** Decline to service hardware IRQ. 182 * 183 * This is only a virtual IRQ, so always decline. 184 * 185 * @return Always IRQ_DECLINE. 186 */ 187 static irq_ownership_t ski_kbd_claim(void) 188 { 189 return IRQ_DECLINE; 159 190 } 160 191 161 192 static chardev_operations_t ski_ops = { 162 .resume = ski_kb _enable,163 .suspend = ski_kb _disable,193 .resume = ski_kbd_enable, 194 .suspend = ski_kbd_disable, 164 195 .write = ski_putchar, 165 196 .read = ski_getchar_blocking … … 174 205 { 175 206 __asm__ volatile ( 176 "mov r15 =%0\n"207 "mov r15 = %0\n" 177 208 "break 0x80000\n" 178 209 : … … 186 217 stdout = &ski_console; 187 218 219 ski_kbd_devno = device_assign_devno(); 220 221 irq_initialize(&ski_kbd_irq); 222 ski_kbd_irq.inr = SKI_KBD_INR; 223 ski_kbd_irq.devno = ski_kbd_devno; 224 ski_kbd_irq.claim = ski_kbd_claim; 225 irq_register(&ski_kbd_irq); 226 188 227 } 189 228 … … 196 235 void ski_set_console_sysinfo(void) 197 236 { 198 sysinfo_set_item_val("kbd",NULL,true); 199 sysinfo_set_item_val("kbd.irq",NULL,IRQ_KBD); 237 sysinfo_set_item_val("kbd", NULL, true); 238 sysinfo_set_item_val("kbd.inr", NULL, SKI_KBD_INR); 239 sysinfo_set_item_val("kbd.devno", NULL, ski_kbd_devno); 240 } 241 242 void ski_kbd_grab(void) 243 { 244 ski_kbd_irq.notif_cfg.notify = false; 245 } 246 247 void ski_kbd_release(void) 248 { 249 if (ski_kbd_irq.notif_cfg.answerbox) 250 ski_kbd_irq.notif_cfg.notify = true; 200 251 } 201 252 -
kernel/arch/sparc64/include/interrupt.h
rcd13c2a rde57e060 41 41 #include <arch/regdef.h> 42 42 43 #define IRQ_COUNT 1 /* TODO */44 45 43 #define IVT_ITEMS 15 46 44 #define IVT_FIRST 1 -
uspace/kbd/arch/ia64/src/kbd.c
rcd13c2a rde57e060 68 68 { 69 69 if (sysinfo_value("kbd")) { 70 ipc_register_irq(sysinfo_value("kbd.i rq"), &ski_kbd);70 ipc_register_irq(sysinfo_value("kbd.inr"), sysinfo_value("kbd.devno"), 0, &ski_kbd); 71 71 return 0; 72 72 } … … 85 85 int kbd_arch_process(keybuffer_t *keybuffer, ipc_call_t *call) 86 86 { 87 static unsigned long long buf =0;88 static int count =0;89 static int esc_count =0;87 static unsigned long long buf = 0; 88 static int count = 0; 89 static int esc_count = 0; 90 90 int scan_code = IPC_GET_ARG2(*call); 91 91
Note:
See TracChangeset
for help on using the changeset viewer.