Changeset 69146b93 in mainline for kernel/generic/src
- Timestamp:
- 2012-11-26T19:02:45Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 04552324
- Parents:
- 5d230a30 (diff), 7462674 (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:
-
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/console/cmd.c
r5d230a30 r69146b93 56 56 #include <cpu.h> 57 57 #include <mm/tlb.h> 58 #include <mm/km.h> 58 59 #include <arch/mm/tlb.h> 59 60 #include <mm/frame.h> … … 83 84 .func = cmd_help, 84 85 .argc = 0 86 }; 87 88 /* Data and methods for pio_read_8 command */ 89 static int cmd_pio_read_8(cmd_arg_t *argv); 90 static cmd_arg_t pio_read_8_argv[] = { { .type = ARG_TYPE_INT } }; 91 static cmd_info_t pio_read_8_info = { 92 .name = "pio_read_8", 93 .description = "pio_read_8 <address> Read 1 byte from memory (or port).", 94 .func = cmd_pio_read_8, 95 .argc = 1, 96 .argv = pio_read_8_argv 97 }; 98 99 /* Data and methods for pio_read_16 command */ 100 static int cmd_pio_read_16(cmd_arg_t *argv); 101 static cmd_arg_t pio_read_16_argv[] = { { .type = ARG_TYPE_INT } }; 102 static cmd_info_t pio_read_16_info = { 103 .name = "pio_read_16", 104 .description = "pio_read_16 <address> Read 2 bytes from memory (or port).", 105 .func = cmd_pio_read_16, 106 .argc = 1, 107 .argv = pio_read_16_argv 108 }; 109 110 /* Data and methods for pio_read_32 command */ 111 static int cmd_pio_read_32(cmd_arg_t *argv); 112 static cmd_arg_t pio_read_32_argv[] = { { .type = ARG_TYPE_INT } }; 113 static cmd_info_t pio_read_32_info = { 114 .name = "pio_read_32", 115 .description = "pio_read_32 <address> Read 4 bytes from memory (or port).", 116 .func = cmd_pio_read_32, 117 .argc = 1, 118 .argv = pio_read_32_argv 119 }; 120 121 /* Data and methods for pio_write_8 command */ 122 static int cmd_pio_write_8(cmd_arg_t *argv); 123 static cmd_arg_t pio_write_8_argv[] = { 124 { .type = ARG_TYPE_INT }, 125 { .type = ARG_TYPE_INT } 126 }; 127 static cmd_info_t pio_write_8_info = { 128 .name = "pio_write_8", 129 .description = "pio_write_8 <address> <value> Write 1 byte to memory (or port).", 130 .func = cmd_pio_write_8, 131 .argc = 2, 132 .argv = pio_write_8_argv 133 }; 134 135 /* Data and methods for pio_write_16 command */ 136 static int cmd_pio_write_16(cmd_arg_t *argv); 137 static cmd_arg_t pio_write_16_argv[] = { 138 { .type = ARG_TYPE_INT }, 139 { .type = ARG_TYPE_INT } 140 }; 141 static cmd_info_t pio_write_16_info = { 142 .name = "pio_write_16", 143 .description = "pio_write_16 <address> <value> Write 2 bytes to memory (or port).", 144 .func = cmd_pio_write_16, 145 .argc = 2, 146 .argv = pio_write_16_argv 147 }; 148 149 /* Data and methods for pio_write_32 command */ 150 static int cmd_pio_write_32(cmd_arg_t *argv); 151 static cmd_arg_t pio_write_32_argv[] = { 152 { .type = ARG_TYPE_INT }, 153 { .type = ARG_TYPE_INT } 154 }; 155 static cmd_info_t pio_write_32_info = { 156 .name = "pio_write_32", 157 .description = "pio_write_32 <address> <value> Write 4 bytes to memory (or port).", 158 .func = cmd_pio_write_32, 159 .argc = 2, 160 .argv = pio_write_32_argv 85 161 }; 86 162 … … 553 629 &btrace_info, 554 630 #endif 631 &pio_read_8_info, 632 &pio_read_16_info, 633 &pio_read_32_info, 634 &pio_write_8_info, 635 &pio_write_16_info, 636 &pio_write_32_info, 555 637 NULL 556 638 }; … … 623 705 spinlock_unlock(&cmd_lock); 624 706 707 return 1; 708 } 709 710 /** Read 1 byte from phys memory or io port. 711 * 712 * @param argv Argument vector. 713 * 714 * @return 0 on failure, 1 on success. 715 */ 716 static int cmd_pio_read_8(cmd_arg_t *argv) 717 { 718 uint8_t *ptr = NULL; 719 720 #ifdef IO_SPACE_BOUNDARY 721 if ((void *) argv->intval < IO_SPACE_BOUNDARY) 722 ptr = (void *) argv[0].intval; 723 else 724 #endif 725 ptr = (uint8_t *) km_map(argv[0].intval, sizeof(uint8_t), 726 PAGE_NOT_CACHEABLE); 727 728 const uint8_t val = pio_read_8(ptr); 729 printf("read %" PRIxn ": %" PRIx8 "\n", argv[0].intval, val); 730 731 #ifdef IO_SPACE_BOUNDARY 732 if ((void *) argv->intval < IO_SPACE_BOUNDARY) 733 return 1; 734 #endif 735 736 km_unmap((uintptr_t) ptr, sizeof(uint8_t)); 737 return 1; 738 } 739 740 /** Read 2 bytes from phys memory or io port. 741 * 742 * @param argv Argument vector. 743 * 744 * @return 0 on failure, 1 on success. 745 */ 746 static int cmd_pio_read_16(cmd_arg_t *argv) 747 { 748 uint16_t *ptr = NULL; 749 750 #ifdef IO_SPACE_BOUNDARY 751 if ((void *) argv->intval < IO_SPACE_BOUNDARY) 752 ptr = (void *) argv[0].intval; 753 else 754 #endif 755 ptr = (uint16_t *) km_map(argv[0].intval, sizeof(uint16_t), 756 PAGE_NOT_CACHEABLE); 757 758 const uint16_t val = pio_read_16(ptr); 759 printf("read %" PRIxn ": %" PRIx16 "\n", argv[0].intval, val); 760 761 #ifdef IO_SPACE_BOUNDARY 762 if ((void *) argv->intval < IO_SPACE_BOUNDARY) 763 return 1; 764 #endif 765 766 km_unmap((uintptr_t) ptr, sizeof(uint16_t)); 767 return 1; 768 } 769 770 /** Read 4 bytes from phys memory or io port. 771 * 772 * @param argv Argument vector. 773 * 774 * @return 0 on failure, 1 on success. 775 */ 776 static int cmd_pio_read_32(cmd_arg_t *argv) 777 { 778 uint32_t *ptr = NULL; 779 780 #ifdef IO_SPACE_BOUNDARY 781 if ((void *) argv->intval < IO_SPACE_BOUNDARY) 782 ptr = (void *) argv[0].intval; 783 else 784 #endif 785 ptr = (uint32_t *) km_map(argv[0].intval, sizeof(uint32_t), 786 PAGE_NOT_CACHEABLE); 787 788 const uint32_t val = pio_read_32(ptr); 789 printf("read %" PRIxn ": %" PRIx32 "\n", argv[0].intval, val); 790 791 #ifdef IO_SPACE_BOUNDARY 792 if ((void *) argv->intval < IO_SPACE_BOUNDARY) 793 return 1; 794 #endif 795 796 km_unmap((uintptr_t) ptr, sizeof(uint32_t)); 797 return 1; 798 } 799 800 /** Write 1 byte to phys memory or io port. 801 * 802 * @param argv Argument vector. 803 * 804 * @return 0 on failure, 1 on success. 805 */ 806 static int cmd_pio_write_8(cmd_arg_t *argv) 807 { 808 uint8_t *ptr = NULL; 809 810 #ifdef IO_SPACE_BOUNDARY 811 if ((void *) argv->intval < IO_SPACE_BOUNDARY) 812 ptr = (void *) argv[0].intval; 813 else 814 #endif 815 ptr = (uint8_t *) km_map(argv[0].intval, sizeof(uint8_t), 816 PAGE_NOT_CACHEABLE); 817 818 printf("write %" PRIxn ": %" PRIx8 "\n", argv[0].intval, 819 (uint8_t) argv[1].intval); 820 pio_write_8(ptr, (uint8_t) argv[1].intval); 821 822 #ifdef IO_SPACE_BOUNDARY 823 if ((void *) argv->intval < IO_SPACE_BOUNDARY) 824 return 1; 825 #endif 826 827 km_unmap((uintptr_t) ptr, sizeof(uint8_t)); 828 return 1; 829 } 830 831 /** Write 2 bytes to phys memory or io port. 832 * 833 * @param argv Argument vector. 834 * 835 * @return 0 on failure, 1 on success. 836 */ 837 static int cmd_pio_write_16(cmd_arg_t *argv) 838 { 839 uint16_t *ptr = NULL; 840 841 #ifdef IO_SPACE_BOUNDARY 842 if ((void *) argv->intval < IO_SPACE_BOUNDARY) 843 ptr = (void *) argv[0].intval; 844 else 845 #endif 846 ptr = (uint16_t *) km_map(argv[0].intval, sizeof(uint16_t), 847 PAGE_NOT_CACHEABLE); 848 849 printf("write %" PRIxn ": %" PRIx16 "\n", argv[0].intval, 850 (uint16_t) argv[1].intval); 851 pio_write_16(ptr, (uint16_t) argv[1].intval); 852 853 #ifdef IO_SPACE_BOUNDARY 854 if ((void *) argv->intval < IO_SPACE_BOUNDARY) 855 return 1; 856 #endif 857 858 km_unmap((uintptr_t) ptr, sizeof(uint16_t)); 859 return 1; 860 } 861 862 /** Write 4 bytes to phys memory or io port. 863 * 864 * @param argv Argument vector. 865 * 866 * @return 0 on failure, 1 on success. 867 */ 868 static int cmd_pio_write_32(cmd_arg_t *argv) 869 { 870 uint32_t *ptr = NULL; 871 872 #ifdef IO_SPACE_BOUNDARY 873 if ((void *) argv->intval < IO_SPACE_BOUNDARY) 874 ptr = (void *) argv[0].intval; 875 else 876 #endif 877 ptr = (uint32_t *) km_map(argv[0].intval, sizeof(uint32_t), 878 PAGE_NOT_CACHEABLE); 879 880 printf("write %" PRIxn ": %" PRIx32 "\n", argv[0].intval, 881 (uint32_t) argv[1].intval); 882 pio_write_32(ptr, (uint32_t) argv[1].intval); 883 884 #ifdef IO_SPACE_BOUNDARY 885 if ((void *) argv->intval < IO_SPACE_BOUNDARY) 886 return 1; 887 #endif 888 889 km_unmap((uintptr_t) ptr, sizeof(uint32_t)); 625 890 return 1; 626 891 } -
kernel/generic/src/console/kconsole.c
r5d230a30 r69146b93 525 525 /* It's a number - convert it */ 526 526 uint64_t value; 527 int rc = str_uint64_t(text, NULL, 0, true, &value); 527 char *end; 528 int rc = str_uint64_t(text, &end, 0, false, &value); 529 if (end != text + len) 530 rc = EINVAL; 528 531 switch (rc) { 529 532 case EINVAL: 530 printf("Invalid number .\n");533 printf("Invalid number '%s'.\n", text); 531 534 return false; 532 535 case EOVERFLOW: 533 printf("Integer overflow .\n");536 printf("Integer overflow in '%s'.\n", text); 534 537 return false; 535 538 case EOK: … … 539 542 break; 540 543 default: 541 printf("Unknown error .\n");544 printf("Unknown error parsing '%s'.\n", text); 542 545 return false; 543 546 } -
kernel/generic/src/interrupt/interrupt.c
r5d230a30 r69146b93 164 164 } 165 165 166 static NO_TRACE void fault_from_uspace_core(istate_t *istate, const char *fmt, va_list args) 166 static NO_TRACE 167 void fault_from_uspace_core(istate_t *istate, const char *fmt, va_list args) 167 168 { 168 169 printf("Task %s (%" PRIu64 ") killed due to an exception at " -
kernel/generic/src/main/kinit.c
r5d230a30 r69146b93 182 182 #endif /* CONFIG_KCONSOLE */ 183 183 184 /* 185 * Store the default stack size in sysinfo so that uspace can create 186 * stack with this default size. 187 */ 188 sysinfo_set_item_val("default.stack_size", NULL, STACK_SIZE_USER); 189 184 190 interrupts_enable(); 185 191 -
kernel/generic/src/mm/as.c
r5d230a30 r69146b93 79 79 #include <syscall/copy.h> 80 80 #include <arch/interrupt.h> 81 #include <interrupt.h> 81 82 82 83 /** … … 426 427 /* 427 428 * So far, the area does not conflict with other areas. 428 * Check if it doesn't conflict with kerneladdress space.429 * Check if it is contained in the user address space. 429 430 */ 430 431 if (!KERNEL_ADDRESS_SPACE_SHADOWED) { 431 return !overlaps(addr, P2SZ(count), KERNEL_ADDRESS_SPACE_START, 432 KERNEL_ADDRESS_SPACE_END - KERNEL_ADDRESS_SPACE_START); 432 return iswithin(USER_ADDRESS_SPACE_START, 433 (USER_ADDRESS_SPACE_END - USER_ADDRESS_SPACE_START) + 1, 434 addr, P2SZ(count)); 433 435 } 434 436 … … 696 698 return ENOENT; 697 699 } 698 699 if (area->backend == &phys_backend) { 700 /* 701 * Remapping of address space areas associated 702 * with memory mapped devices is not supported. 700 701 if (!area->backend->is_resizable(area)) { 702 /* 703 * The backend does not support resizing for this area. 703 704 */ 704 705 mutex_unlock(&area->lock); … … 1057 1058 } 1058 1059 1059 if ((!src_area->backend) || (!src_area->backend->share)) { 1060 /* 1061 * There is no backend or the backend does not 1062 * know how to share the area. 1060 if (!src_area->backend->is_shareable(src_area)) { 1061 /* 1062 * The backend does not permit sharing of this area. 1063 1063 */ 1064 1064 mutex_unlock(&src_area->lock); … … 1363 1363 int as_page_fault(uintptr_t page, pf_access_t access, istate_t *istate) 1364 1364 { 1365 int rc = AS_PF_FAULT; 1366 1365 1367 if (!THREAD) 1366 return AS_PF_FAULT;1368 goto page_fault; 1367 1369 1368 1370 if (!AS) 1369 return AS_PF_FAULT;1371 goto page_fault; 1370 1372 1371 1373 mutex_lock(&AS->lock); … … 1423 1425 * Resort to the backend page fault handler. 1424 1426 */ 1425 if (area->backend->page_fault(area, page, access) != AS_PF_OK) { 1427 rc = area->backend->page_fault(area, page, access); 1428 if (rc != AS_PF_OK) { 1426 1429 page_table_unlock(AS, false); 1427 1430 mutex_unlock(&area->lock); … … 1444 1447 istate_set_retaddr(istate, 1445 1448 (uintptr_t) &memcpy_to_uspace_failover_address); 1449 } else if (rc == AS_PF_SILENT) { 1450 printf("Killing task %" PRIu64 " due to a " 1451 "failed late reservation request.\n", TASK->taskid); 1452 task_kill_self(true); 1446 1453 } else { 1447 return AS_PF_FAULT; 1454 fault_if_from_uspace(istate, "Page fault: %p.", (void *) page); 1455 panic_memtrap(istate, access, page, NULL); 1448 1456 } 1449 1457 … … 2132 2140 { 2133 2141 uintptr_t virt = base; 2134 as_area_t *area = as_area_create(AS, flags | AS_AREA_CACHEABLE, size,2142 as_area_t *area = as_area_create(AS, flags, size, 2135 2143 AS_AREA_ATTR_NONE, &anon_backend, NULL, &virt, bound); 2136 2144 if (area == NULL) -
kernel/generic/src/mm/backend_anon.c
r5d230a30 r69146b93 59 59 static void anon_destroy(as_area_t *); 60 60 61 static bool anon_is_resizable(as_area_t *); 62 static bool anon_is_shareable(as_area_t *); 63 61 64 static int anon_page_fault(as_area_t *, uintptr_t, pf_access_t); 62 65 static void anon_frame_free(as_area_t *, uintptr_t, uintptr_t); … … 68 71 .destroy = anon_destroy, 69 72 73 .is_resizable = anon_is_resizable, 74 .is_shareable = anon_is_shareable, 75 70 76 .page_fault = anon_page_fault, 71 77 .frame_free = anon_frame_free, … … 74 80 bool anon_create(as_area_t *area) 75 81 { 82 if (area->flags & AS_AREA_LATE_RESERVE) 83 return true; 84 76 85 return reserve_try_alloc(area->pages); 77 86 } … … 79 88 bool anon_resize(as_area_t *area, size_t new_pages) 80 89 { 90 if (area->flags & AS_AREA_LATE_RESERVE) 91 return true; 92 81 93 if (new_pages > area->pages) 82 94 return reserve_try_alloc(new_pages - area->pages); … … 100 112 ASSERT(mutex_locked(&area->as->lock)); 101 113 ASSERT(mutex_locked(&area->lock)); 114 ASSERT(!(area->flags & AS_AREA_LATE_RESERVE)); 102 115 103 116 /* … … 139 152 void anon_destroy(as_area_t *area) 140 153 { 154 if (area->flags & AS_AREA_LATE_RESERVE) 155 return; 156 141 157 reserve_free(area->pages); 142 158 } 143 159 160 bool anon_is_resizable(as_area_t *area) 161 { 162 return true; 163 } 164 165 bool anon_is_shareable(as_area_t *area) 166 { 167 return !(area->flags & AS_AREA_LATE_RESERVE); 168 } 144 169 145 170 /** Service a page fault in the anonymous memory address space area. … … 225 250 * the different causes 226 251 */ 252 253 if (area->flags & AS_AREA_LATE_RESERVE) { 254 /* 255 * Reserve the memory for this page now. 256 */ 257 if (!reserve_try_alloc(1)) 258 return AS_PF_SILENT; 259 } 260 227 261 kpage = km_temporary_page_get(&frame, FRAME_NO_RESERVE); 228 262 memsetb((void *) kpage, PAGE_SIZE, 0); … … 255 289 ASSERT(mutex_locked(&area->lock)); 256 290 257 frame_free_noreserve(frame); 291 if (area->flags & AS_AREA_LATE_RESERVE) { 292 /* 293 * In case of the late reserve areas, physical memory will not 294 * be unreserved when the area is destroyed so we need to use 295 * the normal unreserving frame_free(). 296 */ 297 frame_free(frame); 298 } else { 299 /* 300 * The reserve will be given back when the area is destroyed or 301 * resized, so use the frame_free_noreserve() which does not 302 * manipulate the reserve or it would be given back twice. 303 */ 304 frame_free_noreserve(frame); 305 } 258 306 } 259 307 -
kernel/generic/src/mm/backend_elf.c
r5d230a30 r69146b93 58 58 static void elf_destroy(as_area_t *); 59 59 60 static bool elf_is_resizable(as_area_t *); 61 static bool elf_is_shareable(as_area_t *); 62 60 63 static int elf_page_fault(as_area_t *, uintptr_t, pf_access_t); 61 64 static void elf_frame_free(as_area_t *, uintptr_t, uintptr_t); … … 66 69 .share = elf_share, 67 70 .destroy = elf_destroy, 71 72 .is_resizable = elf_is_resizable, 73 .is_shareable = elf_is_shareable, 68 74 69 75 .page_fault = elf_page_fault, … … 213 219 } 214 220 221 bool elf_is_resizable(as_area_t *area) 222 { 223 return true; 224 } 225 226 bool elf_is_shareable(as_area_t *area) 227 { 228 return true; 229 } 230 231 215 232 /** Service a page fault in the ELF backend address space area. 216 233 * -
kernel/generic/src/mm/backend_phys.c
r5d230a30 r69146b93 52 52 static void phys_destroy(as_area_t *); 53 53 54 static bool phys_is_resizable(as_area_t *); 55 static bool phys_is_shareable(as_area_t *); 56 57 54 58 static int phys_page_fault(as_area_t *, uintptr_t, pf_access_t); 55 59 … … 59 63 .share = phys_share, 60 64 .destroy = phys_destroy, 65 66 .is_resizable = phys_is_resizable, 67 .is_shareable = phys_is_shareable, 61 68 62 69 .page_fault = phys_page_fault, … … 87 94 /* Nothing to do. */ 88 95 } 96 97 bool phys_is_resizable(as_area_t *area) 98 { 99 return false; 100 } 101 102 bool phys_is_shareable(as_area_t *area) 103 { 104 return true; 105 } 106 89 107 90 108 /** Service a page fault in the address space area backed by physical memory. -
kernel/generic/src/mm/km.c
r5d230a30 r69146b93 234 234 * @param[inout] framep Pointer to a variable which will receive the physical 235 235 * address of the allocated frame. 236 * @param[in] flags Frame allocation flags. FRAME_NONE or FRAME_NO_RESERVE. 236 * @param[in] flags Frame allocation flags. FRAME_NONE, FRAME_NO_RESERVE 237 * and FRAME_ATOMIC bits are allowed. 237 238 * @return Virtual address of the allocated frame. 238 239 */ … … 244 245 ASSERT(THREAD); 245 246 ASSERT(framep); 246 ASSERT(!(flags & ~ FRAME_NO_RESERVE));247 ASSERT(!(flags & ~(FRAME_NO_RESERVE | FRAME_ATOMIC))); 247 248 248 249 /* … … 256 257 ASSERT(page); // FIXME 257 258 } else { 258 frame = (uintptr_t) frame_alloc_noreserve(ONE_FRAME, 259 FRAME_LOWMEM); 259 frame = (uintptr_t) frame_alloc(ONE_FRAME, 260 FRAME_LOWMEM | flags); 261 if (!frame) 262 return (uintptr_t) NULL; 260 263 page = PA2KA(frame); 261 264 } -
kernel/generic/src/proc/program.c
r5d230a30 r69146b93 79 79 * Create the stack address space area. 80 80 */ 81 uintptr_t virt = USTACK_ADDRESS; 81 uintptr_t virt = (uintptr_t) -1; 82 uintptr_t bound = USER_ADDRESS_SPACE_END - (STACK_SIZE_USER - 1); 83 84 /* Adjust bound to create space for the desired guard page. */ 85 bound -= PAGE_SIZE; 86 82 87 as_area_t *area = as_area_create(as, 83 AS_AREA_READ | AS_AREA_WRITE | AS_AREA_CACHEABLE, 84 STACK_SIZE, AS_AREA_ATTR_NONE, &anon_backend, NULL, &virt, 0); 88 AS_AREA_READ | AS_AREA_WRITE | AS_AREA_CACHEABLE | AS_AREA_GUARD | 89 AS_AREA_LATE_RESERVE, STACK_SIZE_USER, AS_AREA_ATTR_NONE, 90 &anon_backend, NULL, &virt, bound); 85 91 if (!area) { 86 92 task_destroy(prg->task); … … 93 99 kernel_uarg->uspace_entry = (void *) entry_addr; 94 100 kernel_uarg->uspace_stack = (void *) virt; 95 kernel_uarg->uspace_stack_size = STACK_SIZE ;101 kernel_uarg->uspace_stack_size = STACK_SIZE_USER; 96 102 kernel_uarg->uspace_thread_function = NULL; 97 103 kernel_uarg->uspace_thread_arg = NULL; -
kernel/generic/src/proc/task.c
r5d230a30 r69146b93 196 196 task->ucycles = 0; 197 197 task->kcycles = 0; 198 198 199 199 task->ipc_info.call_sent = 0; 200 200 task->ipc_info.call_received = 0;
Note:
See TracChangeset
for help on using the changeset viewer.