Changes in / [2d0c3a6:527298a] in mainline
- Files:
-
- 1 deleted
- 67 edited
Legend:
- Unmodified
- Added
- Removed
-
HelenOS.config
r2d0c3a6 r527298a 498 498 @ "1152x720" 499 499 @ "1152x864" 500 @ "1280x720"501 @ "1280x800"502 500 @ "1280x960" 503 501 @ "1280x1024" … … 546 544 ! CONFIG_BAREBONE (n/y) 547 545 548 % Line debugging information549 ! [CONFIG_STRIP_BINARIES!=y] CONFIG_LINE_DEBUG (n/y) -
boot/Makefile
r2d0c3a6 r527298a 48 48 endif 49 49 ifeq ($(RDFMT),fat) 50 $(MKFAT) 1048576$(DIST_PATH) $@50 $(MKFAT) $(DIST_PATH) $@ 51 51 endif 52 52 -
boot/Makefile.build
r2d0c3a6 r527298a 61 61 GCC_CFLAGS += -Werror 62 62 ICC_CFLAGS += -Werror 63 endif64 65 ifeq ($(CONFIG_LINE_DEBUG),y)66 GCC_CFLAGS += -g67 ICC_CFLAGS += -g68 SUNCC_CFLAGS += -g69 CLANG_CFLAGS += -g70 63 endif 71 64 -
boot/arch/arm32/Makefile.inc
r2d0c3a6 r527298a 55 55 $(COMPS_C) \ 56 56 genarch/src/division.c \ 57 generic/src/memstr.c \58 57 generic/src/printf_core.c \ 59 58 generic/src/vprintf.c \ -
boot/arch/arm32/src/asm.S
r2d0c3a6 r527298a 35 35 .global boot_stack 36 36 .global halt 37 .global memcpy 37 38 .global jump_to_kernel 38 39 … … 54 55 b halt 55 56 57 memcpy: 58 add r3, r1, #3 59 bic r3, r3, #3 60 cmp r1, r3 61 stmdb sp!, {r4, r5, lr} 62 mov r5, r0 63 beq 4f 64 65 1: 66 cmp r2, #0 67 movne ip, #0 68 beq 3f 69 70 2: 71 ldrb r3, [ip, r1] 72 strb r3, [ip, r0] 73 add ip, ip, #1 74 cmp ip, r2 75 bne 2b 76 77 3: 78 mov r0, r5 79 ldmia sp!, {r4, r5, pc} 80 81 4: 82 add r3, r0, #3 83 bic r3, r3, #3 84 cmp r0, r3 85 bne 1b 86 movs r4, r2, lsr #2 87 moveq lr, r4 88 beq 6f 89 mov lr, #0 90 mov ip, lr 91 92 5: 93 ldr r3, [ip, r1] 94 add lr, lr, #1 95 cmp lr, r4 96 str r3, [ip, r0] 97 add ip, ip, #4 98 bne 5b 99 100 6: 101 ands r4, r2, #3 102 beq 3b 103 mov r3, lr, lsl #2 104 add r0, r3, r0 105 add ip, r3, r1 106 mov r2, #0 107 108 7: 109 ldrb r3, [r2, ip] 110 strb r3, [r2, r0] 111 add r2, r2, #1 112 cmp r2, r4 113 bne 7b 114 b 3b 115 56 116 jump_to_kernel: 57 117 # -
boot/arch/ia64/Makefile.inc
r2d0c3a6 r527298a 49 49 genarch/src/division.c \ 50 50 generic/src/balloc.c \ 51 generic/src/memstr.c \52 51 generic/src/printf_core.c \ 53 52 generic/src/vprintf.c \ -
boot/arch/ia64/src/asm.S
r2d0c3a6 r527298a 1 1 # 2 2 # Copyright (c) 2006 Martin Decky 3 # Copyright (c) 2006 Jakub Jermar 3 # Copyright (c) 2006 Jakub Jermar 4 4 # All rights reserved. 5 5 # … … 39 39 br halt 40 40 41 memcpy: 42 alloc loc0 = ar.pfs, 3, 1, 0, 0 43 44 adds r14 = 7, in1 45 mov r2 = ar.lc 46 mov r8 = in0 ;; 47 and r14 = -8, r14 ;; 48 cmp.ne p6, p7 = r14, in1 49 (p7) br.cond.dpnt 3f ;; 50 0: 51 cmp.ne p6, p7 = 0, in2 52 (p7) br.cond.dpnt 2f ;; 53 (p6) adds r14 = -1, in2 54 (p6) mov r16 = r0 55 (p6) mov r17 = r0 ;; 56 (p6) mov ar.lc = r14 57 1: 58 add r14 = r16, in1 59 add r15 = r16, in0 60 adds r17 = 1, r17 ;; 61 ld1 r14 = [r14] 62 mov r16 = r17 ;; 63 st1 [r15] = r14 64 br.cloop.sptk.few 1b ;; 65 2: 66 mov ar.lc = r2 67 mov ar.pfs = loc0 68 br.ret.sptk.many rp 69 3: 70 adds r14 = 7, in0 ;; 71 and r14 = -8, r14 ;; 72 cmp.eq p6, p7 = r14, in0 73 (p7) br.cond.dptk 0b 74 shr.u r18 = in2, 3 ;; 75 cmp.ne p6, p7 = 0, r18 76 (p7) br.cond.dpnt 5f ;; 77 (p6) adds r14 = -1, r18 78 (p6) mov r16 = r0 79 (p6) mov r17 = r0 ;; 80 (p6) mov ar.lc = r14 81 4: 82 shladd r14 = r16, 3, r0 83 adds r16 = 1, r17 ;; 84 add r15 = in1, r14 85 add r14 = in0, r14 86 mov r17 = r16 ;; 87 ld8 r15 = [r15] ;; 88 st8 [r14] = r15 89 br.cloop.sptk.few 4b 90 5: 91 and r15 = 7, in2 92 shladd r14 = r18, 3, r0 93 mov r16 = r0 94 mov r18 = r0 ;; 95 cmp.eq p6, p7 = 0, r15 96 add in0 = r14, in0 97 adds r15 = -1, r15 98 add r17 = r14, in1 99 (p6) br.cond.dpnt 2b ;; 100 mov ar.lc = r15 101 6: 102 add r14 = r16, r17 103 add r15 = r16, in0 104 adds r16 = 1, r18 ;; 105 ld1 r14 = [r14] 106 mov r18 = r16 ;; 107 st1 [r15] = r14 108 br.cloop.sptk.few 6b ;; 109 mov ar.lc = r2 110 mov ar.pfs = loc0 111 br.ret.sptk.many rp 112 41 113 jump_to_kernel: 42 114 alloc loc0 = ar.pfs, 1, 1, 0, 0 -
boot/arch/mips32/Makefile.inc
r2d0c3a6 r527298a 61 61 genarch/src/division.c \ 62 62 genarch/src/multiplication.c \ 63 generic/src/memstr.c \64 63 generic/src/printf_core.c \ 65 64 generic/src/vprintf.c \ -
boot/arch/mips32/src/asm.S
r2d0c3a6 r527298a 36 36 .global start 37 37 .global halt 38 .global memcpy 38 39 .global jump_to_kernel 39 40 … … 125 126 j halt 126 127 nop 128 129 memcpy: 130 addiu $v0, $a1, 3 131 li $v1, -4 132 and $v0, $v0, $v1 133 beq $a1, $v0, 3f 134 move $t0, $a0 135 move $t2, $a0 136 137 0: 138 beq $a2, $zero, 2f 139 move $a3, $zero 140 141 1: 142 addu $v0, $a1, $a3 143 lbu $a0, 0($v0) 144 addu $v1, $t0, $a3 145 addiu $a3, $a3, 1 146 bne $a3, $a2, 1b 147 sb $a0, 0($v1) 148 149 2: 150 jr $ra 151 move $v0, $t2 152 153 3: 154 addiu $v0, $a0, 3 155 and $v0, $v0, $v1 156 bne $a0, $v0, 0b 157 srl $t1, $a2, 2 158 159 beq $t1, $zero, 5f 160 move $a3, $zero 161 162 move $a3, $zero 163 move $a0, $zero 164 165 4: 166 addu $v0, $a1, $a0 167 lw $v1, 0($v0) 168 addiu $a3, $a3, 1 169 addu $v0, $t0, $a0 170 sw $v1, 0($v0) 171 bne $a3, $t1, 4b 172 addiu $a0, $a0, 4 173 174 5: 175 andi $a2, $a2, 0x3 176 beq $a2, $zero, 2b 177 nop 178 179 sll $v0, $a3, 2 180 addu $t1, $v0, $t0 181 move $a3, $zero 182 addu $t0, $v0, $a1 183 184 6: 185 addu $v0, $t0, $a3 186 lbu $a0, 0($v0) 187 addu $v1, $t1, $a3 188 addiu $a3, $a3, 1 189 bne $a3, $a2, 6b 190 sb $a0, 0($v1) 191 192 jr $ra 193 move $v0, $t2 127 194 128 195 jump_to_kernel: -
boot/arch/ppc32/Makefile.inc
r2d0c3a6 r527298a 56 56 genarch/src/multiplication.c \ 57 57 generic/src/balloc.c \ 58 generic/src/memstr.c \59 58 generic/src/printf_core.c \ 60 59 generic/src/vprintf.c \ -
boot/arch/ppc32/src/asm.S
r2d0c3a6 r527298a 60 60 .global start 61 61 .global halt 62 .global memcpy 62 63 .global jump_to_kernel 63 64 .global real_mode … … 77 78 halt: 78 79 b halt 80 81 memcpy: 82 srwi. r7, r5, 3 83 addi r6, r3, -4 84 addi r4, r4, -4 85 beq 2f 86 87 andi. r0, r6, 3 88 mtctr r7 89 bne 5f 90 91 1: 92 lwz r7, 4(r4) 93 lwzu r8, 8(r4) 94 stw r7, 4(r6) 95 stwu r8, 8(r6) 96 bdnz 1b 97 98 andi. r5, r5, 7 99 100 2: 101 cmplwi 0, r5, 4 102 blt 3f 103 104 lwzu r0, 4(r4) 105 addi r5, r5, -4 106 stwu r0, 4(r6) 107 108 3: 109 cmpwi 0, r5, 0 110 beqlr 111 mtctr r5 112 addi r4, r4, 3 113 addi r6, r6, 3 114 115 4: 116 lbzu r0, 1(r4) 117 stbu r0, 1(r6) 118 bdnz 4b 119 blr 120 121 5: 122 subfic r0, r0, 4 123 mtctr r0 124 125 6: 126 lbz r7, 4(r4) 127 addi r4, r4, 1 128 stb r7, 4(r6) 129 addi r6, r6, 1 130 bdnz 6b 131 subf r5, r0, r5 132 rlwinm. r7, r5, 32-3, 3, 31 133 beq 2b 134 mtctr r7 135 b 1b 79 136 80 137 jump_to_kernel: -
boot/arch/sparc64/Makefile.inc
r2d0c3a6 r527298a 54 54 genarch/src/ofw_tree.c \ 55 55 generic/src/balloc.c \ 56 generic/src/memstr.c \57 56 generic/src/printf_core.c \ 58 57 generic/src/vprintf.c \ -
boot/arch/sparc64/src/asm.S
r2d0c3a6 r527298a 42 42 .global start 43 43 .global halt 44 .global memcpy 44 45 .global jump_to_kernel 45 46 … … 97 98 ba %xcc, halt 98 99 nop 100 101 memcpy: 102 ! Save dst 103 104 mov %o0, %o3 105 add %o1, 7, %g1 106 and %g1, -8, %g1 107 cmp %o1, %g1 108 be,pn %xcc, 3f 109 add %o0, 7, %g1 110 mov 0, %g3 111 112 0: 113 brz,pn %o2, 2f 114 mov 0, %g2 115 116 1: 117 ldub [%g3 + %o1], %g1 118 add %g2, 1, %g2 119 cmp %o2, %g2 120 stb %g1, [%g3 + %o0] 121 bne,pt %xcc, 1b 122 mov %g2, %g3 123 124 2: 125 ! Exit point 126 127 jmp %o7 + 8 128 mov %o3, %o0 129 130 3: 131 and %g1, -8, %g1 132 cmp %o0, %g1 133 bne,pt %xcc, 0b 134 mov 0, %g3 135 srlx %o2, 3, %g4 136 brz,pn %g4, 5f 137 mov 0, %g5 138 139 4: 140 sllx %g3, 3, %g2 141 add %g5, 1, %g3 142 ldx [%o1 + %g2], %g1 143 mov %g3, %g5 144 cmp %g4, %g3 145 bne,pt %xcc, 4b 146 stx %g1, [%o0 + %g2] 147 148 5: 149 and %o2, 7, %o2 150 brz,pn %o2, 2b 151 sllx %g4, 3, %g1 152 mov 0, %g2 153 add %g1, %o0, %o0 154 add %g1, %o1, %g4 155 mov 0, %g3 156 157 6: 158 ldub [%g2 + %g4], %g1 159 stb %g1, [%g2 + %o0] 160 add %g3, 1, %g2 161 cmp %o2, %g2 162 bne,pt %xcc, 6b 163 mov %g2, %g3 164 165 ! Exit point 166 167 jmp %o7 + 8 168 mov %o3, %o0 99 169 100 170 jump_to_kernel: -
contrib/conf/ia32-qe.sh
r2d0c3a6 r527298a 5 5 # Create a disk image if it does not exist 6 6 if [ ! -f "$DISK_IMG" ]; then 7 tools/mkfat.py 1048576uspace/dist/data "$DISK_IMG"7 tools/mkfat.py uspace/dist/data "$DISK_IMG" 8 8 fi 9 9 -
contrib/conf/mips32-gx.sh
r2d0c3a6 r527298a 5 5 # Create a disk image if it does not exist 6 6 if [ ! -f "$DISK_IMG" ]; then 7 tools/mkfat.py 1048576uspace/dist/data "$DISK_IMG"7 tools/mkfat.py uspace/dist/data "$DISK_IMG" 8 8 fi 9 9 -
kernel/Makefile
r2d0c3a6 r527298a 120 120 ifeq ($(CONFIG_LTO),y) 121 121 GCC_CFLAGS += -flto 122 endif123 124 ifeq ($(CONFIG_LINE_DEBUG),y)125 GCC_CFLAGS += -g126 ICC_CFLAGS += -g127 SUNCC_CFLAGS += -g128 CLANG_CFLAGS += -g129 122 endif 130 123 … … 408 401 409 402 $(DISASM): $(RAW) 410 ifeq ($(CONFIG_LINE_DEBUG),y)411 $(OBJDUMP) -d -S $< > $@412 else413 403 $(OBJDUMP) -d $< > $@ 414 endif415 404 416 405 $(RAW): $(LINK) $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS) $(SYMTAB_OBJECTS) -
kernel/arch/abs32le/src/debug/stacktrace.c
r2d0c3a6 r527298a 37 37 #include <typedefs.h> 38 38 39 bool kernel_ stack_trace_context_validate(stack_trace_context_t *ctx)39 bool kernel_frame_pointer_validate(uintptr_t fp) 40 40 { 41 41 return true; 42 42 } 43 43 44 bool kernel_frame_pointer_prev( stack_trace_context_t *ctx, uintptr_t *prev)44 bool kernel_frame_pointer_prev(uintptr_t fp, uintptr_t *prev) 45 45 { 46 46 return true; 47 47 } 48 48 49 bool kernel_return_address_get( stack_trace_context_t *ctx, uintptr_t *ra)49 bool kernel_return_address_get(uintptr_t fp, uintptr_t *ra) 50 50 { 51 51 return true; 52 52 } 53 53 54 bool uspace_ stack_trace_context_validate(stack_trace_context_t *ctx)54 bool uspace_frame_pointer_validate(uintptr_t fp) 55 55 { 56 56 return true; 57 57 } 58 58 59 bool uspace_frame_pointer_prev( stack_trace_context_t *ctx, uintptr_t *prev)59 bool uspace_frame_pointer_prev(uintptr_t fp, uintptr_t *prev) 60 60 { 61 61 return true; 62 62 } 63 63 64 bool uspace_return_address_get( stack_trace_context_t *ctx, uintptr_t *ra)64 bool uspace_return_address_get(uintptr_t fp, uintptr_t *ra) 65 65 { 66 66 return true; -
kernel/arch/amd64/_link.ld.in
r2d0c3a6 r527298a 53 53 } 54 54 55 #ifdef CONFIG_LINE_DEBUG56 .comment 0 : { *(.comment); }57 .debug_abbrev 0 : { *(.debug_abbrev); }58 .debug_aranges 0 : { *(.debug_aranges); }59 .debug_info 0 : { *(.debug_info); }60 .debug_line 0 : { *(.debug_line); }61 .debug_loc 0 : { *(.debug_loc); }62 .debug_pubnames 0 : { *(.debug_pubnames); }63 .debug_pubtypes 0 : { *(.debug_pubtypes); }64 .debug_ranges 0 : { *(.debug_ranges); }65 .debug_str 0 : { *(.debug_str); }66 #endif67 68 55 /DISCARD/ : { 69 56 *(*); -
kernel/arch/amd64/include/pm.h
r2d0c3a6 r527298a 65 65 #endif /* CONFIG_FB */ 66 66 67 #define GDT_SELECTOR(des) ((des) << 3) 67 #define gdtselector(des) ((des) << 3) 68 #define idtselector(des) ((des) << 4) 68 69 69 70 #define PL_KERNEL 0 … … 167 168 168 169 extern ptr_16_64_t gdtr; 170 extern ptr_16_32_t bootstrap_gdtr; 169 171 extern ptr_16_32_t protected_ap_gdtr; 170 172 -
kernel/arch/amd64/src/asm.S
r2d0c3a6 r527298a 244 244 */ 245 245 xorq %rdx, %rdx 246 cmpq $( GDT_SELECTOR(KTEXT_DES)), ISTATE_OFFSET_CS(%rsp)246 cmpq $(gdtselector(KTEXT_DES)), ISTATE_OFFSET_CS(%rsp) 247 247 cmovnzq %rdx, %rbp 248 248 -
kernel/arch/amd64/src/boot/boot.S
r2d0c3a6 r527298a 85 85 86 86 /* Kernel data + stack */ 87 movw $ GDT_SELECTOR(KDATA_DES), %cx87 movw $gdtselector(KDATA_DES), %cx 88 88 movw %cx, %es 89 89 movw %cx, %ds … … 94 94 * when _visible_ part of GS does not point to user-mode segment. 95 95 */ 96 movw $ GDT_SELECTOR(UDATA_DES), %cx96 movw $gdtselector(UDATA_DES), %cx 97 97 movw %cx, %fs 98 98 movw %cx, %gs 99 99 100 jmpl $ GDT_SELECTOR(KTEXT32_DES), $multiboot_meeting_point100 jmpl $gdtselector(KTEXT32_DES), $multiboot_meeting_point 101 101 multiboot_meeting_point: 102 102 … … 182 182 183 183 /* At this point we are in compatibility mode */ 184 jmpl $ GDT_SELECTOR(KTEXT_DES), $start64184 jmpl $gdtselector(KTEXT_DES), $start64 185 185 186 186 /** Print string to EGA display (in light red) and halt. … … 645 645 .section K_DATA_START, "aw", @progbits 646 646 647 .global bootstrap_gdtr 647 648 bootstrap_gdtr: 648 .word GDT_SELECTOR(GDT_ITEMS)649 .word gdtselector(GDT_ITEMS) 649 650 .long KA2PA(gdt) 650 651 -
kernel/arch/amd64/src/boot/vesa_ret.inc
r2d0c3a6 r527298a 7 7 8 8 /* Kernel data + stack */ 9 movw $ GDT_SELECTOR(KDATA_DES), %cx9 movw $gdtselector(KDATA_DES), %cx 10 10 movw %cx, %es 11 11 movw %cx, %ds … … 17 17 */ 18 18 19 movw $ GDT_SELECTOR(UDATA_DES), %cx19 movw $gdtselector(UDATA_DES), %cx 20 20 movw %cx, %fs 21 21 movw %cx, %gs 22 22 23 jmpl $ GDT_SELECTOR(KTEXT32_DES), $vesa_meeting_point23 jmpl $gdtselector(KTEXT32_DES), $vesa_meeting_point -
kernel/arch/amd64/src/ddi/ddi.c
r2d0c3a6 r527298a 153 153 tss_descriptor_t *tss_desc = (tss_descriptor_t *) &gdt_p[TSS_DES]; 154 154 tss_desc->type = AR_TSS; 155 tr_load( GDT_SELECTOR(TSS_DES));155 tr_load(gdtselector(TSS_DES)); 156 156 157 157 /* -
kernel/arch/amd64/src/debug/stacktrace.c
r2d0c3a6 r527298a 40 40 #define FRAME_OFFSET_RA 1 41 41 42 bool kernel_ stack_trace_context_validate(stack_trace_context_t *ctx)42 bool kernel_frame_pointer_validate(uintptr_t fp) 43 43 { 44 return ctx->fp != 0;44 return fp != 0; 45 45 } 46 46 47 bool kernel_frame_pointer_prev( stack_trace_context_t *ctx, uintptr_t *prev)47 bool kernel_frame_pointer_prev(uintptr_t fp, uintptr_t *prev) 48 48 { 49 uint64_t *stack = (void *) ctx->fp;49 uint64_t *stack = (void *) fp; 50 50 *prev = stack[FRAME_OFFSET_FP_PREV]; 51 51 … … 53 53 } 54 54 55 bool kernel_return_address_get( stack_trace_context_t *ctx, uintptr_t *ra)55 bool kernel_return_address_get(uintptr_t fp, uintptr_t *ra) 56 56 { 57 uint64_t *stack = (void *) ctx->fp;57 uint64_t *stack = (void *) fp; 58 58 *ra = stack[FRAME_OFFSET_RA]; 59 59 … … 61 61 } 62 62 63 bool uspace_ stack_trace_context_validate(stack_trace_context_t *ctx)63 bool uspace_frame_pointer_validate(uintptr_t fp) 64 64 { 65 return ctx->fp != 0;65 return fp != 0; 66 66 } 67 67 68 bool uspace_frame_pointer_prev( stack_trace_context_t *ctx, uintptr_t *prev)68 bool uspace_frame_pointer_prev(uintptr_t fp, uintptr_t *prev) 69 69 { 70 70 return !copy_from_uspace((void *) prev, 71 (uint64_t *) ctx->fp + FRAME_OFFSET_FP_PREV, sizeof(*prev));71 (uint64_t *) fp + FRAME_OFFSET_FP_PREV, sizeof(*prev)); 72 72 } 73 73 74 bool uspace_return_address_get( stack_trace_context_t *ctx, uintptr_t *ra)74 bool uspace_return_address_get(uintptr_t fp, uintptr_t *ra) 75 75 { 76 return !copy_from_uspace((void *) ra, 77 (uint64_t *) ctx->fp + FRAME_OFFSET_RA,sizeof(*ra));76 return !copy_from_uspace((void *) ra, (uint64_t *) fp + FRAME_OFFSET_RA, 77 sizeof(*ra)); 78 78 } 79 79 -
kernel/arch/amd64/src/pm.c
r2d0c3a6 r527298a 171 171 172 172 d->unused = 0; 173 d->selector = GDT_SELECTOR(KTEXT_DES);173 d->selector = gdtselector(KTEXT_DES); 174 174 175 175 d->present = 1; … … 291 291 * to its own TSS. We just need to load the TR register. 292 292 */ 293 tr_load( GDT_SELECTOR(TSS_DES));293 tr_load(gdtselector(TSS_DES)); 294 294 } 295 295 -
kernel/arch/amd64/src/smp/ap.S
r2d0c3a6 r527298a 61 61 orl $1, %eax 62 62 movl %eax, %cr0 # switch to protected mode 63 jmpl $ GDT_SELECTOR(KTEXT32_DES), $jump_to_kernel - BOOT_OFFSET + AP_BOOT_OFFSET63 jmpl $gdtselector(KTEXT32_DES), $jump_to_kernel - BOOT_OFFSET + AP_BOOT_OFFSET 64 64 65 65 jump_to_kernel: 66 66 .code32 67 movw $ GDT_SELECTOR(KDATA_DES), %ax67 movw $gdtselector(KDATA_DES), %ax 68 68 movw %ax, %ds 69 69 movw %ax, %es 70 70 movw %ax, %ss 71 movw $ GDT_SELECTOR(UDATA_DES), %ax71 movw $gdtselector(UDATA_DES), %ax 72 72 movw %ax, %gs 73 73 … … 94 94 95 95 # At this point we are in compatibility mode 96 jmpl $ GDT_SELECTOR(KTEXT_DES), $start64 - BOOT_OFFSET + AP_BOOT_OFFSET96 jmpl $gdtselector(KTEXT_DES), $start64 - BOOT_OFFSET + AP_BOOT_OFFSET 97 97 98 98 .code64 -
kernel/arch/amd64/src/syscall.c
r2d0c3a6 r527298a 58 58 */ 59 59 write_msr(AMD_MSR_STAR, 60 ((uint64_t) (GDT_SELECTOR(KDATA_DES) | PL_USER) << 48) |61 ((uint64_t) (GDT_SELECTOR(KTEXT_DES) | PL_KERNEL) << 32));60 ((uint64_t)(gdtselector(KDATA_DES) | PL_USER) << 48) | 61 ((uint64_t)(gdtselector(KTEXT_DES) | PL_KERNEL) << 32)); 62 62 write_msr(AMD_MSR_LSTAR, (uint64_t)syscall_entry); 63 63 /* Mask RFLAGS on syscall -
kernel/arch/amd64/src/userspace.c
r2d0c3a6 r527298a 65 65 "xorq %%rdi, %%rdi\n" 66 66 "iretq\n" 67 :: [udata_des] "i" ( GDT_SELECTOR(UDATA_DES) | PL_USER),67 :: [udata_des] "i" (gdtselector(UDATA_DES) | PL_USER), 68 68 [stack_size] "r" (kernel_uarg->uspace_stack + THREAD_STACK_SIZE), 69 69 [ipl] "r" (ipl), 70 [utext_des] "i" ( GDT_SELECTOR(UTEXT_DES) | PL_USER),70 [utext_des] "i" (gdtselector(UTEXT_DES) | PL_USER), 71 71 [entry] "r" (kernel_uarg->uspace_entry), 72 72 [uarg] "r" (kernel_uarg->uspace_uarg) -
kernel/arch/arm32/src/debug/stacktrace.c
r2d0c3a6 r527298a 40 40 #define FRAME_OFFSET_RA -1 41 41 42 bool kernel_ stack_trace_context_validate(stack_trace_context_t *ctx)42 bool kernel_frame_pointer_validate(uintptr_t fp) 43 43 { 44 return ctx->fp != 0;44 return fp != 0; 45 45 } 46 46 47 bool kernel_frame_pointer_prev( stack_trace_context_t *ctx, uintptr_t *prev)47 bool kernel_frame_pointer_prev(uintptr_t fp, uintptr_t *prev) 48 48 { 49 uint32_t *stack = (void *) ctx->fp;49 uint32_t *stack = (void *) fp; 50 50 51 51 *prev = stack[FRAME_OFFSET_FP_PREV]; … … 53 53 } 54 54 55 bool kernel_return_address_get( stack_trace_context_t *ctx, uintptr_t *ra)55 bool kernel_return_address_get(uintptr_t fp, uintptr_t *ra) 56 56 { 57 uint32_t *stack = (void *) ctx->fp;57 uint32_t *stack = (void *) fp; 58 58 59 59 *ra = stack[FRAME_OFFSET_RA]; … … 61 61 } 62 62 63 bool uspace_ stack_trace_context_validate(stack_trace_context_t *ctx)63 bool uspace_frame_pointer_validate(uintptr_t fp) 64 64 { 65 return ctx->fp != 0;65 return fp != 0; 66 66 } 67 67 68 bool uspace_frame_pointer_prev( stack_trace_context_t *ctx, uintptr_t *prev)68 bool uspace_frame_pointer_prev(uintptr_t fp, uintptr_t *prev) 69 69 { 70 70 return !copy_from_uspace((void *) prev, 71 (uint32_t *) ctx->fp + FRAME_OFFSET_FP_PREV, sizeof(*prev));71 (uint32_t *) fp + FRAME_OFFSET_FP_PREV, sizeof(*prev)); 72 72 } 73 73 74 bool uspace_return_address_get( stack_trace_context_t *ctx, uintptr_t *ra)74 bool uspace_return_address_get(uintptr_t fp, uintptr_t *ra) 75 75 { 76 return !copy_from_uspace((void *) ra, 77 (uint32_t *) ctx->fp + FRAME_OFFSET_RA,sizeof(*ra));76 return !copy_from_uspace((void *) ra, (uint32_t *) fp + FRAME_OFFSET_RA, 77 sizeof(*ra)); 78 78 } 79 79 -
kernel/arch/ia32/include/bios/bios.h
r2d0c3a6 r527298a 38 38 #include <typedefs.h> 39 39 40 #define BIOS_EBDA_PTR 0x40e 41 40 42 extern uintptr_t ebda; 41 43 -
kernel/arch/ia32/include/mm/as.h
r2d0c3a6 r527298a 27 27 */ 28 28 29 /** @addtogroup ia32mm 29 /** @addtogroup ia32mm 30 30 * @{ 31 31 */ -
kernel/arch/ia32/include/mm/page.h
r2d0c3a6 r527298a 27 27 */ 28 28 29 /** @addtogroup ia32mm 29 /** @addtogroup ia32mm 30 30 * @{ 31 31 */ … … 106 106 107 107 /* Set PTE flags accessors for each level. */ 108 #define SET_PTL1_FLAGS_ARCH(ptl0, i, x) 108 #define SET_PTL1_FLAGS_ARCH(ptl0, i, x) \ 109 109 set_pt_flags((pte_t *) (ptl0), (size_t) (i), (x)) 110 110 #define SET_PTL2_FLAGS_ARCH(ptl1, i, x) -
kernel/arch/ia32/include/pm.h
r2d0c3a6 r527298a 58 58 #endif /* CONFIG_FB */ 59 59 60 #define GDT_SELECTOR(des) ((des) << 3)60 #define gdtselector(des) ((des) << 3) 61 61 62 62 #define PL_KERNEL 0 … … 153 153 154 154 extern ptr_16_32_t gdtr; 155 extern ptr_16_32_t bootstrap_gdtr; 155 156 extern ptr_16_32_t protected_ap_gdtr; 156 157 extern tss_t *tss_p; -
kernel/arch/ia32/src/asm.S
r2d0c3a6 r527298a 225 225 * Switch to kernel selectors. 226 226 */ 227 movw $( GDT_SELECTOR(KDATA_DES)), %ax227 movw $(gdtselector(KDATA_DES)), %ax 228 228 movw %ax, %ds 229 229 movw %ax, %es … … 304 304 * Switch to kernel selectors. 305 305 */ 306 movl $( GDT_SELECTOR(KDATA_DES)), %eax306 movl $(gdtselector(KDATA_DES)), %eax 307 307 movl %eax, %ds 308 308 movl %eax, %es … … 407 407 * Switch to kernel selectors. 408 408 */ 409 movl $( GDT_SELECTOR(KDATA_DES)), %eax409 movl $(gdtselector(KDATA_DES)), %eax 410 410 movl %eax, %ds 411 411 movl %eax, %es … … 416 416 */ 417 417 xorl %eax, %eax 418 cmpl $( GDT_SELECTOR(KTEXT_DES)), ISTATE_OFFSET_CS(%esp)418 cmpl $(gdtselector(KTEXT_DES)), ISTATE_OFFSET_CS(%esp) 419 419 cmovnzl %eax, %ebp 420 420 -
kernel/arch/ia32/src/bios/bios.c
r2d0c3a6 r527298a 36 36 #include <typedefs.h> 37 37 38 #define BIOS_EBDA_PTR 0x40e39 40 38 uintptr_t ebda = 0; 41 39 -
kernel/arch/ia32/src/boot/boot.S
r2d0c3a6 r527298a 78 78 79 79 /* Initialize Global Descriptor Table register */ 80 lgdtl bootstrap_gdtr80 lgdtl KA2PA(bootstrap_gdtr) 81 81 82 82 /* Kernel data + stack */ 83 movw $ GDT_SELECTOR(KDATA_DES), %cx83 movw $gdtselector(KDATA_DES), %cx 84 84 movw %cx, %es 85 85 movw %cx, %fs … … 88 88 movw %cx, %ss 89 89 90 jmpl $ GDT_SELECTOR(KTEXT_DES), $multiboot_meeting_point90 jmpl $gdtselector(KTEXT_DES), $multiboot_meeting_point 91 91 multiboot_meeting_point: 92 92 … … 514 514 page_directory: 515 515 .space 4096, 0 516 517 bootstrap_gdtr:518 .word GDT_SELECTOR(GDT_ITEMS)519 .long KA2PA(gdt)520 516 521 517 grub_eax: -
kernel/arch/ia32/src/boot/vesa_real.inc
r2d0c3a6 r527298a 30 30 .code32 31 31 vesa_init: 32 jmp $ GDT_SELECTOR(VESA_INIT_DES), $vesa_init_real - vesa_init32 jmp $gdtselector(VESA_INIT_DES), $vesa_init_real - vesa_init 33 33 34 34 .code16 … … 335 335 vesa_leave_real2: 336 336 337 ljmpl $ GDT_SELECTOR(KTEXT32_DES), $(vesa_init_protected - vesa_init + VESA_INIT_SEGMENT << 4)337 ljmpl $gdtselector(KTEXT32_DES), $(vesa_init_protected - vesa_init + VESA_INIT_SEGMENT << 4) 338 338 339 339 no_mode: -
kernel/arch/ia32/src/boot/vesa_ret.inc
r2d0c3a6 r527298a 7 7 8 8 /* Kernel data + stack */ 9 movw $ GDT_SELECTOR(KDATA_DES), %cx9 movw $gdtselector(KDATA_DES), %cx 10 10 movw %cx, %es 11 11 movw %cx, %fs … … 14 14 movw %cx, %ss 15 15 16 jmpl $ GDT_SELECTOR(KTEXT_DES), $vesa_meeting_point16 jmpl $gdtselector(KTEXT_DES), $vesa_meeting_point -
kernel/arch/ia32/src/ddi/ddi.c
r2d0c3a6 r527298a 153 153 */ 154 154 gdt_p[TSS_DES].access = AR_PRESENT | AR_TSS | DPL_KERNEL; 155 tr_load( GDT_SELECTOR(TSS_DES));155 tr_load(gdtselector(TSS_DES)); 156 156 157 157 /* -
kernel/arch/ia32/src/debug/stacktrace.c
r2d0c3a6 r527298a 40 40 #define FRAME_OFFSET_RA 1 41 41 42 bool kernel_ stack_trace_context_validate(stack_trace_context_t *ctx)42 bool kernel_frame_pointer_validate(uintptr_t fp) 43 43 { 44 return ctx->fp != 0;44 return fp != 0; 45 45 } 46 46 47 bool kernel_frame_pointer_prev( stack_trace_context_t *ctx, uintptr_t *prev)47 bool kernel_frame_pointer_prev(uintptr_t fp, uintptr_t *prev) 48 48 { 49 uint32_t *stack = (void *) ctx->fp;49 uint32_t *stack = (void *) fp; 50 50 *prev = stack[FRAME_OFFSET_FP_PREV]; 51 51 return true; 52 52 } 53 53 54 bool kernel_return_address_get( stack_trace_context_t *ctx, uintptr_t *ra)54 bool kernel_return_address_get(uintptr_t fp, uintptr_t *ra) 55 55 { 56 uint32_t *stack = (void *) ctx->fp;56 uint32_t *stack = (void *) fp; 57 57 *ra = stack[FRAME_OFFSET_RA]; 58 58 return true; 59 59 } 60 60 61 bool uspace_ stack_trace_context_validate(stack_trace_context_t *ctx)61 bool uspace_frame_pointer_validate(uintptr_t fp) 62 62 { 63 return ctx->fp != 0;63 return fp != 0; 64 64 } 65 65 66 bool uspace_frame_pointer_prev( stack_trace_context_t *ctx, uintptr_t *prev)66 bool uspace_frame_pointer_prev(uintptr_t fp, uintptr_t *prev) 67 67 { 68 68 return !copy_from_uspace((void *) prev, 69 (uint32_t *) ctx->fp + FRAME_OFFSET_FP_PREV, sizeof(*prev));69 (uint32_t *) fp + FRAME_OFFSET_FP_PREV, sizeof(*prev)); 70 70 } 71 71 72 bool uspace_return_address_get( stack_trace_context_t *ctx, uintptr_t *ra)72 bool uspace_return_address_get(uintptr_t fp, uintptr_t *ra) 73 73 { 74 return !copy_from_uspace((void *) ra, 75 (uint32_t *) ctx->fp + FRAME_OFFSET_RA,sizeof(*ra));74 return !copy_from_uspace((void *) ra, (uint32_t *) fp + FRAME_OFFSET_RA, 75 sizeof(*ra)); 76 76 } 77 77 -
kernel/arch/ia32/src/mm/frame.c
r2d0c3a6 r527298a 131 131 if (last_frame < ALIGN_UP(new_base + new_size, FRAME_SIZE)) 132 132 last_frame = ALIGN_UP(new_base + new_size, FRAME_SIZE); 133 } else if ((e820table[i].type == MEMMAP_MEMORY_ACPI) || 134 (e820table[i].type == MEMMAP_MEMORY_NVS)) { 133 } 134 135 if (e820table[i].type == MEMMAP_MEMORY_RESERVED) { 136 /* To be safe, make the reserved zone possibly larger */ 137 uint64_t new_base = ALIGN_DOWN(base, FRAME_SIZE); 138 uint64_t new_size = ALIGN_UP(size + (base - new_base), 139 FRAME_SIZE); 140 141 zone_create(ADDR2PFN(new_base), SIZE2FRAMES(new_size), 0, 142 ZONE_RESERVED); 143 } 144 145 if (e820table[i].type == MEMMAP_MEMORY_ACPI) { 135 146 /* To be safe, make the firmware zone possibly larger */ 136 147 uint64_t new_base = ALIGN_DOWN(base, FRAME_SIZE); … … 140 151 zone_create(ADDR2PFN(new_base), SIZE2FRAMES(new_size), 0, 141 152 ZONE_FIRMWARE); 142 } else {143 /* To be safe, make the reserved zone possibly larger */144 uint64_t new_base = ALIGN_DOWN(base, FRAME_SIZE);145 uint64_t new_size = ALIGN_UP(size + (base - new_base),146 FRAME_SIZE);147 148 zone_create(ADDR2PFN(new_base), SIZE2FRAMES(new_size), 0,149 ZONE_RESERVED);150 153 } 151 154 } … … 200 203 #ifdef CONFIG_SMP 201 204 /* Reserve AP real mode bootstrap memory */ 202 frame_mark_unavailable(AP_BOOT_OFFSET >> FRAME_WIDTH, 205 frame_mark_unavailable(AP_BOOT_OFFSET >> FRAME_WIDTH, 203 206 (hardcoded_unmapped_ktext_size + 204 207 hardcoded_unmapped_kdata_size) >> FRAME_WIDTH); -
kernel/arch/ia32/src/pm.c
r2d0c3a6 r527298a 75 75 /* VESA Init descriptor */ 76 76 #ifdef CONFIG_FB 77 { 0xffff, 0, VESA_INIT_SEGMENT >>12, AR_PRESENT | AR_CODE | DPL_KERNEL, 0xf, 0, 0, 0, 0, 0 }78 #endif 77 { 0xffff, 0, VESA_INIT_SEGMENT>>12, AR_PRESENT | AR_CODE | DPL_KERNEL, 0xf, 0, 0, 0, 0, 0 } 78 #endif 79 79 }; 80 80 … … 86 86 87 87 /* gdtr is changed by kmp before next CPU is initialized */ 88 ptr_16_32_t gdtr = { 89 .limit = sizeof(gdt), 90 .base = (uintptr_t) gdt 91 }; 88 ptr_16_32_t bootstrap_gdtr = { .limit = sizeof(gdt), .base = KA2PA((uintptr_t) gdt) }; 89 ptr_16_32_t gdtr = { .limit = sizeof(gdt), .base = (uintptr_t) gdt }; 92 90 93 91 void gdt_setbase(descriptor_t *d, uintptr_t base) … … 130 128 131 129 d->unused = 0; 132 d->selector = GDT_SELECTOR(KTEXT_DES);130 d->selector = gdtselector(KTEXT_DES); 133 131 134 132 if (i == VECTOR_SYSCALL) { … … 285 283 * to its own TSS. We just need to load the TR register. 286 284 */ 287 tr_load( GDT_SELECTOR(TSS_DES));285 tr_load(gdtselector(TSS_DES)); 288 286 289 287 clean_IOPL_NT_flags(); /* Disable I/O on nonprivileged levels and clear NT flag. */ -
kernel/arch/ia32/src/proc/scheduler.c
r2d0c3a6 r527298a 67 67 /* Set kernel stack for CPL3 -> CPL0 switch via interrupt */ 68 68 CPU->arch.tss->esp0 = kstk; 69 CPU->arch.tss->ss0 = GDT_SELECTOR(KDATA_DES);69 CPU->arch.tss->ss0 = gdtselector(KDATA_DES); 70 70 71 71 /* Set up TLS in GS register */ -
kernel/arch/ia32/src/syscall.c
r2d0c3a6 r527298a 45 45 46 46 /* set kernel mode CS selector */ 47 write_msr(IA32_MSR_SYSENTER_CS, GDT_SELECTOR(KTEXT_DES));47 write_msr(IA32_MSR_SYSENTER_CS, gdtselector(KTEXT_DES)); 48 48 /* set kernel mode entry point */ 49 49 write_msr(IA32_MSR_SYSENTER_EIP, (uint32_t) sysenter_handler); -
kernel/arch/ia32/src/userspace.c
r2d0c3a6 r527298a 75 75 "iret\n" 76 76 : 77 : [udata_des] "i" ( GDT_SELECTOR(UDATA_DES) | PL_USER),77 : [udata_des] "i" (gdtselector(UDATA_DES) | PL_USER), 78 78 [stack_size] "r" ((uint8_t *) kernel_uarg->uspace_stack + THREAD_STACK_SIZE), 79 79 [ipl] "r" (ipl), 80 [utext_des] "i" ( GDT_SELECTOR(UTEXT_DES) | PL_USER),80 [utext_des] "i" (gdtselector(UTEXT_DES) | PL_USER), 81 81 [entry] "r" (kernel_uarg->uspace_entry), 82 82 [uarg] "r" (kernel_uarg->uspace_uarg), 83 [tls_des] "r" ( GDT_SELECTOR(TLS_DES))83 [tls_des] "r" (gdtselector(TLS_DES)) 84 84 : "eax"); 85 85 -
kernel/arch/ia64/src/debug/stacktrace.c
r2d0c3a6 r527298a 37 37 #include <typedefs.h> 38 38 39 bool kernel_ stack_trace_context_validate(stack_trace_context_t *ctx)39 bool kernel_frame_pointer_validate(uintptr_t fp) 40 40 { 41 41 return false; 42 42 } 43 43 44 bool kernel_frame_pointer_prev( stack_trace_context_t *ctx, uintptr_t *prev)44 bool kernel_frame_pointer_prev(uintptr_t fp, uintptr_t *prev) 45 45 { 46 46 return false; 47 47 } 48 48 49 bool kernel_return_address_get( stack_trace_context_t *ctx, uintptr_t *ra)49 bool kernel_return_address_get(uintptr_t fp, uintptr_t *ra) 50 50 { 51 51 return false; 52 52 } 53 53 54 bool uspace_ stack_trace_context_validate(stack_trace_context_t *ctx)54 bool uspace_frame_pointer_validate(uintptr_t fp) 55 55 { 56 56 return false; 57 57 } 58 58 59 bool uspace_frame_pointer_prev( stack_trace_context_t *ctx, uintptr_t *prev)59 bool uspace_frame_pointer_prev(uintptr_t fp, uintptr_t *prev) 60 60 { 61 61 return false; 62 62 } 63 63 64 bool uspace_return_address_get( stack_trace_context_t *ctx, uintptr_t *ra)64 bool uspace_return_address_get(uintptr_t fp, uintptr_t *ra) 65 65 { 66 66 return false; -
kernel/arch/mips32/include/debugger.h
r2d0c3a6 r527298a 68 68 extern bpinfo_t breakpoints[BKPOINTS_MAX]; 69 69 70 extern bool is_jump(unative_t);71 72 70 extern void debugger_init(void); 73 71 extern void debugger_bpoint(istate_t *); -
kernel/arch/mips32/src/debug/stacktrace.c
r2d0c3a6 r527298a 36 36 #include <syscall/copy.h> 37 37 #include <typedefs.h> 38 #include <arch/debugger.h>39 #include <print.h>40 38 41 #define R0 0U 42 #define SP 29U 43 #define RA 31U 44 45 #define OP_SHIFT 26 46 #define RS_SHIFT 21 47 #define RT_SHIFT 16 48 #define RD_SHIFT 11 49 50 #define HINT_SHIFT 6 51 #define BASE_SHIFT RS_SHIFT 52 #define IMM_SHIFT 0 53 #define OFFSET_SHIFT IMM_SHIFT 54 55 #define RS_MASK (0x1f << RS_SHIFT) 56 #define RT_MASK (0x1f << RT_SHIFT) 57 #define RD_MASK (0x1f << RD_SHIFT) 58 #define HINT_MASK (0x1f << HINT_SHIFT) 59 #define BASE_MASK RS_MASK 60 #define IMM_MASK (0xffff << IMM_SHIFT) 61 #define OFFSET_MASK IMM_MASK 62 63 #define RS_GET(inst) (((inst) & RS_MASK) >> RS_SHIFT) 64 #define RD_GET(inst) (((inst) & RD_MASK) >> RD_SHIFT) 65 #define IMM_GET(inst) (int16_t)(((inst) & IMM_MASK) >> IMM_SHIFT) 66 #define BASE_GET(inst) RS_GET(inst) 67 #define OFFSET_GET(inst) IMM_GET(inst) 68 69 #define ADDU_R_SP_R0_TEMPL \ 70 ((0x0 << OP_SHIFT) | (SP << RS_SHIFT) | (R0 << RT_SHIFT) | 0x21) 71 #define ADDU_SP_R_R0_TEMPL \ 72 ((0x0 << OP_SHIFT) | (SP << RD_SHIFT) | (R0 << RT_SHIFT) | 0x21) 73 #define ADDI_SP_SP_IMM_TEMPL \ 74 ((0x8 << OP_SHIFT) | (SP << RS_SHIFT) | (SP << RT_SHIFT)) 75 #define ADDIU_SP_SP_IMM_TEMPL \ 76 ((0x9 << OP_SHIFT) | (SP << RS_SHIFT) | (SP << RT_SHIFT)) 77 #define JR_RA_TEMPL \ 78 ((0x0 << OP_SHIFT) | (RA << RS_SHIFT) | (0x0 << HINT_SHIFT) | 0x8) 79 #define SW_RA_TEMPL \ 80 ((0x2b << OP_SHIFT) | (RA << RT_SHIFT)) 81 82 #define IS_ADDU_R_SP_R0(inst) \ 83 (((inst) & ~RD_MASK) == ADDU_R_SP_R0_TEMPL) 84 #define IS_ADDU_SP_R_R0(inst) \ 85 (((inst) & ~RS_MASK) == ADDU_SP_R_R0_TEMPL) 86 #define IS_ADDI_SP_SP_IMM(inst) \ 87 (((inst) & ~IMM_MASK) == ADDI_SP_SP_IMM_TEMPL) 88 #define IS_ADDIU_SP_SP_IMM(inst) \ 89 (((inst) & ~IMM_MASK) == ADDIU_SP_SP_IMM_TEMPL) 90 #define IS_JR_RA(inst) \ 91 (((inst) & ~HINT_MASK) == JR_RA_TEMPL) 92 #define IS_SW_RA(inst) \ 93 (((inst) & ~(BASE_MASK | OFFSET_MASK)) == SW_RA_TEMPL) 94 95 extern char ktext_start; 96 extern char ktext_end; 97 98 static bool 99 scan(stack_trace_context_t *ctx, uintptr_t *prev_fp, uintptr_t *prev_ra) 100 { 101 uint32_t *inst = (void *) ctx->pc; 102 bool has_fp = false; 103 size_t frame_size; 104 unsigned int fp = SP; 105 106 do { 107 inst--; 108 #if 0 109 /* 110 * This is one of the situations in which the theory (ABI) does 111 * not meet the practice (GCC). GCC simply does not place the 112 * JR $ra instruction as dictated by the ABI, rendering the 113 * official stack tracing algorithm somewhat unapplicable. 114 */ 115 116 if (IS_ADDU_R_SP_R0(*inst)) { 117 uint32_t *cur; 118 fp = RD_GET(*inst); 119 /* 120 * We have a candidate for frame pointer. 121 */ 122 123 /* Seek to the end of this function. */ 124 for (cur = inst + 1; !IS_JR_RA(*cur); cur++) 125 ; 126 /* Scan the last basic block */ 127 for (cur--; !is_jump(*(cur - 1)); cur--) { 128 if (IS_ADDU_SP_R_R0(*cur) && 129 (fp == RS_GET(*cur))) { 130 has_fp = true; 131 } 132 } 133 continue; 134 } 135 136 if (IS_JR_RA(*inst)) { 137 if (!ctx->istate) 138 return false; 139 /* 140 * No stack frame has been allocated yet. 141 * Use the values stored in istate. 142 */ 143 if (prev_fp) 144 *prev_fp = ctx->istate->sp; 145 if (prev_ra) 146 *prev_ra = ctx->istate->ra - 8; 147 ctx->istate = NULL; 148 return true; 149 } 150 #endif 151 152 } while ((!IS_ADDIU_SP_SP_IMM(*inst) && !IS_ADDI_SP_SP_IMM(*inst)) || 153 (IMM_GET(*inst) >= 0)); 154 155 /* 156 * We are at the instruction which allocates the space for the current 157 * stack frame. 158 */ 159 frame_size = -IMM_GET(*inst); 160 if (prev_fp) 161 *prev_fp = ctx->fp + frame_size; 162 163 /* 164 * Scan the first basic block for the occurrence of 165 * SW $ra, OFFSET($base). 166 */ 167 for (inst++; !is_jump(*(inst - 1)) && (uintptr_t) inst < ctx->pc; 168 inst++) { 169 if (IS_SW_RA(*inst)) { 170 unsigned int base = BASE_GET(*inst); 171 int16_t offset = OFFSET_GET(*inst); 172 173 if (base == SP || (has_fp && base == fp)) { 174 uint32_t *addr = (void *) (ctx->fp + offset); 175 176 if (offset % 4 != 0) 177 return false; 178 /* cannot store below current stack pointer */ 179 if (offset < 0) 180 return false; 181 /* too big offsets are suspicious */ 182 if (offset > 32 * 4) 183 return false; 184 185 if (prev_ra) 186 *prev_ra = *addr; 187 return true; 188 } 189 } 190 } 191 192 /* 193 * The first basic block does not save the return address or saves it 194 * after ctx->pc, which means that the correct value is in istate. 195 */ 196 if (prev_ra) { 197 if (!ctx->istate) 198 return false; 199 *prev_ra = ctx->istate->ra - 8; 200 ctx->istate = NULL; 201 } 202 return true; 203 } 204 205 206 bool kernel_stack_trace_context_validate(stack_trace_context_t *ctx) 207 { 208 return !((ctx->fp == 0) || ((ctx->fp % 8) != 0) || 209 (ctx->pc % 4 != 0) || (ctx->pc < (uintptr_t) &ktext_start) || 210 (ctx->pc >= (uintptr_t) &ktext_end)); 211 } 212 213 bool kernel_frame_pointer_prev(stack_trace_context_t *ctx, uintptr_t *prev) 214 { 215 return scan(ctx, prev, NULL); 216 } 217 218 bool kernel_return_address_get(stack_trace_context_t *ctx, uintptr_t *ra) 219 { 220 return scan(ctx, NULL, ra); 221 } 222 223 bool uspace_stack_trace_context_validate(stack_trace_context_t *ctx) 39 bool kernel_frame_pointer_validate(uintptr_t fp) 224 40 { 225 41 return false; 226 42 } 227 43 228 bool uspace_frame_pointer_prev(stack_trace_context_t *ctx, uintptr_t *prev)44 bool kernel_frame_pointer_prev(uintptr_t fp, uintptr_t *prev) 229 45 { 230 46 return false; 231 47 } 232 48 233 bool uspace_return_address_get(stack_trace_context_t *ctx, uintptr_t *ra) 49 bool kernel_return_address_get(uintptr_t fp, uintptr_t *ra) 50 { 51 return false; 52 } 53 54 bool uspace_frame_pointer_validate(uintptr_t fp) 55 { 56 return false; 57 } 58 59 bool uspace_frame_pointer_prev(uintptr_t fp, uintptr_t *prev) 60 { 61 return false; 62 } 63 64 bool uspace_return_address_get(uintptr_t fp, uintptr_t *ra) 234 65 { 235 66 return false; -
kernel/arch/mips32/src/debug/stacktrace_asm.S
r2d0c3a6 r527298a 37 37 frame_pointer_get: 38 38 j $ra 39 move $v0, $sp39 xor $v0, $v0 40 40 41 41 program_counter_get: 42 42 j $ra 43 move $v0, $ra43 xor $v0, $v0 -
kernel/arch/mips32/src/debugger.c
r2d0c3a6 r527298a 134 134 * 135 135 */ 136 bool is_jump(unative_t instr)136 static bool is_jump(unative_t instr) 137 137 { 138 138 unsigned int i; -
kernel/arch/ppc32/src/debug/stacktrace.c
r2d0c3a6 r527298a 40 40 #define FRAME_OFFSET_RA 1 41 41 42 bool kernel_ stack_trace_context_validate(stack_trace_context_t *ctx)42 bool kernel_frame_pointer_validate(uintptr_t fp) 43 43 { 44 return ctx->fp != 0;44 return fp != 0; 45 45 } 46 46 47 bool kernel_frame_pointer_prev( stack_trace_context_t *ctx, uintptr_t *prev)47 bool kernel_frame_pointer_prev(uintptr_t fp, uintptr_t *prev) 48 48 { 49 uint32_t *stack = (void *) ctx->fp;49 uint32_t *stack = (void *) fp; 50 50 *prev = stack[FRAME_OFFSET_FP_PREV]; 51 51 return true; 52 52 } 53 53 54 bool kernel_return_address_get( stack_trace_context_t *ctx, uintptr_t *ra)54 bool kernel_return_address_get(uintptr_t fp, uintptr_t *ra) 55 55 { 56 uint32_t *stack = (void *) ctx->fp;56 uint32_t *stack = (void *) fp; 57 57 *ra = stack[FRAME_OFFSET_RA]; 58 58 return true; 59 59 } 60 60 61 bool uspace_ stack_trace_context_validate(stack_trace_context_t *ctx)61 bool uspace_frame_pointer_validate(uintptr_t fp) 62 62 { 63 return ctx->fp != 0;63 return fp != 0; 64 64 } 65 65 66 bool uspace_frame_pointer_prev( stack_trace_context_t *ctx, uintptr_t *prev)66 bool uspace_frame_pointer_prev(uintptr_t fp, uintptr_t *prev) 67 67 { 68 68 return !copy_from_uspace((void *) prev, 69 (uint32_t *) ctx->fp + FRAME_OFFSET_FP_PREV, sizeof(*prev));69 (uint32_t *) fp + FRAME_OFFSET_FP_PREV, sizeof(*prev)); 70 70 } 71 71 72 bool uspace_return_address_get( stack_trace_context_t *ctx, uintptr_t *ra)72 bool uspace_return_address_get(uintptr_t fp, uintptr_t *ra) 73 73 { 74 return !copy_from_uspace((void *) ra, 75 (uint32_t *) ctx->fp + FRAME_OFFSET_RA,sizeof(*ra));74 return !copy_from_uspace((void *) ra, (uint32_t *) fp + FRAME_OFFSET_RA, 75 sizeof(*ra)); 76 76 } 77 77 -
kernel/arch/sparc64/src/debug/stacktrace.c
r2d0c3a6 r527298a 50 50 extern void alloc_window_and_flush(void); 51 51 52 bool kernel_ stack_trace_context_validate(stack_trace_context_t *ctx)52 bool kernel_frame_pointer_validate(uintptr_t fp) 53 53 { 54 54 uintptr_t kstack; … … 63 63 kstack -= PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE; 64 64 65 if (THREAD && ( ctx->fp == kstack))65 if (THREAD && (fp == kstack)) 66 66 return false; 67 return ctx->fp != 0;67 return fp != 0; 68 68 } 69 69 70 bool kernel_frame_pointer_prev( stack_trace_context_t *ctx, uintptr_t *prev)70 bool kernel_frame_pointer_prev(uintptr_t fp, uintptr_t *prev) 71 71 { 72 uint64_t *stack = (void *) ctx->fp;72 uint64_t *stack = (void *) fp; 73 73 alloc_window_and_flush(); 74 74 *prev = stack[FRAME_OFFSET_FP_PREV] + STACK_BIAS; … … 76 76 } 77 77 78 bool kernel_return_address_get( stack_trace_context_t *ctx, uintptr_t *ra)78 bool kernel_return_address_get(uintptr_t fp, uintptr_t *ra) 79 79 { 80 uint64_t *stack = (void *) ctx->fp;80 uint64_t *stack = (void *) fp; 81 81 alloc_window_and_flush(); 82 82 *ra = stack[FRAME_OFFSET_RA]; … … 84 84 } 85 85 86 bool uspace_ stack_trace_context_validate(stack_trace_context_t *ctx)86 bool uspace_frame_pointer_validate(uintptr_t fp) 87 87 { 88 88 return false; 89 89 } 90 90 91 bool uspace_frame_pointer_prev( stack_trace_context_t *ctx, uintptr_t *prev)91 bool uspace_frame_pointer_prev(uintptr_t fp, uintptr_t *prev) 92 92 { 93 93 return false; 94 94 } 95 95 96 bool uspace_return_address_get( stack_trace_context_t *ctx, uintptr_t *ra)96 bool uspace_return_address_get(uintptr_t fp, uintptr_t *ra) 97 97 { 98 98 return false; -
kernel/generic/include/macros.h
r2d0c3a6 r527298a 47 47 * @param s2 Start address of the second interval. 48 48 * @param sz2 Size of the second interval. 49 *50 49 */ 51 NO_TRACE static inline int overlaps(uint 64_t s1, uint64_t sz1, uint64_t s2,52 uint64_t sz2)50 NO_TRACE static inline int overlaps(uintptr_t s1, size_t sz1, uintptr_t s2, 51 size_t sz2) 53 52 { 54 uint 64_t e1 = s1 + sz1;55 uint 64_t e2 = s2 + sz2;53 uintptr_t e1 = s1 + sz1; 54 uintptr_t e2 = s2 + sz2; 56 55 57 56 return ((s1 < e2) && (s2 < e1)); 58 }59 60 /** Return true if the second interval is within the first interval.61 *62 * @param s1 Start address of the first interval.63 * @param sz1 Size of the first interval.64 * @param s2 Start address of the second interval.65 * @param sz2 Size of the second interval.66 *67 */68 NO_TRACE static inline int iswithin(uint64_t s1, uint64_t sz1, uint64_t s2,69 uint64_t sz2)70 {71 uint64_t e1 = s1 + sz1;72 uint64_t e2 = s2 + sz2;73 74 return ((s1 <= s2) && (e1 >= e2));75 57 } 76 58 … … 92 74 93 75 /* Compute overlapping of physical addresses */ 94 #define PA_ OVERLAPS(x, szx, y, szy) \76 #define PA_overlaps(x, szx, y, szy) \ 95 77 overlaps(KA2PA((x)), (szx), KA2PA((y)), (szy)) 96 78 -
kernel/generic/include/stacktrace.h
r2d0c3a6 r527298a 42 42 43 43 typedef struct { 44 uintptr_t fp; 45 uintptr_t pc; 46 struct istate *istate; 47 } stack_trace_context_t; 48 49 typedef struct { 50 bool (* stack_trace_context_validate)(stack_trace_context_t *); 51 bool (* frame_pointer_prev)(stack_trace_context_t *, uintptr_t *); 52 bool (* return_address_get)(stack_trace_context_t *, uintptr_t *); 44 bool (* frame_pointer_validate)(uintptr_t); 45 bool (* frame_pointer_prev)(uintptr_t, uintptr_t *); 46 bool (* return_address_get)(uintptr_t, uintptr_t *); 53 47 bool (* symbol_resolve)(uintptr_t, const char **, uintptr_t *); 54 48 } stack_trace_ops_t; … … 59 53 extern void stack_trace(void); 60 54 extern void stack_trace_istate(struct istate *); 61 extern void stack_trace_ ctx(stack_trace_ops_t *, stack_trace_context_t *);55 extern void stack_trace_fp_pc(stack_trace_ops_t *, uintptr_t, uintptr_t); 62 56 63 57 /* … … 67 61 extern uintptr_t program_counter_get(void); 68 62 69 extern bool kernel_ stack_trace_context_validate(stack_trace_context_t *);70 extern bool kernel_frame_pointer_prev( stack_trace_context_t *, uintptr_t *);71 extern bool kernel_return_address_get( stack_trace_context_t *, uintptr_t *);63 extern bool kernel_frame_pointer_validate(uintptr_t); 64 extern bool kernel_frame_pointer_prev(uintptr_t, uintptr_t *); 65 extern bool kernel_return_address_get(uintptr_t, uintptr_t *); 72 66 73 extern bool uspace_ stack_trace_context_validate(stack_trace_context_t *);74 extern bool uspace_frame_pointer_prev( stack_trace_context_t *, uintptr_t *);75 extern bool uspace_return_address_get( stack_trace_context_t *, uintptr_t *);67 extern bool uspace_frame_pointer_validate(uintptr_t); 68 extern bool uspace_frame_pointer_prev(uintptr_t, uintptr_t *); 69 extern bool uspace_return_address_get(uintptr_t, uintptr_t *); 76 70 77 71 #endif -
kernel/generic/src/debug/stacktrace.c
r2d0c3a6 r527298a 27 27 */ 28 28 29 /** @addtogroup genericdebug 29 /** @addtogroup genericdebug 30 30 * @{ 31 31 */ … … 42 42 43 43 void 44 stack_trace_ ctx(stack_trace_ops_t *ops, stack_trace_context_t *ctx)44 stack_trace_fp_pc(stack_trace_ops_t *ops, uintptr_t fp, uintptr_t pc) 45 45 { 46 46 int cnt = 0; 47 47 const char *symbol; 48 48 uintptr_t offset; 49 uintptr_t fp;50 uintptr_t pc;51 49 52 while (cnt++ < STACK_FRAMES_MAX && 53 ops->stack_trace_context_validate(ctx)) { 50 while (cnt++ < STACK_FRAMES_MAX && ops->frame_pointer_validate(fp)) { 54 51 if (ops->symbol_resolve && 55 ops->symbol_resolve( ctx->pc, &symbol, &offset)) {52 ops->symbol_resolve(pc, &symbol, &offset)) { 56 53 if (offset) 57 printf("%p: %s+%" PRIp "()\n", 58 ctx->fp, symbol, offset); 54 printf("%p: %s+%" PRIp "()\n", fp, symbol, offset); 59 55 else 60 printf("%p: %s()\n", 61 ctx->fp, symbol); 56 printf("%p: %s()\n", fp, symbol); 62 57 } else { 63 printf("%p: %p()\n", ctx->fp, ctx->pc);58 printf("%p: %p()\n", fp, pc); 64 59 } 65 if (!ops->return_address_get( ctx, &pc))60 if (!ops->return_address_get(fp, &pc)) 66 61 break; 67 if (!ops->frame_pointer_prev( ctx, &fp))62 if (!ops->frame_pointer_prev(fp, &fp)) 68 63 break; 69 ctx->fp = fp;70 ctx->pc = pc;71 64 } 72 65 } … … 74 67 void stack_trace(void) 75 68 { 76 stack_trace_context_t ctx = { 77 .fp = frame_pointer_get(), 78 .pc = program_counter_get(), 79 .istate = NULL 80 }; 81 82 stack_trace_ctx(&kst_ops, &ctx); 69 stack_trace_fp_pc(&kst_ops, frame_pointer_get(), program_counter_get()); 83 70 84 71 /* … … 91 78 void stack_trace_istate(istate_t *istate) 92 79 { 93 stack_trace_context_t ctx = {94 .fp = istate_get_fp(istate),95 .pc = istate_get_pc(istate),96 .istate = istate97 };98 99 80 if (istate_from_uspace(istate)) 100 stack_trace_ctx(&ust_ops, &ctx); 81 stack_trace_fp_pc(&ust_ops, istate_get_fp(istate), 82 istate_get_pc(istate)); 101 83 else 102 stack_trace_ctx(&kst_ops, &ctx); 84 stack_trace_fp_pc(&kst_ops, istate_get_fp(istate), 85 istate_get_pc(istate)); 103 86 } 104 87 105 static bool 106 kernel_symbol_resolve(uintptr_t addr, const char **sp, uintptr_t *op) 88 static bool kernel_symbol_resolve(uintptr_t addr, const char **sp, uintptr_t *op) 107 89 { 108 90 return (symtab_name_lookup(addr, sp, op) == 0); … … 110 92 111 93 stack_trace_ops_t kst_ops = { 112 . stack_trace_context_validate = kernel_stack_trace_context_validate,94 .frame_pointer_validate = kernel_frame_pointer_validate, 113 95 .frame_pointer_prev = kernel_frame_pointer_prev, 114 96 .return_address_get = kernel_return_address_get, … … 117 99 118 100 stack_trace_ops_t ust_ops = { 119 . stack_trace_context_validate = uspace_stack_trace_context_validate,101 .frame_pointer_validate = uspace_frame_pointer_validate, 120 102 .frame_pointer_prev = uspace_frame_pointer_prev, 121 103 .return_address_get = uspace_return_address_get, -
kernel/generic/src/main/main.c
r2d0c3a6 r527298a 147 147 size_t i; 148 148 for (i = 0; i < init.cnt; i++) { 149 if (PA_ OVERLAPS(config.stack_base, config.stack_size,149 if (PA_overlaps(config.stack_base, config.stack_size, 150 150 init.tasks[i].addr, init.tasks[i].size)) 151 151 config.stack_base = ALIGN_UP(init.tasks[i].addr + … … 155 155 /* Avoid placing stack on top of boot allocations. */ 156 156 if (ballocs.size) { 157 if (PA_ OVERLAPS(config.stack_base, config.stack_size,157 if (PA_overlaps(config.stack_base, config.stack_size, 158 158 ballocs.base, ballocs.size)) 159 159 config.stack_base = ALIGN_UP(ballocs.base + -
kernel/generic/src/mm/frame.c
r2d0c3a6 r527298a 121 121 * 122 122 */ 123 NO_TRACE static size_t zones_insert_zone(pfn_t base, size_t count, 124 zone_flags_t flags) 123 NO_TRACE static size_t zones_insert_zone(pfn_t base, size_t count) 125 124 { 126 125 if (zones.count + 1 == ZONES_MAX) { … … 132 131 for (i = 0; i < zones.count; i++) { 133 132 /* Check for overlap */ 134 if (overlaps(zones.info[i].base, zones.info[i].count, 135 base, count)) { 136 137 /* 138 * If the overlaping zones are of the same type 139 * and the new zone is completely within the previous 140 * one, then quietly ignore the new zone. 141 * 142 */ 143 144 if ((zones.info[i].flags != flags) || 145 (!iswithin(zones.info[i].base, zones.info[i].count, 146 base, count))) { 147 printf("Zone (%p, %p) overlaps with previous zone (%p, %p)!\n", 148 PFN2ADDR(base), PFN2ADDR(count), 149 PFN2ADDR(zones.info[i].base), 150 PFN2ADDR(zones.info[i].count)); 151 } 152 133 if (overlaps(base, count, 134 zones.info[i].base, zones.info[i].count)) { 135 printf("Zone (%p, %p) overlaps with zone (%p, %p)!\n", 136 PFN2ADDR(base), PFN2ADDR(base + count), 137 PFN2ADDR(zones.info[i].base), 138 PFN2ADDR(zones.info[i].base + zones.info[i].count)); 153 139 return (size_t) -1; 154 140 } … … 161 147 for (j = zones.count; j > i; j--) { 162 148 zones.info[j] = zones.info[j - 1]; 163 if (zones.info[j].buddy_system != NULL) 164 zones.info[j].buddy_system->data = 165 (void *) &zones.info[j]; 149 zones.info[j].buddy_system->data = 150 (void *) &zones.info[j - 1]; 166 151 } 167 152 … … 763 748 for (i = z2 + 1; i < zones.count; i++) { 764 749 zones.info[i - 1] = zones.info[i]; 765 if (zones.info[i - 1].buddy_system != NULL) 766 zones.info[i - 1].buddy_system->data = 767 (void *) &zones.info[i - 1]; 750 zones.info[i - 1].buddy_system->data = 751 (void *) &zones.info[i - 1]; 768 752 } 769 753 … … 914 898 } 915 899 916 size_t znum = zones_insert_zone(start, count , flags);900 size_t znum = zones_insert_zone(start, count); 917 901 if (znum == (size_t) -1) { 918 902 irq_spinlock_unlock(&zones.lock, true); … … 937 921 938 922 /* Non-available zone */ 939 size_t znum = zones_insert_zone(start, count , flags);923 size_t znum = zones_insert_zone(start, count); 940 924 if (znum == (size_t) -1) { 941 925 irq_spinlock_unlock(&zones.lock, true); -
tools/mkfat.py
r2d0c3a6 r527298a 343 343 def usage(prname): 344 344 "Print usage syntax" 345 print prname + " < EXTRA_BYTES> <PATH> <IMAGE>"345 print prname + " <PATH> <IMAGE>" 346 346 347 347 def main(): 348 if (len(sys.argv) < 4):348 if (len(sys.argv) < 3): 349 349 usage(sys.argv[0]) 350 350 return 351 351 352 if (not sys.argv[1].isdigit()): 353 print "<EXTRA_BYTES> must be a number" 354 return 355 356 extra_bytes = int(sys.argv[1]) 357 358 path = os.path.abspath(sys.argv[2]) 352 path = os.path.abspath(sys.argv[1]) 359 353 if (not os.path.isdir(path)): 360 354 print "<PATH> must be a directory" … … 371 365 372 366 # Make sure the filesystem is large enought for FAT16 373 size = subtree_size(path, cluster_size, dirent_size) + reserved_clusters * cluster_size + extra_bytes367 size = subtree_size(path, cluster_size, dirent_size) + reserved_clusters * cluster_size 374 368 while (size / cluster_size < fat16_clusters): 375 369 if (cluster_size > sector_size): 376 370 cluster_size /= 2 377 size = subtree_size(path, cluster_size, dirent_size) + reserved_clusters * cluster_size + extra_bytes371 size = subtree_size(path, cluster_size, dirent_size) + reserved_clusters * cluster_size 378 372 else: 379 373 size = fat16_clusters * cluster_size + reserved_clusters * cluster_size … … 387 381 data_start = root_start + root_size 388 382 389 outf = file(sys.argv[ 3], "w")383 outf = file(sys.argv[2], "w") 390 384 391 385 boot_sector = xstruct.create(BOOT_SECTOR) -
uspace/Makefile.common
r2d0c3a6 r527298a 172 172 ifneq ($(BINARY),) 173 173 %.disasm: $(BINARY) 174 ifeq ($(CONFIG_LINE_DEBUG),y)175 $(OBJDUMP) -d -S $< > $@176 else177 174 $(OBJDUMP) -d $< > $@ 178 endif179 175 180 176 $(BINARY): $(LINKER_SCRIPT) $(OBJECTS) $(LIBS) $(BASE_LIBS) -
uspace/app/klog/klog.c
r2d0c3a6 r527298a 43 43 #include <event.h> 44 44 #include <errno.h> 45 #include <str_error.h>46 45 #include <io/klog.h> 47 46 48 #define NAME "klog" 49 #define LOG_FNAME "/log/klog" 47 #define NAME "klog" 50 48 51 49 /* Pointer to klog area */ 52 50 static wchar_t *klog; 53 51 static size_t klog_length; 54 55 static FILE *log;56 52 57 53 static void interrupt_received(ipc_callid_t callid, ipc_call_t *call) … … 62 58 size_t i; 63 59 64 for (i = klog_len - klog_stored; i < klog_len; i++) { 65 wchar_t ch = klog[(klog_start + i) % klog_length]; 66 67 putchar(ch); 68 69 if (log != NULL) 70 fputc(ch, log); 71 } 72 73 if (log != NULL) { 74 fflush(log); 75 fsync(fileno(log)); 76 } 60 for (i = klog_len - klog_stored; i < klog_len; i++) 61 putchar(klog[(klog_start + i) % klog_length]); 77 62 } 78 63 … … 106 91 } 107 92 108 /*109 * Mode "a" would be definitively much better here, but it is110 * not well supported by the FAT driver.111 *112 */113 log = fopen(LOG_FNAME, "w");114 if (log == NULL)115 printf("%s: Unable to create log file %s (%s)\n", NAME, LOG_FNAME,116 str_error(errno));117 118 93 async_set_interrupt_received(interrupt_received); 119 94 klog_update(); -
uspace/lib/c/generic/io/io.c
r2d0c3a6 r527298a 757 757 } 758 758 759 int fileno(FILE *stream)760 {761 if (stream->klog) {762 errno = EBADF;763 return -1;764 }765 766 return stream->fd;767 }768 769 759 int fphone(FILE *stream) 770 760 { -
uspace/lib/c/include/stdio.h
r2d0c3a6 r527298a 171 171 extern off64_t ftell(FILE *); 172 172 extern int feof(FILE *); 173 extern int fileno(FILE *);174 173 175 174 extern int fflush(FILE *); -
uspace/srv/fs/fat/fat.h
r2d0c3a6 r527298a 48 48 49 49 #define min(a, b) ((a) < (b) ? (a) : (b)) 50 51 /*52 * Convenience macros for accessing some frequently used boot sector members.53 */54 #define BPS(bs) uint16_t_le2host((bs)->bps)55 #define SPC(bs) (bs)->spc56 #define RSCNT(bs) uint16_t_le2host((bs)->rscnt)57 #define FATCNT(bs) (bs)->fatcnt58 #define SF(bs) uint16_t_le2host((bs)->sec_per_fat)59 #define RDE(bs) uint16_t_le2host((bs)->root_ent_max)60 #define TS(bs) (uint16_t_le2host((bs)->totsec16) != 0 ? \61 uint16_t_le2host((bs)->totsec16) : \62 uint32_t_le2host(bs->totsec32))63 50 64 51 #define BS_BLOCK 0 … … 211 198 unsigned refcnt; 212 199 bool dirty; 213 214 /*215 * Cache of the node's last and "current" cluster to avoid some216 * unnecessary FAT walks.217 */218 /* Node's last cluster in FAT. */219 bool lastc_cached_valid;220 fat_cluster_t lastc_cached_value;221 /* Node's "current" cluster, i.e. where the last I/O took place. */222 bool currc_cached_valid;223 aoff64_t currc_cached_bn;224 fat_cluster_t currc_cached_value;225 200 } fat_node_t; 226 201 -
uspace/srv/fs/fat/fat_fat.c
r2d0c3a6 r527298a 49 49 #include <mem.h> 50 50 51 /*52 * Convenience macros for computing some frequently used values from the53 * primitive boot sector members.54 */55 #define RDS(bs) ((sizeof(fat_dentry_t) * RDE((bs))) / BPS((bs))) + \56 (((sizeof(fat_dentry_t) * RDE((bs))) % BPS((bs))) != 0)57 #define SSA(bs) (RSCNT((bs)) + FATCNT((bs)) * SF((bs)) + RDS(bs))58 59 #define CLBN2PBN(bs, cl, bn) \60 (SSA((bs)) + ((cl) - FAT_CLST_FIRST) * SPC((bs)) + (bn) % SPC((bs)))61 62 51 /** 63 52 * The fat_alloc_lock mutex protects all copies of the File Allocation Table … … 85 74 { 86 75 block_t *b; 76 unsigned bps; 77 unsigned rscnt; /* block address of the first FAT */ 87 78 uint16_t clusters = 0; 88 79 fat_cluster_t clst = firstc; 89 80 int rc; 81 82 bps = uint16_t_le2host(bs->bps); 83 rscnt = uint16_t_le2host(bs->rscnt); 90 84 91 85 if (firstc == FAT_CLST_RES0) { … … 105 99 if (lastc) 106 100 *lastc = clst; /* remember the last cluster number */ 107 fsec = (clst * sizeof(fat_cluster_t)) / BPS(bs);108 fidx = clst % ( BPS(bs)/ sizeof(fat_cluster_t));101 fsec = (clst * sizeof(fat_cluster_t)) / bps; 102 fidx = clst % (bps / sizeof(fat_cluster_t)); 109 103 /* read FAT1 */ 110 rc = block_get(&b, dev_handle, RSCNT(bs) + fsec, 111 BLOCK_FLAGS_NONE); 104 rc = block_get(&b, dev_handle, rscnt + fsec, BLOCK_FLAGS_NONE); 112 105 if (rc != EOK) 113 106 return rc; … … 132 125 * @param block Pointer to a block pointer for storing result. 133 126 * @param bs Buffer holding the boot sector of the file system. 134 * @param nodep FAT node. 127 * @param dev_handle Device handle of the file system. 128 * @param firstc First cluster used by the file. Can be zero if the file 129 * is empty. 135 130 * @param bn Block number. 136 131 * @param flags Flags passed to libblock. … … 139 134 */ 140 135 int 141 fat_block_get(block_t **block, struct fat_bs *bs, fat_node_t *nodep,142 aoff64_t bn, int flags)143 {144 fat_cluster_t firstc = nodep->firstc;145 fat_cluster_t currc;146 aoff64_t relbn = bn;147 int rc;148 149 if (!nodep->size)150 return ELIMIT;151 152 if (nodep->firstc == FAT_CLST_ROOT)153 goto fall_through;154 155 if (((((nodep->size - 1) / BPS(bs)) / SPC(bs)) == bn / SPC(bs)) &&156 nodep->lastc_cached_valid) {157 /*158 * This is a request to read a block within the last cluster159 * when fortunately we have the last cluster number cached.160 */161 return block_get(block, nodep->idx->dev_handle,162 CLBN2PBN(bs, nodep->lastc_cached_value, bn), flags);163 }164 165 if (nodep->currc_cached_valid && bn >= nodep->currc_cached_bn) {166 /*167 * We can start with the cluster cached by the previous call to168 * fat_block_get().169 */170 firstc = nodep->currc_cached_value;171 relbn -= (nodep->currc_cached_bn / SPC(bs)) * SPC(bs);172 }173 174 fall_through:175 rc = _fat_block_get(block, bs, nodep->idx->dev_handle, firstc,176 &currc, relbn, flags);177 if (rc != EOK)178 return rc;179 180 /*181 * Update the "current" cluster cache.182 */183 nodep->currc_cached_valid = true;184 nodep->currc_cached_bn = bn;185 nodep->currc_cached_value = currc;186 187 return rc;188 }189 190 /** Read block from file located on a FAT file system.191 *192 * @param block Pointer to a block pointer for storing result.193 * @param bs Buffer holding the boot sector of the file system.194 * @param dev_handle Device handle of the file system.195 * @param fcl First cluster used by the file. Can be zero if the file196 * is empty.197 * @param clp If not NULL, address where the cluster containing bn198 * will be stored.199 * stored200 * @param bn Block number.201 * @param flags Flags passed to libblock.202 *203 * @return EOK on success or a negative error code.204 */205 int206 136 _fat_block_get(block_t **block, fat_bs_t *bs, dev_handle_t dev_handle, 207 fat_cluster_t fcl, fat_cluster_t *clp, aoff64_t bn, int flags) 208 { 137 fat_cluster_t firstc, aoff64_t bn, int flags) 138 { 139 unsigned bps; 140 unsigned rscnt; /* block address of the first FAT */ 141 unsigned rde; 142 unsigned rds; /* root directory size */ 143 unsigned sf; 144 unsigned ssa; /* size of the system area */ 209 145 uint16_t clusters; 210 146 unsigned max_clusters; 211 fat_cluster_t c;147 fat_cluster_t lastc; 212 148 int rc; 213 149 … … 215 151 * This function can only operate on non-zero length files. 216 152 */ 217 if (f cl== FAT_CLST_RES0)153 if (firstc == FAT_CLST_RES0) 218 154 return ELIMIT; 219 155 220 if (fcl == FAT_CLST_ROOT) { 156 bps = uint16_t_le2host(bs->bps); 157 rscnt = uint16_t_le2host(bs->rscnt); 158 rde = uint16_t_le2host(bs->root_ent_max); 159 sf = uint16_t_le2host(bs->sec_per_fat); 160 161 rds = (sizeof(fat_dentry_t) * rde) / bps; 162 rds += ((sizeof(fat_dentry_t) * rde) % bps != 0); 163 ssa = rscnt + bs->fatcnt * sf + rds; 164 165 if (firstc == FAT_CLST_ROOT) { 221 166 /* root directory special case */ 222 assert(bn < RDS(bs));223 rc = block_get(block, dev_handle, 224 RSCNT(bs) + FATCNT(bs) * SF(bs) + bn,flags);167 assert(bn < rds); 168 rc = block_get(block, dev_handle, rscnt + bs->fatcnt * sf + bn, 169 flags); 225 170 return rc; 226 171 } 227 172 228 max_clusters = bn / SPC(bs); 229 rc = fat_cluster_walk(bs, dev_handle, fcl, &c, &clusters, max_clusters); 173 max_clusters = bn / bs->spc; 174 rc = fat_cluster_walk(bs, dev_handle, firstc, &lastc, &clusters, 175 max_clusters); 230 176 if (rc != EOK) 231 177 return rc; 232 178 assert(clusters == max_clusters); 233 179 234 rc = block_get(block, dev_handle, CLBN2PBN(bs, c, bn), flags); 235 236 if (clp) 237 *clp = c; 180 rc = block_get(block, dev_handle, 181 ssa + (lastc - FAT_CLST_FIRST) * bs->spc + bn % bs->spc, flags); 238 182 239 183 return rc; … … 254 198 int fat_fill_gap(fat_bs_t *bs, fat_node_t *nodep, fat_cluster_t mcl, aoff64_t pos) 255 199 { 200 uint16_t bps; 201 unsigned spc; 256 202 block_t *b; 257 203 aoff64_t o, boundary; 258 204 int rc; 259 205 260 boundary = ROUND_UP(nodep->size, BPS(bs) * SPC(bs)); 206 bps = uint16_t_le2host(bs->bps); 207 spc = bs->spc; 208 209 boundary = ROUND_UP(nodep->size, bps * spc); 261 210 262 211 /* zero out already allocated space */ 263 212 for (o = nodep->size; o < pos && o < boundary; 264 o = ALIGN_DOWN(o + BPS(bs), BPS(bs))) {265 int flags = (o % BPS(bs)== 0) ?213 o = ALIGN_DOWN(o + bps, bps)) { 214 int flags = (o % bps == 0) ? 266 215 BLOCK_FLAGS_NOREAD : BLOCK_FLAGS_NONE; 267 rc = fat_block_get(&b, bs, nodep, o / BPS(bs), flags);268 if (rc != EOK) 269 return rc; 270 memset(b->data + o % BPS(bs), 0, BPS(bs) - o % BPS(bs));216 rc = fat_block_get(&b, bs, nodep, o / bps, flags); 217 if (rc != EOK) 218 return rc; 219 memset(b->data + o % bps, 0, bps - o % bps); 271 220 b->dirty = true; /* need to sync node */ 272 221 rc = block_put(b); … … 279 228 280 229 /* zero out the initial part of the new cluster chain */ 281 for (o = boundary; o < pos; o += BPS(bs)) {230 for (o = boundary; o < pos; o += bps) { 282 231 rc = _fat_block_get(&b, bs, nodep->idx->dev_handle, mcl, 283 NULL, (o - boundary) / BPS(bs), BLOCK_FLAGS_NOREAD);284 if (rc != EOK) 285 return rc; 286 memset(b->data, 0, min( BPS(bs), pos - o));232 (o - boundary) / bps, BLOCK_FLAGS_NOREAD); 233 if (rc != EOK) 234 return rc; 235 memset(b->data, 0, min(bps, pos - o)); 287 236 b->dirty = true; /* need to sync node */ 288 237 rc = block_put(b); … … 308 257 { 309 258 block_t *b; 259 uint16_t bps; 260 uint16_t rscnt; 261 uint16_t sf; 310 262 fat_cluster_t *cp; 311 263 int rc; 312 264 313 rc = block_get(&b, dev_handle, RSCNT(bs) + SF(bs) * fatno + 314 (clst * sizeof(fat_cluster_t)) / BPS(bs), BLOCK_FLAGS_NONE); 265 bps = uint16_t_le2host(bs->bps); 266 rscnt = uint16_t_le2host(bs->rscnt); 267 sf = uint16_t_le2host(bs->sec_per_fat); 268 269 rc = block_get(&b, dev_handle, rscnt + sf * fatno + 270 (clst * sizeof(fat_cluster_t)) / bps, BLOCK_FLAGS_NONE); 315 271 if (rc != EOK) 316 272 return rc; 317 cp = (fat_cluster_t *)b->data + 318 clst % (BPS(bs) / sizeof(fat_cluster_t)); 273 cp = (fat_cluster_t *)b->data + clst % (bps / sizeof(fat_cluster_t)); 319 274 *value = uint16_t_le2host(*cp); 320 275 rc = block_put(b); … … 338 293 { 339 294 block_t *b; 295 uint16_t bps; 296 uint16_t rscnt; 297 uint16_t sf; 340 298 fat_cluster_t *cp; 341 299 int rc; 342 300 343 assert(fatno < FATCNT(bs)); 344 rc = block_get(&b, dev_handle, RSCNT(bs) + SF(bs) * fatno + 345 (clst * sizeof(fat_cluster_t)) / BPS(bs), BLOCK_FLAGS_NONE); 301 bps = uint16_t_le2host(bs->bps); 302 rscnt = uint16_t_le2host(bs->rscnt); 303 sf = uint16_t_le2host(bs->sec_per_fat); 304 305 assert(fatno < bs->fatcnt); 306 rc = block_get(&b, dev_handle, rscnt + sf * fatno + 307 (clst * sizeof(fat_cluster_t)) / bps, BLOCK_FLAGS_NONE); 346 308 if (rc != EOK) 347 309 return rc; 348 cp = (fat_cluster_t *)b->data + 349 clst % (BPS(bs) / sizeof(fat_cluster_t)); 310 cp = (fat_cluster_t *)b->data + clst % (bps / sizeof(fat_cluster_t)); 350 311 *cp = host2uint16_t_le(value); 351 312 b->dirty = true; /* need to sync block */ … … 403 364 fat_cluster_t *mcl, fat_cluster_t *lcl) 404 365 { 366 uint16_t bps; 367 uint16_t rscnt; 368 uint16_t sf; 369 uint32_t ts; 370 unsigned rde; 371 unsigned rds; 372 unsigned ssa; 405 373 block_t *blk; 406 374 fat_cluster_t *lifo; /* stack for storing free cluster numbers */ … … 413 381 return ENOMEM; 414 382 383 bps = uint16_t_le2host(bs->bps); 384 rscnt = uint16_t_le2host(bs->rscnt); 385 sf = uint16_t_le2host(bs->sec_per_fat); 386 rde = uint16_t_le2host(bs->root_ent_max); 387 ts = (uint32_t) uint16_t_le2host(bs->totsec16); 388 if (ts == 0) 389 ts = uint32_t_le2host(bs->totsec32); 390 391 rds = (sizeof(fat_dentry_t) * rde) / bps; 392 rds += ((sizeof(fat_dentry_t) * rde) % bps != 0); 393 ssa = rscnt + bs->fatcnt * sf + rds; 394 415 395 /* 416 396 * Search FAT1 for unused clusters. 417 397 */ 418 398 fibril_mutex_lock(&fat_alloc_lock); 419 for (b = 0, cl = 0; b < SF(bs); b++) { 420 rc = block_get(&blk, dev_handle, RSCNT(bs) + b, 421 BLOCK_FLAGS_NONE); 399 for (b = 0, cl = 0; b < sf; b++) { 400 rc = block_get(&blk, dev_handle, rscnt + b, BLOCK_FLAGS_NONE); 422 401 if (rc != EOK) 423 402 goto error; 424 for (c = 0; c < BPS(bs)/ sizeof(fat_cluster_t); c++, cl++) {403 for (c = 0; c < bps / sizeof(fat_cluster_t); c++, cl++) { 425 404 /* 426 * Check if the entire cluster is physically there. 427 * This check becomes necessary when the file system is 428 * created with fewer total sectors than how many is 429 * inferred from the size of the file allocation table 430 * or when the last cluster ends beyond the end of the 431 * device. 405 * Check if the cluster is physically there. This check 406 * becomes necessary when the file system is created 407 * with fewer total sectors than how many is inferred 408 * from the size of the file allocation table. 432 409 */ 433 if ((cl >= FAT_CLST_FIRST) && 434 CLBN2PBN(bs, cl, SPC(bs) - 1) >= TS(bs)) { 410 if ((cl >= 2) && ((cl - 2) * bs->spc + ssa >= ts)) { 435 411 rc = block_put(blk); 436 412 if (rc != EOK) … … 535 511 * @param nodep Node representing the file. 536 512 * @param mcl First cluster of the cluster chain to append. 537 * @param lcl Last cluster of the cluster chain to append.538 513 * 539 514 * @return EOK on success or a negative error code. 540 515 */ 541 int 542 fat_append_clusters(fat_bs_t *bs, fat_node_t *nodep, fat_cluster_t mcl, 543 fat_cluster_t lcl) 516 int fat_append_clusters(fat_bs_t *bs, fat_node_t *nodep, fat_cluster_t mcl) 544 517 { 545 518 dev_handle_t dev_handle = nodep->idx->dev_handle; 546 fat_cluster_t l astc;519 fat_cluster_t lcl; 547 520 uint16_t numc; 548 521 uint8_t fatno; 549 522 int rc; 550 523 551 if (nodep->lastc_cached_valid) { 552 lastc = nodep->lastc_cached_value; 553 nodep->lastc_cached_valid = false; 554 } else { 555 rc = fat_cluster_walk(bs, dev_handle, nodep->firstc, &lastc, 556 &numc, (uint16_t) -1); 557 if (rc != EOK) 558 return rc; 559 560 if (numc == 0) { 561 /* No clusters allocated to the node yet. */ 562 nodep->firstc = mcl; 563 nodep->dirty = true; /* need to sync node */ 564 return EOK; 565 } 524 rc = fat_cluster_walk(bs, dev_handle, nodep->firstc, &lcl, &numc, 525 (uint16_t) -1); 526 if (rc != EOK) 527 return rc; 528 529 if (numc == 0) { 530 /* No clusters allocated to the node yet. */ 531 nodep->firstc = mcl; 532 nodep->dirty = true; /* need to sync node */ 533 return EOK; 566 534 } 567 535 568 536 for (fatno = FAT1; fatno < bs->fatcnt; fatno++) { 569 rc = fat_set_cluster(bs, nodep->idx->dev_handle, fatno, l astc,537 rc = fat_set_cluster(bs, nodep->idx->dev_handle, fatno, lcl, 570 538 mcl); 571 539 if (rc != EOK) 572 540 return rc; 573 541 } 574 575 nodep->lastc_cached_valid = true;576 nodep->lastc_cached_value = lcl;577 542 578 543 return EOK; … … 583 548 * @param bs Buffer holding the boot sector of the file system. 584 549 * @param nodep FAT node where the chopping will take place. 585 * @param l clLast cluster which will remain in the node. If this550 * @param lastc Last cluster which will remain in the node. If this 586 551 * argument is FAT_CLST_RES0, then all clusters will 587 552 * be chopped off. … … 589 554 * @return EOK on success or a negative return code. 590 555 */ 591 int fat_chop_clusters(fat_bs_t *bs, fat_node_t *nodep, fat_cluster_t lcl) 592 { 593 int rc; 556 int fat_chop_clusters(fat_bs_t *bs, fat_node_t *nodep, fat_cluster_t lastc) 557 { 558 int rc; 559 594 560 dev_handle_t dev_handle = nodep->idx->dev_handle; 595 596 /* 597 * Invalidate cached cluster numbers. 598 */ 599 nodep->lastc_cached_valid = false; 600 if (nodep->currc_cached_value != lcl) 601 nodep->currc_cached_valid = false; 602 603 if (lcl == FAT_CLST_RES0) { 561 if (lastc == FAT_CLST_RES0) { 604 562 /* The node will have zero size and no clusters allocated. */ 605 563 rc = fat_free_clusters(bs, dev_handle, nodep->firstc); … … 612 570 unsigned fatno; 613 571 614 rc = fat_get_cluster(bs, dev_handle, FAT1, l cl, &nextc);572 rc = fat_get_cluster(bs, dev_handle, FAT1, lastc, &nextc); 615 573 if (rc != EOK) 616 574 return rc; … … 618 576 /* Terminate the cluster chain in all copies of FAT. */ 619 577 for (fatno = FAT1; fatno < bs->fatcnt; fatno++) { 620 rc = fat_set_cluster(bs, dev_handle, fatno, l cl,578 rc = fat_set_cluster(bs, dev_handle, fatno, lastc, 621 579 FAT_CLST_LAST1); 622 580 if (rc != EOK) … … 630 588 } 631 589 632 /*633 * Update and re-enable the last cluster cache.634 */635 nodep->lastc_cached_valid = true;636 nodep->lastc_cached_value = lcl;637 638 590 return EOK; 639 591 } … … 644 596 int i; 645 597 block_t *b; 646 int rc; 647 648 for (i = 0; i < SPC(bs); i++) { 649 rc = _fat_block_get(&b, bs, dev_handle, c, NULL, i, 598 unsigned bps; 599 int rc; 600 601 bps = uint16_t_le2host(bs->bps); 602 603 for (i = 0; i < bs->spc; i++) { 604 rc = _fat_block_get(&b, bs, dev_handle, c, i, 650 605 BLOCK_FLAGS_NOREAD); 651 606 if (rc != EOK) 652 607 return rc; 653 memset(b->data, 0, BPS(bs));608 memset(b->data, 0, bps); 654 609 b->dirty = true; 655 610 rc = block_put(b); -
uspace/srv/fs/fat/fat_fat.h
r2d0c3a6 r527298a 64 64 fat_cluster_t *, uint16_t *, uint16_t); 65 65 66 extern int fat_block_get(block_t **, struct fat_bs *, struct fat_node *, 67 aoff64_t, int); 66 #define fat_block_get(b, bs, np, bn, flags) \ 67 _fat_block_get((b), (bs), (np)->idx->dev_handle, (np)->firstc, (bn), \ 68 (flags)) 69 68 70 extern int _fat_block_get(block_t **, struct fat_bs *, dev_handle_t, 69 fat_cluster_t, fat_cluster_t *,aoff64_t, int);71 fat_cluster_t, aoff64_t, int); 70 72 71 73 extern int fat_append_clusters(struct fat_bs *, struct fat_node *, 72 fat_cluster_t , fat_cluster_t);74 fat_cluster_t); 73 75 extern int fat_chop_clusters(struct fat_bs *, struct fat_node *, 74 76 fat_cluster_t); -
uspace/srv/fs/fat/fat_ops.c
r2d0c3a6 r527298a 60 60 #define FS_NODE(node) ((node) ? (node)->bp : NULL) 61 61 62 #define DPS(bs) (BPS((bs)) / sizeof(fat_dentry_t))63 #define BPC(bs) (BPS((bs)) * SPC((bs)))64 65 62 /** Mutex protecting the list of cached free FAT nodes. */ 66 63 static FIBRIL_MUTEX_INITIALIZE(ffn_mutex); … … 104 101 node->refcnt = 0; 105 102 node->dirty = false; 106 node->lastc_cached_valid = false;107 node->lastc_cached_value = FAT_CLST_LAST1;108 node->currc_cached_valid = false;109 node->currc_cached_bn = 0;110 node->currc_cached_value = FAT_CLST_LAST1;111 103 } 112 104 … … 116 108 fat_bs_t *bs; 117 109 fat_dentry_t *d; 110 uint16_t bps; 111 unsigned dps; 118 112 int rc; 119 113 … … 121 115 122 116 bs = block_bb_get(node->idx->dev_handle); 117 bps = uint16_t_le2host(bs->bps); 118 dps = bps / sizeof(fat_dentry_t); 123 119 124 120 /* Read the block that contains the dentry of interest. */ 125 121 rc = _fat_block_get(&b, bs, node->idx->dev_handle, node->idx->pfc, 126 NULL, (node->idx->pdi * sizeof(fat_dentry_t)) / BPS(bs), 127 BLOCK_FLAGS_NONE); 122 (node->idx->pdi * sizeof(fat_dentry_t)) / bps, BLOCK_FLAGS_NONE); 128 123 if (rc != EOK) 129 124 return rc; 130 125 131 d = ((fat_dentry_t *)b->data) + (node->idx->pdi % DPS(bs));126 d = ((fat_dentry_t *)b->data) + (node->idx->pdi % dps); 132 127 133 128 d->firstc = host2uint16_t_le(node->firstc); … … 271 266 fat_dentry_t *d; 272 267 fat_node_t *nodep = NULL; 268 unsigned bps; 269 unsigned spc; 270 unsigned dps; 273 271 int rc; 274 272 … … 300 298 301 299 bs = block_bb_get(idxp->dev_handle); 300 bps = uint16_t_le2host(bs->bps); 301 spc = bs->spc; 302 dps = bps / sizeof(fat_dentry_t); 302 303 303 304 /* Read the block that contains the dentry of interest. */ 304 rc = _fat_block_get(&b, bs, idxp->dev_handle, idxp->pfc, NULL,305 (idxp->pdi * sizeof(fat_dentry_t)) / BPS(bs), BLOCK_FLAGS_NONE);305 rc = _fat_block_get(&b, bs, idxp->dev_handle, idxp->pfc, 306 (idxp->pdi * sizeof(fat_dentry_t)) / bps, BLOCK_FLAGS_NONE); 306 307 if (rc != EOK) { 307 308 (void) fat_node_put(FS_NODE(nodep)); … … 309 310 } 310 311 311 d = ((fat_dentry_t *)b->data) + (idxp->pdi % DPS(bs));312 d = ((fat_dentry_t *)b->data) + (idxp->pdi % dps); 312 313 if (d->attr & FAT_ATTR_SUBDIR) { 313 314 /* … … 329 330 return rc; 330 331 } 331 nodep->size = BPS(bs) * SPC(bs)* clusters;332 nodep->size = bps * spc * clusters; 332 333 } else { 333 334 nodep->type = FAT_FILE; … … 367 368 char name[FAT_NAME_LEN + 1 + FAT_EXT_LEN + 1]; 368 369 unsigned i, j; 370 unsigned bps; /* bytes per sector */ 371 unsigned dps; /* dentries per sector */ 369 372 unsigned blocks; 370 373 fat_dentry_t *d; … … 374 377 fibril_mutex_lock(&parentp->idx->lock); 375 378 bs = block_bb_get(parentp->idx->dev_handle); 376 blocks = parentp->size / BPS(bs); 379 bps = uint16_t_le2host(bs->bps); 380 dps = bps / sizeof(fat_dentry_t); 381 blocks = parentp->size / bps; 377 382 for (i = 0; i < blocks; i++) { 378 383 rc = fat_block_get(&b, bs, parentp, i, BLOCK_FLAGS_NONE); … … 381 386 return rc; 382 387 } 383 for (j = 0; j < DPS(bs); j++) {388 for (j = 0; j < dps; j++) { 384 389 d = ((fat_dentry_t *)b->data) + j; 385 390 switch (fat_classify_dentry(d)) { … … 409 414 fat_idx_t *idx = fat_idx_get_by_pos( 410 415 parentp->idx->dev_handle, parentp->firstc, 411 i * DPS(bs)+ j);416 i * dps + j); 412 417 fibril_mutex_unlock(&parentp->idx->lock); 413 418 if (!idx) { … … 508 513 fat_bs_t *bs; 509 514 fat_cluster_t mcl, lcl; 515 uint16_t bps; 510 516 int rc; 511 517 512 518 bs = block_bb_get(dev_handle); 519 bps = uint16_t_le2host(bs->bps); 513 520 if (flags & L_DIRECTORY) { 514 521 /* allocate a cluster */ … … 539 546 nodep->type = FAT_DIRECTORY; 540 547 nodep->firstc = mcl; 541 nodep->size = BPS(bs) * SPC(bs);548 nodep->size = bps * bs->spc; 542 549 } else { 543 550 nodep->type = FAT_FILE; … … 602 609 block_t *b; 603 610 unsigned i, j; 611 uint16_t bps; 612 unsigned dps; 604 613 unsigned blocks; 605 614 fat_cluster_t mcl, lcl; … … 631 640 fibril_mutex_lock(&parentp->idx->lock); 632 641 bs = block_bb_get(parentp->idx->dev_handle); 633 634 blocks = parentp->size / BPS(bs); 642 bps = uint16_t_le2host(bs->bps); 643 dps = bps / sizeof(fat_dentry_t); 644 645 blocks = parentp->size / bps; 635 646 636 647 for (i = 0; i < blocks; i++) { … … 640 651 return rc; 641 652 } 642 for (j = 0; j < DPS(bs); j++) {653 for (j = 0; j < dps; j++) { 643 654 d = ((fat_dentry_t *)b->data) + j; 644 655 switch (fat_classify_dentry(d)) { … … 680 691 return rc; 681 692 } 682 rc = fat_append_clusters(bs, parentp, mcl , lcl);693 rc = fat_append_clusters(bs, parentp, mcl); 683 694 if (rc != EOK) { 684 695 (void) fat_free_clusters(bs, parentp->idx->dev_handle, mcl); … … 686 697 return rc; 687 698 } 688 parentp->size += BPS(bs) * SPC(bs);699 parentp->size += bps * bs->spc; 689 700 parentp->dirty = true; /* need to sync node */ 690 701 rc = fat_block_get(&b, bs, parentp, i, BLOCK_FLAGS_NONE); … … 760 771 761 772 childp->idx->pfc = parentp->firstc; 762 childp->idx->pdi = i * DPS(bs)+ j;773 childp->idx->pdi = i * dps + j; 763 774 fibril_mutex_unlock(&childp->idx->lock); 764 775 … … 782 793 fat_bs_t *bs; 783 794 fat_dentry_t *d; 795 uint16_t bps; 784 796 block_t *b; 785 797 bool has_children; … … 800 812 fibril_mutex_lock(&childp->idx->lock); 801 813 bs = block_bb_get(childp->idx->dev_handle); 814 bps = uint16_t_le2host(bs->bps); 802 815 803 816 rc = _fat_block_get(&b, bs, childp->idx->dev_handle, childp->idx->pfc, 804 NULL, (childp->idx->pdi * sizeof(fat_dentry_t)) / BPS(bs),817 (childp->idx->pdi * sizeof(fat_dentry_t)) / bps, 805 818 BLOCK_FLAGS_NONE); 806 819 if (rc != EOK) 807 820 goto error; 808 821 d = (fat_dentry_t *)b->data + 809 (childp->idx->pdi % ( BPS(bs)/ sizeof(fat_dentry_t)));822 (childp->idx->pdi % (bps / sizeof(fat_dentry_t))); 810 823 /* mark the dentry as not-currently-used */ 811 824 d->name[0] = FAT_DENTRY_ERASED; … … 839 852 fat_bs_t *bs; 840 853 fat_node_t *nodep = FAT_NODE(fn); 854 unsigned bps; 855 unsigned dps; 841 856 unsigned blocks; 842 857 block_t *b; … … 851 866 fibril_mutex_lock(&nodep->idx->lock); 852 867 bs = block_bb_get(nodep->idx->dev_handle); 853 854 blocks = nodep->size / BPS(bs); 868 bps = uint16_t_le2host(bs->bps); 869 dps = bps / sizeof(fat_dentry_t); 870 871 blocks = nodep->size / bps; 855 872 856 873 for (i = 0; i < blocks; i++) { … … 862 879 return rc; 863 880 } 864 for (j = 0; j < DPS(bs); j++) {881 for (j = 0; j < dps; j++) { 865 882 d = ((fat_dentry_t *)b->data) + j; 866 883 switch (fat_classify_dentry(d)) { … … 959 976 enum cache_mode cmode; 960 977 fat_bs_t *bs; 978 uint16_t bps; 979 uint16_t rde; 961 980 962 981 /* Accept the mount options */ … … 995 1014 bs = block_bb_get(dev_handle); 996 1015 997 if (BPS(bs) != BS_SIZE) { 1016 /* Read the number of root directory entries. */ 1017 bps = uint16_t_le2host(bs->bps); 1018 rde = uint16_t_le2host(bs->root_ent_max); 1019 1020 if (bps != BS_SIZE) { 998 1021 block_fini(dev_handle); 999 1022 ipc_answer_0(rid, ENOTSUP); … … 1002 1025 1003 1026 /* Initialize the block cache */ 1004 rc = block_cache_init(dev_handle, BPS(bs), 0 /* XXX */, cmode);1027 rc = block_cache_init(dev_handle, bps, 0 /* XXX */, cmode); 1005 1028 if (rc != EOK) { 1006 1029 block_fini(dev_handle); … … 1064 1087 rootp->refcnt = 1; 1065 1088 rootp->lnkcnt = 0; /* FS root is not linked */ 1066 rootp->size = RDE(bs)* sizeof(fat_dentry_t);1089 rootp->size = rde * sizeof(fat_dentry_t); 1067 1090 rootp->idx = ridxp; 1068 1091 ridxp->nodep = rootp; … … 1142 1165 fat_node_t *nodep; 1143 1166 fat_bs_t *bs; 1167 uint16_t bps; 1144 1168 size_t bytes; 1145 1169 block_t *b; … … 1167 1191 1168 1192 bs = block_bb_get(dev_handle); 1193 bps = uint16_t_le2host(bs->bps); 1169 1194 1170 1195 if (nodep->type == FAT_FILE) { … … 1179 1204 (void) async_data_read_finalize(callid, NULL, 0); 1180 1205 } else { 1181 bytes = min(len, BPS(bs) - pos % BPS(bs));1206 bytes = min(len, bps - pos % bps); 1182 1207 bytes = min(bytes, nodep->size - pos); 1183 rc = fat_block_get(&b, bs, nodep, pos / BPS(bs),1208 rc = fat_block_get(&b, bs, nodep, pos / bps, 1184 1209 BLOCK_FLAGS_NONE); 1185 1210 if (rc != EOK) { … … 1189 1214 return; 1190 1215 } 1191 (void) async_data_read_finalize(callid, 1192 b ->data + pos % BPS(bs), bytes);1216 (void) async_data_read_finalize(callid, b->data + pos % bps, 1217 bytes); 1193 1218 rc = block_put(b); 1194 1219 if (rc != EOK) { … … 1205 1230 1206 1231 assert(nodep->type == FAT_DIRECTORY); 1207 assert(nodep->size % BPS(bs)== 0);1208 assert( BPS(bs)% sizeof(fat_dentry_t) == 0);1232 assert(nodep->size % bps == 0); 1233 assert(bps % sizeof(fat_dentry_t) == 0); 1209 1234 1210 1235 /* … … 1214 1239 * the position pointer accordingly. 1215 1240 */ 1216 bnum = (pos * sizeof(fat_dentry_t)) / BPS(bs);1217 while (bnum < nodep->size / BPS(bs)) {1241 bnum = (pos * sizeof(fat_dentry_t)) / bps; 1242 while (bnum < nodep->size / bps) { 1218 1243 aoff64_t o; 1219 1244 … … 1222 1247 if (rc != EOK) 1223 1248 goto err; 1224 for (o = pos % ( BPS(bs)/ sizeof(fat_dentry_t));1225 o < BPS(bs)/ sizeof(fat_dentry_t);1249 for (o = pos % (bps / sizeof(fat_dentry_t)); 1250 o < bps / sizeof(fat_dentry_t); 1226 1251 o++, pos++) { 1227 1252 d = ((fat_dentry_t *)b->data) + o; … … 1281 1306 size_t bytes, size; 1282 1307 block_t *b; 1308 uint16_t bps; 1309 unsigned spc; 1310 unsigned bpc; /* bytes per cluster */ 1283 1311 aoff64_t boundary; 1284 1312 int flags = BLOCK_FLAGS_NONE; … … 1306 1334 1307 1335 bs = block_bb_get(dev_handle); 1336 bps = uint16_t_le2host(bs->bps); 1337 spc = bs->spc; 1338 bpc = bps * spc; 1308 1339 1309 1340 /* … … 1314 1345 * value signalizing a smaller number of bytes written. 1315 1346 */ 1316 bytes = min(len, BPS(bs) - pos % BPS(bs));1317 if (bytes == BPS(bs))1347 bytes = min(len, bps - pos % bps); 1348 if (bytes == bps) 1318 1349 flags |= BLOCK_FLAGS_NOREAD; 1319 1350 1320 boundary = ROUND_UP(nodep->size, BPC(bs));1351 boundary = ROUND_UP(nodep->size, bpc); 1321 1352 if (pos < boundary) { 1322 1353 /* … … 1333 1364 return; 1334 1365 } 1335 rc = fat_block_get(&b, bs, nodep, pos / BPS(bs), flags);1366 rc = fat_block_get(&b, bs, nodep, pos / bps, flags); 1336 1367 if (rc != EOK) { 1337 1368 (void) fat_node_put(fn); … … 1340 1371 return; 1341 1372 } 1342 (void) async_data_write_finalize(callid, 1343 b ->data + pos % BPS(bs), bytes);1373 (void) async_data_write_finalize(callid, b->data + pos % bps, 1374 bytes); 1344 1375 b->dirty = true; /* need to sync block */ 1345 1376 rc = block_put(b); … … 1365 1396 fat_cluster_t mcl, lcl; 1366 1397 1367 nclsts = (ROUND_UP(pos + bytes, BPC(bs)) - boundary) / BPC(bs);1398 nclsts = (ROUND_UP(pos + bytes, bpc) - boundary) / bpc; 1368 1399 /* create an independent chain of nclsts clusters in all FATs */ 1369 1400 rc = fat_alloc_clusters(bs, dev_handle, nclsts, &mcl, &lcl); … … 1384 1415 return; 1385 1416 } 1386 rc = _fat_block_get(&b, bs, dev_handle, lcl, NULL,1387 (pos / BPS(bs)) % SPC(bs),flags);1417 rc = _fat_block_get(&b, bs, dev_handle, lcl, (pos / bps) % spc, 1418 flags); 1388 1419 if (rc != EOK) { 1389 1420 (void) fat_free_clusters(bs, dev_handle, mcl); … … 1393 1424 return; 1394 1425 } 1395 (void) async_data_write_finalize(callid, 1396 b ->data + pos % BPS(bs), bytes);1426 (void) async_data_write_finalize(callid, b->data + pos % bps, 1427 bytes); 1397 1428 b->dirty = true; /* need to sync block */ 1398 1429 rc = block_put(b); … … 1407 1438 * node's cluster chain. 1408 1439 */ 1409 rc = fat_append_clusters(bs, nodep, mcl , lcl);1440 rc = fat_append_clusters(bs, nodep, mcl); 1410 1441 if (rc != EOK) { 1411 1442 (void) fat_free_clusters(bs, dev_handle, mcl); … … 1431 1462 fat_node_t *nodep; 1432 1463 fat_bs_t *bs; 1464 uint16_t bps; 1465 uint8_t spc; 1466 unsigned bpc; /* bytes per cluster */ 1433 1467 int rc; 1434 1468 … … 1445 1479 1446 1480 bs = block_bb_get(dev_handle); 1481 bps = uint16_t_le2host(bs->bps); 1482 spc = bs->spc; 1483 bpc = bps * spc; 1447 1484 1448 1485 if (nodep->size == size) { … … 1454 1491 */ 1455 1492 rc = EINVAL; 1456 } else if (ROUND_UP(nodep->size, BPC(bs)) == ROUND_UP(size, BPC(bs))) {1493 } else if (ROUND_UP(nodep->size, bpc) == ROUND_UP(size, bpc)) { 1457 1494 /* 1458 1495 * The node will be shrunk, but no clusters will be deallocated. … … 1472 1509 fat_cluster_t lastc; 1473 1510 rc = fat_cluster_walk(bs, dev_handle, nodep->firstc, 1474 &lastc, NULL, (size - 1) / BPC(bs));1511 &lastc, NULL, (size - 1) / bpc); 1475 1512 if (rc != EOK) 1476 1513 goto out; … … 1527 1564 void fat_sync(ipc_callid_t rid, ipc_call_t *request) 1528 1565 { 1529 dev_handle_t dev_handle = (dev_handle_t) IPC_GET_ARG1(*request); 1530 fs_index_t index = (fs_index_t) IPC_GET_ARG2(*request); 1531 1532 fs_node_t *fn; 1533 int rc = fat_node_get(&fn, dev_handle, index); 1534 if (rc != EOK) { 1535 ipc_answer_0(rid, rc); 1536 return; 1537 } 1538 if (!fn) { 1539 ipc_answer_0(rid, ENOENT); 1540 return; 1541 } 1542 1543 fat_node_t *nodep = FAT_NODE(fn); 1544 1545 nodep->dirty = true; 1546 rc = fat_node_sync(nodep); 1547 1548 fat_node_put(fn); 1549 ipc_answer_0(rid, rc); 1566 /* Dummy implementation */ 1567 ipc_answer_0(rid, EOK); 1550 1568 } 1551 1569 -
uspace/srv/fs/tmpfs/tmpfs_ops.c
r2d0c3a6 r527298a 736 736 void tmpfs_sync(ipc_callid_t rid, ipc_call_t *request) 737 737 { 738 /* 739 * TMPFS keeps its data structures always consistent, 740 * thus the sync operation is a no-op. 741 */ 738 /* Dummy implementation */ 742 739 ipc_answer_0(rid, EOK); 743 740 }
Note:
See TracChangeset
for help on using the changeset viewer.