Changeset 90478727 in mainline for kernel/generic/src
- Timestamp:
- 2012-08-12T11:46:44Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 41b764b7
- Parents:
- e1e4192 (diff), 371cb6c (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)links above to see all the changes relative to each parent. - Location:
- kernel/generic/src
- Files:
-
- 1 added
- 23 edited
-
adt/btree.c (modified) (1 diff)
-
console/cmd.c (modified) (1 diff)
-
console/kconsole.c (modified) (8 diffs)
-
console/prompt.c (added)
-
debug/symtab.c (modified) (5 diffs)
-
interrupt/interrupt.c (modified) (3 diffs)
-
ipc/ipc.c (modified) (1 diff)
-
ipc/irq.c (modified) (18 diffs)
-
ipc/kbox.c (modified) (1 diff)
-
lib/ra.c (modified) (1 diff)
-
lib/str.c (modified) (3 diffs)
-
main/kinit.c (modified) (4 diffs)
-
main/main.c (modified) (1 diff)
-
main/uinit.c (modified) (2 diffs)
-
mm/as.c (modified) (4 diffs)
-
mm/slab.c (modified) (2 diffs)
-
mm/tlb.c (modified) (2 diffs)
-
proc/program.c (modified) (3 diffs)
-
proc/scheduler.c (modified) (6 diffs)
-
proc/task.c (modified) (1 diff)
-
proc/thread.c (modified) (15 diffs)
-
sysinfo/sysinfo.c (modified) (1 diff)
-
udebug/udebug.c (modified) (1 diff)
-
udebug/udebug_ops.c (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/adt/btree.c
re1e4192 r90478727 71 71 void btree_init(void) 72 72 { 73 btree_node_slab = slab_cache_create("btree_node_ slab",73 btree_node_slab = slab_cache_create("btree_node_t", 74 74 sizeof(btree_node_t), 0, NULL, NULL, SLAB_CACHE_MAGDEFERRED); 75 75 } -
kernel/generic/src/console/cmd.c
re1e4192 r90478727 724 724 thread_t *thread; 725 725 if ((thread = thread_create((void (*)(void *)) cmd_call0, 726 (void *) argv, TASK, THREAD_FLAG_WIRED, "call0", false))) { 727 irq_spinlock_lock(&thread->lock, true); 728 thread->cpu = &cpus[i]; 729 irq_spinlock_unlock(&thread->lock, true); 730 726 (void *) argv, TASK, THREAD_FLAG_NONE, "call0"))) { 731 727 printf("cpu%u: ", i); 732 728 thread_wire(thread, &cpus[i]); 733 729 thread_ready(thread); 734 730 thread_join(thread); -
kernel/generic/src/console/kconsole.c
re1e4192 r90478727 43 43 #include <console/chardev.h> 44 44 #include <console/cmd.h> 45 #include <console/prompt.h> 45 46 #include <print.h> 46 47 #include <panic.h> … … 201 202 * 202 203 */ 203 NO_TRACE static int cmdtab_compl(char *input, size_t size )204 NO_TRACE static int cmdtab_compl(char *input, size_t size, indev_t *indev) 204 205 { 205 206 const char *name = input; 206 207 207 208 size_t found = 0; 209 210 /* 211 * Maximum Match Length: Length of longest matching common 212 * substring in case more than one match is found. 213 */ 214 size_t max_match_len = size; 215 size_t max_match_len_tmp = size; 216 size_t input_len = str_length(input); 208 217 link_t *pos = NULL; 209 218 const char *hint; 210 219 char *output = malloc(MAX_CMDLINE, 0); 220 size_t hints_to_show = MAX_TAB_HINTS - 1; 221 size_t total_hints_shown = 0; 222 bool continue_showing_hints = true; 211 223 212 224 output[0] = 0; … … 218 230 pos = pos->next; 219 231 found++; 232 } 233 234 /* 235 * If the number of possible completions is more than MAX_TAB_HINTS, 236 * ask the user whether to display them or not. 237 */ 238 if (found > MAX_TAB_HINTS) { 239 printf("\n"); 240 continue_showing_hints = 241 console_prompt_display_all_hints(indev, found); 220 242 } 221 243 … … 225 247 while (cmdtab_search_one(name, &pos)) { 226 248 cmd_info_t *hlp = list_get_instance(pos, cmd_info_t, link); 227 printf("%s (%s)\n", hlp->name, hlp->description); 249 250 if (continue_showing_hints) { 251 printf("%s (%s)\n", hlp->name, hlp->description); 252 --hints_to_show; 253 ++total_hints_shown; 254 255 if ((hints_to_show == 0) && (total_hints_shown != found)) { 256 /* Ask user to continue */ 257 continue_showing_hints = 258 console_prompt_more_hints(indev, &hints_to_show); 259 } 260 } 261 228 262 pos = pos->next; 229 } 263 264 for (max_match_len_tmp = 0; 265 (output[max_match_len_tmp] == 266 hlp->name[input_len + max_match_len_tmp]) && 267 (max_match_len_tmp < max_match_len); ++max_match_len_tmp); 268 269 max_match_len = max_match_len_tmp; 270 } 271 272 /* Keep only the characters common in all completions */ 273 output[max_match_len] = 0; 230 274 } 231 275 … … 280 324 continue; 281 325 282 /* Find the beginning of the word 283 and copy it to tmp */ 326 /* 327 * Find the beginning of the word 328 * and copy it to tmp 329 */ 284 330 size_t beg; 285 331 for (beg = position - 1; (beg > 0) && (!isspace(current[beg])); … … 294 340 if (beg == 0) { 295 341 /* Command completion */ 296 found = cmdtab_compl(tmp, STR_BOUNDS(MAX_CMDLINE) );342 found = cmdtab_compl(tmp, STR_BOUNDS(MAX_CMDLINE), indev); 297 343 } else { 298 344 /* Symbol completion */ 299 found = symtab_compl(tmp, STR_BOUNDS(MAX_CMDLINE) );345 found = symtab_compl(tmp, STR_BOUNDS(MAX_CMDLINE), indev); 300 346 } 301 347 302 348 if (found == 0) 303 349 continue; 304 305 if (found > 1) { 306 /* No unique hint, list was printed */ 307 printf("%s> ", prompt); 308 printf("%ls", current); 309 print_cc('\b', wstr_length(current) - position); 310 continue; 311 } 312 313 /* We have a hint */ 314 350 351 /* 352 * We have hints, possibly many. In case of more than one hint, 353 * tmp will contain the common prefix. 354 */ 315 355 size_t off = 0; 316 356 size_t i = 0; … … 318 358 if (!wstr_linsert(current, ch, position + i, MAX_CMDLINE)) 319 359 break; 360 320 361 i++; 321 362 } 363 364 if (found > 1) { 365 /* No unique hint, list was printed */ 366 printf("%s> ", prompt); 367 printf("%ls", current); 368 position += str_length(tmp); 369 print_cc('\b', wstr_length(current) - position); 370 continue; 371 } 372 373 /* We have a hint */ 322 374 323 375 printf("%ls", current + position); … … 540 592 /** Parse command line. 541 593 * 542 * @param cmdline Command line as read from input device. 594 * @param cmdline Command line as read from input device. 543 595 * @param size Size (in bytes) of the string. 544 596 * -
kernel/generic/src/debug/symtab.c
re1e4192 r90478727 43 43 #include <typedefs.h> 44 44 #include <errno.h> 45 #include <console/prompt.h> 45 46 46 47 /** Get name of a symbol that seems most likely to correspond to address. … … 209 210 * 210 211 */ 211 int symtab_compl(char *input, size_t size )212 int symtab_compl(char *input, size_t size, indev_t *indev) 212 213 { 213 214 #ifdef CONFIG_SYMTAB … … 227 228 char output[MAX_SYMBOL_NAME]; 228 229 230 /* 231 * Maximum Match Length: Length of longest matching common substring in 232 * case more than one match is found. 233 */ 234 size_t max_match_len = size; 235 size_t max_match_len_tmp = size; 236 size_t input_len = str_length(input); 237 char *sym_name; 238 size_t hints_to_show = MAX_TAB_HINTS - 1; 239 size_t total_hints_shown = 0; 240 bool continue_showing_hints = true; 241 229 242 output[0] = 0; 243 244 while ((hint = symtab_search_one(name, &pos))) 245 pos++; 246 247 pos = 0; 230 248 231 249 while ((hint = symtab_search_one(name, &pos))) { … … 235 253 pos++; 236 254 found++; 255 } 256 257 /* 258 * If the number of possible completions is more than MAX_TAB_HINTS, 259 * ask the user whether to display them or not. 260 */ 261 if (found > MAX_TAB_HINTS) { 262 printf("\n"); 263 continue_showing_hints = 264 console_prompt_display_all_hints(indev, found); 237 265 } 238 266 … … 241 269 pos = 0; 242 270 while (symtab_search_one(name, &pos)) { 243 printf("%s\n", symbol_table[pos].symbol_name);271 sym_name = symbol_table[pos].symbol_name; 244 272 pos++; 273 274 if (continue_showing_hints) { 275 /* We are still showing hints */ 276 printf("%s\n", sym_name); 277 --hints_to_show; 278 ++total_hints_shown; 279 280 if ((hints_to_show == 0) && (total_hints_shown != found)) { 281 /* Ask the user to continue */ 282 continue_showing_hints = 283 console_prompt_more_hints(indev, &hints_to_show); 284 } 285 } 286 287 for (max_match_len_tmp = 0; 288 (output[max_match_len_tmp] == 289 sym_name[input_len + max_match_len_tmp]) && 290 (max_match_len_tmp < max_match_len); ++max_match_len_tmp); 291 292 max_match_len = max_match_len_tmp; 245 293 } 294 295 /* Keep only the characters common in all completions */ 296 output[max_match_len] = 0; 246 297 } 247 298 -
kernel/generic/src/interrupt/interrupt.c
re1e4192 r90478727 50 50 #include <panic.h> 51 51 #include <print.h> 52 #include <stdarg.h> 52 53 #include <symtab.h> 53 54 #include <proc/thread.h> … … 165 166 } 166 167 167 /** Terminate thread and task if exception came from userspace. 168 * 169 */ 170 NO_TRACE void fault_if_from_uspace(istate_t *istate, const char *fmt, ...) 171 { 172 if (!istate_from_uspace(istate)) 173 return; 174 168 static NO_TRACE void fault_from_uspace_core(istate_t *istate, const char *fmt, va_list args) 169 { 175 170 printf("Task %s (%" PRIu64 ") killed due to an exception at " 176 171 "program counter %p.\n", TASK->name, TASK->taskid, … … 181 176 182 177 printf("Kill message: "); 178 vprintf(fmt, args); 179 printf("\n"); 180 181 task_kill_self(true); 182 } 183 184 /** Terminate thread and task after the exception came from userspace. 185 * 186 */ 187 NO_TRACE void fault_from_uspace(istate_t *istate, const char *fmt, ...) 188 { 189 va_list args; 190 191 va_start(args, fmt); 192 fault_from_uspace_core(istate, fmt, args); 193 va_end(args); 194 } 195 196 /** Terminate thread and task if exception came from userspace. 197 * 198 */ 199 NO_TRACE void fault_if_from_uspace(istate_t *istate, const char *fmt, ...) 200 { 201 if (!istate_from_uspace(istate)) 202 return; 183 203 184 204 va_list args; 185 205 va_start(args, fmt); 186 vprintf(fmt, args);206 fault_from_uspace_core(istate, fmt, args); 187 207 va_end(args); 188 printf("\n");189 190 task_kill_self(true);191 208 } 192 209 -
kernel/generic/src/ipc/ipc.c
re1e4192 r90478727 670 670 void ipc_init(void) 671 671 { 672 ipc_call_slab = slab_cache_create(" ipc_call", sizeof(call_t), 0, NULL,672 ipc_call_slab = slab_cache_create("call_t", sizeof(call_t), 0, NULL, 673 673 NULL, 0); 674 ipc_answerbox_slab = slab_cache_create(" ipc_answerbox",674 ipc_answerbox_slab = slab_cache_create("answerbox_t", 675 675 sizeof(answerbox_t), 0, NULL, NULL, 0); 676 676 } -
kernel/generic/src/ipc/irq.c
re1e4192 r90478727 39 39 * when interrupt is detected. The application may provide a simple 'top-half' 40 40 * handler as part of its registration, which can perform simple operations 41 * (read/write port/memory, add information to notification ipcmessage).41 * (read/write port/memory, add information to notification IPC message). 42 42 * 43 43 * The structure of a notification message is as follows: 44 44 * - IMETHOD: interface and method as registered by 45 45 * the SYS_IRQ_REGISTER syscall 46 * - ARG1: payload modified by a 'top-half' handler 47 * - ARG2: payload modified by a 'top-half' handler 48 * - ARG3: payload modified by a 'top-half' handler 49 * - ARG4: payload modified by a 'top-half' handler 50 * - ARG5: payload modified by a 'top-half' handler 46 * - ARG1: payload modified by a 'top-half' handler (scratch[1]) 47 * - ARG2: payload modified by a 'top-half' handler (scratch[2]) 48 * - ARG3: payload modified by a 'top-half' handler (scratch[3]) 49 * - ARG4: payload modified by a 'top-half' handler (scratch[4]) 50 * - ARG5: payload modified by a 'top-half' handler (scratch[5]) 51 51 * - in_phone_hash: interrupt counter (may be needed to assure correct order 52 52 * in multithreaded drivers) … … 87 87 static void ranges_unmap(irq_pio_range_t *ranges, size_t rangecount) 88 88 { 89 size_t i; 90 91 for (i = 0; i < rangecount; i++) { 89 for (size_t i = 0; i < rangecount; i++) { 92 90 #ifdef IO_SPACE_BOUNDARY 93 91 if ((void *) ranges[i].base >= IO_SPACE_BOUNDARY) … … 100 98 irq_cmd_t *cmds, size_t cmdcount) 101 99 { 102 uintptr_t *pbase;103 size_t i, j;104 105 100 /* Copy the physical base addresses aside. */ 106 pbase = malloc(rangecount * sizeof(uintptr_t), 0);107 for ( i = 0; i < rangecount; i++)101 uintptr_t *pbase = malloc(rangecount * sizeof(uintptr_t), 0); 102 for (size_t i = 0; i < rangecount; i++) 108 103 pbase[i] = ranges[i].base; 109 104 110 105 /* Map the PIO ranges into the kernel virtual address space. */ 111 for ( i = 0; i < rangecount; i++) {106 for (size_t i = 0; i < rangecount; i++) { 112 107 #ifdef IO_SPACE_BOUNDARY 113 108 if ((void *) ranges[i].base < IO_SPACE_BOUNDARY) … … 122 117 } 123 118 } 124 119 125 120 /* Rewrite the pseudocode addresses from physical to kernel virtual. */ 126 for ( i = 0; i < cmdcount; i++) {121 for (size_t i = 0; i < cmdcount; i++) { 127 122 uintptr_t addr; 128 123 size_t size; 129 124 130 125 /* Process only commands that use an address. */ 131 126 switch (cmds[i].cmd) { 132 127 case CMD_PIO_READ_8: 133 case CMD_PIO_WRITE_8:134 case CMD_PIO_WRITE_A_8:128 case CMD_PIO_WRITE_8: 129 case CMD_PIO_WRITE_A_8: 135 130 size = 1; 136 131 break; 137 case CMD_PIO_READ_16:138 case CMD_PIO_WRITE_16:139 case CMD_PIO_WRITE_A_16:132 case CMD_PIO_READ_16: 133 case CMD_PIO_WRITE_16: 134 case CMD_PIO_WRITE_A_16: 140 135 size = 2; 141 136 break; 142 case CMD_PIO_READ_32:143 case CMD_PIO_WRITE_32:144 case CMD_PIO_WRITE_A_32:137 case CMD_PIO_READ_32: 138 case CMD_PIO_WRITE_32: 139 case CMD_PIO_WRITE_A_32: 145 140 size = 4; 146 141 break; … … 149 144 continue; 150 145 } 151 146 152 147 addr = (uintptr_t) cmds[i].addr; 153 148 149 size_t j; 154 150 for (j = 0; j < rangecount; j++) { 155 156 151 /* Find the matching range. */ 157 152 if (!iswithin(pbase[j], ranges[j].size, addr, size)) 158 153 continue; 159 154 160 155 /* Switch the command to a kernel virtual address. */ 161 156 addr -= pbase[j]; 162 157 addr += ranges[j].base; 163 158 164 159 cmds[i].addr = (void *) addr; 165 160 break; 166 161 } 167 162 168 163 if (j == rangecount) { 169 164 /* … … 176 171 } 177 172 } 178 173 179 174 free(pbase); 175 return EOK; 176 } 177 178 /** Statically check the top-half pseudocode 179 * 180 * Check the top-half pseudocode for invalid or unsafe 181 * constructs. 182 * 183 */ 184 static int code_check(irq_cmd_t *cmds, size_t cmdcount) 185 { 186 for (size_t i = 0; i < cmdcount; i++) { 187 /* 188 * Check for accepted ranges. 189 */ 190 if (cmds[i].cmd >= CMD_LAST) 191 return EINVAL; 192 193 if (cmds[i].srcarg >= IPC_CALL_LEN) 194 return EINVAL; 195 196 if (cmds[i].dstarg >= IPC_CALL_LEN) 197 return EINVAL; 198 199 switch (cmds[i].cmd) { 200 case CMD_PREDICATE: 201 /* 202 * Check for control flow overflow. 203 * Note that jumping just beyond the last 204 * command is a correct behaviour. 205 */ 206 if (i + cmds[i].value > cmdcount) 207 return EINVAL; 208 209 break; 210 default: 211 break; 212 } 213 } 214 180 215 return EOK; 181 216 } … … 207 242 irq_pio_range_t *ranges = NULL; 208 243 irq_cmd_t *cmds = NULL; 209 244 210 245 irq_code_t *code = malloc(sizeof(*code), 0); 211 246 int rc = copy_from_uspace(code, ucode, sizeof(*code)); … … 222 257 if (rc != EOK) 223 258 goto error; 224 259 225 260 cmds = malloc(sizeof(code->cmds[0]) * code->cmdcount, 0); 226 261 rc = copy_from_uspace(cmds, code->cmds, … … 228 263 if (rc != EOK) 229 264 goto error; 230 265 266 rc = code_check(cmds, code->cmdcount); 267 if (rc != EOK) 268 goto error; 269 231 270 rc = ranges_map_and_apply(ranges, code->rangecount, cmds, 232 271 code->cmdcount); 233 272 if (rc != EOK) 234 273 goto error; 235 274 236 275 code->ranges = ranges; 237 276 code->cmds = cmds; 238 277 239 278 return code; 240 279 241 280 error: 242 281 if (cmds) 243 282 free(cmds); 283 244 284 if (ranges) 245 285 free(ranges); 286 246 287 free(code); 247 288 return NULL; … … 250 291 /** Register an answerbox as a receiving end for IRQ notifications. 251 292 * 252 * @param box Receiving answerbox. 253 * @param inr IRQ number. 254 * @param devno Device number. 255 * @param imethod Interface and method to be associated with the 256 * notification. 257 * @param ucode Uspace pointer to top-half pseudocode. 258 * @return EOK on success or a negative error code. 293 * @param box Receiving answerbox. 294 * @param inr IRQ number. 295 * @param devno Device number. 296 * @param imethod Interface and method to be associated with the 297 * notification. 298 * @param ucode Uspace pointer to top-half pseudocode. 299 * 300 * @return EOK on success or a negative error code. 259 301 * 260 302 */ … … 266 308 (sysarg_t) devno 267 309 }; 268 310 269 311 if ((inr < 0) || (inr > last_inr)) 270 312 return ELIMIT; … … 329 371 /** Unregister task from IRQ notification. 330 372 * 331 * @param box Answerbox associated with the notification. 332 * @param inr IRQ number. 333 * @param devno Device number. 334 * @return EOK on success or a negative error code. 373 * @param box Answerbox associated with the notification. 374 * @param inr IRQ number. 375 * @param devno Device number. 376 * 377 * @return EOK on success or a negative error code. 378 * 335 379 */ 336 380 int ipc_irq_unregister(answerbox_t *box, inr_t inr, devno_t devno) … … 340 384 (sysarg_t) devno 341 385 }; 342 386 343 387 if ((inr < 0) || (inr > last_inr)) 344 388 return ELIMIT; … … 436 480 /* Remove from the hash table. */ 437 481 hash_table_remove(&irq_uspace_hash_table, key, 2); 438 482 439 483 /* 440 484 * Release both locks so that we can free the pseudo code. … … 442 486 irq_spinlock_unlock(&box->irq_lock, false); 443 487 irq_spinlock_unlock(&irq_uspace_hash_table_lock, true); 444 488 445 489 code_free(irq->notif_cfg.code); 446 490 free(irq); … … 492 536 493 537 for (size_t i = 0; i < code->cmdcount; i++) { 494 uint32_t dstval;495 496 538 uintptr_t srcarg = code->cmds[i].srcarg; 497 539 uintptr_t dstarg = code->cmds[i].dstarg; 498 540 499 if (srcarg >= IPC_CALL_LEN)500 break;501 502 if (dstarg >= IPC_CALL_LEN)503 break;504 505 541 switch (code->cmds[i].cmd) { 506 542 case CMD_PIO_READ_8: 507 dstval = pio_read_8((ioport8_t *) code->cmds[i].addr); 508 if (dstarg) 509 scratch[dstarg] = dstval; 543 scratch[dstarg] = 544 pio_read_8((ioport8_t *) code->cmds[i].addr); 510 545 break; 511 546 case CMD_PIO_READ_16: 512 dstval = pio_read_16((ioport16_t *) code->cmds[i].addr); 513 if (dstarg) 514 scratch[dstarg] = dstval; 547 scratch[dstarg] = 548 pio_read_16((ioport16_t *) code->cmds[i].addr); 515 549 break; 516 550 case CMD_PIO_READ_32: 517 dstval = pio_read_32((ioport32_t *) code->cmds[i].addr); 518 if (dstarg) 519 scratch[dstarg] = dstval; 551 scratch[dstarg] = 552 pio_read_32((ioport32_t *) code->cmds[i].addr); 520 553 break; 521 554 case CMD_PIO_WRITE_8: … … 532 565 break; 533 566 case CMD_PIO_WRITE_A_8: 534 if (srcarg) { 535 pio_write_8((ioport8_t *) code->cmds[i].addr, 536 (uint8_t) scratch[srcarg]); 537 } 567 pio_write_8((ioport8_t *) code->cmds[i].addr, 568 (uint8_t) scratch[srcarg]); 538 569 break; 539 570 case CMD_PIO_WRITE_A_16: 540 if (srcarg) { 541 pio_write_16((ioport16_t *) code->cmds[i].addr, 542 (uint16_t) scratch[srcarg]); 543 } 571 pio_write_16((ioport16_t *) code->cmds[i].addr, 572 (uint16_t) scratch[srcarg]); 544 573 break; 545 574 case CMD_PIO_WRITE_A_32: 546 if (srcarg) { 547 pio_write_32((ioport32_t *) code->cmds[i].addr, 548 (uint32_t) scratch[srcarg]); 549 } 550 break; 551 case CMD_BTEST: 552 if ((srcarg) && (dstarg)) { 553 dstval = scratch[srcarg] & code->cmds[i].value; 554 scratch[dstarg] = dstval; 555 } 575 pio_write_32((ioport32_t *) code->cmds[i].addr, 576 (uint32_t) scratch[srcarg]); 577 break; 578 case CMD_LOAD: 579 scratch[dstarg] = code->cmds[i].value; 580 break; 581 case CMD_AND: 582 scratch[dstarg] = scratch[srcarg] & 583 code->cmds[i].value; 556 584 break; 557 585 case CMD_PREDICATE: 558 if ( (srcarg) && (!scratch[srcarg])) {586 if (scratch[srcarg] == 0) 559 587 i += code->cmds[i].value; 560 continue; 561 } 588 562 589 break; 563 590 case CMD_ACCEPT: … … 582 609 { 583 610 ASSERT(irq); 584 611 585 612 ASSERT(interrupts_disabled()); 586 613 ASSERT(irq_spinlock_locked(&irq->lock)); -
kernel/generic/src/ipc/kbox.c
re1e4192 r90478727 244 244 245 245 /* Create a kbox thread */ 246 thread_t *kb_thread = thread_create(kbox_thread_proc, NULL, task, 0,247 "kbox", false);246 thread_t *kb_thread = thread_create(kbox_thread_proc, NULL, task, 247 THREAD_FLAG_NONE, "kbox"); 248 248 if (!kb_thread) { 249 249 mutex_unlock(&task->kb.cleanup_lock); -
kernel/generic/src/lib/ra.c
re1e4192 r90478727 424 424 void ra_init(void) 425 425 { 426 ra_segment_cache = slab_cache_create(" segment_cache",426 ra_segment_cache = slab_cache_create("ra_segment_t", 427 427 sizeof(ra_segment_t), 0, NULL, NULL, SLAB_CACHE_MAGDEFERRED); 428 428 } -
kernel/generic/src/lib/str.c
re1e4192 r90478727 456 456 * 457 457 * Do a char-by-char comparison of two NULL-terminated strings. 458 * The strings are considered equal iff they consist of the same 459 * characters on the minimum of their lengths. 458 * The strings are considered equal iff their length is equal 459 * and both strings consist of the same sequence of characters. 460 * 461 * A string S1 is less than another string S2 if it has a character with 462 * lower value at the first character position where the strings differ. 463 * If the strings differ in length, the shorter one is treated as if 464 * padded by characters with a value of zero. 460 465 * 461 466 * @param s1 First string to compare. 462 467 * @param s2 Second string to compare. 463 468 * 464 * @return 0 if the strings are equal, -1 if first is smaller,465 * 1 if second smaller.469 * @return 0 if the strings are equal, -1 if the first is less than the second, 470 * 1 if the second is less than the first. 466 471 * 467 472 */ … … 494 499 * 495 500 * Do a char-by-char comparison of two NULL-terminated strings. 496 * The strings are considered equal iff they consist of the same 497 * characters on the minimum of their lengths and the length limit. 501 * The strings are considered equal iff 502 * min(str_length(s1), max_len) == min(str_length(s2), max_len) 503 * and both strings consist of the same sequence of characters, 504 * up to max_len characters. 505 * 506 * A string S1 is less than another string S2 if it has a character with 507 * lower value at the first character position where the strings differ. 508 * If the strings differ in length, the shorter one is treated as if 509 * padded by characters with a value of zero. Only the first max_len 510 * characters are considered. 498 511 * 499 512 * @param s1 First string to compare. … … 501 514 * @param max_len Maximum number of characters to consider. 502 515 * 503 * @return 0 if the strings are equal, -1 if first is smaller,504 * 1 if second smaller.516 * @return 0 if the strings are equal, -1 if the first is less than the second, 517 * 1 if the second is less than the first. 505 518 * 506 519 */ -
kernel/generic/src/main/kinit.c
re1e4192 r90478727 116 116 * Just a beautification. 117 117 */ 118 thread = thread_create(kmp, NULL, TASK, THREAD_FLAG_WIRED, "kmp", true); 118 thread = thread_create(kmp, NULL, TASK, 119 THREAD_FLAG_UNCOUNTED, "kmp"); 119 120 if (thread != NULL) { 120 irq_spinlock_lock(&thread->lock, false); 121 thread->cpu = &cpus[0]; 122 irq_spinlock_unlock(&thread->lock, false); 121 thread_wire(thread, &cpus[0]); 123 122 thread_ready(thread); 124 123 } else … … 134 133 135 134 for (i = 0; i < config.cpu_count; i++) { 136 thread = thread_create(kcpulb, NULL, TASK, THREAD_FLAG_WIRED, "kcpulb", true); 135 thread = thread_create(kcpulb, NULL, TASK, 136 THREAD_FLAG_UNCOUNTED, "kcpulb"); 137 137 if (thread != NULL) { 138 irq_spinlock_lock(&thread->lock, false); 139 thread->cpu = &cpus[i]; 140 irq_spinlock_unlock(&thread->lock, false); 138 thread_wire(thread, &cpus[i]); 141 139 thread_ready(thread); 142 140 } else … … 152 150 153 151 /* Start thread computing system load */ 154 thread = thread_create(kload, NULL, TASK, 0, "kload", false); 152 thread = thread_create(kload, NULL, TASK, THREAD_FLAG_NONE, 153 "kload"); 155 154 if (thread != NULL) 156 155 thread_ready(thread); … … 163 162 * Create kernel console. 164 163 */ 165 thread = thread_create(kconsole_thread, NULL, TASK, 0, "kconsole", false); 164 thread = thread_create(kconsole_thread, NULL, TASK, 165 THREAD_FLAG_NONE, "kconsole"); 166 166 if (thread != NULL) 167 167 thread_ready(thread); -
kernel/generic/src/main/main.c
re1e4192 r90478727 276 276 * Create the first thread. 277 277 */ 278 thread_t *kinit_thread = 279 thread_create(kinit, NULL, kernel, 0, "kinit", true);278 thread_t *kinit_thread = thread_create(kinit, NULL, kernel, 279 THREAD_FLAG_UNCOUNTED, "kinit"); 280 280 if (!kinit_thread) 281 281 panic("Cannot create kinit thread."); -
kernel/generic/src/main/uinit.c
re1e4192 r90478727 56 56 void uinit(void *arg) 57 57 { 58 uspace_arg_t uarg;59 60 58 /* 61 59 * So far, we don't have a use for joining userspace threads so we … … 72 70 #endif 73 71 74 uarg.uspace_entry = ((uspace_arg_t *) arg)->uspace_entry; 75 uarg.uspace_stack = ((uspace_arg_t *) arg)->uspace_stack; 76 uarg.uspace_uarg = ((uspace_arg_t *) arg)->uspace_uarg; 77 uarg.uspace_thread_function = NULL; 78 uarg.uspace_thread_arg = NULL; 72 uspace_arg_t *uarg = (uspace_arg_t *) arg; 73 uspace_arg_t local_uarg; 79 74 80 free((uspace_arg_t *) arg); 75 local_uarg.uspace_entry = uarg->uspace_entry; 76 local_uarg.uspace_stack = uarg->uspace_stack; 77 local_uarg.uspace_stack_size = uarg->uspace_stack_size; 78 local_uarg.uspace_uarg = uarg->uspace_uarg; 79 local_uarg.uspace_thread_function = NULL; 80 local_uarg.uspace_thread_arg = NULL; 81 81 82 userspace(&uarg); 82 free(uarg); 83 84 userspace(&local_uarg); 83 85 } 84 86 -
kernel/generic/src/mm/as.c
re1e4192 r90478727 130 130 as_arch_init(); 131 131 132 as_slab = slab_cache_create("as_ slab", sizeof(as_t), 0,132 as_slab = slab_cache_create("as_t", sizeof(as_t), 0, 133 133 as_constructor, as_destructor, SLAB_CACHE_MAGDEFERRED); 134 134 … … 665 665 666 666 page_table_lock(as, false); 667 668 /*669 * Start TLB shootdown sequence.670 */671 ipl_t ipl = tlb_shootdown_start(TLB_INVL_PAGES, as->asid,672 area->base + P2SZ(pages), area->pages - pages);673 667 674 668 /* … … 726 720 } 727 721 722 /* 723 * Start TLB shootdown sequence. 724 * 725 * The sequence is rather short and can be 726 * repeated multiple times. The reason is that 727 * we don't want to have used_space_remove() 728 * inside the sequence as it may use a blocking 729 * memory allocation for its B+tree. Blocking 730 * while holding the tlblock spinlock is 731 * forbidden and would hit a kernel assertion. 732 */ 733 734 ipl_t ipl = tlb_shootdown_start(TLB_INVL_PAGES, 735 as->asid, area->base + P2SZ(pages), 736 area->pages - pages); 737 728 738 for (; i < size; i++) { 729 739 pte_t *pte = page_mapping_find(as, … … 743 753 page_mapping_remove(as, ptr + P2SZ(i)); 744 754 } 755 756 /* 757 * Finish TLB shootdown sequence. 758 */ 759 760 tlb_invalidate_pages(as->asid, 761 area->base + P2SZ(pages), 762 area->pages - pages); 763 764 /* 765 * Invalidate software translation caches 766 * (e.g. TSB on sparc64, PHT on ppc32). 767 */ 768 as_invalidate_translation_cache(as, 769 area->base + P2SZ(pages), 770 area->pages - pages); 771 tlb_shootdown_finalize(ipl); 745 772 } 746 773 } 747 748 /*749 * Finish TLB shootdown sequence.750 */751 752 tlb_invalidate_pages(as->asid, area->base + P2SZ(pages),753 area->pages - pages);754 755 /*756 * Invalidate software translation caches757 * (e.g. TSB on sparc64, PHT on ppc32).758 */759 as_invalidate_translation_cache(as, area->base + P2SZ(pages),760 area->pages - pages);761 tlb_shootdown_finalize(ipl);762 763 774 page_table_unlock(as, false); 764 775 } else { -
kernel/generic/src/mm/slab.c
re1e4192 r90478727 891 891 { 892 892 /* Initialize magazine cache */ 893 _slab_cache_create(&mag_cache, "slab_magazine ",893 _slab_cache_create(&mag_cache, "slab_magazine_t", 894 894 sizeof(slab_magazine_t) + SLAB_MAG_SIZE * sizeof(void*), 895 895 sizeof(uintptr_t), NULL, NULL, SLAB_CACHE_NOMAGAZINE | … … 897 897 898 898 /* Initialize slab_cache cache */ 899 _slab_cache_create(&slab_cache_cache, "slab_cache ",899 _slab_cache_create(&slab_cache_cache, "slab_cache_cache", 900 900 sizeof(slab_cache_cache), sizeof(uintptr_t), NULL, NULL, 901 901 SLAB_CACHE_NOMAGAZINE | SLAB_CACHE_SLINSIDE); 902 902 903 903 /* Initialize external slab cache */ 904 slab_extern_cache = slab_cache_create("slab_ extern", sizeof(slab_t), 0,904 slab_extern_cache = slab_cache_create("slab_t", sizeof(slab_t), 0, 905 905 NULL, NULL, SLAB_CACHE_SLINSIDE | SLAB_CACHE_MAGDEFERRED); 906 906 -
kernel/generic/src/mm/tlb.c
re1e4192 r90478727 162 162 163 163 size_t i; 164 for (i = 0; i < CPU->tlb_messages_count; CPU->tlb_messages_count--) {164 for (i = 0; i < CPU->tlb_messages_count; i++) { 165 165 tlb_invalidate_type_t type = CPU->tlb_messages[i].type; 166 166 asid_t asid = CPU->tlb_messages[i].asid; … … 188 188 } 189 189 190 CPU->tlb_messages_count = 0; 190 191 irq_spinlock_unlock(&CPU->lock, false); 191 192 CPU->tlb_active = true; -
kernel/generic/src/proc/program.c
re1e4192 r90478727 71 71 int program_create(as_t *as, uintptr_t entry_addr, char *name, program_t *prg) 72 72 { 73 uspace_arg_t *kernel_uarg;74 75 kernel_uarg = (uspace_arg_t *) malloc(sizeof(uspace_arg_t), 0);76 kernel_uarg->uspace_entry = (void *) entry_addr;77 kernel_uarg->uspace_stack = (void *) USTACK_ADDRESS;78 kernel_uarg->uspace_thread_function = NULL;79 kernel_uarg->uspace_thread_arg = NULL;80 kernel_uarg->uspace_uarg = NULL;81 82 73 prg->loader_status = EE_OK; 83 74 prg->task = task_create(as, name); … … 92 83 AS_AREA_READ | AS_AREA_WRITE | AS_AREA_CACHEABLE, 93 84 STACK_SIZE, AS_AREA_ATTR_NONE, &anon_backend, NULL, &virt, 0); 94 if (!area) 85 if (!area) { 86 task_destroy(prg->task); 95 87 return ENOMEM; 88 } 89 90 uspace_arg_t *kernel_uarg = (uspace_arg_t *) 91 malloc(sizeof(uspace_arg_t), 0); 92 93 kernel_uarg->uspace_entry = (void *) entry_addr; 94 kernel_uarg->uspace_stack = (void *) virt; 95 kernel_uarg->uspace_stack_size = STACK_SIZE; 96 kernel_uarg->uspace_thread_function = NULL; 97 kernel_uarg->uspace_thread_arg = NULL; 98 kernel_uarg->uspace_uarg = NULL; 96 99 97 100 /* … … 99 102 */ 100 103 prg->main_thread = thread_create(uinit, kernel_uarg, prg->task, 101 THREAD_FLAG_USPACE, "uinit", false); 102 if (!prg->main_thread) 104 THREAD_FLAG_USPACE, "uinit"); 105 if (!prg->main_thread) { 106 free(kernel_uarg); 107 as_area_destroy(as, virt); 108 task_destroy(prg->task); 103 109 return ELIMIT; 110 } 104 111 105 112 return EOK; -
kernel/generic/src/proc/scheduler.c
re1e4192 r90478727 98 98 else { 99 99 fpu_init(); 100 THREAD->fpu_context_exists = 1;100 THREAD->fpu_context_exists = true; 101 101 } 102 102 #endif … … 142 142 143 143 /* Don't prevent migration */ 144 CPU->fpu_owner->fpu_context_engaged = 0;144 CPU->fpu_owner->fpu_context_engaged = false; 145 145 irq_spinlock_unlock(&CPU->fpu_owner->lock, false); 146 146 CPU->fpu_owner = NULL; … … 163 163 } 164 164 fpu_init(); 165 THREAD->fpu_context_exists = 1;165 THREAD->fpu_context_exists = true; 166 166 } 167 167 168 168 CPU->fpu_owner = THREAD; 169 THREAD->fpu_context_engaged = 1;169 THREAD->fpu_context_engaged = true; 170 170 irq_spinlock_unlock(&THREAD->lock, false); 171 171 … … 248 248 249 249 /* 250 * Clear the THREAD_FLAG_STOLEN flag so thatt can be migrated250 * Clear the stolen flag so that it can be migrated 251 251 * when load balancing needs emerge. 252 252 */ 253 thread-> flags &= ~THREAD_FLAG_STOLEN;253 thread->stolen = false; 254 254 irq_spinlock_unlock(&thread->lock, false); 255 255 … … 630 630 irq_spinlock_lock(&thread->lock, false); 631 631 632 if (!(thread->flags & THREAD_FLAG_WIRED) && 633 !(thread->flags & THREAD_FLAG_STOLEN) && 634 !thread->nomigrate && 635 !thread->fpu_context_engaged) { 632 if ((!thread->wired) && (!thread->stolen) && 633 (!thread->nomigrate) && 634 (!thread->fpu_context_engaged)) { 636 635 /* 637 636 * Remove thread from ready queue. … … 670 669 #endif 671 670 672 thread-> flags |= THREAD_FLAG_STOLEN;671 thread->stolen = true; 673 672 thread->state = Entering; 674 673 -
kernel/generic/src/proc/task.c
re1e4192 r90478727 90 90 TASK = NULL; 91 91 avltree_create(&tasks_tree); 92 task_slab = slab_cache_create("task_ slab", sizeof(task_t), 0,92 task_slab = slab_cache_create("task_t", sizeof(task_t), 0, 93 93 tsk_constructor, NULL, 0); 94 94 } -
kernel/generic/src/proc/thread.c
re1e4192 r90478727 191 191 kmflags |= FRAME_LOWMEM; 192 192 kmflags &= ~FRAME_HIGHMEM; 193 193 194 194 thread->kstack = (uint8_t *) frame_alloc(STACK_FRAMES, FRAME_KA | kmflags); 195 195 if (!thread->kstack) { … … 236 236 237 237 atomic_set(&nrdy, 0); 238 thread_slab = slab_cache_create("thread_ slab", sizeof(thread_t), 0,238 thread_slab = slab_cache_create("thread_t", sizeof(thread_t), 0, 239 239 thr_constructor, thr_destructor, 0); 240 240 241 241 #ifdef CONFIG_FPU 242 fpu_context_slab = slab_cache_create("fpu_ slab", sizeof(fpu_context_t),243 FPU_CONTEXT_ALIGN, NULL, NULL, 0);242 fpu_context_slab = slab_cache_create("fpu_context_t", 243 sizeof(fpu_context_t), FPU_CONTEXT_ALIGN, NULL, NULL, 0); 244 244 #endif 245 245 … … 247 247 } 248 248 249 /** Wire thread to the given CPU 250 * 251 * @param cpu CPU to wire the thread to. 252 * 253 */ 254 void thread_wire(thread_t *thread, cpu_t *cpu) 255 { 256 irq_spinlock_lock(&thread->lock, true); 257 thread->cpu = cpu; 258 thread->wired = true; 259 irq_spinlock_unlock(&thread->lock, true); 260 } 261 249 262 /** Make thread ready 250 263 * … … 260 273 ASSERT(thread->state != Ready); 261 274 262 int i = (thread->priority < RQ_COUNT - 1) 263 ?++thread->priority : thread->priority;264 265 cpu_t *cpu = CPU;266 if (thread-> flags & THREAD_FLAG_WIRED) {275 int i = (thread->priority < RQ_COUNT - 1) ? 276 ++thread->priority : thread->priority; 277 278 cpu_t *cpu; 279 if (thread->wired || thread->nomigrate || thread->fpu_context_engaged) { 267 280 ASSERT(thread->cpu != NULL); 268 281 cpu = thread->cpu; 269 } 282 } else 283 cpu = CPU; 284 270 285 thread->state = Ready; 271 286 … … 298 313 * @param flags Thread flags. 299 314 * @param name Symbolic name (a copy is made). 300 * @param uncounted Thread's accounting doesn't affect accumulated task301 * accounting.302 315 * 303 316 * @return New thread's structure on success, NULL on failure. … … 305 318 */ 306 319 thread_t *thread_create(void (* func)(void *), void *arg, task_t *task, 307 unsigned int flags, const char *name, bool uncounted)320 thread_flags_t flags, const char *name) 308 321 { 309 322 thread_t *thread = (thread_t *) slab_alloc(thread_slab, 0); … … 335 348 thread->ucycles = 0; 336 349 thread->kcycles = 0; 337 thread->uncounted = uncounted; 350 thread->uncounted = 351 ((flags & THREAD_FLAG_UNCOUNTED) == THREAD_FLAG_UNCOUNTED); 338 352 thread->priority = -1; /* Start in rq[0] */ 339 353 thread->cpu = NULL; 340 thread->flags = flags; 354 thread->wired = false; 355 thread->stolen = false; 356 thread->uspace = 357 ((flags & THREAD_FLAG_USPACE) == THREAD_FLAG_USPACE); 358 341 359 thread->nomigrate = 0; 342 360 thread->state = Entering; … … 356 374 thread->task = task; 357 375 358 thread->fpu_context_exists = 0;359 thread->fpu_context_engaged = 0;376 thread->fpu_context_exists = false; 377 thread->fpu_context_engaged = false; 360 378 361 379 avltree_node_initialize(&thread->threads_tree_node); … … 371 389 thread_create_arch(thread); 372 390 373 if ( !(flags & THREAD_FLAG_NOATTACH))391 if ((flags & THREAD_FLAG_NOATTACH) != THREAD_FLAG_NOATTACH) 374 392 thread_attach(thread, task); 375 393 … … 437 455 438 456 /* Must not count kbox thread into lifecount */ 439 if (thread-> flags & THREAD_FLAG_USPACE)457 if (thread->uspace) 440 458 atomic_inc(&task->lifecount); 441 459 … … 459 477 void thread_exit(void) 460 478 { 461 if (THREAD-> flags & THREAD_FLAG_USPACE) {479 if (THREAD->uspace) { 462 480 #ifdef CONFIG_UDEBUG 463 481 /* Generate udebug THREAD_E event */ 464 482 udebug_thread_e_event(); 465 483 466 484 /* 467 485 * This thread will not execute any code or system calls from … … 506 524 { 507 525 ASSERT(THREAD); 508 526 509 527 THREAD->nomigrate++; 510 528 } … … 515 533 ASSERT(THREAD); 516 534 ASSERT(THREAD->nomigrate > 0); 517 518 THREAD->nomigrate--; 535 536 if (THREAD->nomigrate > 0) 537 THREAD->nomigrate--; 519 538 } 520 539 … … 854 873 * In case of failure, kernel_uarg will be deallocated in this function. 855 874 * In case of success, kernel_uarg will be freed in uinit(). 856 *857 875 */ 858 876 uspace_arg_t *kernel_uarg = … … 866 884 867 885 thread_t *thread = thread_create(uinit, kernel_uarg, TASK, 868 THREAD_FLAG_USPACE | THREAD_FLAG_NOATTACH, namebuf , false);886 THREAD_FLAG_USPACE | THREAD_FLAG_NOATTACH, namebuf); 869 887 if (thread) { 870 888 if (uspace_thread_id != NULL) { -
kernel/generic/src/sysinfo/sysinfo.c
re1e4192 r90478727 97 97 void sysinfo_init(void) 98 98 { 99 sysinfo_item_slab = slab_cache_create("sysinfo_item_ slab",99 sysinfo_item_slab = slab_cache_create("sysinfo_item_t", 100 100 sizeof(sysinfo_item_t), 0, sysinfo_item_constructor, 101 101 sysinfo_item_destructor, SLAB_CACHE_MAGDEFERRED); -
kernel/generic/src/udebug/udebug.c
re1e4192 r90478727 410 410 411 411 mutex_lock(&thread->udebug.lock); 412 unsigned int flags = thread->flags;413 412 414 413 /* Only process userspace threads. */ 415 if ( (flags & THREAD_FLAG_USPACE) != 0) {414 if (thread->uspace) { 416 415 /* Prevent any further debug activity in thread. */ 417 416 thread->udebug.active = false; -
kernel/generic/src/udebug/udebug_ops.c
re1e4192 r90478727 95 95 96 96 /* Verify that 'thread' is a userspace thread. */ 97 if ( (thread->flags & THREAD_FLAG_USPACE) == 0) {97 if (!thread->uspace) { 98 98 /* It's not, deny its existence */ 99 99 irq_spinlock_unlock(&thread->lock, true); … … 200 200 201 201 mutex_lock(&thread->udebug.lock); 202 if ( (thread->flags & THREAD_FLAG_USPACE) != 0) {202 if (thread->uspace) { 203 203 thread->udebug.active = true; 204 204 mutex_unlock(&thread->udebug.lock); … … 393 393 394 394 irq_spinlock_lock(&thread->lock, false); 395 int flags = thread->flags;395 bool uspace = thread->uspace; 396 396 irq_spinlock_unlock(&thread->lock, false); 397 397 398 398 /* Not interested in kernel threads. */ 399 if ( (flags & THREAD_FLAG_USPACE) == 0)399 if (!uspace) 400 400 continue; 401 401
Note:
See TracChangeset
for help on using the changeset viewer.
