Changes in / [2d0c3a6:527298a] in mainline


Ignore:
Files:
1 deleted
67 edited

Legend:

Unmodified
Added
Removed
  • HelenOS.config

    r2d0c3a6 r527298a  
    498498@ "1152x720"
    499499@ "1152x864"
    500 @ "1280x720"
    501 @ "1280x800"
    502500@ "1280x960"
    503501@ "1280x1024"
     
    546544! CONFIG_BAREBONE (n/y)
    547545
    548 % Line debugging information
    549 ! [CONFIG_STRIP_BINARIES!=y] CONFIG_LINE_DEBUG (n/y)
  • boot/Makefile

    r2d0c3a6 r527298a  
    4848endif
    4949ifeq ($(RDFMT),fat)
    50         $(MKFAT) 1048576 $(DIST_PATH) $@
     50        $(MKFAT) $(DIST_PATH) $@
    5151endif
    5252
  • boot/Makefile.build

    r2d0c3a6 r527298a  
    6161        GCC_CFLAGS += -Werror
    6262        ICC_CFLAGS += -Werror
    63 endif
    64 
    65 ifeq ($(CONFIG_LINE_DEBUG),y)
    66         GCC_CFLAGS += -g
    67         ICC_CFLAGS += -g
    68         SUNCC_CFLAGS += -g
    69         CLANG_CFLAGS += -g
    7063endif
    7164
  • boot/arch/arm32/Makefile.inc

    r2d0c3a6 r527298a  
    5555        $(COMPS_C) \
    5656        genarch/src/division.c \
    57         generic/src/memstr.c \
    5857        generic/src/printf_core.c \
    5958        generic/src/vprintf.c \
  • boot/arch/arm32/src/asm.S

    r2d0c3a6 r527298a  
    3535.global boot_stack
    3636.global halt
     37.global memcpy
    3738.global jump_to_kernel
    3839
     
    5455        b halt
    5556
     57memcpy:
     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
    56116jump_to_kernel:
    57117        #
  • boot/arch/ia64/Makefile.inc

    r2d0c3a6 r527298a  
    4949        genarch/src/division.c \
    5050        generic/src/balloc.c \
    51         generic/src/memstr.c \
    5251        generic/src/printf_core.c \
    5352        generic/src/vprintf.c \
  • boot/arch/ia64/src/asm.S

    r2d0c3a6 r527298a  
    11#
    22# Copyright (c) 2006 Martin Decky
    3 # Copyright (c) 2006 Jakub Jermar
     3# Copyright (c) 2006 Jakub Jermar 
    44# All rights reserved.
    55#
     
    3939        br halt
    4040
     41memcpy:
     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 ;;
     500:
     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
     571:
     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 ;;
     652:
     66        mov ar.lc = r2
     67        mov ar.pfs = loc0
     68        br.ret.sptk.many rp
     693:
     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
     814:
     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
     905:
     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
     1016:
     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
    41113jump_to_kernel:
    42114        alloc loc0 = ar.pfs, 1, 1, 0, 0
  • boot/arch/mips32/Makefile.inc

    r2d0c3a6 r527298a  
    6161        genarch/src/division.c \
    6262        genarch/src/multiplication.c \
    63         generic/src/memstr.c \
    6463        generic/src/printf_core.c \
    6564        generic/src/vprintf.c \
  • boot/arch/mips32/src/asm.S

    r2d0c3a6 r527298a  
    3636.global start
    3737.global halt
     38.global memcpy
    3839.global jump_to_kernel
    3940
     
    125126        j halt
    126127        nop
     128
     129memcpy:
     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
    127194
    128195jump_to_kernel:
  • boot/arch/ppc32/Makefile.inc

    r2d0c3a6 r527298a  
    5656        genarch/src/multiplication.c \
    5757        generic/src/balloc.c \
    58         generic/src/memstr.c \
    5958        generic/src/printf_core.c \
    6059        generic/src/vprintf.c \
  • boot/arch/ppc32/src/asm.S

    r2d0c3a6 r527298a  
    6060.global start
    6161.global halt
     62.global memcpy
    6263.global jump_to_kernel
    6364.global real_mode
     
    7778halt:
    7879        b halt
     80
     81memcpy:
     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
    79136
    80137jump_to_kernel:
  • boot/arch/sparc64/Makefile.inc

    r2d0c3a6 r527298a  
    5454        genarch/src/ofw_tree.c \
    5555        generic/src/balloc.c \
    56         generic/src/memstr.c \
    5756        generic/src/printf_core.c \
    5857        generic/src/vprintf.c \
  • boot/arch/sparc64/src/asm.S

    r2d0c3a6 r527298a  
    4242.global start
    4343.global halt
     44.global memcpy
    4445.global jump_to_kernel
    4546
     
    9798        ba %xcc, halt
    9899        nop
     100
     101memcpy:
     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
    99169
    100170jump_to_kernel:
  • contrib/conf/ia32-qe.sh

    r2d0c3a6 r527298a  
    55# Create a disk image if it does not exist
    66if [ ! -f "$DISK_IMG" ]; then
    7         tools/mkfat.py 1048576 uspace/dist/data "$DISK_IMG"
     7        tools/mkfat.py uspace/dist/data "$DISK_IMG"
    88fi
    99
  • contrib/conf/mips32-gx.sh

    r2d0c3a6 r527298a  
    55# Create a disk image if it does not exist
    66if [ ! -f "$DISK_IMG" ]; then
    7         tools/mkfat.py 1048576 uspace/dist/data "$DISK_IMG"
     7        tools/mkfat.py uspace/dist/data "$DISK_IMG"
    88fi
    99
  • kernel/Makefile

    r2d0c3a6 r527298a  
    120120ifeq ($(CONFIG_LTO),y)
    121121        GCC_CFLAGS += -flto
    122 endif
    123 
    124 ifeq ($(CONFIG_LINE_DEBUG),y)
    125         GCC_CFLAGS += -g
    126         ICC_CFLAGS += -g
    127         SUNCC_CFLAGS += -g
    128         CLANG_CFLAGS += -g
    129122endif
    130123
     
    408401
    409402$(DISASM): $(RAW)
    410 ifeq ($(CONFIG_LINE_DEBUG),y)
    411         $(OBJDUMP) -d -S $< > $@
    412 else
    413403        $(OBJDUMP) -d $< > $@
    414 endif
    415404
    416405$(RAW): $(LINK) $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS) $(SYMTAB_OBJECTS)
  • kernel/arch/abs32le/src/debug/stacktrace.c

    r2d0c3a6 r527298a  
    3737#include <typedefs.h>
    3838
    39 bool kernel_stack_trace_context_validate(stack_trace_context_t *ctx)
     39bool kernel_frame_pointer_validate(uintptr_t fp)
    4040{
    4141        return true;
    4242}
    4343
    44 bool kernel_frame_pointer_prev(stack_trace_context_t *ctx, uintptr_t *prev)
     44bool kernel_frame_pointer_prev(uintptr_t fp, uintptr_t *prev)
    4545{
    4646        return true;
    4747}
    4848
    49 bool kernel_return_address_get(stack_trace_context_t *ctx, uintptr_t *ra)
     49bool kernel_return_address_get(uintptr_t fp, uintptr_t *ra)
    5050{
    5151        return true;
    5252}
    5353
    54 bool uspace_stack_trace_context_validate(stack_trace_context_t *ctx)
     54bool uspace_frame_pointer_validate(uintptr_t fp)
    5555{
    5656        return true;
    5757}
    5858
    59 bool uspace_frame_pointer_prev(stack_trace_context_t *ctx, uintptr_t *prev)
     59bool uspace_frame_pointer_prev(uintptr_t fp, uintptr_t *prev)
    6060{
    6161        return true;
    6262}
    6363
    64 bool uspace_return_address_get(stack_trace_context_t *ctx, uintptr_t *ra)
     64bool uspace_return_address_get(uintptr_t fp, uintptr_t *ra)
    6565{
    6666        return true;
  • kernel/arch/amd64/_link.ld.in

    r2d0c3a6 r527298a  
    5353        }
    5454       
    55 #ifdef CONFIG_LINE_DEBUG
    56         .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 #endif
    67        
    6855        /DISCARD/ : {
    6956                *(*);
  • kernel/arch/amd64/include/pm.h

    r2d0c3a6 r527298a  
    6565#endif /* CONFIG_FB */
    6666
    67 #define GDT_SELECTOR(des)  ((des) << 3)
     67#define gdtselector(des)  ((des) << 3)
     68#define idtselector(des)  ((des) << 4)
    6869
    6970#define PL_KERNEL  0
     
    167168
    168169extern ptr_16_64_t gdtr;
     170extern ptr_16_32_t bootstrap_gdtr;
    169171extern ptr_16_32_t protected_ap_gdtr;
    170172
  • kernel/arch/amd64/src/asm.S

    r2d0c3a6 r527298a  
    244244         */
    245245        xorq %rdx, %rdx
    246         cmpq $(GDT_SELECTOR(KTEXT_DES)), ISTATE_OFFSET_CS(%rsp)
     246        cmpq $(gdtselector(KTEXT_DES)), ISTATE_OFFSET_CS(%rsp)
    247247        cmovnzq %rdx, %rbp
    248248
  • kernel/arch/amd64/src/boot/boot.S

    r2d0c3a6 r527298a  
    8585       
    8686        /* Kernel data + stack */
    87         movw $GDT_SELECTOR(KDATA_DES), %cx
     87        movw $gdtselector(KDATA_DES), %cx
    8888        movw %cx, %es
    8989        movw %cx, %ds
     
    9494         * when _visible_ part of GS does not point to user-mode segment.
    9595         */
    96         movw $GDT_SELECTOR(UDATA_DES), %cx
     96        movw $gdtselector(UDATA_DES), %cx
    9797        movw %cx, %fs
    9898        movw %cx, %gs
    9999       
    100         jmpl $GDT_SELECTOR(KTEXT32_DES), $multiboot_meeting_point
     100        jmpl $gdtselector(KTEXT32_DES), $multiboot_meeting_point
    101101        multiboot_meeting_point:
    102102       
     
    182182       
    183183        /* At this point we are in compatibility mode */
    184         jmpl $GDT_SELECTOR(KTEXT_DES), $start64
     184        jmpl $gdtselector(KTEXT_DES), $start64
    185185
    186186/** Print string to EGA display (in light red) and halt.
     
    645645.section K_DATA_START, "aw", @progbits
    646646
     647.global bootstrap_gdtr
    647648bootstrap_gdtr:
    648         .word GDT_SELECTOR(GDT_ITEMS)
     649        .word gdtselector(GDT_ITEMS)
    649650        .long KA2PA(gdt)
    650651
  • kernel/arch/amd64/src/boot/vesa_ret.inc

    r2d0c3a6 r527298a  
    77       
    88        /* Kernel data + stack */
    9         movw $GDT_SELECTOR(KDATA_DES), %cx
     9        movw $gdtselector(KDATA_DES), %cx
    1010        movw %cx, %es
    1111        movw %cx, %ds
     
    1717         */
    1818       
    19         movw $GDT_SELECTOR(UDATA_DES), %cx
     19        movw $gdtselector(UDATA_DES), %cx
    2020        movw %cx, %fs
    2121        movw %cx, %gs
    2222       
    23         jmpl $GDT_SELECTOR(KTEXT32_DES), $vesa_meeting_point
     23        jmpl $gdtselector(KTEXT32_DES), $vesa_meeting_point
  • kernel/arch/amd64/src/ddi/ddi.c

    r2d0c3a6 r527298a  
    153153        tss_descriptor_t *tss_desc = (tss_descriptor_t *) &gdt_p[TSS_DES];
    154154        tss_desc->type = AR_TSS;
    155         tr_load(GDT_SELECTOR(TSS_DES));
     155        tr_load(gdtselector(TSS_DES));
    156156       
    157157        /*
  • kernel/arch/amd64/src/debug/stacktrace.c

    r2d0c3a6 r527298a  
    4040#define FRAME_OFFSET_RA       1
    4141
    42 bool kernel_stack_trace_context_validate(stack_trace_context_t *ctx)
     42bool kernel_frame_pointer_validate(uintptr_t fp)
    4343{
    44         return ctx->fp != 0;
     44        return fp != 0;
    4545}
    4646
    47 bool kernel_frame_pointer_prev(stack_trace_context_t *ctx, uintptr_t *prev)
     47bool kernel_frame_pointer_prev(uintptr_t fp, uintptr_t *prev)
    4848{
    49         uint64_t *stack = (void *) ctx->fp;
     49        uint64_t *stack = (void *) fp;
    5050        *prev = stack[FRAME_OFFSET_FP_PREV];
    5151       
     
    5353}
    5454
    55 bool kernel_return_address_get(stack_trace_context_t *ctx, uintptr_t *ra)
     55bool kernel_return_address_get(uintptr_t fp, uintptr_t *ra)
    5656{
    57         uint64_t *stack = (void *) ctx->fp;
     57        uint64_t *stack = (void *) fp;
    5858        *ra = stack[FRAME_OFFSET_RA];
    5959       
     
    6161}
    6262
    63 bool uspace_stack_trace_context_validate(stack_trace_context_t *ctx)
     63bool uspace_frame_pointer_validate(uintptr_t fp)
    6464{
    65         return ctx->fp != 0;
     65        return fp != 0;
    6666}
    6767
    68 bool uspace_frame_pointer_prev(stack_trace_context_t *ctx, uintptr_t *prev)
     68bool uspace_frame_pointer_prev(uintptr_t fp, uintptr_t *prev)
    6969{
    7070        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));
    7272}
    7373
    74 bool uspace_return_address_get(stack_trace_context_t *ctx, uintptr_t *ra)
     74bool uspace_return_address_get(uintptr_t fp, uintptr_t *ra)
    7575{
    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));
    7878}
    7979
  • kernel/arch/amd64/src/pm.c

    r2d0c3a6 r527298a  
    171171
    172172                d->unused = 0;
    173                 d->selector = GDT_SELECTOR(KTEXT_DES);
     173                d->selector = gdtselector(KTEXT_DES);
    174174
    175175                d->present = 1;
     
    291291         * to its own TSS. We just need to load the TR register.
    292292         */
    293         tr_load(GDT_SELECTOR(TSS_DES));
     293        tr_load(gdtselector(TSS_DES));
    294294}
    295295
  • kernel/arch/amd64/src/smp/ap.S

    r2d0c3a6 r527298a  
    6161        orl $1, %eax
    6262        movl %eax, %cr0     # switch to protected mode
    63         jmpl $GDT_SELECTOR(KTEXT32_DES), $jump_to_kernel - BOOT_OFFSET + AP_BOOT_OFFSET
     63        jmpl $gdtselector(KTEXT32_DES), $jump_to_kernel - BOOT_OFFSET + AP_BOOT_OFFSET
    6464
    6565jump_to_kernel:
    6666.code32
    67         movw $GDT_SELECTOR(KDATA_DES), %ax
     67        movw $gdtselector(KDATA_DES), %ax
    6868        movw %ax, %ds
    6969        movw %ax, %es
    7070        movw %ax, %ss
    71         movw $GDT_SELECTOR(UDATA_DES), %ax
     71        movw $gdtselector(UDATA_DES), %ax
    7272        movw %ax, %gs
    7373       
     
    9494       
    9595        # At this point we are in compatibility mode
    96         jmpl $GDT_SELECTOR(KTEXT_DES), $start64 - BOOT_OFFSET + AP_BOOT_OFFSET
     96        jmpl $gdtselector(KTEXT_DES), $start64 - BOOT_OFFSET + AP_BOOT_OFFSET
    9797
    9898.code64
  • kernel/arch/amd64/src/syscall.c

    r2d0c3a6 r527298a  
    5858         */
    5959        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));
    6262        write_msr(AMD_MSR_LSTAR, (uint64_t)syscall_entry);
    6363        /* Mask RFLAGS on syscall
  • kernel/arch/amd64/src/userspace.c

    r2d0c3a6 r527298a  
    6565                "xorq %%rdi, %%rdi\n"
    6666                "iretq\n"
    67                 :: [udata_des] "i" (GDT_SELECTOR(UDATA_DES) | PL_USER),
     67                :: [udata_des] "i" (gdtselector(UDATA_DES) | PL_USER),
    6868                   [stack_size] "r" (kernel_uarg->uspace_stack + THREAD_STACK_SIZE),
    6969                   [ipl] "r" (ipl),
    70                    [utext_des] "i" (GDT_SELECTOR(UTEXT_DES) | PL_USER),
     70                   [utext_des] "i" (gdtselector(UTEXT_DES) | PL_USER),
    7171                   [entry] "r" (kernel_uarg->uspace_entry),
    7272                   [uarg] "r" (kernel_uarg->uspace_uarg)
  • kernel/arch/arm32/src/debug/stacktrace.c

    r2d0c3a6 r527298a  
    4040#define FRAME_OFFSET_RA         -1
    4141
    42 bool kernel_stack_trace_context_validate(stack_trace_context_t *ctx)
     42bool kernel_frame_pointer_validate(uintptr_t fp)
    4343{
    44         return ctx->fp != 0;
     44        return fp != 0;
    4545}
    4646
    47 bool kernel_frame_pointer_prev(stack_trace_context_t *ctx, uintptr_t *prev)
     47bool kernel_frame_pointer_prev(uintptr_t fp, uintptr_t *prev)
    4848{
    49         uint32_t *stack = (void *) ctx->fp;
     49        uint32_t *stack = (void *) fp;
    5050
    5151        *prev = stack[FRAME_OFFSET_FP_PREV];
     
    5353}
    5454
    55 bool kernel_return_address_get(stack_trace_context_t *ctx, uintptr_t *ra)
     55bool kernel_return_address_get(uintptr_t fp, uintptr_t *ra)
    5656{
    57         uint32_t *stack = (void *) ctx->fp;
     57        uint32_t *stack = (void *) fp;
    5858
    5959        *ra = stack[FRAME_OFFSET_RA];
     
    6161}
    6262
    63 bool uspace_stack_trace_context_validate(stack_trace_context_t *ctx)
     63bool uspace_frame_pointer_validate(uintptr_t fp)
    6464{
    65         return ctx->fp != 0;
     65        return fp != 0;
    6666}
    6767
    68 bool uspace_frame_pointer_prev(stack_trace_context_t *ctx, uintptr_t *prev)
     68bool uspace_frame_pointer_prev(uintptr_t fp, uintptr_t *prev)
    6969{
    7070        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));
    7272}
    7373
    74 bool uspace_return_address_get(stack_trace_context_t *ctx, uintptr_t *ra)
     74bool uspace_return_address_get(uintptr_t fp, uintptr_t *ra)
    7575{
    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));
    7878}
    7979
  • kernel/arch/ia32/include/bios/bios.h

    r2d0c3a6 r527298a  
    3838#include <typedefs.h>
    3939
     40#define BIOS_EBDA_PTR  0x40e
     41
    4042extern uintptr_t ebda;
    4143
  • kernel/arch/ia32/include/mm/as.h

    r2d0c3a6 r527298a  
    2727 */
    2828
    29 /** @addtogroup ia32mm
     29/** @addtogroup ia32mm 
    3030 * @{
    3131 */
  • kernel/arch/ia32/include/mm/page.h

    r2d0c3a6 r527298a  
    2727 */
    2828
    29 /** @addtogroup ia32mm
     29/** @addtogroup ia32mm 
    3030 * @{
    3131 */
     
    106106
    107107/* 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) \
    109109        set_pt_flags((pte_t *) (ptl0), (size_t) (i), (x))
    110110#define SET_PTL2_FLAGS_ARCH(ptl1, i, x)
  • kernel/arch/ia32/include/pm.h

    r2d0c3a6 r527298a  
    5858#endif /* CONFIG_FB */
    5959
    60 #define GDT_SELECTOR(des)  ((des) << 3)
     60#define gdtselector(des)  ((des) << 3)
    6161
    6262#define PL_KERNEL  0
     
    153153
    154154extern ptr_16_32_t gdtr;
     155extern ptr_16_32_t bootstrap_gdtr;
    155156extern ptr_16_32_t protected_ap_gdtr;
    156157extern tss_t *tss_p;
  • kernel/arch/ia32/src/asm.S

    r2d0c3a6 r527298a  
    225225         * Switch to kernel selectors.
    226226         */
    227         movw $(GDT_SELECTOR(KDATA_DES)), %ax
     227        movw $(gdtselector(KDATA_DES)), %ax
    228228        movw %ax, %ds
    229229        movw %ax, %es
     
    304304         * Switch to kernel selectors.
    305305         */
    306         movl $(GDT_SELECTOR(KDATA_DES)), %eax
     306        movl $(gdtselector(KDATA_DES)), %eax
    307307        movl %eax, %ds
    308308        movl %eax, %es
     
    407407         * Switch to kernel selectors.
    408408         */
    409         movl $(GDT_SELECTOR(KDATA_DES)), %eax
     409        movl $(gdtselector(KDATA_DES)), %eax
    410410        movl %eax, %ds
    411411        movl %eax, %es
     
    416416         */
    417417        xorl %eax, %eax
    418         cmpl $(GDT_SELECTOR(KTEXT_DES)), ISTATE_OFFSET_CS(%esp)
     418        cmpl $(gdtselector(KTEXT_DES)), ISTATE_OFFSET_CS(%esp)
    419419        cmovnzl %eax, %ebp
    420420
  • kernel/arch/ia32/src/bios/bios.c

    r2d0c3a6 r527298a  
    3636#include <typedefs.h>
    3737
    38 #define BIOS_EBDA_PTR  0x40e
    39 
    4038uintptr_t ebda = 0;
    4139
  • kernel/arch/ia32/src/boot/boot.S

    r2d0c3a6 r527298a  
    7878       
    7979        /* Initialize Global Descriptor Table register */
    80         lgdtl bootstrap_gdtr
     80        lgdtl KA2PA(bootstrap_gdtr)
    8181       
    8282        /* Kernel data + stack */
    83         movw $GDT_SELECTOR(KDATA_DES), %cx
     83        movw $gdtselector(KDATA_DES), %cx
    8484        movw %cx, %es
    8585        movw %cx, %fs
     
    8888        movw %cx, %ss
    8989       
    90         jmpl $GDT_SELECTOR(KTEXT_DES), $multiboot_meeting_point
     90        jmpl $gdtselector(KTEXT_DES), $multiboot_meeting_point
    9191        multiboot_meeting_point:
    9292       
     
    514514page_directory:
    515515        .space 4096, 0
    516 
    517 bootstrap_gdtr:
    518         .word GDT_SELECTOR(GDT_ITEMS)
    519         .long KA2PA(gdt)
    520516
    521517grub_eax:
  • kernel/arch/ia32/src/boot/vesa_real.inc

    r2d0c3a6 r527298a  
    3030.code32
    3131vesa_init:
    32         jmp $GDT_SELECTOR(VESA_INIT_DES), $vesa_init_real - vesa_init
     32        jmp $gdtselector(VESA_INIT_DES), $vesa_init_real - vesa_init
    3333
    3434.code16
     
    335335                vesa_leave_real2:
    336336               
    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)
    338338       
    339339        no_mode:
  • kernel/arch/ia32/src/boot/vesa_ret.inc

    r2d0c3a6 r527298a  
    77       
    88        /* Kernel data + stack */
    9         movw $GDT_SELECTOR(KDATA_DES), %cx
     9        movw $gdtselector(KDATA_DES), %cx
    1010        movw %cx, %es
    1111        movw %cx, %fs
     
    1414        movw %cx, %ss
    1515       
    16         jmpl $GDT_SELECTOR(KTEXT_DES), $vesa_meeting_point
     16        jmpl $gdtselector(KTEXT_DES), $vesa_meeting_point
  • kernel/arch/ia32/src/ddi/ddi.c

    r2d0c3a6 r527298a  
    153153         */
    154154        gdt_p[TSS_DES].access = AR_PRESENT | AR_TSS | DPL_KERNEL;
    155         tr_load(GDT_SELECTOR(TSS_DES));
     155        tr_load(gdtselector(TSS_DES));
    156156       
    157157        /*
  • kernel/arch/ia32/src/debug/stacktrace.c

    r2d0c3a6 r527298a  
    4040#define FRAME_OFFSET_RA         1
    4141
    42 bool kernel_stack_trace_context_validate(stack_trace_context_t *ctx)
     42bool kernel_frame_pointer_validate(uintptr_t fp)
    4343{
    44         return ctx->fp != 0;
     44        return fp != 0;
    4545}
    4646
    47 bool kernel_frame_pointer_prev(stack_trace_context_t *ctx, uintptr_t *prev)
     47bool kernel_frame_pointer_prev(uintptr_t fp, uintptr_t *prev)
    4848{
    49         uint32_t *stack = (void *) ctx->fp;
     49        uint32_t *stack = (void *) fp;
    5050        *prev = stack[FRAME_OFFSET_FP_PREV];
    5151        return true;
    5252}
    5353
    54 bool kernel_return_address_get(stack_trace_context_t *ctx, uintptr_t *ra)
     54bool kernel_return_address_get(uintptr_t fp, uintptr_t *ra)
    5555{
    56         uint32_t *stack = (void *) ctx->fp;
     56        uint32_t *stack = (void *) fp;
    5757        *ra = stack[FRAME_OFFSET_RA];
    5858        return true;
    5959}
    6060
    61 bool uspace_stack_trace_context_validate(stack_trace_context_t *ctx)
     61bool uspace_frame_pointer_validate(uintptr_t fp)
    6262{
    63         return ctx->fp != 0;
     63        return fp != 0;
    6464}
    6565
    66 bool uspace_frame_pointer_prev(stack_trace_context_t *ctx, uintptr_t *prev)
     66bool uspace_frame_pointer_prev(uintptr_t fp, uintptr_t *prev)
    6767{
    6868        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));
    7070}
    7171
    72 bool uspace_return_address_get(stack_trace_context_t *ctx, uintptr_t *ra)
     72bool uspace_return_address_get(uintptr_t fp, uintptr_t *ra)
    7373{
    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));
    7676}
    7777
  • kernel/arch/ia32/src/mm/frame.c

    r2d0c3a6 r527298a  
    131131                        if (last_frame < ALIGN_UP(new_base + new_size, FRAME_SIZE))
    132132                                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) {
    135146                        /* To be safe, make the firmware zone possibly larger */
    136147                        uint64_t new_base = ALIGN_DOWN(base, FRAME_SIZE);
     
    140151                        zone_create(ADDR2PFN(new_base), SIZE2FRAMES(new_size), 0,
    141152                            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);
    150153                }
    151154        }
     
    200203#ifdef CONFIG_SMP
    201204                /* Reserve AP real mode bootstrap memory */
    202                 frame_mark_unavailable(AP_BOOT_OFFSET >> FRAME_WIDTH,
     205                frame_mark_unavailable(AP_BOOT_OFFSET >> FRAME_WIDTH, 
    203206                    (hardcoded_unmapped_ktext_size +
    204207                    hardcoded_unmapped_kdata_size) >> FRAME_WIDTH);
  • kernel/arch/ia32/src/pm.c

    r2d0c3a6 r527298a  
    7575        /* VESA Init descriptor */
    7676#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 
    7979};
    8080
     
    8686
    8787/* 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 };
     88ptr_16_32_t bootstrap_gdtr = { .limit = sizeof(gdt), .base = KA2PA((uintptr_t) gdt) };
     89ptr_16_32_t gdtr = { .limit = sizeof(gdt), .base = (uintptr_t) gdt };
    9290
    9391void gdt_setbase(descriptor_t *d, uintptr_t base)
     
    130128
    131129                d->unused = 0;
    132                 d->selector = GDT_SELECTOR(KTEXT_DES);
     130                d->selector = gdtselector(KTEXT_DES);
    133131
    134132                if (i == VECTOR_SYSCALL) {
     
    285283         * to its own TSS. We just need to load the TR register.
    286284         */
    287         tr_load(GDT_SELECTOR(TSS_DES));
     285        tr_load(gdtselector(TSS_DES));
    288286       
    289287        clean_IOPL_NT_flags();    /* Disable I/O on nonprivileged levels and clear NT flag. */
  • kernel/arch/ia32/src/proc/scheduler.c

    r2d0c3a6 r527298a  
    6767        /* Set kernel stack for CPL3 -> CPL0 switch via interrupt */
    6868        CPU->arch.tss->esp0 = kstk;
    69         CPU->arch.tss->ss0 = GDT_SELECTOR(KDATA_DES);
     69        CPU->arch.tss->ss0 = gdtselector(KDATA_DES);
    7070       
    7171        /* Set up TLS in GS register */
  • kernel/arch/ia32/src/syscall.c

    r2d0c3a6 r527298a  
    4545
    4646        /* 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));
    4848        /* set kernel mode entry point */
    4949        write_msr(IA32_MSR_SYSENTER_EIP, (uint32_t) sysenter_handler);
  • kernel/arch/ia32/src/userspace.c

    r2d0c3a6 r527298a  
    7575                "iret\n"
    7676                :
    77                 : [udata_des] "i" (GDT_SELECTOR(UDATA_DES) | PL_USER),
     77                : [udata_des] "i" (gdtselector(UDATA_DES) | PL_USER),
    7878                  [stack_size] "r" ((uint8_t *) kernel_uarg->uspace_stack + THREAD_STACK_SIZE),
    7979                  [ipl] "r" (ipl),
    80                   [utext_des] "i" (GDT_SELECTOR(UTEXT_DES) | PL_USER),
     80                  [utext_des] "i" (gdtselector(UTEXT_DES) | PL_USER),
    8181                  [entry] "r" (kernel_uarg->uspace_entry),
    8282                  [uarg] "r" (kernel_uarg->uspace_uarg),
    83                   [tls_des] "r" (GDT_SELECTOR(TLS_DES))
     83                  [tls_des] "r" (gdtselector(TLS_DES))
    8484                : "eax");
    8585       
  • kernel/arch/ia64/src/debug/stacktrace.c

    r2d0c3a6 r527298a  
    3737#include <typedefs.h>
    3838
    39 bool kernel_stack_trace_context_validate(stack_trace_context_t *ctx)
     39bool kernel_frame_pointer_validate(uintptr_t fp)
    4040{
    4141        return false;
    4242}
    4343
    44 bool kernel_frame_pointer_prev(stack_trace_context_t *ctx, uintptr_t *prev)
     44bool kernel_frame_pointer_prev(uintptr_t fp, uintptr_t *prev)
    4545{
    4646        return false;
    4747}
    4848
    49 bool kernel_return_address_get(stack_trace_context_t *ctx, uintptr_t *ra)
     49bool kernel_return_address_get(uintptr_t fp, uintptr_t *ra)
    5050{
    5151        return false;
    5252}
    5353
    54 bool uspace_stack_trace_context_validate(stack_trace_context_t *ctx)
     54bool uspace_frame_pointer_validate(uintptr_t fp)
    5555{
    5656        return false;
    5757}
    5858
    59 bool uspace_frame_pointer_prev(stack_trace_context_t *ctx, uintptr_t *prev)
     59bool uspace_frame_pointer_prev(uintptr_t fp, uintptr_t *prev)
    6060{
    6161        return false;
    6262}
    6363
    64 bool uspace_return_address_get(stack_trace_context_t *ctx, uintptr_t *ra)
     64bool uspace_return_address_get(uintptr_t fp, uintptr_t *ra)
    6565{
    6666        return false;
  • kernel/arch/mips32/include/debugger.h

    r2d0c3a6 r527298a  
    6868extern bpinfo_t breakpoints[BKPOINTS_MAX];
    6969
    70 extern bool is_jump(unative_t);
    71 
    7270extern void debugger_init(void);
    7371extern void debugger_bpoint(istate_t *);
  • kernel/arch/mips32/src/debug/stacktrace.c

    r2d0c3a6 r527298a  
    3636#include <syscall/copy.h>
    3737#include <typedefs.h>
    38 #include <arch/debugger.h>
    39 #include <print.h>
    4038
    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)
     39bool kernel_frame_pointer_validate(uintptr_t fp)
    22440{
    22541        return false;
    22642}
    22743
    228 bool uspace_frame_pointer_prev(stack_trace_context_t *ctx, uintptr_t *prev)
     44bool kernel_frame_pointer_prev(uintptr_t fp, uintptr_t *prev)
    22945{
    23046        return false;
    23147}
    23248
    233 bool uspace_return_address_get(stack_trace_context_t *ctx, uintptr_t *ra)
     49bool kernel_return_address_get(uintptr_t fp, uintptr_t *ra)
     50{
     51        return false;
     52}
     53
     54bool uspace_frame_pointer_validate(uintptr_t fp)
     55{
     56        return false;
     57}
     58
     59bool uspace_frame_pointer_prev(uintptr_t fp, uintptr_t *prev)
     60{
     61        return false;
     62}
     63
     64bool uspace_return_address_get(uintptr_t fp, uintptr_t *ra)
    23465{
    23566        return false;
  • kernel/arch/mips32/src/debug/stacktrace_asm.S

    r2d0c3a6 r527298a  
    3737frame_pointer_get:
    3838        j $ra
    39         move $v0, $sp
     39        xor $v0, $v0
    4040
    4141program_counter_get:
    4242        j $ra
    43         move $v0, $ra
     43        xor $v0, $v0
  • kernel/arch/mips32/src/debugger.c

    r2d0c3a6 r527298a  
    134134 *
    135135 */
    136 bool is_jump(unative_t instr)
     136static bool is_jump(unative_t instr)
    137137{
    138138        unsigned int i;
  • kernel/arch/ppc32/src/debug/stacktrace.c

    r2d0c3a6 r527298a  
    4040#define FRAME_OFFSET_RA       1
    4141
    42 bool kernel_stack_trace_context_validate(stack_trace_context_t *ctx)
     42bool kernel_frame_pointer_validate(uintptr_t fp)
    4343{
    44         return ctx->fp != 0;
     44        return fp != 0;
    4545}
    4646
    47 bool kernel_frame_pointer_prev(stack_trace_context_t *ctx, uintptr_t *prev)
     47bool kernel_frame_pointer_prev(uintptr_t fp, uintptr_t *prev)
    4848{
    49         uint32_t *stack = (void *) ctx->fp;
     49        uint32_t *stack = (void *) fp;
    5050        *prev = stack[FRAME_OFFSET_FP_PREV];
    5151        return true;
    5252}
    5353
    54 bool kernel_return_address_get(stack_trace_context_t *ctx, uintptr_t *ra)
     54bool kernel_return_address_get(uintptr_t fp, uintptr_t *ra)
    5555{
    56         uint32_t *stack = (void *) ctx->fp;
     56        uint32_t *stack = (void *) fp;
    5757        *ra = stack[FRAME_OFFSET_RA];
    5858        return true;
    5959}
    6060
    61 bool uspace_stack_trace_context_validate(stack_trace_context_t *ctx)
     61bool uspace_frame_pointer_validate(uintptr_t fp)
    6262{
    63         return ctx->fp != 0;
     63        return fp != 0;
    6464}
    6565
    66 bool uspace_frame_pointer_prev(stack_trace_context_t *ctx, uintptr_t *prev)
     66bool uspace_frame_pointer_prev(uintptr_t fp, uintptr_t *prev)
    6767{
    6868        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));
    7070}
    7171
    72 bool uspace_return_address_get(stack_trace_context_t *ctx, uintptr_t *ra)
     72bool uspace_return_address_get(uintptr_t fp, uintptr_t *ra)
    7373{
    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));
    7676}
    7777
  • kernel/arch/sparc64/src/debug/stacktrace.c

    r2d0c3a6 r527298a  
    5050extern void alloc_window_and_flush(void);
    5151
    52 bool kernel_stack_trace_context_validate(stack_trace_context_t *ctx)
     52bool kernel_frame_pointer_validate(uintptr_t fp)
    5353{
    5454        uintptr_t kstack;
     
    6363        kstack -= PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE;
    6464
    65         if (THREAD && (ctx->fp == kstack))
     65        if (THREAD && (fp == kstack))
    6666                return false;
    67         return ctx->fp != 0;
     67        return fp != 0;
    6868}
    6969
    70 bool kernel_frame_pointer_prev(stack_trace_context_t *ctx, uintptr_t *prev)
     70bool kernel_frame_pointer_prev(uintptr_t fp, uintptr_t *prev)
    7171{
    72         uint64_t *stack = (void *) ctx->fp;
     72        uint64_t *stack = (void *) fp;
    7373        alloc_window_and_flush();
    7474        *prev = stack[FRAME_OFFSET_FP_PREV] + STACK_BIAS;
     
    7676}
    7777
    78 bool kernel_return_address_get(stack_trace_context_t *ctx, uintptr_t *ra)
     78bool kernel_return_address_get(uintptr_t fp, uintptr_t *ra)
    7979{
    80         uint64_t *stack = (void *) ctx->fp;
     80        uint64_t *stack = (void *) fp;
    8181        alloc_window_and_flush();
    8282        *ra = stack[FRAME_OFFSET_RA];
     
    8484}
    8585
    86 bool uspace_stack_trace_context_validate(stack_trace_context_t *ctx)
     86bool uspace_frame_pointer_validate(uintptr_t fp)
    8787{
    8888        return false;
    8989}
    9090
    91 bool uspace_frame_pointer_prev(stack_trace_context_t *ctx, uintptr_t *prev)
     91bool uspace_frame_pointer_prev(uintptr_t fp, uintptr_t *prev)
    9292{
    9393        return false;
    9494}
    9595
    96 bool uspace_return_address_get(stack_trace_context_t *ctx , uintptr_t *ra)
     96bool uspace_return_address_get(uintptr_t fp, uintptr_t *ra)
    9797{
    9898        return false;
  • kernel/generic/include/macros.h

    r2d0c3a6 r527298a  
    4747 * @param s2  Start address of the second interval.
    4848 * @param sz2 Size of the second interval.
    49  *
    5049 */
    51 NO_TRACE static inline int overlaps(uint64_t s1, uint64_t sz1, uint64_t s2,
    52     uint64_t sz2)
     50NO_TRACE static inline int overlaps(uintptr_t s1, size_t sz1, uintptr_t s2,
     51    size_t sz2)
    5352{
    54         uint64_t e1 = s1 + sz1;
    55         uint64_t e2 = s2 + sz2;
     53        uintptr_t e1 = s1 + sz1;
     54        uintptr_t e2 = s2 + sz2;
    5655       
    5756        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));
    7557}
    7658
     
    9274
    9375/* Compute overlapping of physical addresses */
    94 #define PA_OVERLAPS(x, szx, y, szy) \
     76#define PA_overlaps(x, szx, y, szy) \
    9577        overlaps(KA2PA((x)), (szx), KA2PA((y)), (szy))
    9678
  • kernel/generic/include/stacktrace.h

    r2d0c3a6 r527298a  
    4242
    4343typedef 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 *);
    5347        bool (* symbol_resolve)(uintptr_t, const char **, uintptr_t *);
    5448} stack_trace_ops_t;
     
    5953extern void stack_trace(void);
    6054extern void stack_trace_istate(struct istate *);
    61 extern void stack_trace_ctx(stack_trace_ops_t *, stack_trace_context_t *);
     55extern void stack_trace_fp_pc(stack_trace_ops_t *, uintptr_t, uintptr_t);
    6256
    6357/*
     
    6761extern uintptr_t program_counter_get(void);
    6862
    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 *);
     63extern bool kernel_frame_pointer_validate(uintptr_t);
     64extern bool kernel_frame_pointer_prev(uintptr_t, uintptr_t *);
     65extern bool kernel_return_address_get(uintptr_t, uintptr_t *);
    7266
    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 *);
     67extern bool uspace_frame_pointer_validate(uintptr_t);
     68extern bool uspace_frame_pointer_prev(uintptr_t, uintptr_t *);
     69extern bool uspace_return_address_get(uintptr_t, uintptr_t *);
    7670
    7771#endif
  • kernel/generic/src/debug/stacktrace.c

    r2d0c3a6 r527298a  
    2727 */
    2828
    29 /** @addtogroup genericdebug
     29/** @addtogroup genericdebug 
    3030 * @{
    3131 */
     
    4242
    4343void
    44 stack_trace_ctx(stack_trace_ops_t *ops, stack_trace_context_t *ctx)
     44stack_trace_fp_pc(stack_trace_ops_t *ops, uintptr_t fp, uintptr_t pc)
    4545{
    4646        int cnt = 0;
    4747        const char *symbol;
    4848        uintptr_t offset;
    49         uintptr_t fp;
    50         uintptr_t pc;
    5149       
    52         while (cnt++ < STACK_FRAMES_MAX &&
    53             ops->stack_trace_context_validate(ctx)) {
     50        while (cnt++ < STACK_FRAMES_MAX && ops->frame_pointer_validate(fp)) {
    5451                if (ops->symbol_resolve &&
    55                     ops->symbol_resolve(ctx->pc, &symbol, &offset)) {
     52                    ops->symbol_resolve(pc, &symbol, &offset)) {
    5653                        if (offset)
    57                                 printf("%p: %s+%" PRIp "()\n",
    58                                     ctx->fp, symbol, offset);
     54                                printf("%p: %s+%" PRIp "()\n", fp, symbol, offset);
    5955                        else
    60                                 printf("%p: %s()\n",
    61                                     ctx->fp, symbol);
     56                                printf("%p: %s()\n", fp, symbol);
    6257                } else {
    63                         printf("%p: %p()\n", ctx->fp, ctx->pc);
     58                        printf("%p: %p()\n", fp, pc);
    6459                }
    65                 if (!ops->return_address_get(ctx, &pc))
     60                if (!ops->return_address_get(fp, &pc))
    6661                        break;
    67                 if (!ops->frame_pointer_prev(ctx, &fp))
     62                if (!ops->frame_pointer_prev(fp, &fp))
    6863                        break;
    69                 ctx->fp = fp;
    70                 ctx->pc = pc;
    7164        }
    7265}
     
    7467void stack_trace(void)
    7568{
    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());
    8370
    8471        /*
     
    9178void stack_trace_istate(istate_t *istate)
    9279{
    93         stack_trace_context_t ctx = {
    94                 .fp = istate_get_fp(istate),
    95                 .pc = istate_get_pc(istate),
    96                 .istate = istate
    97         };
    98        
    9980        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));
    10183        else
    102                 stack_trace_ctx(&kst_ops, &ctx);
     84                stack_trace_fp_pc(&kst_ops, istate_get_fp(istate),
     85                    istate_get_pc(istate));
    10386}
    10487
    105 static bool
    106 kernel_symbol_resolve(uintptr_t addr, const char **sp, uintptr_t *op)
     88static bool kernel_symbol_resolve(uintptr_t addr, const char **sp, uintptr_t *op)
    10789{
    10890        return (symtab_name_lookup(addr, sp, op) == 0);
     
    11092
    11193stack_trace_ops_t kst_ops = {
    112         .stack_trace_context_validate = kernel_stack_trace_context_validate,
     94        .frame_pointer_validate = kernel_frame_pointer_validate,
    11395        .frame_pointer_prev = kernel_frame_pointer_prev,
    11496        .return_address_get = kernel_return_address_get,
     
    11799
    118100stack_trace_ops_t ust_ops = {
    119         .stack_trace_context_validate = uspace_stack_trace_context_validate,
     101        .frame_pointer_validate = uspace_frame_pointer_validate,
    120102        .frame_pointer_prev = uspace_frame_pointer_prev,
    121103        .return_address_get = uspace_return_address_get,
  • kernel/generic/src/main/main.c

    r2d0c3a6 r527298a  
    147147        size_t i;
    148148        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,
    150150                    init.tasks[i].addr, init.tasks[i].size))
    151151                        config.stack_base = ALIGN_UP(init.tasks[i].addr +
     
    155155        /* Avoid placing stack on top of boot allocations. */
    156156        if (ballocs.size) {
    157                 if (PA_OVERLAPS(config.stack_base, config.stack_size,
     157                if (PA_overlaps(config.stack_base, config.stack_size,
    158158                    ballocs.base, ballocs.size))
    159159                        config.stack_base = ALIGN_UP(ballocs.base +
  • kernel/generic/src/mm/frame.c

    r2d0c3a6 r527298a  
    121121 *
    122122 */
    123 NO_TRACE static size_t zones_insert_zone(pfn_t base, size_t count,
    124     zone_flags_t flags)
     123NO_TRACE static size_t zones_insert_zone(pfn_t base, size_t count)
    125124{
    126125        if (zones.count + 1 == ZONES_MAX) {
     
    132131        for (i = 0; i < zones.count; i++) {
    133132                /* 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));
    153139                        return (size_t) -1;
    154140                }
     
    161147        for (j = zones.count; j > i; j--) {
    162148                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];
    166151        }
    167152       
     
    763748        for (i = z2 + 1; i < zones.count; i++) {
    764749                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];
    768752        }
    769753       
     
    914898                }
    915899               
    916                 size_t znum = zones_insert_zone(start, count, flags);
     900                size_t znum = zones_insert_zone(start, count);
    917901                if (znum == (size_t) -1) {
    918902                        irq_spinlock_unlock(&zones.lock, true);
     
    937921       
    938922        /* Non-available zone */
    939         size_t znum = zones_insert_zone(start, count, flags);
     923        size_t znum = zones_insert_zone(start, count);
    940924        if (znum == (size_t) -1) {
    941925                irq_spinlock_unlock(&zones.lock, true);
  • tools/mkfat.py

    r2d0c3a6 r527298a  
    343343def usage(prname):
    344344        "Print usage syntax"
    345         print prname + " <EXTRA_BYTES> <PATH> <IMAGE>"
     345        print prname + " <PATH> <IMAGE>"
    346346
    347347def main():
    348         if (len(sys.argv) < 4):
     348        if (len(sys.argv) < 3):
    349349                usage(sys.argv[0])
    350350                return
    351351       
    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])
    359353        if (not os.path.isdir(path)):
    360354                print "<PATH> must be a directory"
     
    371365       
    372366        # Make sure the filesystem is large enought for FAT16
    373         size = subtree_size(path, cluster_size, dirent_size) + reserved_clusters * cluster_size + extra_bytes
     367        size = subtree_size(path, cluster_size, dirent_size) + reserved_clusters * cluster_size
    374368        while (size / cluster_size < fat16_clusters):
    375369                if (cluster_size > sector_size):
    376370                        cluster_size /= 2
    377                         size = subtree_size(path, cluster_size, dirent_size) + reserved_clusters * cluster_size + extra_bytes
     371                        size = subtree_size(path, cluster_size, dirent_size) + reserved_clusters * cluster_size
    378372                else:
    379373                        size = fat16_clusters * cluster_size + reserved_clusters * cluster_size
     
    387381        data_start = root_start + root_size
    388382       
    389         outf = file(sys.argv[3], "w")
     383        outf = file(sys.argv[2], "w")
    390384       
    391385        boot_sector = xstruct.create(BOOT_SECTOR)
  • uspace/Makefile.common

    r2d0c3a6 r527298a  
    172172ifneq ($(BINARY),)
    173173%.disasm: $(BINARY)
    174 ifeq ($(CONFIG_LINE_DEBUG),y)
    175         $(OBJDUMP) -d -S $< > $@
    176 else
    177174        $(OBJDUMP) -d $< > $@
    178 endif
    179175
    180176$(BINARY): $(LINKER_SCRIPT) $(OBJECTS) $(LIBS) $(BASE_LIBS)
  • uspace/app/klog/klog.c

    r2d0c3a6 r527298a  
    4343#include <event.h>
    4444#include <errno.h>
    45 #include <str_error.h>
    4645#include <io/klog.h>
    4746
    48 #define NAME       "klog"
    49 #define LOG_FNAME  "/log/klog"
     47#define NAME  "klog"
    5048
    5149/* Pointer to klog area */
    5250static wchar_t *klog;
    5351static size_t klog_length;
    54 
    55 static FILE *log;
    5652
    5753static void interrupt_received(ipc_callid_t callid, ipc_call_t *call)
     
    6258        size_t i;
    6359       
    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]);
    7762}
    7863
     
    10691        }
    10792       
    108         /*
    109          * Mode "a" would be definitively much better here, but it is
    110          * 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        
    11893        async_set_interrupt_received(interrupt_received);
    11994        klog_update();
  • uspace/lib/c/generic/io/io.c

    r2d0c3a6 r527298a  
    757757}
    758758
    759 int fileno(FILE *stream)
    760 {
    761         if (stream->klog) {
    762                 errno = EBADF;
    763                 return -1;
    764         }
    765        
    766         return stream->fd;
    767 }
    768 
    769759int fphone(FILE *stream)
    770760{
  • uspace/lib/c/include/stdio.h

    r2d0c3a6 r527298a  
    171171extern off64_t ftell(FILE *);
    172172extern int feof(FILE *);
    173 extern int fileno(FILE *);
    174173
    175174extern int fflush(FILE *);
  • uspace/srv/fs/fat/fat.h

    r2d0c3a6 r527298a  
    4848
    4949#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)->spc
    56 #define RSCNT(bs)       uint16_t_le2host((bs)->rscnt)
    57 #define FATCNT(bs)      (bs)->fatcnt
    58 #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))
    6350
    6451#define BS_BLOCK                0
     
    211198        unsigned                refcnt;
    212199        bool                    dirty;
    213 
    214         /*
    215          * Cache of the node's last and "current" cluster to avoid some
    216          * 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;
    225200} fat_node_t;
    226201
  • uspace/srv/fs/fat/fat_fat.c

    r2d0c3a6 r527298a  
    4949#include <mem.h>
    5050
    51 /*
    52  * Convenience macros for computing some frequently used values from the
    53  * 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 
    6251/**
    6352 * The fat_alloc_lock mutex protects all copies of the File Allocation Table
     
    8574{
    8675        block_t *b;
     76        unsigned bps;
     77        unsigned rscnt;         /* block address of the first FAT */
    8778        uint16_t clusters = 0;
    8879        fat_cluster_t clst = firstc;
    8980        int rc;
     81
     82        bps = uint16_t_le2host(bs->bps);
     83        rscnt = uint16_t_le2host(bs->rscnt);
    9084
    9185        if (firstc == FAT_CLST_RES0) {
     
    10599                if (lastc)
    106100                        *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));
    109103                /* 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);
    112105                if (rc != EOK)
    113106                        return rc;
     
    132125 * @param block         Pointer to a block pointer for storing result.
    133126 * @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.
    135130 * @param bn            Block number.
    136131 * @param flags         Flags passed to libblock.
     
    139134 */
    140135int
    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 cluster
    159                  * 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 to
    168                  * 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 file
    196  *                      is empty.
    197  * @param clp           If not NULL, address where the cluster containing bn
    198  *                      will be stored.
    199  *                      stored
    200  * @param bn            Block number.
    201  * @param flags         Flags passed to libblock.
    202  *
    203  * @return              EOK on success or a negative error code.
    204  */
    205 int
    206136_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 */
    209145        uint16_t clusters;
    210146        unsigned max_clusters;
    211         fat_cluster_t c;
     147        fat_cluster_t lastc;
    212148        int rc;
    213149
     
    215151         * This function can only operate on non-zero length files.
    216152         */
    217         if (fcl == FAT_CLST_RES0)
     153        if (firstc == FAT_CLST_RES0)
    218154                return ELIMIT;
    219155
    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) {
    221166                /* 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);
    225170                return rc;
    226171        }
    227172
    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);
    230176        if (rc != EOK)
    231177                return rc;
    232178        assert(clusters == max_clusters);
    233179
    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);
    238182
    239183        return rc;
     
    254198int fat_fill_gap(fat_bs_t *bs, fat_node_t *nodep, fat_cluster_t mcl, aoff64_t pos)
    255199{
     200        uint16_t bps;
     201        unsigned spc;
    256202        block_t *b;
    257203        aoff64_t o, boundary;
    258204        int rc;
    259205
    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);
    261210
    262211        /* zero out already allocated space */
    263212        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) ?
    266215                    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);
    271220                b->dirty = true;                /* need to sync node */
    272221                rc = block_put(b);
     
    279228       
    280229        /* 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) {
    282231                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));
    287236                b->dirty = true;                /* need to sync node */
    288237                rc = block_put(b);
     
    308257{
    309258        block_t *b;
     259        uint16_t bps;
     260        uint16_t rscnt;
     261        uint16_t sf;
    310262        fat_cluster_t *cp;
    311263        int rc;
    312264
    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);
    315271        if (rc != EOK)
    316272                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));
    319274        *value = uint16_t_le2host(*cp);
    320275        rc = block_put(b);
     
    338293{
    339294        block_t *b;
     295        uint16_t bps;
     296        uint16_t rscnt;
     297        uint16_t sf;
    340298        fat_cluster_t *cp;
    341299        int rc;
    342300
    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);
    346308        if (rc != EOK)
    347309                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));
    350311        *cp = host2uint16_t_le(value);
    351312        b->dirty = true;                /* need to sync block */
     
    403364    fat_cluster_t *mcl, fat_cluster_t *lcl)
    404365{
     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;
    405373        block_t *blk;
    406374        fat_cluster_t *lifo;    /* stack for storing free cluster numbers */
     
    413381                return ENOMEM;
    414382       
     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       
    415395        /*
    416396         * Search FAT1 for unused clusters.
    417397         */
    418398        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);
    422401                if (rc != EOK)
    423402                        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++) {
    425404                        /*
    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.
    432409                         */
    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)) {
    435411                                rc = block_put(blk);
    436412                                if (rc != EOK)
     
    535511 * @param nodep         Node representing the file.
    536512 * @param mcl           First cluster of the cluster chain to append.
    537  * @param lcl           Last cluster of the cluster chain to append.
    538513 *
    539514 * @return              EOK on success or a negative error code.
    540515 */
    541 int
    542 fat_append_clusters(fat_bs_t *bs, fat_node_t *nodep, fat_cluster_t mcl,
    543     fat_cluster_t lcl)
     516int fat_append_clusters(fat_bs_t *bs, fat_node_t *nodep, fat_cluster_t mcl)
    544517{
    545518        dev_handle_t dev_handle = nodep->idx->dev_handle;
    546         fat_cluster_t lastc;
     519        fat_cluster_t lcl;
    547520        uint16_t numc;
    548521        uint8_t fatno;
    549522        int rc;
    550523
    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;
    566534        }
    567535
    568536        for (fatno = FAT1; fatno < bs->fatcnt; fatno++) {
    569                 rc = fat_set_cluster(bs, nodep->idx->dev_handle, fatno, lastc,
     537                rc = fat_set_cluster(bs, nodep->idx->dev_handle, fatno, lcl,
    570538                    mcl);
    571539                if (rc != EOK)
    572540                        return rc;
    573541        }
    574 
    575         nodep->lastc_cached_valid = true;
    576         nodep->lastc_cached_value = lcl;
    577542
    578543        return EOK;
     
    583548 * @param bs            Buffer holding the boot sector of the file system.
    584549 * @param nodep         FAT node where the chopping will take place.
    585  * @param lcl           Last cluster which will remain in the node. If this
     550 * @param lastc         Last cluster which will remain in the node. If this
    586551 *                      argument is FAT_CLST_RES0, then all clusters will
    587552 *                      be chopped off.
     
    589554 * @return              EOK on success or a negative return code.
    590555 */
    591 int fat_chop_clusters(fat_bs_t *bs, fat_node_t *nodep, fat_cluster_t lcl)
    592 {
    593         int rc;
     556int fat_chop_clusters(fat_bs_t *bs, fat_node_t *nodep, fat_cluster_t lastc)
     557{
     558        int rc;
     559
    594560        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) {
    604562                /* The node will have zero size and no clusters allocated. */
    605563                rc = fat_free_clusters(bs, dev_handle, nodep->firstc);
     
    612570                unsigned fatno;
    613571
    614                 rc = fat_get_cluster(bs, dev_handle, FAT1, lcl, &nextc);
     572                rc = fat_get_cluster(bs, dev_handle, FAT1, lastc, &nextc);
    615573                if (rc != EOK)
    616574                        return rc;
     
    618576                /* Terminate the cluster chain in all copies of FAT. */
    619577                for (fatno = FAT1; fatno < bs->fatcnt; fatno++) {
    620                         rc = fat_set_cluster(bs, dev_handle, fatno, lcl,
     578                        rc = fat_set_cluster(bs, dev_handle, fatno, lastc,
    621579                            FAT_CLST_LAST1);
    622580                        if (rc != EOK)
     
    630588        }
    631589
    632         /*
    633          * Update and re-enable the last cluster cache.
    634          */
    635         nodep->lastc_cached_valid = true;
    636         nodep->lastc_cached_value = lcl;
    637 
    638590        return EOK;
    639591}
     
    644596        int i;
    645597        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,
    650605                    BLOCK_FLAGS_NOREAD);
    651606                if (rc != EOK)
    652607                        return rc;
    653                 memset(b->data, 0, BPS(bs));
     608                memset(b->data, 0, bps);
    654609                b->dirty = true;
    655610                rc = block_put(b);
  • uspace/srv/fs/fat/fat_fat.h

    r2d0c3a6 r527298a  
    6464    fat_cluster_t *, uint16_t *, uint16_t);
    6565
    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
    6870extern 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);
    7072
    7173extern int fat_append_clusters(struct fat_bs *, struct fat_node *,
    72     fat_cluster_t, fat_cluster_t);
     74    fat_cluster_t);
    7375extern int fat_chop_clusters(struct fat_bs *, struct fat_node *,
    7476    fat_cluster_t);
  • uspace/srv/fs/fat/fat_ops.c

    r2d0c3a6 r527298a  
    6060#define FS_NODE(node)   ((node) ? (node)->bp : NULL)
    6161
    62 #define DPS(bs)         (BPS((bs)) / sizeof(fat_dentry_t))
    63 #define BPC(bs)         (BPS((bs)) * SPC((bs)))
    64 
    6562/** Mutex protecting the list of cached free FAT nodes. */
    6663static FIBRIL_MUTEX_INITIALIZE(ffn_mutex);
     
    104101        node->refcnt = 0;
    105102        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;
    111103}
    112104
     
    116108        fat_bs_t *bs;
    117109        fat_dentry_t *d;
     110        uint16_t bps;
     111        unsigned dps;
    118112        int rc;
    119113       
     
    121115
    122116        bs = block_bb_get(node->idx->dev_handle);
     117        bps = uint16_t_le2host(bs->bps);
     118        dps = bps / sizeof(fat_dentry_t);
    123119       
    124120        /* Read the block that contains the dentry of interest. */
    125121        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);
    128123        if (rc != EOK)
    129124                return rc;
    130125
    131         d = ((fat_dentry_t *)b->data) + (node->idx->pdi % DPS(bs));
     126        d = ((fat_dentry_t *)b->data) + (node->idx->pdi % dps);
    132127
    133128        d->firstc = host2uint16_t_le(node->firstc);
     
    271266        fat_dentry_t *d;
    272267        fat_node_t *nodep = NULL;
     268        unsigned bps;
     269        unsigned spc;
     270        unsigned dps;
    273271        int rc;
    274272
     
    300298
    301299        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);
    302303
    303304        /* 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);
    306307        if (rc != EOK) {
    307308                (void) fat_node_put(FS_NODE(nodep));
     
    309310        }
    310311
    311         d = ((fat_dentry_t *)b->data) + (idxp->pdi % DPS(bs));
     312        d = ((fat_dentry_t *)b->data) + (idxp->pdi % dps);
    312313        if (d->attr & FAT_ATTR_SUBDIR) {
    313314                /*
     
    329330                        return rc;
    330331                }
    331                 nodep->size = BPS(bs) * SPC(bs) * clusters;
     332                nodep->size = bps * spc * clusters;
    332333        } else {
    333334                nodep->type = FAT_FILE;
     
    367368        char name[FAT_NAME_LEN + 1 + FAT_EXT_LEN + 1];
    368369        unsigned i, j;
     370        unsigned bps;           /* bytes per sector */
     371        unsigned dps;           /* dentries per sector */
    369372        unsigned blocks;
    370373        fat_dentry_t *d;
     
    374377        fibril_mutex_lock(&parentp->idx->lock);
    375378        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;
    377382        for (i = 0; i < blocks; i++) {
    378383                rc = fat_block_get(&b, bs, parentp, i, BLOCK_FLAGS_NONE);
     
    381386                        return rc;
    382387                }
    383                 for (j = 0; j < DPS(bs); j++) {
     388                for (j = 0; j < dps; j++) {
    384389                        d = ((fat_dentry_t *)b->data) + j;
    385390                        switch (fat_classify_dentry(d)) {
     
    409414                                fat_idx_t *idx = fat_idx_get_by_pos(
    410415                                    parentp->idx->dev_handle, parentp->firstc,
    411                                     i * DPS(bs) + j);
     416                                    i * dps + j);
    412417                                fibril_mutex_unlock(&parentp->idx->lock);
    413418                                if (!idx) {
     
    508513        fat_bs_t *bs;
    509514        fat_cluster_t mcl, lcl;
     515        uint16_t bps;
    510516        int rc;
    511517
    512518        bs = block_bb_get(dev_handle);
     519        bps = uint16_t_le2host(bs->bps);
    513520        if (flags & L_DIRECTORY) {
    514521                /* allocate a cluster */
     
    539546                nodep->type = FAT_DIRECTORY;
    540547                nodep->firstc = mcl;
    541                 nodep->size = BPS(bs) * SPC(bs);
     548                nodep->size = bps * bs->spc;
    542549        } else {
    543550                nodep->type = FAT_FILE;
     
    602609        block_t *b;
    603610        unsigned i, j;
     611        uint16_t bps;
     612        unsigned dps;
    604613        unsigned blocks;
    605614        fat_cluster_t mcl, lcl;
     
    631640        fibril_mutex_lock(&parentp->idx->lock);
    632641        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;
    635646
    636647        for (i = 0; i < blocks; i++) {
     
    640651                        return rc;
    641652                }
    642                 for (j = 0; j < DPS(bs); j++) {
     653                for (j = 0; j < dps; j++) {
    643654                        d = ((fat_dentry_t *)b->data) + j;
    644655                        switch (fat_classify_dentry(d)) {
     
    680691                return rc;
    681692        }
    682         rc = fat_append_clusters(bs, parentp, mcl, lcl);
     693        rc = fat_append_clusters(bs, parentp, mcl);
    683694        if (rc != EOK) {
    684695                (void) fat_free_clusters(bs, parentp->idx->dev_handle, mcl);
     
    686697                return rc;
    687698        }
    688         parentp->size += BPS(bs) * SPC(bs);
     699        parentp->size += bps * bs->spc;
    689700        parentp->dirty = true;          /* need to sync node */
    690701        rc = fat_block_get(&b, bs, parentp, i, BLOCK_FLAGS_NONE);
     
    760771
    761772        childp->idx->pfc = parentp->firstc;
    762         childp->idx->pdi = i * DPS(bs) + j;
     773        childp->idx->pdi = i * dps + j;
    763774        fibril_mutex_unlock(&childp->idx->lock);
    764775
     
    782793        fat_bs_t *bs;
    783794        fat_dentry_t *d;
     795        uint16_t bps;
    784796        block_t *b;
    785797        bool has_children;
     
    800812        fibril_mutex_lock(&childp->idx->lock);
    801813        bs = block_bb_get(childp->idx->dev_handle);
     814        bps = uint16_t_le2host(bs->bps);
    802815
    803816        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,
    805818            BLOCK_FLAGS_NONE);
    806819        if (rc != EOK)
    807820                goto error;
    808821        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)));
    810823        /* mark the dentry as not-currently-used */
    811824        d->name[0] = FAT_DENTRY_ERASED;
     
    839852        fat_bs_t *bs;
    840853        fat_node_t *nodep = FAT_NODE(fn);
     854        unsigned bps;
     855        unsigned dps;
    841856        unsigned blocks;
    842857        block_t *b;
     
    851866        fibril_mutex_lock(&nodep->idx->lock);
    852867        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;
    855872
    856873        for (i = 0; i < blocks; i++) {
     
    862879                        return rc;
    863880                }
    864                 for (j = 0; j < DPS(bs); j++) {
     881                for (j = 0; j < dps; j++) {
    865882                        d = ((fat_dentry_t *)b->data) + j;
    866883                        switch (fat_classify_dentry(d)) {
     
    959976        enum cache_mode cmode;
    960977        fat_bs_t *bs;
     978        uint16_t bps;
     979        uint16_t rde;
    961980       
    962981        /* Accept the mount options */
     
    9951014        bs = block_bb_get(dev_handle);
    9961015       
    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) {
    9981021                block_fini(dev_handle);
    9991022                ipc_answer_0(rid, ENOTSUP);
     
    10021025
    10031026        /* 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);
    10051028        if (rc != EOK) {
    10061029                block_fini(dev_handle);
     
    10641087        rootp->refcnt = 1;
    10651088        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);
    10671090        rootp->idx = ridxp;
    10681091        ridxp->nodep = rootp;
     
    11421165        fat_node_t *nodep;
    11431166        fat_bs_t *bs;
     1167        uint16_t bps;
    11441168        size_t bytes;
    11451169        block_t *b;
     
    11671191
    11681192        bs = block_bb_get(dev_handle);
     1193        bps = uint16_t_le2host(bs->bps);
    11691194
    11701195        if (nodep->type == FAT_FILE) {
     
    11791204                        (void) async_data_read_finalize(callid, NULL, 0);
    11801205                } else {
    1181                         bytes = min(len, BPS(bs) - pos % BPS(bs));
     1206                        bytes = min(len, bps - pos % bps);
    11821207                        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,
    11841209                            BLOCK_FLAGS_NONE);
    11851210                        if (rc != EOK) {
     
    11891214                                return;
    11901215                        }
    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);
    11931218                        rc = block_put(b);
    11941219                        if (rc != EOK) {
     
    12051230
    12061231                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);
    12091234
    12101235                /*
     
    12141239                 * the position pointer accordingly.
    12151240                 */
    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) {
    12181243                        aoff64_t o;
    12191244
     
    12221247                        if (rc != EOK)
    12231248                                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);
    12261251                            o++, pos++) {
    12271252                                d = ((fat_dentry_t *)b->data) + o;
     
    12811306        size_t bytes, size;
    12821307        block_t *b;
     1308        uint16_t bps;
     1309        unsigned spc;
     1310        unsigned bpc;           /* bytes per cluster */
    12831311        aoff64_t boundary;
    12841312        int flags = BLOCK_FLAGS_NONE;
     
    13061334
    13071335        bs = block_bb_get(dev_handle);
     1336        bps = uint16_t_le2host(bs->bps);
     1337        spc = bs->spc;
     1338        bpc = bps * spc;
    13081339
    13091340        /*
     
    13141345         * value signalizing a smaller number of bytes written.
    13151346         */
    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)
    13181349                flags |= BLOCK_FLAGS_NOREAD;
    13191350       
    1320         boundary = ROUND_UP(nodep->size, BPC(bs));
     1351        boundary = ROUND_UP(nodep->size, bpc);
    13211352        if (pos < boundary) {
    13221353                /*
     
    13331364                        return;
    13341365                }
    1335                 rc = fat_block_get(&b, bs, nodep, pos / BPS(bs), flags);
     1366                rc = fat_block_get(&b, bs, nodep, pos / bps, flags);
    13361367                if (rc != EOK) {
    13371368                        (void) fat_node_put(fn);
     
    13401371                        return;
    13411372                }
    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);
    13441375                b->dirty = true;                /* need to sync block */
    13451376                rc = block_put(b);
     
    13651396                fat_cluster_t mcl, lcl;
    13661397 
    1367                 nclsts = (ROUND_UP(pos + bytes, BPC(bs)) - boundary) / BPC(bs);
     1398                nclsts = (ROUND_UP(pos + bytes, bpc) - boundary) / bpc;
    13681399                /* create an independent chain of nclsts clusters in all FATs */
    13691400                rc = fat_alloc_clusters(bs, dev_handle, nclsts, &mcl, &lcl);
     
    13841415                        return;
    13851416                }
    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);
    13881419                if (rc != EOK) {
    13891420                        (void) fat_free_clusters(bs, dev_handle, mcl);
     
    13931424                        return;
    13941425                }
    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);
    13971428                b->dirty = true;                /* need to sync block */
    13981429                rc = block_put(b);
     
    14071438                 * node's cluster chain.
    14081439                 */
    1409                 rc = fat_append_clusters(bs, nodep, mcl, lcl);
     1440                rc = fat_append_clusters(bs, nodep, mcl);
    14101441                if (rc != EOK) {
    14111442                        (void) fat_free_clusters(bs, dev_handle, mcl);
     
    14311462        fat_node_t *nodep;
    14321463        fat_bs_t *bs;
     1464        uint16_t bps;
     1465        uint8_t spc;
     1466        unsigned bpc;   /* bytes per cluster */
    14331467        int rc;
    14341468
     
    14451479
    14461480        bs = block_bb_get(dev_handle);
     1481        bps = uint16_t_le2host(bs->bps);
     1482        spc = bs->spc;
     1483        bpc = bps * spc;
    14471484
    14481485        if (nodep->size == size) {
     
    14541491                 */
    14551492                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)) {
    14571494                /*
    14581495                 * The node will be shrunk, but no clusters will be deallocated.
     
    14721509                        fat_cluster_t lastc;
    14731510                        rc = fat_cluster_walk(bs, dev_handle, nodep->firstc,
    1474                             &lastc, NULL, (size - 1) / BPC(bs));
     1511                            &lastc, NULL, (size - 1) / bpc);
    14751512                        if (rc != EOK)
    14761513                                goto out;
     
    15271564void fat_sync(ipc_callid_t rid, ipc_call_t *request)
    15281565{
    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);
    15501568}
    15511569
  • uspace/srv/fs/tmpfs/tmpfs_ops.c

    r2d0c3a6 r527298a  
    736736void tmpfs_sync(ipc_callid_t rid, ipc_call_t *request)
    737737{
    738         /*
    739          * TMPFS keeps its data structures always consistent,
    740          * thus the sync operation is a no-op.
    741          */
     738        /* Dummy implementation */
    742739        ipc_answer_0(rid, EOK);
    743740}
Note: See TracChangeset for help on using the changeset viewer.