Changeset 8b243f2 in mainline for kernel/generic/src/ipc/irq.c
- Timestamp:
- 2007-06-17T19:34:36Z (17 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- bd72c3e9
- Parents:
- 4680ef5
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/ipc/irq.c
r4680ef5 r8b243f2 61 61 /** Execute code associated with IRQ notification. 62 62 * 63 * @param call 64 * @param code 63 * @param call Notification call. 64 * @param code Top-half pseudocode. 65 65 */ 66 66 static void code_execute(call_t *call, irq_code_t *code) … … 72 72 return; 73 73 74 for (i =0; i < code->cmdcount;i++) {74 for (i = 0; i < code->cmdcount; i++) { 75 75 switch (code->cmds[i].cmd) { 76 76 case CMD_MEM_READ_1: 77 dstval = *((uint8_t *) code->cmds[i].addr);77 dstval = *((uint8_t *) code->cmds[i].addr); 78 78 break; 79 79 case CMD_MEM_READ_2: 80 dstval = *((uint16_t *) code->cmds[i].addr);80 dstval = *((uint16_t *) code->cmds[i].addr); 81 81 break; 82 82 case CMD_MEM_READ_4: 83 dstval = *((uint32_t *) code->cmds[i].addr);83 dstval = *((uint32_t *) code->cmds[i].addr); 84 84 break; 85 85 case CMD_MEM_READ_8: 86 dstval = *((uint64_t *) code->cmds[i].addr);86 dstval = *((uint64_t *) code->cmds[i].addr); 87 87 break; 88 88 case CMD_MEM_WRITE_1: 89 *((uint8_t *) code->cmds[i].addr) = code->cmds[i].value;89 *((uint8_t *) code->cmds[i].addr) = code->cmds[i].value; 90 90 break; 91 91 case CMD_MEM_WRITE_2: 92 *((uint16_t *) code->cmds[i].addr) = code->cmds[i].value;92 *((uint16_t *) code->cmds[i].addr) = code->cmds[i].value; 93 93 break; 94 94 case CMD_MEM_WRITE_4: 95 *((uint32_t *) code->cmds[i].addr) = code->cmds[i].value;95 *((uint32_t *) code->cmds[i].addr) = code->cmds[i].value; 96 96 break; 97 97 case CMD_MEM_WRITE_8: 98 *((uint64_t *) code->cmds[i].addr) = code->cmds[i].value;98 *((uint64_t *) code->cmds[i].addr) = code->cmds[i].value; 99 99 break; 100 100 #if defined(ia32) || defined(amd64) 101 101 case CMD_PORT_READ_1: 102 dstval = inb((long) code->cmds[i].addr);102 dstval = inb((long) code->cmds[i].addr); 103 103 break; 104 104 case CMD_PORT_WRITE_1: 105 outb((long) code->cmds[i].addr, code->cmds[i].value);105 outb((long) code->cmds[i].addr, code->cmds[i].value); 106 106 break; 107 107 #endif … … 125 125 } 126 126 127 /** Free top-half pseudocode. 128 * 129 * @param code Pointer to the top-half pseudocode. 130 */ 127 131 static void code_free(irq_code_t *code) 128 132 { … … 133 137 } 134 138 135 static irq_code_t * code_from_uspace(irq_code_t *ucode) 139 /** Copy top-half pseudocode from userspace into the kernel. 140 * 141 * @param ucode Userspace address of the top-half pseudocode. 142 * 143 * @return Kernel address of the copied pseudocode. 144 */ 145 static irq_code_t *code_from_uspace(irq_code_t *ucode) 136 146 { 137 147 irq_code_t *code; … … 151 161 } 152 162 ucmds = code->cmds; 153 code->cmds = malloc(sizeof(code->cmds[0]) * (code->cmdcount), 0); 154 rc = copy_from_uspace(code->cmds, ucmds, sizeof(code->cmds[0]) * (code->cmdcount)); 163 code->cmds = malloc(sizeof(code->cmds[0]) * code->cmdcount, 0); 164 rc = copy_from_uspace(code->cmds, ucmds, 165 sizeof(code->cmds[0]) * code->cmdcount); 155 166 if (rc != 0) { 156 167 free(code->cmds); … … 164 175 /** Unregister task from IRQ notification. 165 176 * 166 * @param box 167 * @param inr IRQ numbe.168 * @param devno 177 * @param box Answerbox associated with the notification. 178 * @param inr IRQ number. 179 * @param devno Device number. 169 180 */ 170 181 void ipc_irq_unregister(answerbox_t *box, inr_t inr, devno_t devno) … … 196 207 /** Register an answerbox as a receiving end for IRQ notifications. 197 208 * 198 * @param box Receiving answerbox. 199 * @param inr IRQ number. 200 * @param devno Device number. 201 * @param method Method to be associated with the notification. 202 * @param ucode Uspace pointer to top-half pseudocode. 203 * 204 * @return EBADMEM, ENOENT or EEXISTS on failure or 0 on success. 205 */ 206 int ipc_irq_register(answerbox_t *box, inr_t inr, devno_t devno, unative_t method, irq_code_t *ucode) 209 * @param box Receiving answerbox. 210 * @param inr IRQ number. 211 * @param devno Device number. 212 * @param method Method to be associated with the notification. 213 * @param ucode Uspace pointer to top-half pseudocode. 214 * 215 * @return EBADMEM, ENOENT or EEXISTS on failure or 0 on success. 216 */ 217 int ipc_irq_register(answerbox_t *box, inr_t inr, devno_t devno, 218 unative_t method, irq_code_t *ucode) 207 219 { 208 220 ipl_t ipl; … … 214 226 if (!code) 215 227 return EBADMEM; 216 } else 228 } else { 217 229 code = NULL; 230 } 218 231 219 232 ipl = interrupts_disable(); … … 248 261 } 249 262 250 /** Add call toproper answerbox queue.263 /** Add a call to the proper answerbox queue. 251 264 * 252 265 * Assume irq->lock is locked. 253 266 * 267 * @param irq IRQ structure referencing the target answerbox. 268 * @param call IRQ notification call. 254 269 */ 255 270 static void send_call(irq_t *irq, call_t *call) … … 262 277 } 263 278 264 /** Send notification message 265 * 279 /** Send notification message. 280 * 281 * @param irq IRQ structure. 282 * @param a1 Driver-specific payload argument. 283 * @param a2 Driver-specific payload argument. 284 * @param a3 Driver-specific payload argument. 266 285 */ 267 286 void ipc_irq_send_msg(irq_t *irq, unative_t a1, unative_t a2, unative_t a3) … … 290 309 } 291 310 292 /** Notify task that an irqhad occurred.311 /** Notify a task that an IRQ had occurred. 293 312 * 294 313 * We expect interrupts to be disabled and the irq->lock already held. 314 * 315 * @param irq IRQ structure. 295 316 */ 296 317 void ipc_irq_send_notif(irq_t *irq) … … 324 345 * send notifications to it. 325 346 * 326 * @param box 347 * @param box Answerbox for which we want to carry out the cleanup. 327 348 */ 328 349 void ipc_irq_cleanup(answerbox_t *box)
Note:
See TracChangeset
for help on using the changeset viewer.