- Timestamp:
- 2011-05-21T16:23:17Z (15 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 0ff03f3
- Parents:
- 8d308b9 (diff), 13f2461 (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
- Files:
-
- 72 edited
-
arch/abs32le/include/mm/as.h (modified) (1 diff)
-
arch/amd64/include/mm/as.h (modified) (1 diff)
-
arch/amd64/src/proc/scheduler.c (modified) (1 diff)
-
arch/amd64/src/userspace.c (modified) (1 diff)
-
arch/arm32/include/mm/as.h (modified) (1 diff)
-
arch/arm32/src/arm32.c (modified) (1 diff)
-
arch/arm32/src/userspace.c (modified) (3 diffs)
-
arch/ia32/include/mm/as.h (modified) (1 diff)
-
arch/ia32/src/proc/scheduler.c (modified) (1 diff)
-
arch/ia32/src/userspace.c (modified) (1 diff)
-
arch/ia64/include/arch.h (modified) (1 diff)
-
arch/ia64/include/asm.h (modified) (1 diff)
-
arch/ia64/include/context.h (modified) (1 diff)
-
arch/ia64/include/mm/as.h (modified) (1 diff)
-
arch/ia64/include/mm/frame.h (modified) (1 diff)
-
arch/ia64/src/ia64.c (modified) (1 diff)
-
arch/ia64/src/proc/scheduler.c (modified) (2 diffs)
-
arch/mips32/include/mm/as.h (modified) (1 diff)
-
arch/mips32/src/debugger.c (modified) (1 diff)
-
arch/mips32/src/mips32.c (modified) (2 diffs)
-
arch/ppc32/include/boot/boot.h (modified) (1 diff)
-
arch/ppc32/include/interrupt.h (modified) (1 diff)
-
arch/ppc32/include/istate.h (modified) (2 diffs)
-
arch/ppc32/include/mm/as.h (modified) (1 diff)
-
arch/ppc32/include/mm/tlb.h (modified) (1 diff)
-
arch/ppc32/src/boot/boot.S (modified) (2 diffs)
-
arch/ppc32/src/exception.S (modified) (6 diffs)
-
arch/ppc32/src/interrupt.c (modified) (1 diff)
-
arch/ppc32/src/mm/tlb.c (modified) (3 diffs)
-
arch/ppc32/src/ppc32.c (modified) (1 diff)
-
arch/ppc32/src/proc/scheduler.c (modified) (1 diff)
-
arch/sparc64/include/mm/sun4u/as.h (modified) (2 diffs)
-
arch/sparc64/include/mm/sun4v/as.h (modified) (1 diff)
-
arch/sparc64/src/mm/sun4u/as.c (modified) (1 diff)
-
arch/sparc64/src/mm/sun4v/as.c (modified) (1 diff)
-
genarch/src/drivers/ega/ega.c (modified) (1 diff)
-
generic/include/adt/list.h (modified) (11 diffs)
-
generic/include/arch.h (modified) (3 diffs)
-
generic/include/config.h (modified) (2 diffs)
-
generic/include/cpu.h (modified) (1 diff)
-
generic/include/ipc/event.h (modified) (2 diffs)
-
generic/include/ipc/event_types.h (modified) (1 diff)
-
generic/include/mm/as.h (modified) (1 diff)
-
generic/include/mm/frame.h (modified) (1 diff)
-
generic/include/mm/page.h (modified) (1 diff)
-
generic/include/proc/task.h (modified) (1 diff)
-
generic/include/proc/thread.h (modified) (1 diff)
-
generic/include/proc/uarg.h (modified) (1 diff)
-
generic/include/synch/waitq.h (modified) (1 diff)
-
generic/include/syscall/syscall.h (modified) (1 diff)
-
generic/include/typedefs.h (modified) (1 diff)
-
generic/src/adt/list.c (modified) (1 diff)
-
generic/src/console/cmd.c (modified) (1 diff)
-
generic/src/console/console.c (modified) (8 diffs)
-
generic/src/ddi/ddi.c (modified) (1 diff)
-
generic/src/debug/panic.c (modified) (1 diff)
-
generic/src/interrupt/interrupt.c (modified) (1 diff)
-
generic/src/ipc/event.c (modified) (3 diffs)
-
generic/src/lib/elf.c (modified) (1 diff)
-
generic/src/main/main.c (modified) (4 diffs)
-
generic/src/main/uinit.c (modified) (6 diffs)
-
generic/src/mm/as.c (modified) (51 diffs)
-
generic/src/mm/backend_anon.c (modified) (1 diff)
-
generic/src/printf/vprintf.c (modified) (2 diffs)
-
generic/src/proc/program.c (modified) (2 diffs)
-
generic/src/proc/scheduler.c (modified) (1 diff)
-
generic/src/proc/task.c (modified) (7 diffs)
-
generic/src/proc/the.c (modified) (2 diffs)
-
generic/src/proc/thread.c (modified) (7 diffs)
-
generic/src/security/cap.c (modified) (2 diffs)
-
generic/src/synch/spinlock.c (modified) (1 diff)
-
generic/src/syscall/syscall.c (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/abs32le/include/mm/as.h
r8d308b9 r9d47440 43 43 #define USER_ADDRESS_SPACE_END_ARCH UINT32_C(0x7fffffff) 44 44 45 #define USTACK_ADDRESS_ARCH (USER_ADDRESS_SPACE_END_ARCH - (PAGE_SIZE - 1))46 47 45 typedef struct { 48 46 } as_arch_t; -
kernel/arch/amd64/include/mm/as.h
r8d308b9 r9d47440 43 43 #define KERNEL_ADDRESS_SPACE_START_ARCH UINT64_C(0xffff800000000000) 44 44 #define KERNEL_ADDRESS_SPACE_END_ARCH UINT64_C(0xffffffffffffffff) 45 46 #define USER_ADDRESS_SPACE_START_ARCH UINT64_C(0x0000000000000000) 47 #define USER_ADDRESS_SPACE_END_ARCH UINT64_C(0x00007fffffffffff) 48 49 #define USTACK_ADDRESS_ARCH (USER_ADDRESS_SPACE_END_ARCH - (PAGE_SIZE - 1)) 45 #define USER_ADDRESS_SPACE_START_ARCH UINT64_C(0x0000000000000000) 46 #define USER_ADDRESS_SPACE_END_ARCH UINT64_C(0x00007fffffffffff) 50 47 51 48 #define as_constructor_arch(as, flags) (as != as) -
kernel/arch/amd64/src/proc/scheduler.c
r8d308b9 r9d47440 56 56 { 57 57 CPU->arch.tss->rsp0 = 58 (uintptr_t) &THREAD->kstack[ THREAD_STACK_SIZE];58 (uintptr_t) &THREAD->kstack[STACK_SIZE]; 59 59 60 60 /* -
kernel/arch/amd64/src/userspace.c
r8d308b9 r9d47440 66 66 "iretq\n" 67 67 :: [udata_des] "i" (GDT_SELECTOR(UDATA_DES) | PL_USER), 68 [stack_size] "r" (kernel_uarg->uspace_stack + THREAD_STACK_SIZE),68 [stack_size] "r" (kernel_uarg->uspace_stack + STACK_SIZE), 69 69 [ipl] "r" (ipl), 70 70 [utext_des] "i" (GDT_SELECTOR(UTEXT_DES) | PL_USER), -
kernel/arch/arm32/include/mm/as.h
r8d308b9 r9d47440 37 37 #define KERN_arm32_AS_H_ 38 38 39 #define KERNEL_ADDRESS_SPACE_SHADOWED_ARCH 039 #define KERNEL_ADDRESS_SPACE_SHADOWED_ARCH 0 40 40 41 #define KERNEL_ADDRESS_SPACE_START_ARCH (unsigned long) 0x80000000 42 #define KERNEL_ADDRESS_SPACE_END_ARCH (unsigned long) 0xffffffff 43 #define USER_ADDRESS_SPACE_START_ARCH (unsigned long) 0x00000000 44 #define USER_ADDRESS_SPACE_END_ARCH (unsigned long) 0x7fffffff 45 46 #define USTACK_ADDRESS_ARCH (0x80000000 - PAGE_SIZE) 41 #define KERNEL_ADDRESS_SPACE_START_ARCH UINT32_C(0x80000000) 42 #define KERNEL_ADDRESS_SPACE_END_ARCH UINT32_C(0xffffffff) 43 #define USER_ADDRESS_SPACE_START_ARCH UINT32_C(0x00000000) 44 #define USER_ADDRESS_SPACE_END_ARCH UINT32_C(0x7fffffff) 47 45 48 46 typedef struct { -
kernel/arch/arm32/src/arm32.c
r8d308b9 r9d47440 134 134 uint8_t *stck; 135 135 136 stck = &THREAD->kstack[ THREAD_STACK_SIZE - SP_DELTA];136 stck = &THREAD->kstack[STACK_SIZE - SP_DELTA]; 137 137 supervisor_sp = (uintptr_t) stck; 138 138 } -
kernel/arch/arm32/src/userspace.c
r8d308b9 r9d47440 38 38 39 39 /** Struct for holding all general purpose registers. 40 * 40 * 41 41 * Used to set registers when going to userspace. 42 42 */ … … 60 60 } ustate_t; 61 61 62 /** Changes processor mode and jumps to the address specified in the first 63 * parameter. 62 /** Change processor mode 64 63 * 65 * @param kernel_uarg Userspace settings (entry point, stack, ...). 64 * @param kernel_uarg Userspace settings (entry point, stack, ...). 65 * 66 66 */ 67 67 void userspace(uspace_arg_t *kernel_uarg) … … 79 79 80 80 /* clear other registers */ 81 ustate.r3 = ustate.r4 = ustate.r5 = ustate.r6 = ustate.r7 = 82 ustate.r8 = ustate.r9 = ustate.r10 = ustate.r11 = ustate.r12 = 83 ustate.lr = 0; 81 ustate.r3 = 0; 82 ustate.r4 = 0; 83 ustate.r5 = 0; 84 ustate.r6 = 0; 85 ustate.r7 = 0; 86 ustate.r8 = 0; 87 ustate.r9 = 0; 88 ustate.r10 = 0; 89 ustate.r11 = 0; 90 ustate.r12 = 0; 91 ustate.lr = 0; 84 92 85 93 /* set user stack */ 86 ustate.sp = ((uint32_t)kernel_uarg->uspace_stack) + PAGE_SIZE;94 ustate.sp = ((uint32_t)kernel_uarg->uspace_stack) + STACK_SIZE; 87 95 88 96 /* set where uspace execution starts */ -
kernel/arch/ia32/include/mm/as.h
r8d308b9 r9d47440 43 43 #define USER_ADDRESS_SPACE_END_ARCH UINT32_C(0x7fffffff) 44 44 45 #define USTACK_ADDRESS_ARCH (USER_ADDRESS_SPACE_END_ARCH - (PAGE_SIZE - 1))46 47 45 typedef struct { 48 46 } as_arch_t; -
kernel/arch/ia32/src/proc/scheduler.c
r8d308b9 r9d47440 58 58 void before_thread_runs_arch(void) 59 59 { 60 uintptr_t kstk = (uintptr_t) &THREAD->kstack[ THREAD_STACK_SIZE];60 uintptr_t kstk = (uintptr_t) &THREAD->kstack[STACK_SIZE]; 61 61 62 62 if (CPU->arch.fi.bits.sep) { -
kernel/arch/ia32/src/userspace.c
r8d308b9 r9d47440 76 76 : 77 77 : [udata_des] "i" (GDT_SELECTOR(UDATA_DES) | PL_USER), 78 [stack_size] "r" ((uint8_t *) kernel_uarg->uspace_stack + THREAD_STACK_SIZE),78 [stack_size] "r" ((uint8_t *) kernel_uarg->uspace_stack + STACK_SIZE), 79 79 [ipl] "r" (ipl), 80 80 [utext_des] "i" (GDT_SELECTOR(UTEXT_DES) | PL_USER), -
kernel/arch/ia64/include/arch.h
r8d308b9 r9d47440 36 36 #define KERN_ia64_ARCH_H_ 37 37 38 #define LOADED_PROG_STACK_PAGES_NO 239 40 38 #include <arch/drivers/ski.h> 41 39 -
kernel/arch/ia64/include/asm.h
r8d308b9 r9d47440 122 122 } 123 123 124 /** Return base address of current stack 125 * 126 * Return the base address of the current stack. 127 * The stack is assumed to be STACK_SIZE long. 128 * The stack must start on page boundary. 129 * 124 /** Return base address of current memory stack. 125 * 126 * The memory stack is assumed to be STACK_SIZE / 2 long. Note that there is 127 * also the RSE stack, which takes up the upper half of STACK_SIZE. 128 * The memory stack must start on page boundary. 130 129 */ 131 130 NO_TRACE static inline uintptr_t get_stack_base(void) 132 131 { 133 uint64_t v; 134 135 /* 136 * I'm not sure why but this code inlines badly 137 * in scheduler, resulting in THE shifting about 138 * 16B and causing kernel panic. 139 * 140 * asm volatile ( 141 * "and %[value] = %[mask], r12" 142 * : [value] "=r" (v) 143 * : [mask] "r" (~(STACK_SIZE - 1)) 144 * ); 145 * return v; 146 * 147 * The following code has the same semantics but 148 * inlines correctly. 149 * 150 */ 132 uint64_t value; 151 133 152 134 asm volatile ( 153 135 "mov %[value] = r12" 154 : [value] "=r" (v )155 ); 156 157 return (v & (~(STACK_SIZE- 1)));136 : [value] "=r" (value) 137 ); 138 139 return (value & (~(STACK_SIZE / 2 - 1))); 158 140 } 159 141 -
kernel/arch/ia64/include/context.h
r8d308b9 r9d47440 49 49 #define SP_DELTA (0 + ALIGN_UP(STACK_ITEM_SIZE, STACK_ALIGNMENT)) 50 50 51 /* RSE stack starts at the bottom of memory stack . */51 /* RSE stack starts at the bottom of memory stack, hence the division by 2. */ 52 52 #define context_set(c, _pc, stack, size) \ 53 53 do { \ 54 54 (c)->pc = (uintptr_t) _pc; \ 55 (c)->bsp = ((uintptr_t) stack) + ALIGN_UP((size ), REGISTER_STACK_ALIGNMENT);\55 (c)->bsp = ((uintptr_t) stack) + ALIGN_UP((size / 2), REGISTER_STACK_ALIGNMENT); \ 56 56 (c)->ar_pfs &= PFM_MASK; \ 57 (c)->sp = ((uintptr_t) stack) + ALIGN_UP((size ), STACK_ALIGNMENT) - SP_DELTA;\57 (c)->sp = ((uintptr_t) stack) + ALIGN_UP((size / 2), STACK_ALIGNMENT) - SP_DELTA; \ 58 58 } while (0); 59 59 -
kernel/arch/ia64/include/mm/as.h
r8d308b9 r9d47440 38 38 #define KERNEL_ADDRESS_SPACE_SHADOWED_ARCH 0 39 39 40 #define KERNEL_ADDRESS_SPACE_START_ARCH ((unsigned long) 0xe000000000000000ULL)41 #define KERNEL_ADDRESS_SPACE_END_ARCH ((unsigned long) 0xffffffffffffffffULL)42 #define USER_ADDRESS_SPACE_START_ARCH ((unsigned long) 0x0000000000000000ULL)43 #define USER_ADDRESS_SPACE_END_ARCH ((unsigned long) 0xdfffffffffffffffULL)40 #define KERNEL_ADDRESS_SPACE_START_ARCH UINT64_C(0xe000000000000000) 41 #define KERNEL_ADDRESS_SPACE_END_ARCH UINT64_C(0xffffffffffffffff) 42 #define USER_ADDRESS_SPACE_START_ARCH UINT64_C(0x0000000000000000) 43 #define USER_ADDRESS_SPACE_END_ARCH UINT64_C(0xdfffffffffffffff) 44 44 45 #define USTACK_ADDRESS_ARCH 0x0000000ff0000000ULL45 #define USTACK_ADDRESS_ARCH UINT64_C(0x0000000ff0000000) 46 46 47 47 typedef struct { -
kernel/arch/ia64/include/mm/frame.h
r8d308b9 r9d47440 49 49 #define physmem_print() 50 50 51 #define ARCH_STACK_FRAMES TWO_FRAMES52 53 51 #endif /* __ASM__ */ 54 52 #endif /* KERNEL */ -
kernel/arch/ia64/src/ia64.c
r8d308b9 r9d47440 249 249 rsc.mode = 3; /* eager mode */ 250 250 251 /* 252 * Switch to userspace. 253 * 254 * When calculating stack addresses, mind the stack split between the 255 * memory stack and the RSE stack. Each occuppies STACK_SIZE / 2 bytes. 256 */ 251 257 switch_to_userspace((uintptr_t) kernel_uarg->uspace_entry, 252 ((uintptr_t) kernel_uarg->uspace_stack) + PAGE_SIZE-258 ((uintptr_t) kernel_uarg->uspace_stack) + STACK_SIZE / 2 - 253 259 ALIGN_UP(STACK_ITEM_SIZE, STACK_ALIGNMENT), 254 ((uintptr_t) kernel_uarg->uspace_stack) + PAGE_SIZE,260 ((uintptr_t) kernel_uarg->uspace_stack) + STACK_SIZE / 2, 255 261 (uintptr_t) kernel_uarg->uspace_uarg, psr.value, rsc.value); 256 262 -
kernel/arch/ia64/src/proc/scheduler.c
r8d308b9 r9d47440 79 79 * Record address of kernel stack to bank 0 r23. 80 80 * These values will be found there after switch from userspace. 81 * 82 * Mind the 1:1 split of the entire STACK_SIZE long region between the 83 * memory stack and the RSE stack. 81 84 */ 82 85 asm volatile ( … … 86 89 "bsw.1\n" 87 90 : 88 : "r" (&THREAD->kstack[ THREAD_STACK_SIZE]),89 "r" (&THREAD->kstack[ THREAD_STACK_SIZE- SP_DELTA])91 : "r" (&THREAD->kstack[STACK_SIZE / 2]), 92 "r" (&THREAD->kstack[STACK_SIZE / 2 - SP_DELTA]) 90 93 ); 91 94 } -
kernel/arch/mips32/include/mm/as.h
r8d308b9 r9d47440 38 38 #define KERNEL_ADDRESS_SPACE_SHADOWED_ARCH 0 39 39 40 #define KERNEL_ADDRESS_SPACE_START_ARCH (unsigned long) 0x80000000 41 #define KERNEL_ADDRESS_SPACE_END_ARCH (unsigned long) 0x9fffffff 42 #define USER_ADDRESS_SPACE_START_ARCH (unsigned long) 0x00000000 43 #define USER_ADDRESS_SPACE_END_ARCH (unsigned long) 0x7fffffff 44 45 #define USTACK_ADDRESS_ARCH (0x80000000 - PAGE_SIZE) 40 #define KERNEL_ADDRESS_SPACE_START_ARCH UINT32_C(0x80000000) 41 #define KERNEL_ADDRESS_SPACE_END_ARCH UINT32_C(0x9fffffff) 42 #define USER_ADDRESS_SPACE_START_ARCH UINT32_C(0x00000000) 43 #define USER_ADDRESS_SPACE_END_ARCH UINT32_C(0x7fffffff) 46 44 47 45 typedef struct { -
kernel/arch/mips32/src/debugger.c
r8d308b9 r9d47440 79 79 static cmd_info_t addbkpt_info = { 80 80 .name = "addbkpt", 81 .description = "Add bkpoint (break on J/Branch insts unsupported).",81 .description = "Add bkpoint (break on j/branch insts unsupported).", 82 82 .func = cmd_add_breakpoint, 83 83 .argc = 1, -
kernel/arch/mips32/src/mips32.c
r8d308b9 r9d47440 220 220 cp0_status_um_bit | cp0_status_ie_enabled_bit)); 221 221 cp0_epc_write((uintptr_t) kernel_uarg->uspace_entry); 222 userspace_asm(((uintptr_t) kernel_uarg->uspace_stack + PAGE_SIZE),222 userspace_asm(((uintptr_t) kernel_uarg->uspace_stack + STACK_SIZE), 223 223 (uintptr_t) kernel_uarg->uspace_uarg, 224 224 (uintptr_t) kernel_uarg->uspace_entry); … … 235 235 void before_thread_runs_arch(void) 236 236 { 237 supervisor_sp = (uintptr_t) &THREAD->kstack[THREAD_STACK_SIZE -238 SP_DELTA];237 supervisor_sp = 238 (uintptr_t) &THREAD->kstack[STACK_SIZE - SP_DELTA]; 239 239 } 240 240 -
kernel/arch/ppc32/include/boot/boot.h
r8d308b9 r9d47440 37 37 38 38 #define BOOT_OFFSET 0x8000 39 40 /* Temporary stack size for boot process */41 #define TEMP_STACK_SIZE 0x100042 39 43 40 #define TASKMAP_MAX_RECORDS 32 -
kernel/arch/ppc32/include/interrupt.h
r8d308b9 r9d47440 45 45 #define VECTOR_EXTERNAL 4 46 46 #define VECTOR_DECREMENTER 8 47 #define VECTOR_ITLB_MISS 13 48 #define VECTOR_DTLB_MISS_LOAD 14 49 #define VECTOR_DTLB_MISS_STORE 15 47 50 48 51 extern void start_decrementer(void); -
kernel/arch/ppc32/include/istate.h
r8d308b9 r9d47440 73 73 uint32_t cr; 74 74 uint32_t pc; 75 uint32_t srr1;75 uint32_t msr; 76 76 uint32_t lr; 77 77 uint32_t ctr; … … 90 90 /** Return true if exception happened while in userspace 91 91 * 92 * The contexts of MSR register was stored in SRR1.93 *94 92 */ 95 93 NO_TRACE static inline int istate_from_uspace(istate_t *istate) 96 94 { 97 return (istate-> srr1& MSR_PR) != 0;95 return (istate->msr & MSR_PR) != 0; 98 96 } 99 97 -
kernel/arch/ppc32/include/mm/as.h
r8d308b9 r9d47440 38 38 #define KERNEL_ADDRESS_SPACE_SHADOWED_ARCH 0 39 39 40 #define KERNEL_ADDRESS_SPACE_START_ARCH ((unsigned long) 0x80000000) 41 #define KERNEL_ADDRESS_SPACE_END_ARCH ((unsigned long) 0xffffffff) 42 #define USER_ADDRESS_SPACE_START_ARCH ((unsigned long) 0x00000000) 43 #define USER_ADDRESS_SPACE_END_ARCH ((unsigned long) 0x7fffffff) 44 45 #define USTACK_ADDRESS_ARCH (0x7fffffff - (PAGE_SIZE - 1)) 40 #define KERNEL_ADDRESS_SPACE_START_ARCH UINT32_C(0x80000000) 41 #define KERNEL_ADDRESS_SPACE_END_ARCH UINT32_C(0xffffffff) 42 #define USER_ADDRESS_SPACE_START_ARCH UINT32_C(0x00000000) 43 #define USER_ADDRESS_SPACE_END_ARCH UINT32_C(0x7fffffff) 46 44 47 45 typedef struct { -
kernel/arch/ppc32/include/mm/tlb.h
r8d308b9 r9d47440 77 77 extern void pht_init(void); 78 78 extern void pht_refill(unsigned int, istate_t *); 79 80 extern bool pht_refill_real(unsigned int, istate_t *) 81 __attribute__ ((section("K_UNMAPPED_TEXT_START"))); 82 extern void tlb_refill_real(unsigned int, uint32_t, ptehi_t, ptelo_t, 83 istate_t *) __attribute__ ((section("K_UNMAPPED_TEXT_START"))); 79 extern void tlb_refill(unsigned int, istate_t *); 84 80 85 81 #endif -
kernel/arch/ppc32/src/boot/boot.S
r8d308b9 r9d47440 28 28 29 29 #include <arch/asm/regname.h> 30 #include < arch/boot/boot.h>30 #include <config.h> 31 31 32 32 .section K_TEXT_START, "ax" … … 56 56 .align 12 57 57 kernel_stack_bottom: 58 .space TEMP_STACK_SIZE58 .space STACK_SIZE 59 59 kernel_stack: -
kernel/arch/ppc32/src/exception.S
r8d308b9 r9d47440 142 142 CONTEXT_STORE 143 143 144 b data_storage 144 li r3, 2 145 b jump_to_kernel 145 146 146 147 .org 0x400 … … 149 150 CONTEXT_STORE 150 151 151 b instruction_storage 152 li r3, 3 153 b jump_to_kernel 152 154 153 155 .org 0x500 … … 227 229 CONTEXT_STORE 228 230 229 b tlb_miss 231 li r3, 13 232 b jump_to_kernel 230 233 231 234 .org 0x1100 … … 234 237 CONTEXT_STORE 235 238 236 b tlb_miss 239 li r3, 14 240 b jump_to_kernel 237 241 238 242 .org 0x1200 … … 241 245 CONTEXT_STORE 242 246 243 b tlb_miss 247 li r3, 15 248 b jump_to_kernel 244 249 245 250 .org 0x4000 246 data_storage:247 li r3, 2248 mr r4, sp249 addi r4, r4, 8250 bl pht_refill_real251 252 cmpwi r3, 0253 bne iret_real254 255 li r3, 2256 b jump_to_kernel257 258 instruction_storage:259 li r3, 3260 mr r4, sp261 addi r4, r4, 8262 bl pht_refill_real263 264 cmpwi r3, 0265 bne iret_real266 267 li r3, 3268 b jump_to_kernel269 270 tlb_miss:271 li r3, 16272 mfspr r4, tlbmiss273 mfspr r5, ptehi274 mfspr r6, ptelo275 mr r7, sp276 addi r7, r7, 20277 278 bl tlb_refill_real279 b iret_real280 281 251 jump_to_kernel: 282 252 lis r12, iret@ha … … 313 283 addis sp, sp, 0x8000 314 284 rfi 315 316 iret_real:317 lwz r0, 8(sp)318 lwz r2, 12(sp)319 lwz r3, 16(sp)320 lwz r4, 20(sp)321 lwz r5, 24(sp)322 lwz r6, 28(sp)323 lwz r7, 32(sp)324 lwz r8, 36(sp)325 lwz r9, 40(sp)326 lwz r10, 44(sp)327 lwz r11, 48(sp)328 lwz r13, 52(sp)329 lwz r14, 56(sp)330 lwz r15, 60(sp)331 lwz r16, 64(sp)332 lwz r17, 68(sp)333 lwz r18, 72(sp)334 lwz r19, 76(sp)335 lwz r20, 80(sp)336 lwz r21, 84(sp)337 lwz r22, 88(sp)338 lwz r23, 92(sp)339 lwz r24, 96(sp)340 lwz r25, 100(sp)341 lwz r26, 104(sp)342 lwz r27, 108(sp)343 lwz r28, 112(sp)344 lwz r29, 116(sp)345 lwz r30, 120(sp)346 lwz r31, 124(sp)347 348 lwz r12, 128(sp)349 mtcr r12350 351 lwz r12, 132(sp)352 mtsrr0 r12353 354 lwz r12, 136(sp)355 mtsrr1 r12356 357 lwz r12, 140(sp)358 mtlr r12359 360 lwz r12, 144(sp)361 mtctr r12362 363 lwz r12, 148(sp)364 mtxer r12365 366 lwz r12, 156(sp)367 lwz sp, 160(sp)368 369 rfi -
kernel/arch/ppc32/src/interrupt.c
r8d308b9 r9d47440 153 153 exc_register(VECTOR_DECREMENTER, "timer", true, 154 154 exception_decrementer); 155 exc_register(VECTOR_ITLB_MISS, "itlb_miss", true, 156 tlb_refill); 157 exc_register(VECTOR_DTLB_MISS_LOAD, "dtlb_miss_load", true, 158 tlb_refill); 159 exc_register(VECTOR_DTLB_MISS_STORE, "dtlb_miss_store", true, 160 tlb_refill); 155 161 } 156 162 -
kernel/arch/ppc32/src/mm/tlb.c
r8d308b9 r9d47440 44 44 #include <symtab.h> 45 45 46 static unsigned int seed = 10; 47 static unsigned int seed_real 48 __attribute__ ((section("K_UNMAPPED_DATA_START"))) = 42; 46 static unsigned int seed = 42; 49 47 50 48 /** Try to find PTE for faulting address … … 225 223 switch (pfrc) { 226 224 case AS_PF_FAULT: 227 goto fail; 228 break; 225 page_table_unlock(as, true); 226 pht_refill_fail(badvaddr, istate); 227 return; 229 228 case AS_PF_DEFER: 230 229 /* … … 244 243 245 244 page_table_unlock(as, true); 246 return; 247 248 fail: 249 page_table_unlock(as, true); 250 pht_refill_fail(badvaddr, istate); 251 } 252 253 /** Process Instruction/Data Storage Exception in Real Mode 254 * 255 * @param n Exception vector number. 256 * @param istate Interrupted register context. 257 * 258 */ 259 bool pht_refill_real(unsigned int n, istate_t *istate) 260 { 261 uintptr_t badvaddr; 262 263 if (n == VECTOR_DATA_STORAGE) 264 badvaddr = istate->dar; 265 else 266 badvaddr = istate->pc; 267 268 uint32_t physmem = physmem_top(); 269 270 if ((badvaddr < PA2KA(0)) || (badvaddr >= PA2KA(physmem))) 271 return false; 272 273 uint32_t page = (badvaddr >> 12) & 0xffff; 274 uint32_t api = (badvaddr >> 22) & 0x3f; 275 276 uint32_t vsid = sr_get(badvaddr); 277 uint32_t sdr1 = sdr1_get(); 278 279 // FIXME: compute size of PHT exactly 280 phte_t *phte_real = (phte_t *) (sdr1 & 0xffff0000); 281 282 /* Primary hash (xor) */ 283 uint32_t h = 0; 284 uint32_t hash = vsid ^ page; 285 uint32_t base = (hash & 0x3ff) << 3; 286 uint32_t i; 287 bool found = false; 288 289 /* Find colliding PTE in PTEG */ 290 for (i = 0; i < 8; i++) { 291 if ((phte_real[base + i].v) 292 && (phte_real[base + i].vsid == vsid) 293 && (phte_real[base + i].api == api) 294 && (phte_real[base + i].h == 0)) { 295 found = true; 296 break; 297 } 298 } 299 300 if (!found) { 301 /* Find unused PTE in PTEG */ 302 for (i = 0; i < 8; i++) { 303 if (!phte_real[base + i].v) { 304 found = true; 305 break; 306 } 307 } 308 } 309 310 if (!found) { 311 /* Secondary hash (not) */ 312 uint32_t base2 = (~hash & 0x3ff) << 3; 313 314 /* Find colliding PTE in PTEG */ 315 for (i = 0; i < 8; i++) { 316 if ((phte_real[base2 + i].v) 317 && (phte_real[base2 + i].vsid == vsid) 318 && (phte_real[base2 + i].api == api) 319 && (phte_real[base2 + i].h == 1)) { 320 found = true; 321 base = base2; 322 h = 1; 323 break; 324 } 325 } 326 327 if (!found) { 328 /* Find unused PTE in PTEG */ 329 for (i = 0; i < 8; i++) { 330 if (!phte_real[base2 + i].v) { 331 found = true; 332 base = base2; 333 h = 1; 334 break; 335 } 336 } 337 } 338 339 if (!found) { 340 /* Use secondary hash to avoid collisions 341 with usual PHT refill handler. */ 342 i = RANDI(seed_real) % 8; 343 base = base2; 344 h = 1; 345 } 346 } 347 348 phte_real[base + i].v = 1; 349 phte_real[base + i].vsid = vsid; 350 phte_real[base + i].h = h; 351 phte_real[base + i].api = api; 352 phte_real[base + i].rpn = KA2PA(badvaddr) >> 12; 353 phte_real[base + i].r = 0; 354 phte_real[base + i].c = 0; 355 phte_real[base + i].wimg = 0; 356 phte_real[base + i].pp = 2; // FIXME 357 358 return true; 359 } 360 361 /** Process ITLB/DTLB Miss Exception in Real Mode 362 * 363 * 364 */ 365 void tlb_refill_real(unsigned int n, uint32_t tlbmiss, ptehi_t ptehi, 366 ptelo_t ptelo, istate_t *istate) 367 { 245 } 246 247 void tlb_refill(unsigned int n, istate_t *istate) 248 { 249 uint32_t tlbmiss; 250 ptehi_t ptehi; 251 ptelo_t ptelo; 252 253 asm volatile ( 254 "mfspr %[tlbmiss], 980\n" 255 "mfspr %[ptehi], 981\n" 256 "mfspr %[ptelo], 982\n" 257 : [tlbmiss] "=r" (tlbmiss), 258 [ptehi] "=r" (ptehi), 259 [ptelo] "=r" (ptelo) 260 ); 261 368 262 uint32_t badvaddr = tlbmiss & 0xfffffffc; 369 263 uint32_t physmem = physmem_top(); -
kernel/arch/ppc32/src/ppc32.c
r8d308b9 r9d47440 265 265 { 266 266 userspace_asm((uintptr_t) kernel_uarg->uspace_uarg, 267 (uintptr_t) kernel_uarg->uspace_stack + 268 THREAD_STACK_SIZE - SP_DELTA, 267 (uintptr_t) kernel_uarg->uspace_stack + STACK_SIZE - SP_DELTA, 269 268 (uintptr_t) kernel_uarg->uspace_entry); 270 269 -
kernel/arch/ppc32/src/proc/scheduler.c
r8d308b9 r9d47440 55 55 asm volatile ( 56 56 "mtsprg0 %[ksp]\n" 57 :: [ksp] "r" (KA2PA(&THREAD->kstack[ THREAD_STACK_SIZE - SP_DELTA]))57 :: [ksp] "r" (KA2PA(&THREAD->kstack[STACK_SIZE - SP_DELTA])) 58 58 ); 59 59 } -
kernel/arch/sparc64/include/mm/sun4u/as.h
r8d308b9 r9d47440 27 27 */ 28 28 29 /** @addtogroup sparc64mm 29 /** @addtogroup sparc64mm 30 30 * @{ 31 31 */ … … 38 38 #include <arch/mm/tte.h> 39 39 40 #define KERNEL_ADDRESS_SPACE_SHADOWED_ARCH 140 #define KERNEL_ADDRESS_SPACE_SHADOWED_ARCH 1 41 41 42 #define KERNEL_ADDRESS_SPACE_START_ARCH (unsigned long) 0x0000000000000000 43 #define KERNEL_ADDRESS_SPACE_END_ARCH (unsigned long) 0xffffffffffffffff 44 #define USER_ADDRESS_SPACE_START_ARCH (unsigned long) 0x0000000000000000 45 #define USER_ADDRESS_SPACE_END_ARCH (unsigned long) 0xffffffffffffffff 46 47 #define USTACK_ADDRESS_ARCH (0xffffffffffffffffULL - (PAGE_SIZE - 1)) 42 #define KERNEL_ADDRESS_SPACE_START_ARCH UINT64_C(0x0000000000000000) 43 #define KERNEL_ADDRESS_SPACE_END_ARCH UINT64_C(0xffffffffffffffff) 44 #define USER_ADDRESS_SPACE_START_ARCH UINT64_C(0x0000000000000000) 45 #define USER_ADDRESS_SPACE_END_ARCH UINT64_C(0xffffffffffffffff) 48 46 49 47 #ifdef CONFIG_TSB -
kernel/arch/sparc64/include/mm/sun4v/as.h
r8d308b9 r9d47440 40 40 #include <arch/mm/tsb.h> 41 41 42 #define KERNEL_ADDRESS_SPACE_SHADOWED_ARCH 142 #define KERNEL_ADDRESS_SPACE_SHADOWED_ARCH 1 43 43 44 #define KERNEL_ADDRESS_SPACE_START_ARCH (unsigned long) 0x0000000000000000 45 #define KERNEL_ADDRESS_SPACE_END_ARCH (unsigned long) 0xffffffffffffffff 46 #define USER_ADDRESS_SPACE_START_ARCH (unsigned long) 0x0000000000000000 47 #define USER_ADDRESS_SPACE_END_ARCH (unsigned long) 0xffffffffffffffff 48 49 #define USTACK_ADDRESS_ARCH (0xffffffffffffffffULL - (PAGE_SIZE - 1)) 44 #define KERNEL_ADDRESS_SPACE_START_ARCH UINT64_C(0x0000000000000000) 45 #define KERNEL_ADDRESS_SPACE_END_ARCH UINT64_C(0xffffffffffffffff) 46 #define USER_ADDRESS_SPACE_START_ARCH UINT64_C(0x0000000000000000) 47 #define USER_ADDRESS_SPACE_END_ARCH UINT64_C(0xffffffffffffffff) 50 48 51 49 #ifdef CONFIG_TSB -
kernel/arch/sparc64/src/mm/sun4u/as.c
r8d308b9 r9d47440 47 47 #include <bitops.h> 48 48 #include <macros.h> 49 #include <memstr.h> 49 50 50 51 #endif /* CONFIG_TSB */ -
kernel/arch/sparc64/src/mm/sun4v/as.c
r8d308b9 r9d47440 50 50 #include <bitops.h> 51 51 #include <macros.h> 52 #include <memstr.h> 52 53 53 54 #endif /* CONFIG_TSB */ -
kernel/genarch/src/drivers/ega/ega.c
r8d308b9 r9d47440 41 41 #include <mm/slab.h> 42 42 #include <arch/mm/page.h> 43 #include <synch/spinlock.h>44 43 #include <typedefs.h> 45 44 #include <arch/asm.h> -
kernel/generic/include/adt/list.h
r8d308b9 r9d47440 41 41 /** Doubly linked list head and link type. */ 42 42 typedef struct link { 43 struct link *prev; /**< Pointer to the previous item in the list. */44 struct link *next; /**< Pointer to the next item in the list. */43 struct link *prev; /**< Pointer to the previous item in the list. */ 44 struct link *next; /**< Pointer to the next item in the list. */ 45 45 } link_t; 46 46 … … 48 48 * 49 49 * @param name Name of the new statically allocated list. 50 * 50 51 */ 51 52 #define LIST_INITIALIZE(name) \ 52 link_t name = { .prev = &name, .next = &name } 53 link_t name = { \ 54 .prev = &name, \ 55 .next = &name \ 56 } 57 58 #define list_get_instance(link, type, member) \ 59 ((type *) (((void *)(link)) - ((void *) &(((type *) NULL)->member)))) 60 61 #define list_foreach(list, iterator) \ 62 for (link_t *iterator = (list).next; \ 63 iterator != &(list); iterator = iterator->next) 53 64 54 65 /** Initialize doubly-linked circular list link … … 57 68 * 58 69 * @param link Pointer to link_t structure to be initialized. 70 * 59 71 */ 60 72 NO_TRACE static inline void link_initialize(link_t *link) … … 68 80 * Initialize doubly-linked circular list. 69 81 * 70 * @param head Pointer to link_t structure representing head of the list. 71 */ 72 NO_TRACE static inline void list_initialize(link_t *head) 73 { 74 head->prev = head; 75 head->next = head; 82 * @param list Pointer to link_t structure representing the list. 83 * 84 */ 85 NO_TRACE static inline void list_initialize(link_t *list) 86 { 87 list->prev = list; 88 list->next = list; 76 89 } 77 90 … … 81 94 * 82 95 * @param link Pointer to link_t structure to be added. 83 * @param head Pointer to link_t structure representing head of the list. 84 */ 85 NO_TRACE static inline void list_prepend(link_t *link, link_t *head) 86 { 87 link->next = head->next; 88 link->prev = head; 89 head->next->prev = link; 90 head->next = link; 96 * @param list Pointer to link_t structure representing the list. 97 * 98 */ 99 NO_TRACE static inline void list_prepend(link_t *link, link_t *list) 100 { 101 link->next = list->next; 102 link->prev = list; 103 list->next->prev = link; 104 list->next = link; 91 105 } 92 106 … … 96 110 * 97 111 * @param link Pointer to link_t structure to be added. 98 * @param head Pointer to link_t structure representing head of the list. 99 */ 100 NO_TRACE static inline void list_append(link_t *link, link_t *head) 101 { 102 link->prev = head->prev; 103 link->next = head; 104 head->prev->next = link; 105 head->prev = link; 112 * @param list Pointer to link_t structure representing the list. 113 * 114 */ 115 NO_TRACE static inline void list_append(link_t *link, link_t *list) 116 { 117 link->prev = list->prev; 118 link->next = list; 119 list->prev->next = link; 120 list->prev = link; 121 } 122 123 /** Insert item before another item in doubly-linked circular list. 124 * 125 */ 126 static inline void list_insert_before(link_t *link, link_t *list) 127 { 128 list_append(link, list); 129 } 130 131 /** Insert item after another item in doubly-linked circular list. 132 * 133 */ 134 static inline void list_insert_after(link_t *link, link_t *list) 135 { 136 list_prepend(list, link); 106 137 } 107 138 … … 110 141 * Remove item from doubly-linked circular list. 111 142 * 112 * @param link Pointer to link_t structure to be removed from the list it is 113 * contained in. 143 * @param link Pointer to link_t structure to be removed from the list 144 * it is contained in. 145 * 114 146 */ 115 147 NO_TRACE static inline void list_remove(link_t *link) … … 124 156 * Query emptiness of doubly-linked circular list. 125 157 * 126 * @param head Pointer to link_t structure representing head of the list. 127 */ 128 NO_TRACE static inline bool list_empty(link_t *head) 129 { 130 return head->next == head ? true : false; 131 } 132 158 * @param list Pointer to link_t structure representing the list. 159 * 160 */ 161 NO_TRACE static inline int list_empty(link_t *list) 162 { 163 return (list->next == list); 164 } 165 166 /** Get head item of a list. 167 * 168 * @param list Pointer to link_t structure representing the list. 169 * 170 * @return Head item of the list. 171 * @return NULL if the list is empty. 172 * 173 */ 174 static inline link_t *list_head(link_t *list) 175 { 176 return ((list->next == list) ? NULL : list->next); 177 } 133 178 134 179 /** Split or concatenate headless doubly-linked circular list … … 139 184 * concatenates splitted lists and splits concatenated lists. 140 185 * 141 * @param part1 Pointer to link_t structure leading the first (half of the 142 * headless) list. 143 * @param part2 Pointer to link_t structure leading the second (half of the 144 * headless) list. 186 * @param part1 Pointer to link_t structure leading the first 187 * (half of the headless) list. 188 * @param part2 Pointer to link_t structure leading the second 189 * (half of the headless) list. 190 * 145 191 */ 146 192 NO_TRACE static inline void headless_list_split_or_concat(link_t *part1, link_t *part2) 147 193 { 148 link_t *hlp;149 150 194 part1->prev->next = part2; 151 part2->prev->next = part1; 152 hlp = part1->prev; 195 part2->prev->next = part1; 196 197 link_t *hlp = part1->prev; 198 153 199 part1->prev = part2->prev; 154 200 part2->prev = hlp; 155 201 } 156 202 157 158 203 /** Split headless doubly-linked circular list 159 204 * 160 205 * Split headless doubly-linked circular list. 161 206 * 162 * @param part1 Pointer to link_t structure leading the first half of the 163 * headless list. 164 * @param part2 Pointer to link_t structure leading the second half of the 165 * headless list. 207 * @param part1 Pointer to link_t structure leading 208 * the first half of the headless list. 209 * @param part2 Pointer to link_t structure leading 210 * the second half of the headless list. 211 * 166 212 */ 167 213 NO_TRACE static inline void headless_list_split(link_t *part1, link_t *part2) … … 174 220 * Concatenate two headless doubly-linked circular lists. 175 221 * 176 * @param part1 Pointer to link_t structure leading the first headless list. 177 * @param part2 Pointer to link_t structure leading the second headless list. 222 * @param part1 Pointer to link_t structure leading 223 * the first headless list. 224 * @param part2 Pointer to link_t structure leading 225 * the second headless list. 226 * 178 227 */ 179 228 NO_TRACE static inline void headless_list_concat(link_t *part1, link_t *part2) … … 182 231 } 183 232 184 #define list_get_instance(link, type, member) \ 185 ((type *)(((uint8_t *)(link)) - ((uint8_t *)&(((type *)NULL)->member)))) 186 187 extern bool list_member(const link_t *link, const link_t *head); 188 extern void list_concat(link_t *head1, link_t *head2); 233 /** Get n-th item of a list. 234 * 235 * @param list Pointer to link_t structure representing the list. 236 * @param n Item number (indexed from zero). 237 * 238 * @return n-th item of the list. 239 * @return NULL if no n-th item found. 240 * 241 */ 242 static inline link_t *list_nth(link_t *list, unsigned int n) 243 { 244 unsigned int cnt = 0; 245 246 list_foreach(*list, link) { 247 if (cnt == n) 248 return link; 249 250 cnt++; 251 } 252 253 return NULL; 254 } 255 256 extern int list_member(const link_t *, const link_t *); 257 extern void list_concat(link_t *, link_t *); 258 extern unsigned int list_count(const link_t *); 189 259 190 260 #endif -
kernel/generic/include/arch.h
r8d308b9 r9d47440 41 41 #include <mm/as.h> 42 42 43 #define DEFAULT_CONTEXT 0 43 /* 44 * THE is not an abbreviation, but the English definite article written in 45 * capital letters. It means the current pointer to something, e.g. thread, 46 * processor or address space. Kind reader of this comment shall appreciate 47 * the wit of constructs like THE->thread and similar. 48 */ 49 #define THE ((the_t * )(get_stack_base())) 44 50 45 51 #define CPU THE->cpu … … 47 53 #define TASK THE->task 48 54 #define AS THE->as 49 #define CONTEXT (THE->task ? THE->task->context : DEFAULT_CONTEXT)50 55 #define PREEMPTION_DISABLED THE->preemption_disabled 56 #define MAGIC UINT32_C(0xfacefeed) 51 57 52 #define context_check(ctx1, ctx2) ((ctx1) == (ctx2)) 58 #define container_check(ctn1, ctn2) ((ctn1) == (ctn2)) 59 60 #define DEFAULT_CONTAINER 0 61 #define CONTAINER \ 62 ((THE->task) ? (THE->task->container) : (DEFAULT_CONTAINER)) 53 63 54 64 /** … … 63 73 cpu_t *cpu; /**< Executing cpu. */ 64 74 as_t *as; /**< Current address space. */ 75 uint32_t magic; /**< Magic value */ 65 76 } the_t; 66 67 /*68 * THE is not an abbreviation, but the English definite article written in69 * capital letters. It means the current pointer to something, e.g. thread,70 * processor or address space. Kind reader of this comment shall appreciate71 * the wit of constructs like THE->thread and similar.72 */73 #define THE ((the_t * )(get_stack_base()))74 77 75 78 extern void the_initialize(the_t *); -
kernel/generic/include/config.h
r8d308b9 r9d47440 36 36 #define KERN_CONFIG_H_ 37 37 38 #include <typedefs.h>39 38 #include <arch/mm/page.h> 40 39 41 #define STACK_SIZE PAGE_SIZE 40 #define ONE_FRAME 0 41 #define TWO_FRAMES 1 42 #define FOUR_FRAMES 2 43 44 #define STACK_FRAMES TWO_FRAMES 45 #define STACK_SIZE ((1 << STACK_FRAMES) << PAGE_WIDTH) 42 46 43 47 #define CONFIG_INIT_TASKS 32 44 48 #define CONFIG_TASK_NAME_BUFLEN 32 49 50 #ifndef __ASM__ 51 52 #include <typedefs.h> 45 53 46 54 typedef struct { … … 80 88 extern ballocs_t ballocs; 81 89 90 #endif /* __ASM__ */ 91 82 92 #endif 83 93 -
kernel/generic/include/cpu.h
r8d308b9 r9d47440 41 41 #include <arch/cpu.h> 42 42 #include <arch/context.h> 43 44 #define CPU_STACK_SIZE STACK_SIZE45 43 46 44 /** CPU structure. -
kernel/generic/include/ipc/event.h
r8d308b9 r9d47440 41 41 #include <ipc/ipc.h> 42 42 43 typedef void (*event_callback_t)(void); 44 43 45 /** Event notification structure. */ 44 46 typedef struct { … … 51 53 /** Counter. */ 52 54 size_t counter; 55 56 /** Masked flag. */ 57 bool masked; 58 /** Unmask callback. */ 59 event_callback_t unmask_callback; 53 60 } event_t; 54 61 55 62 extern void event_init(void); 63 extern void event_cleanup_answerbox(answerbox_t *); 64 extern void event_set_unmask_callback(event_type_t, event_callback_t); 65 66 #define event_notify_0(e, m) \ 67 event_notify((e), (m), 0, 0, 0, 0, 0) 68 #define event_notify_1(e, m, a1) \ 69 event_notify((e), (m), (a1), 0, 0, 0, 0) 70 #define event_notify_2(e, m, a1, a2) \ 71 event_notify((e), (m), (a1), (a2), 0, 0, 0) 72 #define event_notify_3(e, m, a1, a2, a3) \ 73 event_notify((e), (m), (a1), (a2), (a3), 0, 0) 74 #define event_notify_4(e, m, a1, a2, a3, a4) \ 75 event_notify((e), (m), (a1), (a2), (a3), (a4), 0) 76 #define event_notify_5(e, m, a1, a2, a3, a4, a5) \ 77 event_notify((e), (m), (a1), (a2), (a3), (a4), (a5)) 78 79 extern int event_notify(event_type_t, bool, sysarg_t, sysarg_t, sysarg_t, 80 sysarg_t, sysarg_t); 81 56 82 extern sysarg_t sys_event_subscribe(sysarg_t, sysarg_t); 57 extern bool event_is_subscribed(event_type_t); 58 extern void event_cleanup_answerbox(answerbox_t *); 59 60 #define event_notify_0(e) \ 61 event_notify((e), 0, 0, 0, 0, 0) 62 #define event_notify_1(e, a1) \ 63 event_notify((e), (a1), 0, 0, 0, 0) 64 #define event_notify_2(e, a1, a2) \ 65 event_notify((e), (a1), (a2), 0, 0, 0) 66 #define event_notify_3(e, a1, a2, a3) \ 67 event_notify((e), (a1), (a2), (a3), 0, 0) 68 #define event_notify_4(e, a1, a2, a3, a4) \ 69 event_notify((e), (a1), (a2), (a3), (a4), 0) 70 #define event_notify_5(e, a1, a2, a3, a4, a5) \ 71 event_notify((e), (a1), (a2), (a3), (a4), (a5)) 72 73 extern void event_notify(event_type_t, sysarg_t, sysarg_t, sysarg_t, 74 sysarg_t, sysarg_t); 83 extern sysarg_t sys_event_unmask(sysarg_t); 75 84 76 85 #endif -
kernel/generic/include/ipc/event_types.h
r8d308b9 r9d47440 39 39 /** New data available in kernel log */ 40 40 EVENT_KLOG = 0, 41 /** Returning from kernel console to us erspace */41 /** Returning from kernel console to uspace */ 42 42 EVENT_KCONSOLE, 43 43 /** A task/thread has faulted and will be terminated */ -
kernel/generic/include/mm/as.h
r8d308b9 r9d47440 84 84 #define USER_ADDRESS_SPACE_END USER_ADDRESS_SPACE_END_ARCH 85 85 86 #define USTACK_ADDRESS USTACK_ADDRESS_ARCH 86 #ifdef USTACK_ADDRESS_ARCH 87 #define USTACK_ADDRESS USTACK_ADDRESS_ARCH 88 #else 89 #define USTACK_ADDRESS (USER_ADDRESS_SPACE_END - (STACK_SIZE - 1)) 90 #endif 87 91 88 92 /** Kernel address space. */ -
kernel/generic/include/mm/frame.h
r8d308b9 r9d47440 44 44 #include <arch/mm/page.h> 45 45 #include <arch/mm/frame.h> 46 47 #define ONE_FRAME 048 #define TWO_FRAMES 149 #define FOUR_FRAMES 250 51 52 #ifdef ARCH_STACK_FRAMES53 #define STACK_FRAMES ARCH_STACK_FRAMES54 #else55 #define STACK_FRAMES ONE_FRAME56 #endif57 46 58 47 /** Maximum number of zones in the system. */ -
kernel/generic/include/mm/page.h
r8d308b9 r9d47440 38 38 #include <typedefs.h> 39 39 #include <mm/as.h> 40 #include <memstr.h> 40 #include <arch/mm/page.h> 41 42 #define P2SZ(pages) \ 43 ((pages) << PAGE_WIDTH) 41 44 42 45 /** Operations to manipulate page mappings. */ -
kernel/generic/include/proc/task.h
r8d308b9 r9d47440 78 78 /** Unique identity of task. */ 79 79 task_id_t taskid; 80 /** Task security cont ext. */81 cont ext_id_t context;80 /** Task security container. */ 81 container_id_t container; 82 82 83 83 /** Number of references (i.e. threads). */ -
kernel/generic/include/proc/thread.h
r8d308b9 r9d47440 49 49 #include <sysinfo/abi.h> 50 50 51 #define THREAD_STACK_SIZE STACK_SIZE52 51 #define THREAD_NAME_BUFLEN 20 53 52 -
kernel/generic/include/proc/uarg.h
r8d308b9 r9d47440 40 40 void *uspace_entry; 41 41 void *uspace_stack; 42 42 43 43 void (* uspace_thread_function)(); 44 44 void *uspace_thread_arg; -
kernel/generic/include/synch/waitq.h
r8d308b9 r9d47440 62 62 int missed_wakeups; 63 63 64 /** List of sleeping threads for w ich there was no missed_wakeup. */64 /** List of sleeping threads for which there was no missed_wakeup. */ 65 65 link_t head; 66 66 } waitq_t; -
kernel/generic/include/syscall/syscall.h
r8d308b9 r9d47440 75 75 76 76 SYS_EVENT_SUBSCRIBE, 77 SYS_EVENT_UNMASK, 77 78 78 79 SYS_CAP_GRANT, -
kernel/generic/include/typedefs.h
r8d308b9 r9d47440 64 64 typedef uint64_t thread_id_t; 65 65 typedef uint64_t task_id_t; 66 typedef uint32_t cont ext_id_t;66 typedef uint32_t container_id_t; 67 67 68 68 typedef int32_t inr_t; -
kernel/generic/src/adt/list.c
r8d308b9 r9d47440 52 52 * 53 53 */ 54 boollist_member(const link_t *link, const link_t *head)54 int list_member(const link_t *link, const link_t *head) 55 55 { 56 56 bool found = false; -
kernel/generic/src/console/cmd.c
r8d308b9 r9d47440 1107 1107 release_console(); 1108 1108 1109 event_notify_0(EVENT_KCONSOLE );1109 event_notify_0(EVENT_KCONSOLE, false); 1110 1110 indev_pop_character(stdin); 1111 1111 -
kernel/generic/src/console/console.c
r8d308b9 r9d47440 53 53 #include <str.h> 54 54 55 #define KLOG_PAGES 455 #define KLOG_PAGES 8 56 56 #define KLOG_LENGTH (KLOG_PAGES * PAGE_SIZE / sizeof(wchar_t)) 57 #define KLOG_LATENCY 858 57 59 58 /** Kernel log cyclic buffer */ … … 61 60 62 61 /** Kernel log initialized */ 63 static bool klog_inited = false;62 static atomic_t klog_inited = {false}; 64 63 65 64 /** First kernel log characters */ … … 76 75 77 76 /** Kernel log spinlock */ 78 SPINLOCK_STATIC_INITIALIZE_NAME(klog_lock, " *klog_lock");77 SPINLOCK_STATIC_INITIALIZE_NAME(klog_lock, "klog_lock"); 79 78 80 79 /** Physical memory area used for klog buffer */ … … 166 165 sysinfo_set_item_val("klog.pages", NULL, KLOG_PAGES); 167 166 168 spinlock_lock(&klog_lock); 169 klog_inited = true; 170 spinlock_unlock(&klog_lock); 167 event_set_unmask_callback(EVENT_KLOG, klog_update); 168 atomic_set(&klog_inited, true); 171 169 } 172 170 … … 263 261 void klog_update(void) 264 262 { 263 if (!atomic_get(&klog_inited)) 264 return; 265 265 266 spinlock_lock(&klog_lock); 266 267 267 if ((klog_inited) && (event_is_subscribed(EVENT_KLOG)) && (klog_uspace > 0)) { 268 event_notify_3(EVENT_KLOG, klog_start, klog_len, klog_uspace); 269 klog_uspace = 0; 268 if (klog_uspace > 0) { 269 if (event_notify_3(EVENT_KLOG, true, klog_start, klog_len, 270 klog_uspace) == EOK) 271 klog_uspace = 0; 270 272 } 271 273 … … 275 277 void putchar(const wchar_t ch) 276 278 { 279 bool ordy = ((stdout) && (stdout->op->write)); 280 277 281 spinlock_lock(&klog_lock); 278 282 279 if ((klog_stored > 0) && (stdout) && (stdout->op->write)) { 280 /* Print charaters stored in kernel log */ 281 size_t i; 282 for (i = klog_len - klog_stored; i < klog_len; i++) 283 stdout->op->write(stdout, klog[(klog_start + i) % KLOG_LENGTH], silent); 284 klog_stored = 0; 283 /* Print charaters stored in kernel log */ 284 if (ordy) { 285 while (klog_stored > 0) { 286 wchar_t tmp = klog[(klog_start + klog_len - klog_stored) % KLOG_LENGTH]; 287 klog_stored--; 288 289 /* 290 * We need to give up the spinlock for 291 * the physical operation of writting out 292 * the character. 293 */ 294 spinlock_unlock(&klog_lock); 295 stdout->op->write(stdout, tmp, silent); 296 spinlock_lock(&klog_lock); 297 } 285 298 } 286 299 … … 292 305 klog_start = (klog_start + 1) % KLOG_LENGTH; 293 306 294 if ((stdout) && (stdout->op->write)) 307 if (!ordy) { 308 if (klog_stored < klog_len) 309 klog_stored++; 310 } 311 312 /* The character is stored for uspace */ 313 if (klog_uspace < klog_len) 314 klog_uspace++; 315 316 spinlock_unlock(&klog_lock); 317 318 if (ordy) { 319 /* 320 * Output the character. In this case 321 * it should be no longer buffered. 322 */ 295 323 stdout->op->write(stdout, ch, silent); 296 else {324 } else { 297 325 /* 298 326 * No standard output routine defined yet. … … 304 332 * Note that the early_putc() function might be 305 333 * a no-op on certain hardware configurations. 306 *307 334 */ 308 335 early_putchar(ch); 309 310 if (klog_stored < klog_len) 311 klog_stored++; 312 } 313 314 /* The character is stored for uspace */ 315 if (klog_uspace < klog_len) 316 klog_uspace++; 317 318 /* Check notify uspace to update */ 319 bool update; 320 if ((klog_uspace > KLOG_LATENCY) || (ch == '\n')) 321 update = true; 322 else 323 update = false; 324 325 spinlock_unlock(&klog_lock); 326 327 if (update) 336 } 337 338 /* Force notification on newline */ 339 if (ch == '\n') 328 340 klog_update(); 329 341 } -
kernel/generic/src/ddi/ddi.c
r8d308b9 r9d47440 224 224 task_t *task = task_find_by_id(id); 225 225 226 if ((!task) || (!cont ext_check(CONTEXT, task->context))) {226 if ((!task) || (!container_check(CONTAINER, task->container))) { 227 227 /* 228 228 * There is no task with the specified ID -
kernel/generic/src/debug/panic.c
r8d308b9 r9d47440 95 95 printf("\n"); 96 96 97 printf("THE=%p: ", THE); 98 if (THE != NULL) { 99 printf("pe=%" PRIun " thr=%p task=%p cpu=%p as=%p" 100 " magic=%#" PRIx32 "\n", THE->preemption_disabled, 101 THE->thread, THE->task, THE->cpu, THE->as, THE->magic); 102 } else 103 printf("invalid\n"); 104 97 105 if (istate) { 98 106 istate_decode(istate); -
kernel/generic/src/interrupt/interrupt.c
r8d308b9 r9d47440 205 205 * stack. 206 206 */ 207 return (istate_t *) ((uint8_t *) thread->kstack + THREAD_STACK_SIZE -208 sizeof(istate_t));207 return (istate_t *) ((uint8_t *) 208 thread->kstack + STACK_SIZE - sizeof(istate_t)); 209 209 } 210 210 -
kernel/generic/src/ipc/event.c
r8d308b9 r9d47440 48 48 static event_t events[EVENT_END]; 49 49 50 /** Initialize kernel events. */ 50 /** Initialize kernel events. 51 * 52 */ 51 53 void event_init(void) 52 54 { 53 unsigned int i; 54 55 for (i = 0; i < EVENT_END; i++) { 55 for (unsigned int i = 0; i < EVENT_END; i++) { 56 56 spinlock_initialize(&events[i].lock, "event.lock"); 57 57 events[i].answerbox = NULL; 58 58 events[i].counter = 0; 59 59 events[i].imethod = 0; 60 events[i].masked = false; 61 events[i].unmask_callback = NULL; 60 62 } 61 63 } 62 64 65 /** Unsubscribe kernel events associated with an answerbox 66 * 67 * @param answerbox Answerbox to be unsubscribed. 68 * 69 */ 70 void event_cleanup_answerbox(answerbox_t *answerbox) 71 { 72 for (unsigned int i = 0; i < EVENT_END; i++) { 73 spinlock_lock(&events[i].lock); 74 75 if (events[i].answerbox == answerbox) { 76 events[i].answerbox = NULL; 77 events[i].counter = 0; 78 events[i].imethod = 0; 79 events[i].masked = false; 80 } 81 82 spinlock_unlock(&events[i].lock); 83 } 84 } 85 86 /** Define a callback function for the event unmask event. 87 * 88 * @param evno Event type. 89 * @param callback Callback function to be called when 90 * the event is unmasked. 91 * 92 */ 93 void event_set_unmask_callback(event_type_t evno, event_callback_t callback) 94 { 95 ASSERT(evno < EVENT_END); 96 97 spinlock_lock(&events[evno].lock); 98 events[evno].unmask_callback = callback; 99 spinlock_unlock(&events[evno].lock); 100 } 101 102 /** Send kernel notification event 103 * 104 * @param evno Event type. 105 * @param mask Mask further notifications after a successful 106 * sending. 107 * @param a1 First argument. 108 * @param a2 Second argument. 109 * @param a3 Third argument. 110 * @param a4 Fourth argument. 111 * @param a5 Fifth argument. 112 * 113 * @return EOK if notification was successfully sent. 114 * @return ENOMEM if the notification IPC message failed to allocate. 115 * @return EBUSY if the notifications of the given type are 116 * currently masked. 117 * @return ENOENT if the notifications of the given type are 118 * currently not subscribed. 119 * 120 */ 121 int event_notify(event_type_t evno, bool mask, sysarg_t a1, sysarg_t a2, 122 sysarg_t a3, sysarg_t a4, sysarg_t a5) 123 { 124 ASSERT(evno < EVENT_END); 125 126 spinlock_lock(&events[evno].lock); 127 128 int ret; 129 130 if (events[evno].answerbox != NULL) { 131 if (!events[evno].masked) { 132 call_t *call = ipc_call_alloc(FRAME_ATOMIC); 133 134 if (call) { 135 call->flags |= IPC_CALL_NOTIF; 136 call->priv = ++events[evno].counter; 137 138 IPC_SET_IMETHOD(call->data, events[evno].imethod); 139 IPC_SET_ARG1(call->data, a1); 140 IPC_SET_ARG2(call->data, a2); 141 IPC_SET_ARG3(call->data, a3); 142 IPC_SET_ARG4(call->data, a4); 143 IPC_SET_ARG5(call->data, a5); 144 145 irq_spinlock_lock(&events[evno].answerbox->irq_lock, true); 146 list_append(&call->link, &events[evno].answerbox->irq_notifs); 147 irq_spinlock_unlock(&events[evno].answerbox->irq_lock, true); 148 149 waitq_wakeup(&events[evno].answerbox->wq, WAKEUP_FIRST); 150 151 if (mask) 152 events[evno].masked = true; 153 154 ret = EOK; 155 } else 156 ret = ENOMEM; 157 } else 158 ret = EBUSY; 159 } else 160 ret = ENOENT; 161 162 spinlock_unlock(&events[evno].lock); 163 164 return ret; 165 } 166 167 /** Subscribe event notifications 168 * 169 * @param evno Event type. 170 * @param imethod IPC interface and method to be used for 171 * the notifications. 172 * @param answerbox Answerbox to send the notifications to. 173 * 174 * @return EOK if the subscription was successful. 175 * @return EEXISTS if the notifications of the given type are 176 * already subscribed. 177 * 178 */ 63 179 static int event_subscribe(event_type_t evno, sysarg_t imethod, 64 180 answerbox_t *answerbox) 65 181 { 66 if (evno >= EVENT_END) 67 return ELIMIT; 182 ASSERT(evno < EVENT_END); 68 183 69 184 spinlock_lock(&events[evno].lock); … … 75 190 events[evno].imethod = imethod; 76 191 events[evno].counter = 0; 192 events[evno].masked = false; 77 193 res = EOK; 78 194 } else … … 84 200 } 85 201 202 /** Unmask event notifications 203 * 204 * @param evno Event type to unmask. 205 * 206 */ 207 static void event_unmask(event_type_t evno) 208 { 209 ASSERT(evno < EVENT_END); 210 211 spinlock_lock(&events[evno].lock); 212 events[evno].masked = false; 213 event_callback_t callback = events[evno].unmask_callback; 214 spinlock_unlock(&events[evno].lock); 215 216 /* 217 * Check if there is an unmask callback 218 * function defined for this event. 219 */ 220 if (callback != NULL) 221 callback(); 222 } 223 224 /** Event notification syscall wrapper 225 * 226 * @param evno Event type to subscribe. 227 * @param imethod IPC interface and method to be used for 228 * the notifications. 229 * 230 * @return EOK on success. 231 * @return ELIMIT on unknown event type. 232 * @return EEXISTS if the notifications of the given type are 233 * already subscribed. 234 * 235 */ 86 236 sysarg_t sys_event_subscribe(sysarg_t evno, sysarg_t imethod) 87 237 { 238 if (evno >= EVENT_END) 239 return ELIMIT; 240 88 241 return (sysarg_t) event_subscribe((event_type_t) evno, (sysarg_t) 89 242 imethod, &TASK->answerbox); 90 243 } 91 244 92 bool event_is_subscribed(event_type_t evno) 93 { 94 bool res; 95 96 ASSERT(evno < EVENT_END); 97 98 spinlock_lock(&events[evno].lock); 99 res = events[evno].answerbox != NULL; 100 spinlock_unlock(&events[evno].lock); 101 102 return res; 103 } 104 105 106 void event_cleanup_answerbox(answerbox_t *answerbox) 107 { 108 unsigned int i; 109 110 for (i = 0; i < EVENT_END; i++) { 111 spinlock_lock(&events[i].lock); 112 if (events[i].answerbox == answerbox) { 113 events[i].answerbox = NULL; 114 events[i].counter = 0; 115 events[i].imethod = 0; 116 } 117 spinlock_unlock(&events[i].lock); 118 } 119 } 120 121 void event_notify(event_type_t evno, sysarg_t a1, sysarg_t a2, sysarg_t a3, 122 sysarg_t a4, sysarg_t a5) 123 { 124 ASSERT(evno < EVENT_END); 125 126 spinlock_lock(&events[evno].lock); 127 if (events[evno].answerbox != NULL) { 128 call_t *call = ipc_call_alloc(FRAME_ATOMIC); 129 if (call) { 130 call->flags |= IPC_CALL_NOTIF; 131 call->priv = ++events[evno].counter; 132 IPC_SET_IMETHOD(call->data, events[evno].imethod); 133 IPC_SET_ARG1(call->data, a1); 134 IPC_SET_ARG2(call->data, a2); 135 IPC_SET_ARG3(call->data, a3); 136 IPC_SET_ARG4(call->data, a4); 137 IPC_SET_ARG5(call->data, a5); 138 139 irq_spinlock_lock(&events[evno].answerbox->irq_lock, true); 140 list_append(&call->link, &events[evno].answerbox->irq_notifs); 141 irq_spinlock_unlock(&events[evno].answerbox->irq_lock, true); 142 143 waitq_wakeup(&events[evno].answerbox->wq, WAKEUP_FIRST); 144 } 145 } 146 spinlock_unlock(&events[evno].lock); 245 /** Event notification unmask syscall wrapper 246 * 247 * Note that currently no tests are performed whether the calling 248 * task is entitled to unmask the notifications. However, thanks 249 * to the fact that notification masking is only a performance 250 * optimization, this has probably no security implications. 251 * 252 * @param evno Event type to unmask. 253 * 254 * @return EOK on success. 255 * @return ELIMIT on unknown event type. 256 * 257 */ 258 sysarg_t sys_event_unmask(sysarg_t evno) 259 { 260 if (evno >= EVENT_END) 261 return ELIMIT; 262 263 event_unmask((event_type_t) evno); 264 return EOK; 147 265 } 148 266 -
kernel/generic/src/lib/elf.c
r8d308b9 r9d47440 114 114 } 115 115 116 /* Inspect all section headers and proc cess them. */116 /* Inspect all section headers and process them. */ 117 117 for (i = 0; i < header->e_shnum; i++) { 118 118 elf_section_header_t *sechdr = -
kernel/generic/src/main/main.c
r8d308b9 r9d47440 118 118 #endif 119 119 120 #define CONFIG_STACK_SIZE ((1 << STACK_FRAMES) * STACK_SIZE)121 122 120 /** Main kernel routine for bootstrap CPU. 123 121 * … … 139 137 config.kernel_size = ALIGN_UP(hardcoded_ktext_size + 140 138 hardcoded_kdata_size, PAGE_SIZE); 141 config.stack_size = CONFIG_STACK_SIZE;139 config.stack_size = STACK_SIZE; 142 140 143 141 /* Initialy the stack is placed just after the kernel */ … … 165 163 166 164 context_save(&ctx); 167 context_set(&ctx, FADDR(main_bsp_separated_stack), config.stack_base,168 THREAD_STACK_SIZE);165 context_set(&ctx, FADDR(main_bsp_separated_stack), 166 config.stack_base, STACK_SIZE); 169 167 context_restore(&ctx); 170 168 /* not reached */ … … 323 321 context_save(&CPU->saved_context); 324 322 context_set(&CPU->saved_context, FADDR(main_ap_separated_stack), 325 (uintptr_t) CPU->stack, CPU_STACK_SIZE);323 (uintptr_t) CPU->stack, STACK_SIZE); 326 324 context_restore(&CPU->saved_context); 327 325 /* not reached */ -
kernel/generic/src/main/uinit.c
r8d308b9 r9d47440 33 33 /** 34 34 * @file 35 * @brief Userspace bootstrap thread.35 * @brief Userspace bootstrap thread. 36 36 * 37 37 * This file contains uinit kernel thread wich is used to start every … … 40 40 * @see SYS_THREAD_CREATE 41 41 */ 42 42 43 43 #include <main/uinit.h> 44 44 #include <typedefs.h> … … 48 48 #include <arch.h> 49 49 #include <udebug/udebug.h> 50 51 50 52 51 /** Thread used to bring up userspace thread. … … 58 57 { 59 58 uspace_arg_t uarg; 60 59 61 60 /* 62 61 * So far, we don't have a use for joining userspace threads so we … … 68 67 */ 69 68 thread_detach(THREAD); 70 69 71 70 #ifdef CONFIG_UDEBUG 72 71 udebug_stoppable_end(); … … 78 77 uarg.uspace_thread_function = NULL; 79 78 uarg.uspace_thread_arg = NULL; 80 79 81 80 free((uspace_arg_t *) arg); 82 81 -
kernel/generic/src/mm/as.c
r8d308b9 r9d47440 302 302 * We don't want any area to have conflicts with NULL page. 303 303 */ 304 if (overlaps(addr, count << PAGE_WIDTH, (uintptr_t) NULL, PAGE_SIZE))304 if (overlaps(addr, P2SZ(count), (uintptr_t) NULL, PAGE_SIZE)) 305 305 return false; 306 306 … … 329 329 mutex_lock(&area->lock); 330 330 331 if (overlaps(addr, count << PAGE_WIDTH,332 area->base, area->pages << PAGE_WIDTH)) {331 if (overlaps(addr, P2SZ(count), area->base, 332 P2SZ(area->pages))) { 333 333 mutex_unlock(&area->lock); 334 334 return false; … … 346 346 mutex_lock(&area->lock); 347 347 348 if (overlaps(addr, count << PAGE_WIDTH,349 area->base, area->pages << PAGE_WIDTH)) {348 if (overlaps(addr, P2SZ(count), area->base, 349 P2SZ(area->pages))) { 350 350 mutex_unlock(&area->lock); 351 351 return false; … … 366 366 mutex_lock(&area->lock); 367 367 368 if (overlaps(addr, count << PAGE_WIDTH,369 area->base, area->pages << PAGE_WIDTH)) {368 if (overlaps(addr, P2SZ(count), area->base, 369 P2SZ(area->pages))) { 370 370 mutex_unlock(&area->lock); 371 371 return false; … … 380 380 */ 381 381 if (!KERNEL_ADDRESS_SPACE_SHADOWED) { 382 return !overlaps(addr, count << PAGE_WIDTH, 383 KERNEL_ADDRESS_SPACE_START, 382 return !overlaps(addr, P2SZ(count), KERNEL_ADDRESS_SPACE_START, 384 383 KERNEL_ADDRESS_SPACE_END - KERNEL_ADDRESS_SPACE_START); 385 384 } … … 474 473 475 474 btree_node_t *leaf; 476 as_area_t *area = (as_area_t *) btree_search(&as->as_area_btree, va, &leaf); 475 as_area_t *area = (as_area_t *) btree_search(&as->as_area_btree, va, 476 &leaf); 477 477 if (area) { 478 478 /* va is the base address of an address space area */ … … 482 482 483 483 /* 484 * Search the leaf node and the righ most record of its left neighbour484 * Search the leaf node and the rightmost record of its left neighbour 485 485 * to find out whether this is a miss or va belongs to an address 486 486 * space area found there. … … 494 494 495 495 mutex_lock(&area->lock); 496 496 497 497 if ((area->base <= va) && 498 (va < area->base + (area->pages << PAGE_WIDTH)))498 (va <= area->base + (P2SZ(area->pages) - 1))) 499 499 return area; 500 500 … … 506 506 * Because of its position in the B+tree, it must have base < va. 507 507 */ 508 btree_node_t *lnode = btree_leaf_node_left_neighbour(&as->as_area_btree, leaf); 508 btree_node_t *lnode = btree_leaf_node_left_neighbour(&as->as_area_btree, 509 leaf); 509 510 if (lnode) { 510 511 area = (as_area_t *) lnode->value[lnode->keys - 1]; … … 512 513 mutex_lock(&area->lock); 513 514 514 if (va < area->base + (area->pages << PAGE_WIDTH))515 if (va <= area->base + (P2SZ(area->pages) - 1)) 515 516 return area; 516 517 … … 577 578 578 579 if (pages < area->pages) { 579 uintptr_t start_free = area->base + (pages << PAGE_WIDTH);580 uintptr_t start_free = area->base + P2SZ(pages); 580 581 581 582 /* … … 590 591 */ 591 592 ipl_t ipl = tlb_shootdown_start(TLB_INVL_PAGES, as->asid, 592 area->base + (pages << PAGE_WIDTH), area->pages - pages);593 area->base + P2SZ(pages), area->pages - pages); 593 594 594 595 /* … … 613 614 size_t i = 0; 614 615 615 if (overlaps(ptr, size << PAGE_WIDTH, area->base,616 pages << PAGE_WIDTH)) {616 if (overlaps(ptr, P2SZ(size), area->base, 617 P2SZ(pages))) { 617 618 618 if (ptr + (size << PAGE_WIDTH) <= start_free) {619 if (ptr + P2SZ(size) <= start_free) { 619 620 /* 620 621 * The whole interval fits … … 647 648 648 649 for (; i < size; i++) { 649 pte_t *pte = page_mapping_find(as, ptr +650 (i << PAGE_WIDTH));650 pte_t *pte = page_mapping_find(as, 651 ptr + P2SZ(i)); 651 652 652 653 ASSERT(pte); … … 657 658 (area->backend->frame_free)) { 658 659 area->backend->frame_free(area, 659 ptr + (i << PAGE_WIDTH),660 ptr + P2SZ(i), 660 661 PTE_GET_FRAME(pte)); 661 662 } 662 663 663 page_mapping_remove(as, ptr + 664 (i << PAGE_WIDTH)); 664 page_mapping_remove(as, ptr + P2SZ(i)); 665 665 } 666 666 } … … 671 671 */ 672 672 673 tlb_invalidate_pages(as->asid, area->base + (pages << PAGE_WIDTH),673 tlb_invalidate_pages(as->asid, area->base + P2SZ(pages), 674 674 area->pages - pages); 675 675 … … 677 677 * Invalidate software translation caches (e.g. TSB on sparc64). 678 678 */ 679 as_invalidate_translation_cache(as, area->base + 680 (pages << PAGE_WIDTH),area->pages - pages);679 as_invalidate_translation_cache(as, area->base + P2SZ(pages), 680 area->pages - pages); 681 681 tlb_shootdown_finalize(ipl); 682 682 … … 797 797 798 798 for (size = 0; size < (size_t) node->value[i]; size++) { 799 pte_t *pte = 800 page_mapping_find(as, ptr + (size << PAGE_WIDTH));799 pte_t *pte = page_mapping_find(as, 800 ptr + P2SZ(size)); 801 801 802 802 ASSERT(pte); … … 807 807 (area->backend->frame_free)) { 808 808 area->backend->frame_free(area, 809 ptr + (size << PAGE_WIDTH), PTE_GET_FRAME(pte)); 809 ptr + P2SZ(size), 810 PTE_GET_FRAME(pte)); 810 811 } 811 812 812 page_mapping_remove(as, ptr + (size << PAGE_WIDTH));813 page_mapping_remove(as, ptr + P2SZ(size)); 813 814 } 814 815 } … … 897 898 } 898 899 899 size_t src_size = src_area->pages << PAGE_WIDTH;900 size_t src_size = P2SZ(src_area->pages); 900 901 unsigned int src_flags = src_area->flags; 901 902 mem_backend_t *src_backend = src_area->backend; … … 1094 1095 for (cur = area->used_space.leaf_head.next; 1095 1096 cur != &area->used_space.leaf_head; cur = cur->next) { 1096 btree_node_t *node 1097 = list_get_instance(cur, btree_node_t,leaf_link);1097 btree_node_t *node = list_get_instance(cur, btree_node_t, 1098 leaf_link); 1098 1099 btree_key_t i; 1099 1100 … … 1103 1104 1104 1105 for (size = 0; size < (size_t) node->value[i]; size++) { 1105 pte_t *pte = 1106 p age_mapping_find(as, ptr + (size << PAGE_WIDTH));1106 pte_t *pte = page_mapping_find(as, 1107 ptr + P2SZ(size)); 1107 1108 1108 1109 ASSERT(pte); … … 1113 1114 1114 1115 /* Remove old mapping */ 1115 page_mapping_remove(as, ptr + (size << PAGE_WIDTH));1116 page_mapping_remove(as, ptr + P2SZ(size)); 1116 1117 } 1117 1118 } … … 1159 1160 1160 1161 /* Insert the new mapping */ 1161 page_mapping_insert(as, ptr + (size << PAGE_WIDTH),1162 page_mapping_insert(as, ptr + P2SZ(size), 1162 1163 old_frame[frame_idx++], page_flags); 1163 1164 … … 1481 1482 1482 1483 if (src_area) { 1483 size = src_area->pages << PAGE_WIDTH;1484 size = P2SZ(src_area->pages); 1484 1485 mutex_unlock(&src_area->lock); 1485 1486 } else … … 1536 1537 if (page >= right_pg) { 1537 1538 /* Do nothing. */ 1538 } else if (overlaps(page, count << PAGE_WIDTH, left_pg,1539 left_cnt << PAGE_WIDTH)) {1539 } else if (overlaps(page, P2SZ(count), left_pg, 1540 P2SZ(left_cnt))) { 1540 1541 /* The interval intersects with the left interval. */ 1541 1542 return false; 1542 } else if (overlaps(page, count << PAGE_WIDTH, right_pg,1543 right_cnt << PAGE_WIDTH)) {1543 } else if (overlaps(page, P2SZ(count), right_pg, 1544 P2SZ(right_cnt))) { 1544 1545 /* The interval intersects with the right interval. */ 1545 1546 return false; 1546 } else if ((page == left_pg + (left_cnt << PAGE_WIDTH)) &&1547 (page + (count << PAGE_WIDTH) == right_pg)) {1547 } else if ((page == left_pg + P2SZ(left_cnt)) && 1548 (page + P2SZ(count) == right_pg)) { 1548 1549 /* 1549 1550 * The interval can be added by merging the two already … … 1553 1554 btree_remove(&area->used_space, right_pg, leaf); 1554 1555 goto success; 1555 } else if (page == left_pg + (left_cnt << PAGE_WIDTH)) {1556 } else if (page == left_pg + P2SZ(left_cnt)) { 1556 1557 /* 1557 1558 * The interval can be added by simply growing the left … … 1560 1561 node->value[node->keys - 1] += count; 1561 1562 goto success; 1562 } else if (page + (count << PAGE_WIDTH) == right_pg) {1563 } else if (page + P2SZ(count) == right_pg) { 1563 1564 /* 1564 1565 * The interval can be addded by simply moving base of … … 1587 1588 */ 1588 1589 1589 if (overlaps(page, count << PAGE_WIDTH, right_pg, 1590 right_cnt << PAGE_WIDTH)) { 1590 if (overlaps(page, P2SZ(count), right_pg, P2SZ(right_cnt))) { 1591 1591 /* The interval intersects with the right interval. */ 1592 1592 return false; 1593 } else if (page + (count << PAGE_WIDTH) == right_pg) {1593 } else if (page + P2SZ(count) == right_pg) { 1594 1594 /* 1595 1595 * The interval can be added by moving the base of the … … 1626 1626 if (page < left_pg) { 1627 1627 /* Do nothing. */ 1628 } else if (overlaps(page, count << PAGE_WIDTH, left_pg,1629 left_cnt << PAGE_WIDTH)) {1628 } else if (overlaps(page, P2SZ(count), left_pg, 1629 P2SZ(left_cnt))) { 1630 1630 /* The interval intersects with the left interval. */ 1631 1631 return false; 1632 } else if (overlaps(page, count << PAGE_WIDTH, right_pg,1633 right_cnt << PAGE_WIDTH)) {1632 } else if (overlaps(page, P2SZ(count), right_pg, 1633 P2SZ(right_cnt))) { 1634 1634 /* The interval intersects with the right interval. */ 1635 1635 return false; 1636 } else if ((page == left_pg + (left_cnt << PAGE_WIDTH)) &&1637 (page + (count << PAGE_WIDTH) == right_pg)) {1636 } else if ((page == left_pg + P2SZ(left_cnt)) && 1637 (page + P2SZ(count) == right_pg)) { 1638 1638 /* 1639 1639 * The interval can be added by merging the two already … … 1643 1643 btree_remove(&area->used_space, right_pg, node); 1644 1644 goto success; 1645 } else if (page == left_pg + (left_cnt << PAGE_WIDTH)) {1645 } else if (page == left_pg + P2SZ(left_cnt)) { 1646 1646 /* 1647 1647 * The interval can be added by simply growing the left … … 1650 1650 leaf->value[leaf->keys - 1] += count; 1651 1651 goto success; 1652 } else if (page + (count << PAGE_WIDTH) == right_pg) {1652 } else if (page + P2SZ(count) == right_pg) { 1653 1653 /* 1654 1654 * The interval can be addded by simply moving base of … … 1677 1677 */ 1678 1678 1679 if (overlaps(page, count << PAGE_WIDTH, left_pg, 1680 left_cnt << PAGE_WIDTH)) { 1679 if (overlaps(page, P2SZ(count), left_pg, P2SZ(left_cnt))) { 1681 1680 /* The interval intersects with the left interval. */ 1682 1681 return false; 1683 } else if (left_pg + (left_cnt << PAGE_WIDTH) == page) {1682 } else if (left_pg + P2SZ(left_cnt) == page) { 1684 1683 /* 1685 1684 * The interval can be added by growing the left … … 1716 1715 */ 1717 1716 1718 if (overlaps(page, count << PAGE_WIDTH, left_pg,1719 left_cnt << PAGE_WIDTH)) {1717 if (overlaps(page, P2SZ(count), left_pg, 1718 P2SZ(left_cnt))) { 1720 1719 /* 1721 1720 * The interval intersects with the left … … 1723 1722 */ 1724 1723 return false; 1725 } else if (overlaps(page, count << PAGE_WIDTH, right_pg,1726 right_cnt << PAGE_WIDTH)) {1724 } else if (overlaps(page, P2SZ(count), right_pg, 1725 P2SZ(right_cnt))) { 1727 1726 /* 1728 1727 * The interval intersects with the right … … 1730 1729 */ 1731 1730 return false; 1732 } else if ((page == left_pg + (left_cnt << PAGE_WIDTH)) &&1733 (page + (count << PAGE_WIDTH) == right_pg)) {1731 } else if ((page == left_pg + P2SZ(left_cnt)) && 1732 (page + P2SZ(count) == right_pg)) { 1734 1733 /* 1735 1734 * The interval can be added by merging the two … … 1739 1738 btree_remove(&area->used_space, right_pg, leaf); 1740 1739 goto success; 1741 } else if (page == left_pg + (left_cnt << PAGE_WIDTH)) {1740 } else if (page == left_pg + P2SZ(left_cnt)) { 1742 1741 /* 1743 1742 * The interval can be added by simply growing … … 1746 1745 leaf->value[i - 1] += count; 1747 1746 goto success; 1748 } else if (page + (count << PAGE_WIDTH) == right_pg) {1747 } else if (page + P2SZ(count) == right_pg) { 1749 1748 /* 1750 1749 * The interval can be addded by simply moving … … 1812 1811 for (i = 0; i < leaf->keys; i++) { 1813 1812 if (leaf->key[i] == page) { 1814 leaf->key[i] += count << PAGE_WIDTH;1813 leaf->key[i] += P2SZ(count); 1815 1814 leaf->value[i] -= count; 1816 1815 goto success; … … 1822 1821 } 1823 1822 1824 btree_node_t *node = btree_leaf_node_left_neighbour(&area->used_space, leaf); 1823 btree_node_t *node = btree_leaf_node_left_neighbour(&area->used_space, 1824 leaf); 1825 1825 if ((node) && (page < leaf->key[0])) { 1826 1826 uintptr_t left_pg = node->key[node->keys - 1]; 1827 1827 size_t left_cnt = (size_t) node->value[node->keys - 1]; 1828 1828 1829 if (overlaps(left_pg, left_cnt << PAGE_WIDTH, page, 1830 count << PAGE_WIDTH)) { 1831 if (page + (count << PAGE_WIDTH) == 1832 left_pg + (left_cnt << PAGE_WIDTH)) { 1829 if (overlaps(left_pg, P2SZ(left_cnt), page, P2SZ(count))) { 1830 if (page + P2SZ(count) == left_pg + P2SZ(left_cnt)) { 1833 1831 /* 1834 1832 * The interval is contained in the rightmost … … 1839 1837 node->value[node->keys - 1] -= count; 1840 1838 goto success; 1841 } else if (page + (count << PAGE_WIDTH) < 1842 left_pg + (left_cnt << PAGE_WIDTH)) { 1839 } else if (page + P2SZ(count) < 1840 left_pg + P2SZ(left_cnt)) { 1841 size_t new_cnt; 1842 1843 1843 /* 1844 1844 * The interval is contained in the rightmost … … 1848 1848 * new interval. 1849 1849 */ 1850 size_t new_cnt = ((left_pg + (left_cnt << PAGE_WIDTH)) -1851 (page + (count << PAGE_WIDTH))) >> PAGE_WIDTH;1850 new_cnt = ((left_pg + P2SZ(left_cnt)) - 1851 (page + P2SZ(count))) >> PAGE_WIDTH; 1852 1852 node->value[node->keys - 1] -= count + new_cnt; 1853 1853 btree_insert(&area->used_space, page + 1854 (count << PAGE_WIDTH), (void *) new_cnt, leaf);1854 P2SZ(count), (void *) new_cnt, leaf); 1855 1855 goto success; 1856 1856 } … … 1865 1865 size_t left_cnt = (size_t) leaf->value[leaf->keys - 1]; 1866 1866 1867 if (overlaps(left_pg, left_cnt << PAGE_WIDTH, page, 1868 count << PAGE_WIDTH)) { 1869 if (page + (count << PAGE_WIDTH) == 1870 left_pg + (left_cnt << PAGE_WIDTH)) { 1867 if (overlaps(left_pg, P2SZ(left_cnt), page, P2SZ(count))) { 1868 if (page + P2SZ(count) == left_pg + P2SZ(left_cnt)) { 1871 1869 /* 1872 1870 * The interval is contained in the rightmost … … 1876 1874 leaf->value[leaf->keys - 1] -= count; 1877 1875 goto success; 1878 } else if (page + (count << PAGE_WIDTH) < left_pg + 1879 (left_cnt << PAGE_WIDTH)) { 1876 } else if (page + P2SZ(count) < left_pg + 1877 P2SZ(left_cnt)) { 1878 size_t new_cnt; 1879 1880 1880 /* 1881 1881 * The interval is contained in the rightmost … … 1885 1885 * interval. 1886 1886 */ 1887 size_t new_cnt = ((left_pg + (left_cnt << PAGE_WIDTH)) -1888 (page + (count << PAGE_WIDTH))) >> PAGE_WIDTH;1887 new_cnt = ((left_pg + P2SZ(left_cnt)) - 1888 (page + P2SZ(count))) >> PAGE_WIDTH; 1889 1889 leaf->value[leaf->keys - 1] -= count + new_cnt; 1890 1890 btree_insert(&area->used_space, page + 1891 (count << PAGE_WIDTH), (void *) new_cnt, leaf);1891 P2SZ(count), (void *) new_cnt, leaf); 1892 1892 goto success; 1893 1893 } … … 1911 1911 * to (i - 1) and i. 1912 1912 */ 1913 if (overlaps(left_pg, left_cnt << PAGE_WIDTH, page,1914 count << PAGE_WIDTH)) {1915 if (page + (count << PAGE_WIDTH) ==1916 left_pg + (left_cnt << PAGE_WIDTH)) {1913 if (overlaps(left_pg, P2SZ(left_cnt), page, 1914 P2SZ(count))) { 1915 if (page + P2SZ(count) == 1916 left_pg + P2SZ(left_cnt)) { 1917 1917 /* 1918 1918 * The interval is contained in the … … 1923 1923 leaf->value[i - 1] -= count; 1924 1924 goto success; 1925 } else if (page + (count << PAGE_WIDTH) < 1926 left_pg + (left_cnt << PAGE_WIDTH)) { 1925 } else if (page + P2SZ(count) < 1926 left_pg + P2SZ(left_cnt)) { 1927 size_t new_cnt; 1928 1927 1929 /* 1928 1930 * The interval is contained in the … … 1932 1934 * also inserting a new interval. 1933 1935 */ 1934 size_t new_cnt = ((left_pg + 1935 (left_cnt << PAGE_WIDTH)) - 1936 (page + (count << PAGE_WIDTH))) >> 1936 new_cnt = ((left_pg + P2SZ(left_cnt)) - 1937 (page + P2SZ(count))) >> 1937 1938 PAGE_WIDTH; 1938 1939 leaf->value[i - 1] -= count + new_cnt; 1939 1940 btree_insert(&area->used_space, page + 1940 (count << PAGE_WIDTH), (void *) new_cnt,1941 P2SZ(count), (void *) new_cnt, 1941 1942 leaf); 1942 1943 goto success; … … 2034 2035 btree_key_t i; 2035 2036 for (i = 0; (ret == 0) && (i < node->keys); i++) { 2037 uintptr_t addr; 2038 2036 2039 as_area_t *area = (as_area_t *) node->value[i]; 2037 2040 2038 2041 mutex_lock(&area->lock); 2039 2042 2040 uintptr_t addr = 2041 ALIGN_UP(area->base + (area->pages << PAGE_WIDTH), 2043 addr = ALIGN_UP(area->base + P2SZ(area->pages), 2042 2044 PAGE_SIZE); 2043 2045 … … 2098 2100 2099 2101 info[area_idx].start_addr = area->base; 2100 info[area_idx].size = FRAMES2SIZE(area->pages);2102 info[area_idx].size = P2SZ(area->pages); 2101 2103 info[area_idx].flags = area->flags; 2102 2104 ++area_idx; … … 2136 2138 " (%p - %p)\n", area, (void *) area->base, 2137 2139 area->pages, (void *) area->base, 2138 (void *) (area->base + FRAMES2SIZE(area->pages)));2140 (void *) (area->base + P2SZ(area->pages))); 2139 2141 mutex_unlock(&area->lock); 2140 2142 } -
kernel/generic/src/mm/backend_anon.c
r8d308b9 r9d47440 50 50 #include <typedefs.h> 51 51 #include <align.h> 52 #include <memstr.h> 52 53 #include <arch.h> 53 54 -
kernel/generic/src/printf/vprintf.c
r8d308b9 r9d47440 41 41 #include <typedefs.h> 42 42 #include <str.h> 43 44 IRQ_SPINLOCK_STATIC_INITIALIZE_NAME(printf_lock, "*printf_lock");45 43 46 44 static int vprintf_str_write(const char *str, size_t size, void *data) … … 93 91 }; 94 92 95 irq_spinlock_lock(&printf_lock, true); 96 int ret = printf_core(fmt, &ps, ap); 97 irq_spinlock_unlock(&printf_lock, true); 98 99 return ret; 93 return printf_core(fmt, &ps, ap); 100 94 } 101 95 -
kernel/generic/src/proc/program.c
r8d308b9 r9d47440 54 54 #include <proc/program.h> 55 55 56 #ifndef LOADED_PROG_STACK_PAGES_NO57 #define LOADED_PROG_STACK_PAGES_NO 158 #endif59 60 56 /** 61 57 * Points to the binary image used as the program loader. All non-initial … … 90 86 91 87 /* 92 * Create the dataaddress space area.88 * Create the stack address space area. 93 89 */ 94 90 as_area_t *area = as_area_create(as, 95 91 AS_AREA_READ | AS_AREA_WRITE | AS_AREA_CACHEABLE, 96 LOADED_PROG_STACK_PAGES_NO * PAGE_SIZE, USTACK_ADDRESS,97 AS_AREA_ATTR_NONE,&anon_backend, NULL);92 STACK_SIZE, USTACK_ADDRESS, AS_AREA_ATTR_NONE, 93 &anon_backend, NULL); 98 94 if (!area) 99 95 return ENOMEM; -
kernel/generic/src/proc/scheduler.c
r8d308b9 r9d47440 376 376 context_save(&CPU->saved_context); 377 377 context_set(&CPU->saved_context, FADDR(scheduler_separated_stack), 378 (uintptr_t) CPU->stack, CPU_STACK_SIZE);378 (uintptr_t) CPU->stack, STACK_SIZE); 379 379 context_restore(&CPU->saved_context); 380 380 -
kernel/generic/src/proc/task.c
r8d308b9 r9d47440 190 190 str_cpy(task->name, TASK_NAME_BUFLEN, name); 191 191 192 task->cont ext = CONTEXT;192 task->container = CONTAINER; 193 193 task->capabilities = 0; 194 194 task->ucycles = 0; … … 211 211 212 212 if ((ipc_phone_0) && 213 (cont ext_check(ipc_phone_0->task->context, task->context)))213 (container_check(ipc_phone_0->task->container, task->container))) 214 214 ipc_phone_connect(&task->phones[0], ipc_phone_0); 215 215 … … 534 534 */ 535 535 if (notify) { 536 if (event_is_subscribed(EVENT_FAULT)) { 537 /* Notify the subscriber that a fault occurred. */ 538 event_notify_3(EVENT_FAULT, LOWER32(TASK->taskid), 539 UPPER32(TASK->taskid), (sysarg_t) THREAD); 540 536 /* Notify the subscriber that a fault occurred. */ 537 if (event_notify_3(EVENT_FAULT, false, LOWER32(TASK->taskid), 538 UPPER32(TASK->taskid), (sysarg_t) THREAD) == EOK) { 541 539 #ifdef CONFIG_UDEBUG 542 540 /* Wait for a debugging session. */ … … 586 584 printf("%-8" PRIu64 " %-14s %-5" PRIu32 " %10p %10p" 587 585 " %9" PRIu64 "%c %9" PRIu64 "%c\n", task->taskid, 588 task->name, task->cont ext, task, task->as,586 task->name, task->container, task, task->as, 589 587 ucycles, usuffix, kcycles, ksuffix); 590 588 #endif … … 597 595 else 598 596 printf("%-8" PRIu64 " %-14s %-5" PRIu32 " %18p %18p\n", 599 task->taskid, task->name, task->cont ext, task, task->as);597 task->taskid, task->name, task->container, task, task->as); 600 598 #endif 601 599 … … 627 625 printf("[id ] [threads] [calls] [callee\n"); 628 626 else 629 printf("[id ] [name ] [ct x] [address ] [as ]"627 printf("[id ] [name ] [ctn] [address ] [as ]" 630 628 " [ucycles ] [kcycles ]\n"); 631 629 #endif … … 636 634 " [callee\n"); 637 635 else 638 printf("[id ] [name ] [ct x] [address ]"636 printf("[id ] [name ] [ctn] [address ]" 639 637 " [as ]\n"); 640 638 #endif -
kernel/generic/src/proc/the.c
r8d308b9 r9d47440 58 58 the->task = NULL; 59 59 the->as = NULL; 60 the->magic = MAGIC; 60 61 } 61 62 … … 70 71 NO_TRACE void the_copy(the_t *src, the_t *dst) 71 72 { 73 ASSERT(src->magic == MAGIC); 72 74 *dst = *src; 73 75 } -
kernel/generic/src/proc/thread.c
r8d308b9 r9d47440 68 68 #include <errno.h> 69 69 70 71 #ifndef LOADED_PROG_STACK_PAGES_NO72 #define LOADED_PROG_STACK_PAGES_NO 173 #endif74 75 76 70 /** Thread states */ 77 71 const char *thread_states[] = { … … 300 294 301 295 /* Not needed, but good for debugging */ 302 memsetb(thread->kstack, THREAD_STACK_SIZE * 1 << STACK_FRAMES, 0);296 memsetb(thread->kstack, STACK_SIZE, 0); 303 297 304 298 irq_spinlock_lock(&tidlock, true); … … 308 302 context_save(&thread->saved_context); 309 303 context_set(&thread->saved_context, FADDR(cushion), 310 (uintptr_t) thread->kstack, THREAD_STACK_SIZE);304 (uintptr_t) thread->kstack, STACK_SIZE); 311 305 312 306 the_initialize((the_t *) thread->kstack); … … 605 599 printf("%-8" PRIu64 " %-14s %10p %-8s %10p %-5" PRIu32 "\n", 606 600 thread->tid, name, thread, thread_states[thread->state], 607 thread->task, thread->task->cont ext);601 thread->task, thread->task->container); 608 602 #endif 609 603 … … 617 611 printf("%-8" PRIu64 " %-14s %18p %-8s %18p %-5" PRIu32 "\n", 618 612 thread->tid, name, thread, thread_states[thread->state], 619 thread->task, thread->task->cont ext);613 thread->task, thread->task->container); 620 614 #endif 621 615 … … 658 652 else 659 653 printf("[id ] [name ] [address ] [state ] [task ]" 660 " [ct x]\n");654 " [ctn]\n"); 661 655 #endif 662 656 … … 667 661 } else 668 662 printf("[id ] [name ] [address ] [state ]" 669 " [task ] [ct x]\n");663 " [task ] [ctn]\n"); 670 664 #endif 671 665 -
kernel/generic/src/security/cap.c
r8d308b9 r9d47440 92 92 task_t *task = task_find_by_id(taskid); 93 93 94 if ((!task) || (!cont ext_check(CONTEXT, task->context))) {94 if ((!task) || (!container_check(CONTAINER, task->container))) { 95 95 irq_spinlock_unlock(&tasks_lock, true); 96 96 return (sysarg_t) ENOENT; … … 121 121 122 122 task_t *task = task_find_by_id(taskid); 123 if ((!task) || (!cont ext_check(CONTEXT, task->context))) {123 if ((!task) || (!container_check(CONTAINER, task->container))) { 124 124 irq_spinlock_unlock(&tasks_lock, true); 125 125 return (sysarg_t) ENOENT; -
kernel/generic/src/synch/spinlock.c
r8d308b9 r9d47440 96 96 * run in a simulator) that caused problems with both 97 97 * printf_lock and the framebuffer lock. 98 *99 98 */ 100 99 if (lock->name[0] == '*') -
kernel/generic/src/syscall/syscall.c
r8d308b9 r9d47440 161 161 /* Event notification syscalls. */ 162 162 (syshandler_t) sys_event_subscribe, 163 (syshandler_t) sys_event_unmask, 163 164 164 165 /* Capabilities related syscalls. */
Note:
See TracChangeset
for help on using the changeset viewer.
