Changeset 43752b6 in mainline
- Timestamp:
- 2006-06-11T17:03:02Z (19 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- dd054bc2
- Parents:
- 0b917dd
- Location:
- generic
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
generic/include/ipc/ipc.h
r0b917dd r43752b6 122 122 */ 123 123 #define IPC_M_PHONE_HUNGUP 3 124 /** Interrupt notification */125 #define IPC_M_INTERRUPT 4126 124 127 125 /** Send as_area over IPC -
generic/include/ipc/irq.h
r0b917dd r43752b6 58 58 void *addr; 59 59 unsigned long long value; 60 int dstarg; 60 61 } irq_cmd_t; 61 62 … … 72 73 extern int ipc_irq_register(answerbox_t *box, int irq, irq_code_t *ucode); 73 74 extern void ipc_irq_send_notif(int irq); 74 extern void ipc_irq_send_msg(int irq, __native a 2, __native a3);75 extern void ipc_irq_send_msg(int irq, __native a1, __native a2, __native a3); 75 76 extern void ipc_irq_unregister(answerbox_t *box, int irq); 76 77 extern void irq_ipc_bind_arch(__native irq); -
generic/src/console/klog.c
r0b917dd r43752b6 79 79 goto out; 80 80 } 81 ipc_irq_send_msg(IPC_IRQ_KLOG, klogpos, ret );81 ipc_irq_send_msg(IPC_IRQ_KLOG, klogpos, ret, 0); 82 82 klogpos += ret; 83 83 if (klogpos >= klogsize) -
generic/src/ipc/irq.c
r0b917dd r43752b6 35 35 * 36 36 * The structure of a notification message is as follows: 37 * - METHOD: IPC_M_INTERRUPT 38 * - ARG1: interrupt number 39 * - ARG2: payload modified by a 'top-half' handler 40 * - ARG3: interrupt counter (may be needed to assure correct order 37 * - METHOD: interrupt number 38 * - ARG1: payload modified by a 'top-half' handler 39 * - ARG2: payload 40 * - ARG3: payload 41 * - in_phone_hash: interrupt counter (may be needed to assure correct order 41 42 * in multithreaded drivers) 42 43 */ … … 67 68 { 68 69 int i; 70 __native dstval = 0; 69 71 70 72 if (!code) … … 74 76 switch (code->cmds[i].cmd) { 75 77 case CMD_MEM_READ_1: 76 IPC_SET_ARG2(call->data, *((__u8 *)code->cmds[i].addr));78 dstval = *((__u8 *)code->cmds[i].addr); 77 79 break; 78 80 case CMD_MEM_READ_2: 79 IPC_SET_ARG2(call->data, *((__u16 *)code->cmds[i].addr));81 dstval = *((__u16 *)code->cmds[i].addr); 80 82 break; 81 83 case CMD_MEM_READ_4: 82 IPC_SET_ARG2(call->data, *((__u32 *)code->cmds[i].addr));84 dstval = *((__u32 *)code->cmds[i].addr); 83 85 break; 84 86 case CMD_MEM_READ_8: 85 IPC_SET_ARG2(call->data, *((__u64 *)code->cmds[i].addr));87 dstval = *((__u64 *)code->cmds[i].addr); 86 88 break; 87 89 case CMD_MEM_WRITE_1: … … 99 101 #if defined(ia32) || defined(amd64) 100 102 case CMD_PORT_READ_1: 101 IPC_SET_ARG2(call->data, inb((long)code->cmds[i].addr));103 dstval = inb((long)code->cmds[i].addr); 102 104 break; 103 105 case CMD_PORT_WRITE_1: … … 107 109 #if defined(ia64) 108 110 case CMD_IA64_GETCHAR: 109 IPC_SET_ARG2(call->data, _getc(&ski_uconsole));111 dstval = _getc(&ski_uconsole); 110 112 break; 111 113 #endif 112 114 #if defined(ppc32) 113 115 case CMD_PPC32_GETCHAR: 114 IPC_SET_ARG2(call->data, cuda_get_scancode());116 dstval = cuda_get_scancode(); 115 117 break; 116 118 #endif 117 119 default: 118 120 break; 121 } 122 if (code->cmds[i].dstarg && code->cmds[i].dstarg < 4) { 123 call->data.args[code->cmds[i].dstarg] = dstval; 119 124 } 120 125 } … … 225 230 * 226 231 */ 227 void ipc_irq_send_msg(int irq, __native a 2, __native a3)232 void ipc_irq_send_msg(int irq, __native a1, __native a2, __native a3) 228 233 { 229 234 call_t *call; … … 239 244 } 240 245 call->flags |= IPC_CALL_NOTIF; 241 IPC_SET_METHOD(call->data, IPC_M_INTERRUPT);242 IPC_SET_ARG1(call->data, irq);246 IPC_SET_METHOD(call->data, irq); 247 IPC_SET_ARG1(call->data, a1); 243 248 IPC_SET_ARG2(call->data, a2); 244 249 IPC_SET_ARG3(call->data, a3); 250 /* Put a counter to the message */ 251 call->private = atomic_preinc(&irq_conns[mq].counter); 245 252 246 253 send_call(mq, call); … … 268 275 } 269 276 call->flags |= IPC_CALL_NOTIF; 270 IPC_SET_METHOD(call->data, IPC_M_INTERRUPT); 271 IPC_SET_ARG1(call->data, irq); 272 IPC_SET_ARG3(call->data, atomic_preinc(&irq_conns[mq].counter)); 277 /* Put a counter to the message */ 278 call->private = atomic_preinc(&irq_conns[mq].counter); 279 /* Set up args */ 280 IPC_SET_METHOD(call->data, irq); 273 281 274 282 /* Execute code to handle irq */ -
generic/src/ipc/sysipc.c
r0b917dd r43752b6 519 519 if (call->flags & IPC_CALL_NOTIF) { 520 520 ASSERT(! (call->flags & IPC_CALL_STATIC_ALLOC)); 521 STRUCT_TO_USPACE(&calldata->args, &call->data.args); 521 522 /* Set in_phone_hash to the interrupt counter */ 523 call->data.phone = (void *)call->private; 524 525 STRUCT_TO_USPACE(calldata, &call->data); 526 522 527 ipc_call_free(call); 523 528
Note:
See TracChangeset
for help on using the changeset viewer.