- Timestamp:
- 2012-08-08T08:46:22Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 30c0826
- Parents:
- bc216a0 (diff), 1d01cca (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:
-
- 3 added
- 37 edited
-
Makefile (modified) (1 diff)
-
arch/abs32le/include/mm/page.h (modified) (2 diffs)
-
arch/amd64/include/mm/page.h (modified) (2 diffs)
-
arch/amd64/src/asm.S (modified) (2 diffs)
-
arch/amd64/src/boot/multiboot.S (modified) (3 diffs)
-
arch/amd64/src/boot/multiboot2.S (modified) (2 diffs)
-
arch/amd64/src/boot/vesa_ret.inc (modified) (1 diff)
-
arch/amd64/src/mm/page.c (modified) (1 diff)
-
arch/arm32/include/mm/page.h (modified) (5 diffs)
-
arch/ia32/include/mm/page.h (modified) (2 diffs)
-
arch/ia32/src/boot/multiboot.S (modified) (3 diffs)
-
arch/ia32/src/boot/multiboot2.S (modified) (2 diffs)
-
arch/ia32/src/boot/vesa_prot.inc (modified) (1 diff)
-
arch/ia32/src/boot/vesa_real.inc (modified) (1 diff)
-
arch/ia32/src/boot/vesa_ret.inc (modified) (1 diff)
-
arch/ia32/src/mm/page.c (modified) (1 diff)
-
arch/ia32/src/smp/apic.c (modified) (7 diffs)
-
arch/ia64/Makefile.inc (modified) (1 diff)
-
arch/mips32/Makefile.inc (modified) (2 diffs)
-
arch/mips32/include/mm/page.h (modified) (2 diffs)
-
arch/mips64/Makefile.inc (modified) (2 diffs)
-
arch/ppc32/include/mm/page.h (modified) (2 diffs)
-
arch/sparc64/src/smp/sun4u/ipi.c (modified) (1 diff)
-
genarch/include/mm/page_pt.h (modified) (1 diff)
-
genarch/src/mm/page_ht.c (modified) (2 diffs)
-
genarch/src/mm/page_pt.c (modified) (7 diffs)
-
generic/include/console/prompt.h (added)
-
generic/include/debug.h (modified) (1 diff)
-
generic/include/interrupt.h (modified) (2 diffs)
-
generic/include/ipc/irq.h (modified) (1 diff)
-
generic/include/symtab.h (modified) (1 diff)
-
generic/include/symtab_lookup.h (added)
-
generic/src/console/kconsole.c (modified) (8 diffs)
-
generic/src/console/prompt.c (added)
-
generic/src/debug/symtab.c (modified) (5 diffs)
-
generic/src/interrupt/interrupt.c (modified) (3 diffs)
-
generic/src/ipc/irq.c (modified) (18 diffs)
-
generic/src/lib/str.c (modified) (3 diffs)
-
generic/src/mm/as.c (modified) (3 diffs)
-
generic/src/mm/tlb.c (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
kernel/Makefile
rbc216a0 rda68871a 197 197 generic/src/console/chardev.c \ 198 198 generic/src/console/console.c \ 199 generic/src/console/prompt.c \ 199 200 generic/src/cpu/cpu.c \ 200 201 generic/src/cpu/cpu_mask.c \ -
kernel/arch/abs32le/include/mm/page.h
rbc216a0 rda68871a 105 105 set_pt_flags((pte_t *) (ptl3), (size_t) (i), (x)) 106 106 107 /* Set PTE present bit accessors for each level. */ 108 #define SET_PTL1_PRESENT_ARCH(ptl0, i) \ 109 set_pt_present((pte_t *) (ptl0), (size_t) (i)) 110 #define SET_PTL2_PRESENT_ARCH(ptl1, i) 111 #define SET_PTL3_PRESENT_ARCH(ptl2, i) 112 #define SET_FRAME_PRESENT_ARCH(ptl3, i) \ 113 set_pt_present((pte_t *) (ptl3), (size_t) (i)) 114 107 115 /* Macros for querying the last level entries. */ 108 116 #define PTE_VALID_ARCH(p) \ … … 173 181 } 174 182 183 NO_TRACE static inline void set_pt_present(pte_t *pt, size_t i) 184 WRITES(ARRAY_RANGE(pt, PTL0_ENTRIES_ARCH)) 185 REQUIRES_ARRAY_MUTABLE(pt, PTL0_ENTRIES_ARCH) 186 { 187 pte_t *p = &pt[i]; 188 189 p->present = 1; 190 } 191 175 192 extern void page_arch_init(void); 176 193 extern void page_fault(unsigned int, istate_t *); -
kernel/arch/amd64/include/mm/page.h
rbc216a0 rda68871a 119 119 set_pt_flags((pte_t *) (ptl3), (size_t) (i), (x)) 120 120 121 /* Set PTE present bit accessors for each level. */ 122 #define SET_PTL1_PRESENT_ARCH(ptl0, i) \ 123 set_pt_present((pte_t *) (ptl0), (size_t) (i)) 124 #define SET_PTL2_PRESENT_ARCH(ptl1, i) \ 125 set_pt_present((pte_t *) (ptl1), (size_t) (i)) 126 #define SET_PTL3_PRESENT_ARCH(ptl2, i) \ 127 set_pt_present((pte_t *) (ptl2), (size_t) (i)) 128 #define SET_FRAME_PRESENT_ARCH(ptl3, i) \ 129 set_pt_present((pte_t *) (ptl3), (size_t) (i)) 130 121 131 /* Macros for querying the last-level PTE entries. */ 122 132 #define PTE_VALID_ARCH(p) \ … … 215 225 } 216 226 227 NO_TRACE static inline void set_pt_present(pte_t *pt, size_t i) 228 { 229 pte_t *p = &pt[i]; 230 231 p->present = 1; 232 } 233 217 234 extern void page_arch_init(void); 218 235 extern void page_fault(unsigned int, istate_t *); -
kernel/arch/amd64/src/asm.S
rbc216a0 rda68871a 362 362 */ 363 363 call syscall_handler 364 364 365 /* 366 * Test if the saved return address is canonical and not-kernel. 367 * We do this by looking at the 16 most significant bits 368 * of the saved return address (two bytes at offset 6). 369 */ 370 testw $0xffff, ISTATE_OFFSET_RIP+6(%rsp) 371 jnz bad_rip 372 365 373 cli 366 374 … … 388 396 sysretq 389 397 398 bad_rip: 399 movq %rsp, %rdi 400 movabs $bad_rip_msg, %rsi 401 xorb %al, %al 402 callq fault_from_uspace 403 /* not reached */ 404 405 bad_rip_msg: 406 .asciz "Invalid instruction pointer." 407 390 408 /** Print Unicode character to EGA display. 391 409 * -
kernel/arch/amd64/src/boot/multiboot.S
rbc216a0 rda68871a 76 76 77 77 multiboot_image_start: 78 cli 78 79 cld 79 80 … … 81 82 movl $START_STACK, %esp 82 83 83 /* Initialize Global Descriptor Table register */ 84 /* 85 * Initialize Global Descriptor Table and 86 * Interrupt Descriptor Table registers 87 */ 84 88 lgdtl bootstrap_gdtr 89 lidtl bootstrap_idtr 85 90 86 91 /* Kernel data + stack */ … … 645 650 .section K_DATA_START, "aw", @progbits 646 651 652 .global bootstrap_idtr 653 bootstrap_idtr: 654 .word 0 655 .long 0 656 647 657 .global bootstrap_gdtr 648 658 bootstrap_gdtr: -
kernel/arch/amd64/src/boot/multiboot2.S
rbc216a0 rda68871a 116 116 117 117 multiboot2_image_start: 118 cli 118 119 cld 119 120 … … 121 122 movl $START_STACK, %esp 122 123 123 /* Initialize Global Descriptor Table register */ 124 /* 125 * Initialize Global Descriptor Table and 126 * Interrupt Descriptor Table registers 127 */ 124 128 lgdtl bootstrap_gdtr 129 lidtl bootstrap_idtr 125 130 126 131 /* Kernel data + stack */ -
kernel/arch/amd64/src/boot/vesa_ret.inc
rbc216a0 rda68871a 1 1 .code32 2 2 vesa_init_protected: 3 cli 3 4 cld 4 5 -
kernel/arch/amd64/src/mm/page.c
rbc216a0 rda68871a 57 57 uintptr_t cur; 58 58 unsigned int identity_flags = 59 PAGE_ CACHEABLE | PAGE_EXEC | PAGE_GLOBAL | PAGE_WRITE;59 PAGE_GLOBAL | PAGE_CACHEABLE | PAGE_EXEC | PAGE_WRITE | PAGE_READ; 60 60 61 61 page_mapping_operations = &pt_mapping_operations; -
kernel/arch/arm32/include/mm/page.h
rbc216a0 rda68871a 40 40 #include <mm/mm.h> 41 41 #include <arch/exception.h> 42 #include <arch/barrier.h> 42 43 #include <trace.h> 43 44 … … 109 110 #define SET_FRAME_FLAGS_ARCH(ptl3, i, x) \ 110 111 set_pt_level1_flags((pte_t *) (ptl3), (size_t) (i), (x)) 112 113 /* Set PTE present bit accessors for each level. */ 114 #define SET_PTL1_PRESENT_ARCH(ptl0, i) \ 115 set_pt_level0_present((pte_t *) (ptl0), (size_t) (i)) 116 #define SET_PTL2_PRESENT_ARCH(ptl1, i) 117 #define SET_PTL3_PRESENT_ARCH(ptl2, i) 118 #define SET_FRAME_PRESENT_ARCH(ptl3, i) \ 119 set_pt_level1_present((pte_t *) (ptl3), (size_t) (i)) 111 120 112 121 /* Macros for querying the last-level PTE entries. */ … … 267 276 } 268 277 278 NO_TRACE static inline void set_pt_level0_present(pte_t *pt, size_t i) 279 { 280 pte_level0_t *p = &pt[i].l0; 281 282 p->should_be_zero = 0; 283 write_barrier(); 284 p->descriptor_type = PTE_DESCRIPTOR_COARSE_TABLE; 285 } 269 286 270 287 /** Sets flags of level 1 page table entry. … … 283 300 pte_level1_t *p = &pt[i].l1; 284 301 285 if (flags & PAGE_NOT_PRESENT) {302 if (flags & PAGE_NOT_PRESENT) 286 303 p->descriptor_type = PTE_DESCRIPTOR_NOT_PRESENT; 287 p->access_permission_3 = 1; 288 } else { 304 else 289 305 p->descriptor_type = PTE_DESCRIPTOR_SMALL_PAGE; 290 p->access_permission_3 = p->access_permission_0;291 }292 306 293 307 p->cacheable = p->bufferable = (flags & PAGE_CACHEABLE) != 0; … … 312 326 } 313 327 314 328 NO_TRACE static inline void set_pt_level1_present(pte_t *pt, size_t i) 329 { 330 pte_level1_t *p = &pt[i].l1; 331 332 p->descriptor_type = PTE_DESCRIPTOR_SMALL_PAGE; 333 } 334 315 335 extern void page_arch_init(void); 316 336 317 318 337 #endif /* __ASM__ */ 319 338 -
kernel/arch/ia32/include/mm/page.h
rbc216a0 rda68871a 115 115 set_pt_flags((pte_t *) (ptl3), (size_t) (i), (x)) 116 116 117 /* Set PTE present bit accessors for each level. */ 118 #define SET_PTL1_PRESENT_ARCH(ptl0, i) \ 119 set_pt_present((pte_t *) (ptl0), (size_t) (i)) 120 #define SET_PTL2_PRESENT_ARCH(ptl1, i) 121 #define SET_PTL3_PRESENT_ARCH(ptl2, i) 122 #define SET_FRAME_PRESENT_ARCH(ptl3, i) \ 123 set_pt_present((pte_t *) (ptl3), (size_t) (i)) 124 117 125 /* Macros for querying the last level entries. */ 118 126 #define PTE_VALID_ARCH(p) \ … … 194 202 } 195 203 204 NO_TRACE static inline void set_pt_present(pte_t *pt, size_t i) 205 { 206 pte_t *p = &pt[i]; 207 208 p->present = 1; 209 } 210 196 211 extern void page_arch_init(void); 197 212 extern void page_fault(unsigned int, istate_t *); -
kernel/arch/ia32/src/boot/multiboot.S
rbc216a0 rda68871a 73 73 74 74 multiboot_image_start: 75 cli 75 76 cld 76 77 … … 78 79 movl $START_STACK, %esp 79 80 80 /* Initialize Global Descriptor Table register */ 81 /* 82 * Initialize Global Descriptor Table and 83 * Interrupt Descriptor Table registers 84 */ 81 85 lgdtl bootstrap_gdtr 86 lidtl bootstrap_idtr 82 87 83 88 /* Kernel data + stack */ … … 701 706 page_directory: 702 707 .space 4096, 0 708 709 .global bootstrap_idtr 710 bootstrap_idtr: 711 .word 0 712 .long 0 703 713 704 714 .global bootstrap_gdtr -
kernel/arch/ia32/src/boot/multiboot2.S
rbc216a0 rda68871a 114 114 115 115 multiboot2_image_start: 116 cli 116 117 cld 117 118 … … 119 120 movl $START_STACK, %esp 120 121 121 /* Initialize Global Descriptor Table register */ 122 /* 123 * Initialize Global Descriptor Table and 124 * Interrupt Descriptor Table registers 125 */ 122 126 lgdtl bootstrap_gdtr 127 lidtl bootstrap_idtr 123 128 124 129 /* Kernel data + stack */ -
kernel/arch/ia32/src/boot/vesa_prot.inc
rbc216a0 rda68871a 88 88 /* Returned back to protected mode */ 89 89 90 /* 91 * Initialize Global Descriptor Table and 92 * Interrupt Descriptor Table registers 93 */ 94 lgdtl bootstrap_gdtr 95 lidtl bootstrap_idtr 96 90 97 movzx %ax, %ecx 91 98 mov %ecx, KA2PA(bfb_scanline) -
kernel/arch/ia32/src/boot/vesa_real.inc
rbc216a0 rda68871a 30 30 .code32 31 31 vesa_init: 32 lidtl vesa_idtr 32 33 jmp $GDT_SELECTOR(VESA_INIT_DES), $vesa_init_real - vesa_init 34 35 vesa_idtr: 36 .word 0x3ff 37 .long 0 33 38 34 39 .code16 -
kernel/arch/ia32/src/boot/vesa_ret.inc
rbc216a0 rda68871a 1 1 .code32 2 2 vesa_init_protected: 3 cli 3 4 cld 4 5 -
kernel/arch/ia32/src/mm/page.c
rbc216a0 rda68871a 71 71 for (cur = 0; cur < min(config.identity_size, config.physmem_end); 72 72 cur += FRAME_SIZE) { 73 flags = PAGE_CACHEABLE | PAGE_WRITE; 74 if ((PA2KA(cur) >= config.base) && 75 (PA2KA(cur) < config.base + config.kernel_size)) 76 flags |= PAGE_GLOBAL; 73 flags = PAGE_GLOBAL | PAGE_CACHEABLE | PAGE_WRITE | PAGE_READ; 77 74 page_mapping_insert(AS_KERNEL, PA2KA(cur), cur, flags); 78 75 } -
kernel/arch/ia32/src/smp/apic.c
rbc216a0 rda68871a 259 259 } 260 260 261 static void ipi_wait_for_idle(void) 261 /* Waits for the destination cpu to accept the previous ipi. */ 262 static void l_apic_wait_for_delivery(void) 262 263 { 263 264 icr_t icr; 264 265 265 /* Wait for the destination cpu to accept the previous ipi. */266 266 do { 267 267 icr.lo = l_apic[ICRlo]; … … 281 281 282 282 /* Wait for a destination cpu to accept our previous ipi. */ 283 ipi_wait_for_idle();283 l_apic_wait_for_delivery(); 284 284 285 285 icr.lo = l_apic[ICRlo]; … … 298 298 l_apic[ICRlo] = icr.lo; 299 299 300 #ifdef CONFIG_DEBUG301 icr.lo = l_apic[ICRlo];302 if (icr.delivs == DELIVS_PENDING) {303 printf("IPI is pending.\n");304 }305 #endif306 307 300 return apic_poll_errors(); 308 301 } … … 320 313 321 314 /* Wait for a destination cpu to accept our previous ipi. */ 322 ipi_wait_for_idle();315 l_apic_wait_for_delivery(); 323 316 324 317 icr.lo = l_apic[ICRlo]; … … 332 325 l_apic[ICRlo] = icr.lo; 333 326 334 icr.lo = l_apic[ICRlo];335 if (icr.delivs == DELIVS_PENDING) {336 #ifdef CONFIG_DEBUG337 printf("IPI is pending.\n");338 #endif339 }340 341 327 return apic_poll_errors(); 342 328 } … … 379 365 return 0; 380 366 367 l_apic_wait_for_delivery(); 368 381 369 icr.lo = l_apic[ICRlo]; 382 if (icr.delivs == DELIVS_PENDING) {383 #ifdef CONFIG_DEBUG384 printf("IPI is pending.\n");385 #endif386 }387 388 370 icr.delmod = DELMOD_INIT; 389 371 icr.destmod = DESTMOD_PHYS; … … 518 500 dfr.model = MODEL_FLAT; 519 501 l_apic[DFR] = dfr.value; 520 521 if (CPU->arch.id != l_apic_id()) {522 #ifdef CONFIG_DEBUG523 printf("lapic error: LAPIC ID (%" PRIu8 ") and hw ID assigned by BSP"524 " (%u) differ. Correcting to LAPIC ID.\n", l_apic_id(),525 CPU->arch.id);526 #endif527 CPU->arch.id = l_apic_id();528 }529 530 502 } 531 503 -
kernel/arch/ia64/Makefile.inc
rbc216a0 rda68871a 30 30 BFD_ARCH = ia64-elf64 31 31 32 CMN1 = -mconstant-gp -fno-unwind-tables -mfixed-range=f32-f127 32 # 33 # FIXME: 34 # 35 # The -fno-selective-scheduling and -fno-selective-scheduling2 options 36 # should be removed as soon as a bug in GCC concerning unchecked 37 # speculative loads is fixed. 38 # 39 # See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53975 for reference. 40 # 41 42 CMN1 = -mconstant-gp -fno-unwind-tables -mfixed-range=f32-f127 -fno-selective-scheduling -fno-selective-scheduling2 33 43 GCC_CFLAGS += $(CMN1) 34 44 ICC_CFLAGS += $(CMN1) -
kernel/arch/mips32/Makefile.inc
rbc216a0 rda68871a 29 29 BFD_ARCH = mips 30 30 BFD = binary 31 GCC_CFLAGS += -m no-abicalls -G 0 -fno-zero-initialized-in-bss -mips3 -mabi=3231 GCC_CFLAGS += -msoft-float -mno-abicalls -G 0 -fno-zero-initialized-in-bss -mips3 -mabi=32 32 32 33 33 BITS = 32 … … 48 48 BFD_NAME = elf32-tradlittlemips 49 49 ENDIANESS = LE 50 GCC_CFLAGS += -mhard-float51 50 endif 52 51 -
kernel/arch/mips32/include/mm/page.h
rbc216a0 rda68871a 128 128 set_pt_flags((pte_t *) (ptl3), (size_t) (i), (x)) 129 129 130 /* Set PTE present bit accessors for each level. */ 131 #define SET_PTL1_PRESENT_ARCH(ptl0, i) \ 132 set_pt_present((pte_t *) (ptl0), (size_t) (i)) 133 #define SET_PTL2_PRESENT_ARCH(ptl1, i) 134 #define SET_PTL3_PRESENT_ARCH(ptl2, i) 135 #define SET_FRAME_PRESENT_ARCH(ptl3, i) \ 136 set_pt_present((pte_t *) (ptl3), (size_t) (i)) 137 130 138 /* Last-level info macros. */ 131 139 #define PTE_VALID_ARCH(pte) (*((uint32_t *) (pte)) != 0) … … 182 190 } 183 191 192 NO_TRACE static inline void set_pt_present(pte_t *pt, size_t i) 193 { 194 pte_t *p = &pt[i]; 195 196 p->p = 1; 197 } 198 199 184 200 extern void page_arch_init(void); 185 201 -
kernel/arch/mips64/Makefile.inc
rbc216a0 rda68871a 29 29 BFD_ARCH = mips:4000 30 30 BFD = binary 31 GCC_CFLAGS += -m no-abicalls -G 0 -fno-zero-initialized-in-bss -mips3 -mabi=6431 GCC_CFLAGS += -msoft-float -mno-abicalls -G 0 -fno-zero-initialized-in-bss -mips3 -mabi=64 32 32 AFLAGS = -64 33 33 … … 40 40 BFD_NAME = elf64-tradlittlemips 41 41 ENDIANESS = LE 42 GCC_CFLAGS += -mhard-float43 42 endif 44 43 -
kernel/arch/ppc32/include/mm/page.h
rbc216a0 rda68871a 128 128 #define SET_FRAME_FLAGS_ARCH(ptl3, i, x) \ 129 129 set_pt_flags((pte_t *) (ptl3), (size_t) (i), (x)) 130 131 /* Set PTE present accessors for each level. */ 132 #define SET_PTL1_PRESENT_ARCH(ptl0, i) \ 133 set_pt_present((pte_t *) (ptl0), (size_t) (i)) 134 135 #define SET_PTL2_PRESENT_ARCH(ptl1, i) 136 #define SET_PTL3_PRESENT_ARCH(ptl2, i) 137 138 #define SET_FRAME_PRESENT_ARCH(ptl3, i) \ 139 set_pt_present((pte_t *) (ptl3), (size_t) (i)) 130 140 131 141 /* Macros for querying the last-level PTEs. */ … … 175 185 } 176 186 187 NO_TRACE static inline void set_pt_present(pte_t *pt, size_t i) 188 { 189 pte_t *entry = &pt[i]; 190 191 entry->present = 1; 192 } 193 177 194 extern void page_arch_init(void); 178 195 -
kernel/arch/sparc64/src/smp/sun4u/ipi.c
rbc216a0 rda68871a 124 124 (void) interrupts_disable(); 125 125 } 126 } while ( done);126 } while (!done); 127 127 128 128 preemption_enable(); -
kernel/genarch/include/mm/page_pt.h
rbc216a0 rda68871a 115 115 116 116 /* 117 * These macros are provided to set the present bit within the page tables. 118 * 119 */ 120 #define SET_PTL1_PRESENT(ptl0, i) SET_PTL1_PRESENT_ARCH(ptl0, i) 121 #define SET_PTL2_PRESENT(ptl1, i) SET_PTL2_PRESENT_ARCH(ptl1, i) 122 #define SET_PTL3_PRESENT(ptl2, i) SET_PTL3_PRESENT_ARCH(ptl2, i) 123 #define SET_FRAME_PRESENT(ptl3, i) SET_FRAME_PRESENT_ARCH(ptl3, i) 124 125 /* 117 126 * Macros for querying the last-level PTEs. 118 127 * -
kernel/genarch/src/mm/page_ht.c
rbc216a0 rda68871a 45 45 #include <typedefs.h> 46 46 #include <arch/asm.h> 47 #include <arch/barrier.h> 47 48 #include <synch/spinlock.h> 48 49 #include <arch.h> … … 207 208 pte->page = ALIGN_DOWN(page, PAGE_SIZE); 208 209 pte->frame = ALIGN_DOWN(frame, FRAME_SIZE); 210 211 write_barrier(); 209 212 210 213 hash_table_insert(&page_ht, key, &pte->link); -
kernel/genarch/src/mm/page_pt.c
rbc216a0 rda68871a 43 43 #include <arch/mm/page.h> 44 44 #include <arch/mm/as.h> 45 #include <arch/barrier.h> 45 46 #include <typedefs.h> 46 47 #include <arch/asm.h> … … 86 87 SET_PTL1_ADDRESS(ptl0, PTL0_INDEX(page), KA2PA(newpt)); 87 88 SET_PTL1_FLAGS(ptl0, PTL0_INDEX(page), 88 PAGE_ PRESENT | PAGE_USER | PAGE_EXEC | PAGE_CACHEABLE |89 PAGE_NOT_PRESENT | PAGE_USER | PAGE_EXEC | PAGE_CACHEABLE | 89 90 PAGE_WRITE); 91 write_barrier(); 92 SET_PTL1_PRESENT(ptl0, PTL0_INDEX(page)); 90 93 } 91 94 … … 98 101 SET_PTL2_ADDRESS(ptl1, PTL1_INDEX(page), KA2PA(newpt)); 99 102 SET_PTL2_FLAGS(ptl1, PTL1_INDEX(page), 100 PAGE_ PRESENT | PAGE_USER | PAGE_EXEC | PAGE_CACHEABLE |103 PAGE_NOT_PRESENT | PAGE_USER | PAGE_EXEC | PAGE_CACHEABLE | 101 104 PAGE_WRITE); 105 write_barrier(); 106 SET_PTL2_PRESENT(ptl1, PTL1_INDEX(page)); 102 107 } 103 108 … … 110 115 SET_PTL3_ADDRESS(ptl2, PTL2_INDEX(page), KA2PA(newpt)); 111 116 SET_PTL3_FLAGS(ptl2, PTL2_INDEX(page), 112 PAGE_ PRESENT | PAGE_USER | PAGE_EXEC | PAGE_CACHEABLE |117 PAGE_NOT_PRESENT | PAGE_USER | PAGE_EXEC | PAGE_CACHEABLE | 113 118 PAGE_WRITE); 119 write_barrier(); 120 SET_PTL3_PRESENT(ptl2, PTL2_INDEX(page)); 114 121 } 115 122 … … 117 124 118 125 SET_FRAME_ADDRESS(ptl3, PTL3_INDEX(page), frame); 119 SET_FRAME_FLAGS(ptl3, PTL3_INDEX(page), flags); 126 SET_FRAME_FLAGS(ptl3, PTL3_INDEX(page), flags | PAGE_NOT_PRESENT); 127 write_barrier(); 128 SET_FRAME_PRESENT(ptl3, PTL3_INDEX(page)); 120 129 } 121 130 … … 279 288 if (GET_PTL1_FLAGS(ptl0, PTL0_INDEX(page)) & PAGE_NOT_PRESENT) 280 289 return NULL; 290 291 read_barrier(); 281 292 282 293 pte_t *ptl1 = (pte_t *) PA2KA(GET_PTL1_ADDRESS(ptl0, PTL0_INDEX(page))); 283 294 if (GET_PTL2_FLAGS(ptl1, PTL1_INDEX(page)) & PAGE_NOT_PRESENT) 284 295 return NULL; 296 297 #if (PTL1_ENTRIES != 0) 298 read_barrier(); 299 #endif 285 300 286 301 pte_t *ptl2 = (pte_t *) PA2KA(GET_PTL2_ADDRESS(ptl1, PTL1_INDEX(page))); 287 302 if (GET_PTL3_FLAGS(ptl2, PTL2_INDEX(page)) & PAGE_NOT_PRESENT) 288 303 return NULL; 304 305 #if (PTL2_ENTRIES != 0) 306 read_barrier(); 307 #endif 289 308 290 309 pte_t *ptl3 = (pte_t *) PA2KA(GET_PTL3_ADDRESS(ptl2, PTL2_INDEX(page))); … … 346 365 SET_PTL1_ADDRESS(ptl0, PTL0_INDEX(addr), KA2PA(l1)); 347 366 SET_PTL1_FLAGS(ptl0, PTL0_INDEX(addr), 348 PAGE_PRESENT | PAGE_USER | PAGE_ EXEC | PAGE_CACHEABLE |349 PAGE_ WRITE);367 PAGE_PRESENT | PAGE_USER | PAGE_CACHEABLE | 368 PAGE_EXEC | PAGE_WRITE | PAGE_READ); 350 369 } 351 370 } -
kernel/generic/include/debug.h
rbc216a0 rda68871a 37 37 38 38 #include <panic.h> 39 #include <symtab .h>39 #include <symtab_lookup.h> 40 40 41 41 #define CALLER ((uintptr_t) __builtin_return_address(0)) -
kernel/generic/include/interrupt.h
rbc216a0 rda68871a 38 38 #include <arch/interrupt.h> 39 39 #include <print.h> 40 #include <stdarg.h> 40 41 #include <typedefs.h> 41 42 #include <proc/task.h> … … 58 59 extern exc_table_t exc_table[]; 59 60 61 extern void fault_from_uspace(istate_t *, const char *, ...); 60 62 extern void fault_if_from_uspace(istate_t *, const char *, ...) 61 63 PRINTF_ATTRIBUTE(2, 3); -
kernel/generic/include/ipc/irq.h
rbc216a0 rda68871a 37 37 38 38 /** Maximum number of IPC IRQ programmed I/O ranges. */ 39 #define IRQ_MAX_RANGE_COUNT 839 #define IRQ_MAX_RANGE_COUNT 8 40 40 41 41 /** Maximum length of IPC IRQ program. */ 42 #define IRQ_MAX_PROG_SIZE 2 042 #define IRQ_MAX_PROG_SIZE 256 43 43 44 44 #include <ipc/ipc.h> -
kernel/generic/include/symtab.h
rbc216a0 rda68871a 36 36 #define KERN_SYMTAB_H_ 37 37 38 #include <typedefs.h> 38 #include <symtab_lookup.h> 39 #include <console/chardev.h> 39 40 40 #define MAX_SYMBOL_NAME 6441 42 struct symtab_entry {43 uint64_t address_le;44 char symbol_name[MAX_SYMBOL_NAME];45 };46 47 extern int symtab_name_lookup(uintptr_t, const char **, uintptr_t *);48 extern const char *symtab_fmt_name_lookup(uintptr_t);49 extern int symtab_addr_lookup(const char *, uintptr_t *);50 41 extern void symtab_print_search(const char *); 51 extern int symtab_compl(char *, size_t); 52 53 #ifdef CONFIG_SYMTAB 54 55 /** Symtable linked together by build process 56 * 57 */ 58 extern struct symtab_entry symbol_table[]; 59 60 #endif /* CONFIG_SYMTAB */ 42 extern int symtab_compl(char *, size_t, indev_t *); 61 43 62 44 #endif -
kernel/generic/src/console/kconsole.c
rbc216a0 rda68871a 43 43 #include <console/chardev.h> 44 44 #include <console/cmd.h> 45 #include <console/prompt.h> 45 46 #include <print.h> 46 47 #include <panic.h> … … 202 203 * 203 204 */ 204 NO_TRACE static int cmdtab_compl(char *input, size_t size )205 NO_TRACE static int cmdtab_compl(char *input, size_t size, indev_t *indev) 205 206 { 206 207 const char *name = input; 207 208 208 209 size_t found = 0; 210 211 /* 212 * Maximum Match Length: Length of longest matching common 213 * substring in case more than one match is found. 214 */ 215 size_t max_match_len = size; 216 size_t max_match_len_tmp = size; 217 size_t input_len = str_length(input); 209 218 link_t *pos = NULL; 210 219 const char *hint; 211 220 char *output = malloc(MAX_CMDLINE, 0); 221 size_t hints_to_show = MAX_TAB_HINTS - 1; 222 size_t total_hints_shown = 0; 223 bool continue_showing_hints = true; 212 224 213 225 output[0] = 0; … … 219 231 pos = pos->next; 220 232 found++; 233 } 234 235 /* 236 * If the number of possible completions is more than MAX_TAB_HINTS, 237 * ask the user whether to display them or not. 238 */ 239 if (found > MAX_TAB_HINTS) { 240 printf("\n"); 241 continue_showing_hints = 242 console_prompt_display_all_hints(indev, found); 221 243 } 222 244 … … 226 248 while (cmdtab_search_one(name, &pos)) { 227 249 cmd_info_t *hlp = list_get_instance(pos, cmd_info_t, link); 228 printf("%s (%s)\n", hlp->name, hlp->description); 250 251 if (continue_showing_hints) { 252 printf("%s (%s)\n", hlp->name, hlp->description); 253 --hints_to_show; 254 ++total_hints_shown; 255 256 if ((hints_to_show == 0) && (total_hints_shown != found)) { 257 /* Ask user to continue */ 258 continue_showing_hints = 259 console_prompt_more_hints(indev, &hints_to_show); 260 } 261 } 262 229 263 pos = pos->next; 230 } 264 265 for (max_match_len_tmp = 0; 266 (output[max_match_len_tmp] == 267 hlp->name[input_len + max_match_len_tmp]) && 268 (max_match_len_tmp < max_match_len); ++max_match_len_tmp); 269 270 max_match_len = max_match_len_tmp; 271 } 272 273 /* Keep only the characters common in all completions */ 274 output[max_match_len] = 0; 231 275 } 232 276 … … 281 325 continue; 282 326 283 /* Find the beginning of the word 284 and copy it to tmp */ 327 /* 328 * Find the beginning of the word 329 * and copy it to tmp 330 */ 285 331 size_t beg; 286 332 for (beg = position - 1; (beg > 0) && (!isspace(current[beg])); … … 295 341 if (beg == 0) { 296 342 /* Command completion */ 297 found = cmdtab_compl(tmp, STR_BOUNDS(MAX_CMDLINE) );343 found = cmdtab_compl(tmp, STR_BOUNDS(MAX_CMDLINE), indev); 298 344 } else { 299 345 /* Symbol completion */ 300 found = symtab_compl(tmp, STR_BOUNDS(MAX_CMDLINE) );346 found = symtab_compl(tmp, STR_BOUNDS(MAX_CMDLINE), indev); 301 347 } 302 348 303 349 if (found == 0) 304 350 continue; 305 306 if (found > 1) { 307 /* No unique hint, list was printed */ 308 printf("%s> ", prompt); 309 printf("%ls", current); 310 print_cc('\b', wstr_length(current) - position); 311 continue; 312 } 313 314 /* We have a hint */ 315 351 352 /* 353 * We have hints, possibly many. In case of more than one hint, 354 * tmp will contain the common prefix. 355 */ 316 356 size_t off = 0; 317 357 size_t i = 0; … … 319 359 if (!wstr_linsert(current, ch, position + i, MAX_CMDLINE)) 320 360 break; 361 321 362 i++; 322 363 } 364 365 if (found > 1) { 366 /* No unique hint, list was printed */ 367 printf("%s> ", prompt); 368 printf("%ls", current); 369 position += str_length(tmp); 370 print_cc('\b', wstr_length(current) - position); 371 continue; 372 } 373 374 /* We have a hint */ 323 375 324 376 printf("%ls", current + position); … … 541 593 /** Parse command line. 542 594 * 543 * @param cmdline Command line as read from input device. 595 * @param cmdline Command line as read from input device. 544 596 * @param size Size (in bytes) of the string. 545 597 * -
kernel/generic/src/debug/symtab.c
rbc216a0 rda68871a 43 43 #include <typedefs.h> 44 44 #include <errno.h> 45 #include <console/prompt.h> 45 46 46 47 /** Get name of a symbol that seems most likely to correspond to address. … … 209 210 * 210 211 */ 211 int symtab_compl(char *input, size_t size )212 int symtab_compl(char *input, size_t size, indev_t *indev) 212 213 { 213 214 #ifdef CONFIG_SYMTAB … … 227 228 char output[MAX_SYMBOL_NAME]; 228 229 230 /* 231 * Maximum Match Length: Length of longest matching common substring in 232 * case more than one match is found. 233 */ 234 size_t max_match_len = size; 235 size_t max_match_len_tmp = size; 236 size_t input_len = str_length(input); 237 char *sym_name; 238 size_t hints_to_show = MAX_TAB_HINTS - 1; 239 size_t total_hints_shown = 0; 240 bool continue_showing_hints = true; 241 229 242 output[0] = 0; 243 244 while ((hint = symtab_search_one(name, &pos))) 245 pos++; 246 247 pos = 0; 230 248 231 249 while ((hint = symtab_search_one(name, &pos))) { … … 235 253 pos++; 236 254 found++; 255 } 256 257 /* 258 * If the number of possible completions is more than MAX_TAB_HINTS, 259 * ask the user whether to display them or not. 260 */ 261 if (found > MAX_TAB_HINTS) { 262 printf("\n"); 263 continue_showing_hints = 264 console_prompt_display_all_hints(indev, found); 237 265 } 238 266 … … 241 269 pos = 0; 242 270 while (symtab_search_one(name, &pos)) { 243 printf("%s\n", symbol_table[pos].symbol_name);271 sym_name = symbol_table[pos].symbol_name; 244 272 pos++; 273 274 if (continue_showing_hints) { 275 /* We are still showing hints */ 276 printf("%s\n", sym_name); 277 --hints_to_show; 278 ++total_hints_shown; 279 280 if ((hints_to_show == 0) && (total_hints_shown != found)) { 281 /* Ask the user to continue */ 282 continue_showing_hints = 283 console_prompt_more_hints(indev, &hints_to_show); 284 } 285 } 286 287 for (max_match_len_tmp = 0; 288 (output[max_match_len_tmp] == 289 sym_name[input_len + max_match_len_tmp]) && 290 (max_match_len_tmp < max_match_len); ++max_match_len_tmp); 291 292 max_match_len = max_match_len_tmp; 245 293 } 294 295 /* Keep only the characters common in all completions */ 296 output[max_match_len] = 0; 246 297 } 247 298 -
kernel/generic/src/interrupt/interrupt.c
rbc216a0 rda68871a 50 50 #include <panic.h> 51 51 #include <print.h> 52 #include <stdarg.h> 52 53 #include <symtab.h> 53 54 #include <proc/thread.h> … … 163 164 } 164 165 165 /** Terminate thread and task if exception came from userspace. 166 * 167 */ 168 NO_TRACE void fault_if_from_uspace(istate_t *istate, const char *fmt, ...) 169 { 170 if (!istate_from_uspace(istate)) 171 return; 172 166 static NO_TRACE void fault_from_uspace_core(istate_t *istate, const char *fmt, va_list args) 167 { 173 168 printf("Task %s (%" PRIu64 ") killed due to an exception at " 174 169 "program counter %p.\n", TASK->name, TASK->taskid, … … 179 174 180 175 printf("Kill message: "); 176 vprintf(fmt, args); 177 printf("\n"); 178 179 task_kill_self(true); 180 } 181 182 /** Terminate thread and task after the exception came from userspace. 183 * 184 */ 185 NO_TRACE void fault_from_uspace(istate_t *istate, const char *fmt, ...) 186 { 187 va_list args; 188 189 va_start(args, fmt); 190 fault_from_uspace_core(istate, fmt, args); 191 va_end(args); 192 } 193 194 /** Terminate thread and task if exception came from userspace. 195 * 196 */ 197 NO_TRACE void fault_if_from_uspace(istate_t *istate, const char *fmt, ...) 198 { 199 if (!istate_from_uspace(istate)) 200 return; 181 201 182 202 va_list args; 183 203 va_start(args, fmt); 184 vprintf(fmt, args);204 fault_from_uspace_core(istate, fmt, args); 185 205 va_end(args); 186 printf("\n");187 188 task_kill_self(true);189 206 } 190 207 -
kernel/generic/src/ipc/irq.c
rbc216a0 rda68871a 39 39 * when interrupt is detected. The application may provide a simple 'top-half' 40 40 * handler as part of its registration, which can perform simple operations 41 * (read/write port/memory, add information to notification ipcmessage).41 * (read/write port/memory, add information to notification IPC message). 42 42 * 43 43 * The structure of a notification message is as follows: 44 44 * - IMETHOD: interface and method as registered by 45 45 * the SYS_IRQ_REGISTER syscall 46 * - ARG1: payload modified by a 'top-half' handler 47 * - ARG2: payload modified by a 'top-half' handler 48 * - ARG3: payload modified by a 'top-half' handler 49 * - ARG4: payload modified by a 'top-half' handler 50 * - ARG5: payload modified by a 'top-half' handler 46 * - ARG1: payload modified by a 'top-half' handler (scratch[1]) 47 * - ARG2: payload modified by a 'top-half' handler (scratch[2]) 48 * - ARG3: payload modified by a 'top-half' handler (scratch[3]) 49 * - ARG4: payload modified by a 'top-half' handler (scratch[4]) 50 * - ARG5: payload modified by a 'top-half' handler (scratch[5]) 51 51 * - in_phone_hash: interrupt counter (may be needed to assure correct order 52 52 * in multithreaded drivers) … … 87 87 static void ranges_unmap(irq_pio_range_t *ranges, size_t rangecount) 88 88 { 89 size_t i; 90 91 for (i = 0; i < rangecount; i++) { 89 for (size_t i = 0; i < rangecount; i++) { 92 90 #ifdef IO_SPACE_BOUNDARY 93 91 if ((void *) ranges[i].base >= IO_SPACE_BOUNDARY) … … 100 98 irq_cmd_t *cmds, size_t cmdcount) 101 99 { 102 uintptr_t *pbase;103 size_t i, j;104 105 100 /* Copy the physical base addresses aside. */ 106 pbase = malloc(rangecount * sizeof(uintptr_t), 0);107 for ( i = 0; i < rangecount; i++)101 uintptr_t *pbase = malloc(rangecount * sizeof(uintptr_t), 0); 102 for (size_t i = 0; i < rangecount; i++) 108 103 pbase[i] = ranges[i].base; 109 104 110 105 /* Map the PIO ranges into the kernel virtual address space. */ 111 for ( i = 0; i < rangecount; i++) {106 for (size_t i = 0; i < rangecount; i++) { 112 107 #ifdef IO_SPACE_BOUNDARY 113 108 if ((void *) ranges[i].base < IO_SPACE_BOUNDARY) … … 122 117 } 123 118 } 124 119 125 120 /* Rewrite the pseudocode addresses from physical to kernel virtual. */ 126 for ( i = 0; i < cmdcount; i++) {121 for (size_t i = 0; i < cmdcount; i++) { 127 122 uintptr_t addr; 128 123 size_t size; 129 124 130 125 /* Process only commands that use an address. */ 131 126 switch (cmds[i].cmd) { 132 127 case CMD_PIO_READ_8: 133 case CMD_PIO_WRITE_8:134 case CMD_PIO_WRITE_A_8:128 case CMD_PIO_WRITE_8: 129 case CMD_PIO_WRITE_A_8: 135 130 size = 1; 136 131 break; 137 case CMD_PIO_READ_16:138 case CMD_PIO_WRITE_16:139 case CMD_PIO_WRITE_A_16:132 case CMD_PIO_READ_16: 133 case CMD_PIO_WRITE_16: 134 case CMD_PIO_WRITE_A_16: 140 135 size = 2; 141 136 break; 142 case CMD_PIO_READ_32:143 case CMD_PIO_WRITE_32:144 case CMD_PIO_WRITE_A_32:137 case CMD_PIO_READ_32: 138 case CMD_PIO_WRITE_32: 139 case CMD_PIO_WRITE_A_32: 145 140 size = 4; 146 141 break; … … 149 144 continue; 150 145 } 151 146 152 147 addr = (uintptr_t) cmds[i].addr; 153 148 149 size_t j; 154 150 for (j = 0; j < rangecount; j++) { 155 156 151 /* Find the matching range. */ 157 152 if (!iswithin(pbase[j], ranges[j].size, addr, size)) 158 153 continue; 159 154 160 155 /* Switch the command to a kernel virtual address. */ 161 156 addr -= pbase[j]; 162 157 addr += ranges[j].base; 163 158 164 159 cmds[i].addr = (void *) addr; 165 160 break; 166 161 } 167 162 168 163 if (j == rangecount) { 169 164 /* … … 176 171 } 177 172 } 178 173 179 174 free(pbase); 175 return EOK; 176 } 177 178 /** Statically check the top-half pseudocode 179 * 180 * Check the top-half pseudocode for invalid or unsafe 181 * constructs. 182 * 183 */ 184 static int code_check(irq_cmd_t *cmds, size_t cmdcount) 185 { 186 for (size_t i = 0; i < cmdcount; i++) { 187 /* 188 * Check for accepted ranges. 189 */ 190 if (cmds[i].cmd >= CMD_LAST) 191 return EINVAL; 192 193 if (cmds[i].srcarg >= IPC_CALL_LEN) 194 return EINVAL; 195 196 if (cmds[i].dstarg >= IPC_CALL_LEN) 197 return EINVAL; 198 199 switch (cmds[i].cmd) { 200 case CMD_PREDICATE: 201 /* 202 * Check for control flow overflow. 203 * Note that jumping just beyond the last 204 * command is a correct behaviour. 205 */ 206 if (i + cmds[i].value > cmdcount) 207 return EINVAL; 208 209 break; 210 default: 211 break; 212 } 213 } 214 180 215 return EOK; 181 216 } … … 207 242 irq_pio_range_t *ranges = NULL; 208 243 irq_cmd_t *cmds = NULL; 209 244 210 245 irq_code_t *code = malloc(sizeof(*code), 0); 211 246 int rc = copy_from_uspace(code, ucode, sizeof(*code)); … … 222 257 if (rc != EOK) 223 258 goto error; 224 259 225 260 cmds = malloc(sizeof(code->cmds[0]) * code->cmdcount, 0); 226 261 rc = copy_from_uspace(cmds, code->cmds, … … 228 263 if (rc != EOK) 229 264 goto error; 230 265 266 rc = code_check(cmds, code->cmdcount); 267 if (rc != EOK) 268 goto error; 269 231 270 rc = ranges_map_and_apply(ranges, code->rangecount, cmds, 232 271 code->cmdcount); 233 272 if (rc != EOK) 234 273 goto error; 235 274 236 275 code->ranges = ranges; 237 276 code->cmds = cmds; 238 277 239 278 return code; 240 279 241 280 error: 242 281 if (cmds) 243 282 free(cmds); 283 244 284 if (ranges) 245 285 free(ranges); 286 246 287 free(code); 247 288 return NULL; … … 250 291 /** Register an answerbox as a receiving end for IRQ notifications. 251 292 * 252 * @param box Receiving answerbox. 253 * @param inr IRQ number. 254 * @param devno Device number. 255 * @param imethod Interface and method to be associated with the 256 * notification. 257 * @param ucode Uspace pointer to top-half pseudocode. 258 * @return EOK on success or a negative error code. 293 * @param box Receiving answerbox. 294 * @param inr IRQ number. 295 * @param devno Device number. 296 * @param imethod Interface and method to be associated with the 297 * notification. 298 * @param ucode Uspace pointer to top-half pseudocode. 299 * 300 * @return EOK on success or a negative error code. 259 301 * 260 302 */ … … 266 308 (sysarg_t) devno 267 309 }; 268 310 269 311 if ((inr < 0) || (inr > last_inr)) 270 312 return ELIMIT; … … 329 371 /** Unregister task from IRQ notification. 330 372 * 331 * @param box Answerbox associated with the notification. 332 * @param inr IRQ number. 333 * @param devno Device number. 334 * @return EOK on success or a negative error code. 373 * @param box Answerbox associated with the notification. 374 * @param inr IRQ number. 375 * @param devno Device number. 376 * 377 * @return EOK on success or a negative error code. 378 * 335 379 */ 336 380 int ipc_irq_unregister(answerbox_t *box, inr_t inr, devno_t devno) … … 340 384 (sysarg_t) devno 341 385 }; 342 386 343 387 if ((inr < 0) || (inr > last_inr)) 344 388 return ELIMIT; … … 436 480 /* Remove from the hash table. */ 437 481 hash_table_remove(&irq_uspace_hash_table, key, 2); 438 482 439 483 /* 440 484 * Release both locks so that we can free the pseudo code. … … 442 486 irq_spinlock_unlock(&box->irq_lock, false); 443 487 irq_spinlock_unlock(&irq_uspace_hash_table_lock, true); 444 488 445 489 code_free(irq->notif_cfg.code); 446 490 free(irq); … … 492 536 493 537 for (size_t i = 0; i < code->cmdcount; i++) { 494 uint32_t dstval;495 496 538 uintptr_t srcarg = code->cmds[i].srcarg; 497 539 uintptr_t dstarg = code->cmds[i].dstarg; 498 540 499 if (srcarg >= IPC_CALL_LEN)500 break;501 502 if (dstarg >= IPC_CALL_LEN)503 break;504 505 541 switch (code->cmds[i].cmd) { 506 542 case CMD_PIO_READ_8: 507 dstval = pio_read_8((ioport8_t *) code->cmds[i].addr); 508 if (dstarg) 509 scratch[dstarg] = dstval; 543 scratch[dstarg] = 544 pio_read_8((ioport8_t *) code->cmds[i].addr); 510 545 break; 511 546 case CMD_PIO_READ_16: 512 dstval = pio_read_16((ioport16_t *) code->cmds[i].addr); 513 if (dstarg) 514 scratch[dstarg] = dstval; 547 scratch[dstarg] = 548 pio_read_16((ioport16_t *) code->cmds[i].addr); 515 549 break; 516 550 case CMD_PIO_READ_32: 517 dstval = pio_read_32((ioport32_t *) code->cmds[i].addr); 518 if (dstarg) 519 scratch[dstarg] = dstval; 551 scratch[dstarg] = 552 pio_read_32((ioport32_t *) code->cmds[i].addr); 520 553 break; 521 554 case CMD_PIO_WRITE_8: … … 532 565 break; 533 566 case CMD_PIO_WRITE_A_8: 534 if (srcarg) { 535 pio_write_8((ioport8_t *) code->cmds[i].addr, 536 (uint8_t) scratch[srcarg]); 537 } 567 pio_write_8((ioport8_t *) code->cmds[i].addr, 568 (uint8_t) scratch[srcarg]); 538 569 break; 539 570 case CMD_PIO_WRITE_A_16: 540 if (srcarg) { 541 pio_write_16((ioport16_t *) code->cmds[i].addr, 542 (uint16_t) scratch[srcarg]); 543 } 571 pio_write_16((ioport16_t *) code->cmds[i].addr, 572 (uint16_t) scratch[srcarg]); 544 573 break; 545 574 case CMD_PIO_WRITE_A_32: 546 if (srcarg) { 547 pio_write_32((ioport32_t *) code->cmds[i].addr, 548 (uint32_t) scratch[srcarg]); 549 } 550 break; 551 case CMD_BTEST: 552 if ((srcarg) && (dstarg)) { 553 dstval = scratch[srcarg] & code->cmds[i].value; 554 scratch[dstarg] = dstval; 555 } 575 pio_write_32((ioport32_t *) code->cmds[i].addr, 576 (uint32_t) scratch[srcarg]); 577 break; 578 case CMD_LOAD: 579 scratch[dstarg] = code->cmds[i].value; 580 break; 581 case CMD_AND: 582 scratch[dstarg] = scratch[srcarg] & 583 code->cmds[i].value; 556 584 break; 557 585 case CMD_PREDICATE: 558 if ( (srcarg) && (!scratch[srcarg])) {586 if (scratch[srcarg] == 0) 559 587 i += code->cmds[i].value; 560 continue; 561 } 588 562 589 break; 563 590 case CMD_ACCEPT: … … 582 609 { 583 610 ASSERT(irq); 584 611 585 612 ASSERT(interrupts_disabled()); 586 613 ASSERT(irq_spinlock_locked(&irq->lock)); -
kernel/generic/src/lib/str.c
rbc216a0 rda68871a 457 457 * 458 458 * Do a char-by-char comparison of two NULL-terminated strings. 459 * The strings are considered equal iff they consist of the same 460 * characters on the minimum of their lengths. 459 * The strings are considered equal iff their length is equal 460 * and both strings consist of the same sequence of characters. 461 * 462 * A string S1 is less than another string S2 if it has a character with 463 * lower value at the first character position where the strings differ. 464 * If the strings differ in length, the shorter one is treated as if 465 * padded by characters with a value of zero. 461 466 * 462 467 * @param s1 First string to compare. 463 468 * @param s2 Second string to compare. 464 469 * 465 * @return 0 if the strings are equal, -1 if first is smaller,466 * 1 if second smaller.470 * @return 0 if the strings are equal, -1 if the first is less than the second, 471 * 1 if the second is less than the first. 467 472 * 468 473 */ … … 495 500 * 496 501 * Do a char-by-char comparison of two NULL-terminated strings. 497 * The strings are considered equal iff they consist of the same 498 * characters on the minimum of their lengths and the length limit. 502 * The strings are considered equal iff 503 * min(str_length(s1), max_len) == min(str_length(s2), max_len) 504 * and both strings consist of the same sequence of characters, 505 * up to max_len characters. 506 * 507 * A string S1 is less than another string S2 if it has a character with 508 * lower value at the first character position where the strings differ. 509 * If the strings differ in length, the shorter one is treated as if 510 * padded by characters with a value of zero. Only the first max_len 511 * characters are considered. 499 512 * 500 513 * @param s1 First string to compare. … … 502 515 * @param max_len Maximum number of characters to consider. 503 516 * 504 * @return 0 if the strings are equal, -1 if first is smaller,505 * 1 if second smaller.517 * @return 0 if the strings are equal, -1 if the first is less than the second, 518 * 1 if the second is less than the first. 506 519 * 507 520 */ -
kernel/generic/src/mm/as.c
rbc216a0 rda68871a 665 665 666 666 page_table_lock(as, false); 667 668 /*669 * Start TLB shootdown sequence.670 */671 ipl_t ipl = tlb_shootdown_start(TLB_INVL_PAGES, as->asid,672 area->base + P2SZ(pages), area->pages - pages);673 667 674 668 /* … … 726 720 } 727 721 722 /* 723 * Start TLB shootdown sequence. 724 * 725 * The sequence is rather short and can be 726 * repeated multiple times. The reason is that 727 * we don't want to have used_space_remove() 728 * inside the sequence as it may use a blocking 729 * memory allocation for its B+tree. Blocking 730 * while holding the tlblock spinlock is 731 * forbidden and would hit a kernel assertion. 732 */ 733 734 ipl_t ipl = tlb_shootdown_start(TLB_INVL_PAGES, 735 as->asid, area->base + P2SZ(pages), 736 area->pages - pages); 737 728 738 for (; i < size; i++) { 729 739 pte_t *pte = page_mapping_find(as, … … 743 753 page_mapping_remove(as, ptr + P2SZ(i)); 744 754 } 755 756 /* 757 * Finish TLB shootdown sequence. 758 */ 759 760 tlb_invalidate_pages(as->asid, 761 area->base + P2SZ(pages), 762 area->pages - pages); 763 764 /* 765 * Invalidate software translation caches 766 * (e.g. TSB on sparc64, PHT on ppc32). 767 */ 768 as_invalidate_translation_cache(as, 769 area->base + P2SZ(pages), 770 area->pages - pages); 771 tlb_shootdown_finalize(ipl); 745 772 } 746 773 } 747 748 /*749 * Finish TLB shootdown sequence.750 */751 752 tlb_invalidate_pages(as->asid, area->base + P2SZ(pages),753 area->pages - pages);754 755 /*756 * Invalidate software translation caches757 * (e.g. TSB on sparc64, PHT on ppc32).758 */759 as_invalidate_translation_cache(as, area->base + P2SZ(pages),760 area->pages - pages);761 tlb_shootdown_finalize(ipl);762 763 774 page_table_unlock(as, false); 764 775 } else { -
kernel/generic/src/mm/tlb.c
rbc216a0 rda68871a 162 162 163 163 size_t i; 164 for (i = 0; i < CPU->tlb_messages_count; CPU->tlb_messages_count--) {164 for (i = 0; i < CPU->tlb_messages_count; i++) { 165 165 tlb_invalidate_type_t type = CPU->tlb_messages[i].type; 166 166 asid_t asid = CPU->tlb_messages[i].asid; … … 188 188 } 189 189 190 CPU->tlb_messages_count = 0; 190 191 irq_spinlock_unlock(&CPU->lock, false); 191 192 CPU->tlb_active = true;
Note:
See TracChangeset
for help on using the changeset viewer.
