Rev 1284 | Rev 1507 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1284 | Rev 1288 | ||
---|---|---|---|
Line 45... | Line 45... | ||
45 | #include <mm/slab.h> |
45 | #include <mm/slab.h> |
46 | #include <errno.h> |
46 | #include <errno.h> |
47 | #include <ipc/ipc.h> |
47 | #include <ipc/ipc.h> |
48 | #include <ipc/irq.h> |
48 | #include <ipc/irq.h> |
49 | #include <atomic.h> |
49 | #include <atomic.h> |
- | 50 | #include <syscall/copy.h> |
|
50 | 51 | ||
51 | typedef struct { |
52 | typedef struct { |
52 | SPINLOCK_DECLARE(lock); |
53 | SPINLOCK_DECLARE(lock); |
53 | answerbox_t *box; |
54 | answerbox_t *box; |
54 | irq_code_t *code; |
55 | irq_code_t *code; |
Line 118... | Line 119... | ||
118 | 119 | ||
119 | static irq_code_t * code_from_uspace(irq_code_t *ucode) |
120 | static irq_code_t * code_from_uspace(irq_code_t *ucode) |
120 | { |
121 | { |
121 | irq_code_t *code; |
122 | irq_code_t *code; |
122 | irq_cmd_t *ucmds; |
123 | irq_cmd_t *ucmds; |
- | 124 | int rc; |
|
123 | 125 | ||
124 | code = malloc(sizeof(*code), 0); |
126 | code = malloc(sizeof(*code), 0); |
125 | copy_from_uspace(code, ucode, sizeof(*code)); |
127 | rc = copy_from_uspace(code, ucode, sizeof(*code)); |
- | 128 | if (rc != 0) { |
|
- | 129 | free(code); |
|
- | 130 | return NULL; |
|
- | 131 | } |
|
126 | 132 | ||
127 | if (code->cmdcount > IRQ_MAX_PROG_SIZE) { |
133 | if (code->cmdcount > IRQ_MAX_PROG_SIZE) { |
128 | free(code); |
134 | free(code); |
129 | return NULL; |
135 | return NULL; |
130 | } |
136 | } |
131 | ucmds = code->cmds; |
137 | ucmds = code->cmds; |
132 | code->cmds = malloc(sizeof(code->cmds[0]) * (code->cmdcount), 0); |
138 | code->cmds = malloc(sizeof(code->cmds[0]) * (code->cmdcount), 0); |
133 | copy_from_uspace(code->cmds, ucmds, sizeof(code->cmds[0]) * (code->cmdcount)); |
139 | rc = copy_from_uspace(code->cmds, ucmds, sizeof(code->cmds[0]) * (code->cmdcount)); |
- | 140 | if (rc != 0) { |
|
- | 141 | free(code->cmds); |
|
- | 142 | free(code); |
|
- | 143 | return NULL; |
|
- | 144 | } |
|
134 | 145 | ||
135 | return code; |
146 | return code; |
136 | } |
147 | } |
137 | 148 | ||
138 | /** Unregister task from irq */ |
149 | /** Unregister task from irq */ |