Changes in / [1720cf9:571addd] in mainline


Ignore:
Files:
1 added
35 edited

Legend:

Unmodified
Added
Removed
  • HelenOS.config

    r1720cf9 r571addd  
    498498@ "1152x720"
    499499@ "1152x864"
     500@ "1280x720"
     501@ "1280x800"
    500502@ "1280x960"
    501503@ "1280x1024"
     
    544546! CONFIG_BAREBONE (n/y)
    545547
     548% Line debugging information
     549! [CONFIG_STRIP_BINARIES!=y] CONFIG_LINE_DEBUG (n/y)
  • boot/Makefile.build

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

    r1720cf9 r571addd  
    5454        $(COMPS_C) \
    5555        genarch/src/division.c \
     56        generic/src/memstr.c \
    5657        generic/src/printf_core.c \
    5758        generic/src/vprintf.c \
  • boot/arch/arm32/src/asm.S

    r1720cf9 r571addd  
    3535.global boot_stack
    3636.global halt
    37 .global memcpy
    3837.global jump_to_kernel
    3938
     
    5554        b halt
    5655
    57 memcpy:
    58         add r3, r1, #3
    59         bic r3, r3, #3
    60         cmp r1, r3
    61         stmdb sp!, {r4, r5, lr}
    62         mov r5, r0
    63         beq 4f
    64        
    65         1:
    66                 cmp r2, #0
    67                 movne ip, #0
    68                 beq 3f
    69        
    70         2:
    71                 ldrb r3, [ip, r1]
    72                 strb r3, [ip, r0]
    73                 add ip, ip, #1
    74                 cmp ip, r2
    75                 bne 2b
    76        
    77         3:
    78                 mov r0, r5
    79                 ldmia sp!, {r4, r5, pc}
    80        
    81         4:
    82                 add r3, r0, #3
    83                 bic r3, r3, #3
    84                 cmp r0, r3
    85                 bne 1b
    86                 movs r4, r2, lsr #2
    87                 moveq lr, r4
    88                 beq 6f
    89                 mov lr, #0
    90                 mov ip, lr
    91        
    92         5:
    93                 ldr r3, [ip, r1]
    94                 add lr, lr, #1
    95                 cmp lr, r4
    96                 str r3, [ip, r0]
    97                 add ip, ip, #4
    98                 bne 5b
    99        
    100         6:
    101                 ands r4, r2, #3
    102                 beq 3b
    103                 mov r3, lr, lsl #2
    104                 add r0, r3, r0
    105                 add ip, r3, r1
    106                 mov r2, #0
    107        
    108         7:
    109                 ldrb r3, [r2, ip]
    110                 strb r3, [r2, r0]
    111                 add r2, r2, #1
    112                 cmp r2, r4
    113                 bne 7b
    114                 b 3b
    115 
    11656jump_to_kernel:
    11757        #
  • boot/arch/ia64/Makefile.inc

    r1720cf9 r571addd  
    4949        genarch/src/division.c \
    5050        generic/src/balloc.c \
     51        generic/src/memstr.c \
    5152        generic/src/printf_core.c \
    5253        generic/src/vprintf.c \
  • boot/arch/ia64/src/asm.S

    r1720cf9 r571addd  
    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
    41 memcpy:
    42         alloc loc0 = ar.pfs, 3, 1, 0, 0
    43 
    44         adds r14 = 7, in1
    45         mov r2 = ar.lc
    46         mov r8 = in0 ;;
    47         and r14 = -8, r14 ;;
    48         cmp.ne p6, p7 = r14, in1
    49 (p7)    br.cond.dpnt 3f ;;
    50 0:
    51         cmp.ne p6, p7 = 0, in2
    52 (p7)    br.cond.dpnt 2f ;;
    53 (p6)    adds r14 = -1, in2
    54 (p6)    mov r16 = r0
    55 (p6)    mov r17 = r0 ;;
    56 (p6)    mov ar.lc = r14
    57 1:
    58         add r14 = r16, in1
    59         add r15 = r16, in0
    60         adds r17 = 1, r17 ;;
    61         ld1 r14 = [r14]
    62         mov r16 = r17 ;;
    63         st1 [r15] = r14
    64         br.cloop.sptk.few 1b ;;
    65 2:
    66         mov ar.lc = r2
    67         mov ar.pfs = loc0
    68         br.ret.sptk.many rp
    69 3:
    70         adds r14 = 7, in0 ;;
    71         and r14 = -8, r14 ;;
    72         cmp.eq p6, p7 = r14, in0
    73 (p7)    br.cond.dptk 0b
    74         shr.u r18 = in2, 3 ;;
    75         cmp.ne p6, p7 = 0, r18
    76 (p7)    br.cond.dpnt 5f ;;
    77 (p6)    adds r14 = -1, r18
    78 (p6)    mov r16 = r0
    79 (p6)    mov r17 = r0 ;;
    80 (p6)    mov ar.lc = r14
    81 4:
    82         shladd r14 = r16, 3, r0
    83         adds r16 = 1, r17 ;;
    84         add r15 = in1, r14
    85         add r14 = in0, r14
    86         mov r17 = r16 ;;
    87         ld8 r15 = [r15] ;;
    88         st8 [r14] = r15
    89         br.cloop.sptk.few 4b
    90 5:
    91         and r15 = 7, in2
    92         shladd r14 = r18, 3, r0
    93         mov r16 = r0
    94         mov r18 = r0 ;;
    95         cmp.eq p6, p7 = 0, r15
    96         add in0 = r14, in0
    97         adds r15 = -1, r15
    98         add r17 = r14, in1
    99 (p6)    br.cond.dpnt 2b ;;
    100         mov ar.lc = r15
    101 6:
    102         add r14 = r16, r17
    103         add r15 = r16, in0
    104         adds r16 = 1, r18 ;;
    105         ld1 r14 = [r14]
    106         mov r18 = r16 ;;
    107         st1 [r15] = r14
    108         br.cloop.sptk.few 6b ;;
    109         mov ar.lc = r2
    110         mov ar.pfs = loc0
    111         br.ret.sptk.many rp
    112 
    11341jump_to_kernel:
    11442        alloc loc0 = ar.pfs, 1, 1, 0, 0
  • boot/arch/mips32/Makefile.inc

    r1720cf9 r571addd  
    6161        genarch/src/division.c \
    6262        genarch/src/multiplication.c \
     63        generic/src/memstr.c \
    6364        generic/src/printf_core.c \
    6465        generic/src/vprintf.c \
  • boot/arch/mips32/src/asm.S

    r1720cf9 r571addd  
    3636.global start
    3737.global halt
    38 .global memcpy
    3938.global jump_to_kernel
    4039
     
    127126        nop
    128127
    129 memcpy:
    130         addiu $v0, $a1, 3
    131         li $v1, -4
    132         and $v0, $v0, $v1
    133         beq $a1, $v0, 3f
    134         move $t0, $a0
    135         move $t2, $a0
    136        
    137         0:
    138                 beq $a2, $zero, 2f
    139                 move $a3, $zero
    140        
    141         1:
    142                 addu $v0, $a1, $a3
    143                 lbu $a0, 0($v0)
    144                 addu $v1, $t0, $a3
    145                 addiu $a3, $a3, 1
    146                 bne $a3, $a2, 1b
    147                 sb $a0, 0($v1)
    148        
    149         2:
    150                 jr $ra
    151                 move $v0, $t2
    152        
    153         3:
    154                 addiu $v0, $a0, 3
    155                 and $v0, $v0, $v1
    156                 bne $a0, $v0, 0b
    157                 srl $t1, $a2, 2
    158                
    159                 beq $t1, $zero, 5f
    160                 move $a3, $zero
    161                
    162                 move $a3, $zero
    163                 move $a0, $zero
    164        
    165         4:
    166                 addu $v0, $a1, $a0
    167                 lw $v1, 0($v0)
    168                 addiu $a3, $a3, 1
    169                 addu $v0, $t0, $a0
    170                 sw $v1, 0($v0)
    171                 bne $a3, $t1, 4b
    172                 addiu $a0, $a0, 4
    173        
    174         5:
    175                 andi $a2, $a2, 0x3
    176                 beq $a2, $zero, 2b
    177                 nop
    178                
    179                 sll $v0, $a3, 2
    180                 addu $t1, $v0, $t0
    181                 move $a3, $zero
    182                 addu $t0, $v0, $a1
    183        
    184         6:
    185                 addu $v0, $t0, $a3
    186                 lbu $a0, 0($v0)
    187                 addu $v1, $t1, $a3
    188                 addiu $a3, $a3, 1
    189                 bne $a3, $a2, 6b
    190                 sb $a0, 0($v1)
    191                
    192                 jr $ra
    193                 move $v0, $t2
    194 
    195128jump_to_kernel:
    196129        #
  • boot/arch/ppc32/Makefile.inc

    r1720cf9 r571addd  
    5656        genarch/src/multiplication.c \
    5757        generic/src/balloc.c \
     58        generic/src/memstr.c \
    5859        generic/src/printf_core.c \
    5960        generic/src/vprintf.c \
  • boot/arch/ppc32/src/asm.S

    r1720cf9 r571addd  
    6060.global start
    6161.global halt
    62 .global memcpy
    6362.global jump_to_kernel
    6463.global real_mode
     
    7877halt:
    7978        b halt
    80 
    81 memcpy:
    82         srwi. r7, r5, 3
    83         addi r6, r3, -4
    84         addi r4, r4, -4
    85         beq 2f
    86        
    87         andi. r0, r6, 3
    88         mtctr r7
    89         bne 5f
    90        
    91         1:
    92                 lwz r7, 4(r4)
    93                 lwzu r8, 8(r4)
    94                 stw r7, 4(r6)
    95                 stwu r8, 8(r6)
    96                 bdnz 1b
    97                
    98                 andi. r5, r5, 7
    99        
    100         2:
    101                 cmplwi 0, r5, 4
    102                 blt 3f
    103                
    104                 lwzu r0, 4(r4)
    105                 addi r5, r5, -4
    106                 stwu r0, 4(r6)
    107        
    108         3:
    109                 cmpwi 0, r5, 0
    110                 beqlr
    111                 mtctr r5
    112                 addi r4, r4, 3
    113                 addi r6, r6, 3
    114        
    115         4:
    116                 lbzu r0, 1(r4)
    117                 stbu r0, 1(r6)
    118                 bdnz 4b
    119                 blr
    120        
    121         5:
    122                 subfic r0, r0, 4
    123                 mtctr r0
    124        
    125         6:
    126                 lbz r7, 4(r4)
    127                 addi r4, r4, 1
    128                 stb r7, 4(r6)
    129                 addi r6, r6, 1
    130                 bdnz 6b
    131                 subf r5, r0, r5
    132                 rlwinm. r7, r5, 32-3, 3, 31
    133                 beq 2b
    134                 mtctr r7
    135                 b 1b
    13679
    13780jump_to_kernel:
  • boot/arch/sparc64/Makefile.inc

    r1720cf9 r571addd  
    5454        genarch/src/ofw_tree.c \
    5555        generic/src/balloc.c \
     56        generic/src/memstr.c \
    5657        generic/src/printf_core.c \
    5758        generic/src/vprintf.c \
  • boot/arch/sparc64/src/asm.S

    r1720cf9 r571addd  
    4242.global start
    4343.global halt
    44 .global memcpy
    4544.global jump_to_kernel
    4645
     
    9897        ba %xcc, halt
    9998        nop
    100 
    101 memcpy:
    102         ! Save dst
    103        
    104         mov %o0, %o3
    105         add %o1, 7, %g1
    106         and %g1, -8, %g1
    107         cmp %o1, %g1
    108         be,pn %xcc, 3f
    109         add %o0, 7, %g1
    110         mov 0, %g3
    111        
    112         0:
    113                 brz,pn %o2, 2f
    114                 mov 0, %g2
    115        
    116         1:
    117                 ldub [%g3 + %o1], %g1
    118                 add %g2, 1, %g2
    119                 cmp %o2, %g2
    120                 stb %g1, [%g3 + %o0]
    121                 bne,pt %xcc, 1b
    122                 mov %g2, %g3
    123        
    124         2:
    125                 ! Exit point
    126                
    127                 jmp %o7 + 8
    128                 mov %o3, %o0
    129        
    130         3:
    131                 and %g1, -8, %g1
    132                 cmp %o0, %g1
    133                 bne,pt %xcc, 0b
    134                 mov 0, %g3
    135                 srlx %o2, 3, %g4
    136                 brz,pn %g4, 5f
    137                 mov 0, %g5
    138        
    139         4:
    140                 sllx %g3, 3, %g2
    141                 add %g5, 1, %g3
    142                 ldx [%o1 + %g2], %g1
    143                 mov %g3, %g5
    144                 cmp %g4, %g3
    145                 bne,pt %xcc, 4b
    146                 stx %g1, [%o0 + %g2]
    147        
    148         5:
    149                 and %o2, 7, %o2
    150                 brz,pn %o2, 2b
    151                 sllx %g4, 3, %g1
    152                 mov 0, %g2
    153                 add %g1, %o0, %o0
    154                 add %g1, %o1, %g4
    155                 mov 0, %g3
    156        
    157         6:
    158                 ldub [%g2 + %g4], %g1
    159                 stb %g1, [%g2 + %o0]
    160                 add %g3, 1, %g2
    161                 cmp %o2, %g2
    162                 bne,pt %xcc, 6b
    163                 mov %g2, %g3
    164        
    165         ! Exit point
    166        
    167         jmp %o7 + 8
    168         mov %o3, %o0
    16999
    170100jump_to_kernel:
  • kernel/Makefile

    r1720cf9 r571addd  
    120120ifeq ($(CONFIG_LTO),y)
    121121        GCC_CFLAGS += -flto
     122endif
     123
     124ifeq ($(CONFIG_LINE_DEBUG),y)
     125        GCC_CFLAGS += -g
     126        ICC_CFLAGS += -g
     127        SUNCC_CFLAGS += -g
     128        CLANG_CFLAGS += -g
    122129endif
    123130
     
    401408
    402409$(DISASM): $(RAW)
     410ifeq ($(CONFIG_LINE_DEBUG),y)
     411        $(OBJDUMP) -d -S $< > $@
     412else
    403413        $(OBJDUMP) -d $< > $@
     414endif
    404415
    405416$(RAW): $(LINK) $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS) $(SYMTAB_OBJECTS)
  • kernel/arch/abs32le/src/debug/stacktrace.c

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

    r1720cf9 r571addd  
    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       
    5568        /DISCARD/ : {
    5669                *(*);
  • kernel/arch/amd64/src/debug/stacktrace.c

    r1720cf9 r571addd  
    4040#define FRAME_OFFSET_RA       1
    4141
    42 bool kernel_frame_pointer_validate(uintptr_t fp)
     42bool kernel_stack_trace_context_validate(stack_trace_context_t *ctx)
    4343{
    44         return fp != 0;
     44        return ctx->fp != 0;
    4545}
    4646
    47 bool kernel_frame_pointer_prev(uintptr_t fp, uintptr_t *prev)
     47bool kernel_frame_pointer_prev(stack_trace_context_t *ctx, uintptr_t *prev)
    4848{
    49         uint64_t *stack = (void *) fp;
     49        uint64_t *stack = (void *) ctx->fp;
    5050        *prev = stack[FRAME_OFFSET_FP_PREV];
    5151       
     
    5353}
    5454
    55 bool kernel_return_address_get(uintptr_t fp, uintptr_t *ra)
     55bool kernel_return_address_get(stack_trace_context_t *ctx, uintptr_t *ra)
    5656{
    57         uint64_t *stack = (void *) fp;
     57        uint64_t *stack = (void *) ctx->fp;
    5858        *ra = stack[FRAME_OFFSET_RA];
    5959       
     
    6161}
    6262
    63 bool uspace_frame_pointer_validate(uintptr_t fp)
     63bool uspace_stack_trace_context_validate(stack_trace_context_t *ctx)
    6464{
    65         return fp != 0;
     65        return ctx->fp != 0;
    6666}
    6767
    68 bool uspace_frame_pointer_prev(uintptr_t fp, uintptr_t *prev)
     68bool uspace_frame_pointer_prev(stack_trace_context_t *ctx, uintptr_t *prev)
    6969{
    7070        return !copy_from_uspace((void *) prev,
    71             (uint64_t *) fp + FRAME_OFFSET_FP_PREV, sizeof(*prev));
     71            (uint64_t *) ctx->fp + FRAME_OFFSET_FP_PREV, sizeof(*prev));
    7272}
    7373
    74 bool uspace_return_address_get(uintptr_t fp, uintptr_t *ra)
     74bool uspace_return_address_get(stack_trace_context_t *ctx, uintptr_t *ra)
    7575{
    76         return !copy_from_uspace((void *) ra, (uint64_t *) fp + FRAME_OFFSET_RA,
    77             sizeof(*ra));
     76        return !copy_from_uspace((void *) ra,
     77            (uint64_t *) ctx->fp + FRAME_OFFSET_RA, sizeof(*ra));
    7878}
    7979
  • kernel/arch/arm32/src/debug/stacktrace.c

    r1720cf9 r571addd  
    4040#define FRAME_OFFSET_RA         -1
    4141
    42 bool kernel_frame_pointer_validate(uintptr_t fp)
     42bool kernel_stack_trace_context_validate(stack_trace_context_t *ctx)
    4343{
    44         return fp != 0;
     44        return ctx->fp != 0;
    4545}
    4646
    47 bool kernel_frame_pointer_prev(uintptr_t fp, uintptr_t *prev)
     47bool kernel_frame_pointer_prev(stack_trace_context_t *ctx, uintptr_t *prev)
    4848{
    49         uint32_t *stack = (void *) fp;
     49        uint32_t *stack = (void *) ctx->fp;
    5050
    5151        *prev = stack[FRAME_OFFSET_FP_PREV];
     
    5353}
    5454
    55 bool kernel_return_address_get(uintptr_t fp, uintptr_t *ra)
     55bool kernel_return_address_get(stack_trace_context_t *ctx, uintptr_t *ra)
    5656{
    57         uint32_t *stack = (void *) fp;
     57        uint32_t *stack = (void *) ctx->fp;
    5858
    5959        *ra = stack[FRAME_OFFSET_RA];
     
    6161}
    6262
    63 bool uspace_frame_pointer_validate(uintptr_t fp)
     63bool uspace_stack_trace_context_validate(stack_trace_context_t *ctx)
    6464{
    65         return fp != 0;
     65        return ctx->fp != 0;
    6666}
    6767
    68 bool uspace_frame_pointer_prev(uintptr_t fp, uintptr_t *prev)
     68bool uspace_frame_pointer_prev(stack_trace_context_t *ctx, uintptr_t *prev)
    6969{
    7070        return !copy_from_uspace((void *) prev,
    71             (uint32_t *) fp + FRAME_OFFSET_FP_PREV, sizeof(*prev));
     71            (uint32_t *) ctx->fp + FRAME_OFFSET_FP_PREV, sizeof(*prev));
    7272}
    7373
    74 bool uspace_return_address_get(uintptr_t fp, uintptr_t *ra)
     74bool uspace_return_address_get(stack_trace_context_t *ctx, uintptr_t *ra)
    7575{
    76         return !copy_from_uspace((void *) ra, (uint32_t *) fp + FRAME_OFFSET_RA,
    77             sizeof(*ra));
     76        return !copy_from_uspace((void *) ra,
     77            (uint32_t *) ctx->fp + FRAME_OFFSET_RA, sizeof(*ra));
    7878}
    7979
  • kernel/arch/ia32/src/debug/stacktrace.c

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

    r1720cf9 r571addd  
    131131                        if (last_frame < ALIGN_UP(new_base + new_size, FRAME_SIZE))
    132132                                last_frame = ALIGN_UP(new_base + new_size, FRAME_SIZE);
    133                 }
    134                
    135                 if (e820table[i].type == MEMMAP_MEMORY_RESERVED) {
     133                } else if ((e820table[i].type == MEMMAP_MEMORY_ACPI) ||
     134                    (e820table[i].type == MEMMAP_MEMORY_NVS)) {
     135                        /* To be safe, make the firmware zone possibly larger */
     136                        uint64_t new_base = ALIGN_DOWN(base, FRAME_SIZE);
     137                        uint64_t new_size = ALIGN_UP(size + (base - new_base),
     138                            FRAME_SIZE);
     139                       
     140                        zone_create(ADDR2PFN(new_base), SIZE2FRAMES(new_size), 0,
     141                            ZONE_FIRMWARE);
     142                } else {
    136143                        /* To be safe, make the reserved zone possibly larger */
    137144                        uint64_t new_base = ALIGN_DOWN(base, FRAME_SIZE);
     
    141148                        zone_create(ADDR2PFN(new_base), SIZE2FRAMES(new_size), 0,
    142149                            ZONE_RESERVED);
    143                 }
    144                
    145                 if (e820table[i].type == MEMMAP_MEMORY_ACPI) {
    146                         /* To be safe, make the firmware zone possibly larger */
    147                         uint64_t new_base = ALIGN_DOWN(base, FRAME_SIZE);
    148                         uint64_t new_size = ALIGN_UP(size + (base - new_base),
    149                             FRAME_SIZE);
    150                        
    151                         zone_create(ADDR2PFN(new_base), SIZE2FRAMES(new_size), 0,
    152                             ZONE_FIRMWARE);
    153150                }
    154151        }
     
    203200#ifdef CONFIG_SMP
    204201                /* Reserve AP real mode bootstrap memory */
    205                 frame_mark_unavailable(AP_BOOT_OFFSET >> FRAME_WIDTH, 
     202                frame_mark_unavailable(AP_BOOT_OFFSET >> FRAME_WIDTH,
    206203                    (hardcoded_unmapped_ktext_size +
    207204                    hardcoded_unmapped_kdata_size) >> FRAME_WIDTH);
  • kernel/arch/ia64/src/debug/stacktrace.c

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

    r1720cf9 r571addd  
    6868extern bpinfo_t breakpoints[BKPOINTS_MAX];
    6969
     70extern bool is_jump(unative_t);
     71
    7072extern void debugger_init(void);
    7173extern void debugger_bpoint(istate_t *);
  • kernel/arch/mips32/src/debug/stacktrace.c

    r1720cf9 r571addd  
    3636#include <syscall/copy.h>
    3737#include <typedefs.h>
    38 
    39 bool kernel_frame_pointer_validate(uintptr_t fp)
     38#include <arch/debugger.h>
     39#include <print.h>
     40
     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
     95extern char ktext_start;
     96extern char ktext_end;
     97
     98static bool
     99scan(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
     206bool 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
     213bool kernel_frame_pointer_prev(stack_trace_context_t *ctx, uintptr_t *prev)
     214{
     215        return scan(ctx, prev, NULL);
     216}
     217
     218bool kernel_return_address_get(stack_trace_context_t *ctx, uintptr_t *ra)
     219{
     220        return scan(ctx, NULL, ra);
     221}
     222
     223bool uspace_stack_trace_context_validate(stack_trace_context_t *ctx)
    40224{
    41225        return false;
    42226}
    43227
    44 bool kernel_frame_pointer_prev(uintptr_t fp, uintptr_t *prev)
     228bool uspace_frame_pointer_prev(stack_trace_context_t *ctx, uintptr_t *prev)
    45229{
    46230        return false;
    47231}
    48232
    49 bool kernel_return_address_get(uintptr_t fp, uintptr_t *ra)
     233bool uspace_return_address_get(stack_trace_context_t *ctx, uintptr_t *ra)
    50234{
    51235        return false;
    52236}
    53237
    54 bool uspace_frame_pointer_validate(uintptr_t fp)
    55 {
    56         return false;
    57 }
    58 
    59 bool uspace_frame_pointer_prev(uintptr_t fp, uintptr_t *prev)
    60 {
    61         return false;
    62 }
    63 
    64 bool uspace_return_address_get(uintptr_t fp, uintptr_t *ra)
    65 {
    66         return false;
    67 }
    68 
    69238/** @}
    70239 */
  • kernel/arch/mips32/src/debug/stacktrace_asm.S

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

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

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

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

    r1720cf9 r571addd  
    4747 * @param s2  Start address of the second interval.
    4848 * @param sz2 Size of the second interval.
     49 *
    4950 */
    50 NO_TRACE static inline int overlaps(uintptr_t s1, size_t sz1, uintptr_t s2,
    51     size_t sz2)
     51NO_TRACE static inline int overlaps(uint64_t s1, uint64_t sz1, uint64_t s2,
     52    uint64_t sz2)
    5253{
    53         uintptr_t e1 = s1 + sz1;
    54         uintptr_t e2 = s2 + sz2;
     54        uint64_t e1 = s1 + sz1;
     55        uint64_t e2 = s2 + sz2;
    5556       
    5657        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 */
     68NO_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));
    5775}
    5876
     
    7492
    7593/* Compute overlapping of physical addresses */
    76 #define PA_overlaps(x, szx, y, szy) \
     94#define PA_OVERLAPS(x, szx, y, szy) \
    7795        overlaps(KA2PA((x)), (szx), KA2PA((y)), (szy))
    7896
  • kernel/generic/include/stacktrace.h

    r1720cf9 r571addd  
    4242
    4343typedef struct {
    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 *);
     44        uintptr_t fp;
     45        uintptr_t pc;
     46        struct istate *istate;
     47} stack_trace_context_t;
     48
     49typedef 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 *);
    4753        bool (* symbol_resolve)(uintptr_t, const char **, uintptr_t *);
    4854} stack_trace_ops_t;
     
    5359extern void stack_trace(void);
    5460extern void stack_trace_istate(struct istate *);
    55 extern void stack_trace_fp_pc(stack_trace_ops_t *, uintptr_t, uintptr_t);
     61extern void stack_trace_ctx(stack_trace_ops_t *, stack_trace_context_t *);
    5662
    5763/*
     
    6167extern uintptr_t program_counter_get(void);
    6268
    63 extern bool kernel_frame_pointer_validate(uintptr_t);
    64 extern bool kernel_frame_pointer_prev(uintptr_t, uintptr_t *);
    65 extern bool kernel_return_address_get(uintptr_t, uintptr_t *);
     69extern bool kernel_stack_trace_context_validate(stack_trace_context_t *);
     70extern bool kernel_frame_pointer_prev(stack_trace_context_t *, uintptr_t *);
     71extern bool kernel_return_address_get(stack_trace_context_t *, uintptr_t *);
    6672
    67 extern bool uspace_frame_pointer_validate(uintptr_t);
    68 extern bool uspace_frame_pointer_prev(uintptr_t, uintptr_t *);
    69 extern bool uspace_return_address_get(uintptr_t, uintptr_t *);
     73extern bool uspace_stack_trace_context_validate(stack_trace_context_t *);
     74extern bool uspace_frame_pointer_prev(stack_trace_context_t *, uintptr_t *);
     75extern bool uspace_return_address_get(stack_trace_context_t *, uintptr_t *);
    7076
    7177#endif
  • kernel/generic/src/debug/stacktrace.c

    r1720cf9 r571addd  
    2727 */
    2828
    29 /** @addtogroup genericdebug 
     29/** @addtogroup genericdebug
    3030 * @{
    3131 */
     
    4242
    4343void
    44 stack_trace_fp_pc(stack_trace_ops_t *ops, uintptr_t fp, uintptr_t pc)
     44stack_trace_ctx(stack_trace_ops_t *ops, stack_trace_context_t *ctx)
    4545{
    4646        int cnt = 0;
    4747        const char *symbol;
    4848        uintptr_t offset;
     49        uintptr_t fp;
     50        uintptr_t pc;
    4951       
    50         while (cnt++ < STACK_FRAMES_MAX && ops->frame_pointer_validate(fp)) {
     52        while (cnt++ < STACK_FRAMES_MAX &&
     53            ops->stack_trace_context_validate(ctx)) {
    5154                if (ops->symbol_resolve &&
    52                     ops->symbol_resolve(pc, &symbol, &offset)) {
     55                    ops->symbol_resolve(ctx->pc, &symbol, &offset)) {
    5356                        if (offset)
    54                                 printf("%p: %s+%" PRIp "()\n", fp, symbol, offset);
     57                                printf("%p: %s+%" PRIp "()\n",
     58                                    ctx->fp, symbol, offset);
    5559                        else
    56                                 printf("%p: %s()\n", fp, symbol);
     60                                printf("%p: %s()\n",
     61                                    ctx->fp, symbol);
    5762                } else {
    58                         printf("%p: %p()\n", fp, pc);
     63                        printf("%p: %p()\n", ctx->fp, ctx->pc);
    5964                }
    60                 if (!ops->return_address_get(fp, &pc))
     65                if (!ops->return_address_get(ctx, &pc))
    6166                        break;
    62                 if (!ops->frame_pointer_prev(fp, &fp))
     67                if (!ops->frame_pointer_prev(ctx, &fp))
    6368                        break;
     69                ctx->fp = fp;
     70                ctx->pc = pc;
    6471        }
    6572}
     
    6774void stack_trace(void)
    6875{
    69         stack_trace_fp_pc(&kst_ops, frame_pointer_get(), program_counter_get());
     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);
    7083
    7184        /*
     
    7891void stack_trace_istate(istate_t *istate)
    7992{
     93        stack_trace_context_t ctx = {
     94                .fp = istate_get_fp(istate),
     95                .pc = istate_get_pc(istate),
     96                .istate = istate
     97        };
     98       
    8099        if (istate_from_uspace(istate))
    81                 stack_trace_fp_pc(&ust_ops, istate_get_fp(istate),
    82                     istate_get_pc(istate));
     100                stack_trace_ctx(&ust_ops, &ctx);
    83101        else
    84                 stack_trace_fp_pc(&kst_ops, istate_get_fp(istate),
    85                     istate_get_pc(istate));
     102                stack_trace_ctx(&kst_ops, &ctx);
    86103}
    87104
    88 static bool kernel_symbol_resolve(uintptr_t addr, const char **sp, uintptr_t *op)
     105static bool
     106kernel_symbol_resolve(uintptr_t addr, const char **sp, uintptr_t *op)
    89107{
    90108        return (symtab_name_lookup(addr, sp, op) == 0);
     
    92110
    93111stack_trace_ops_t kst_ops = {
    94         .frame_pointer_validate = kernel_frame_pointer_validate,
     112        .stack_trace_context_validate = kernel_stack_trace_context_validate,
    95113        .frame_pointer_prev = kernel_frame_pointer_prev,
    96114        .return_address_get = kernel_return_address_get,
     
    99117
    100118stack_trace_ops_t ust_ops = {
    101         .frame_pointer_validate = uspace_frame_pointer_validate,
     119        .stack_trace_context_validate = uspace_stack_trace_context_validate,
    102120        .frame_pointer_prev = uspace_frame_pointer_prev,
    103121        .return_address_get = uspace_return_address_get,
  • kernel/generic/src/main/main.c

    r1720cf9 r571addd  
    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

    r1720cf9 r571addd  
    121121 *
    122122 */
    123 NO_TRACE static size_t zones_insert_zone(pfn_t base, size_t count)
     123NO_TRACE static size_t zones_insert_zone(pfn_t base, size_t count,
     124    zone_flags_t flags)
    124125{
    125126        if (zones.count + 1 == ZONES_MAX) {
     
    131132        for (i = 0; i < zones.count; i++) {
    132133                /* Check for overlap */
    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));
     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                       
    139153                        return (size_t) -1;
    140154                }
     
    147161        for (j = zones.count; j > i; j--) {
    148162                zones.info[j] = zones.info[j - 1];
    149                 zones.info[j].buddy_system->data =
    150                     (void *) &zones.info[j - 1];
     163                if (zones.info[j].buddy_system != NULL)
     164                        zones.info[j].buddy_system->data =
     165                            (void *) &zones.info[j];
    151166        }
    152167       
     
    748763        for (i = z2 + 1; i < zones.count; i++) {
    749764                zones.info[i - 1] = zones.info[i];
    750                 zones.info[i - 1].buddy_system->data =
    751                     (void *) &zones.info[i - 1];
     765                if (zones.info[i - 1].buddy_system != NULL)
     766                        zones.info[i - 1].buddy_system->data =
     767                            (void *) &zones.info[i - 1];
    752768        }
    753769       
     
    898914                }
    899915               
    900                 size_t znum = zones_insert_zone(start, count);
     916                size_t znum = zones_insert_zone(start, count, flags);
    901917                if (znum == (size_t) -1) {
    902918                        irq_spinlock_unlock(&zones.lock, true);
     
    921937       
    922938        /* Non-available zone */
    923         size_t znum = zones_insert_zone(start, count);
     939        size_t znum = zones_insert_zone(start, count, flags);
    924940        if (znum == (size_t) -1) {
    925941                irq_spinlock_unlock(&zones.lock, true);
  • uspace/Makefile.common

    r1720cf9 r571addd  
    172172ifneq ($(BINARY),)
    173173%.disasm: $(BINARY)
     174ifeq ($(CONFIG_LINE_DEBUG),y)
     175        $(OBJDUMP) -d -S $< > $@
     176else
    174177        $(OBJDUMP) -d $< > $@
     178endif
    175179
    176180$(BINARY): $(LINKER_SCRIPT) $(OBJECTS) $(LIBS) $(BASE_LIBS)
  • uspace/app/klog/klog.c

    r1720cf9 r571addd  
    4343#include <event.h>
    4444#include <errno.h>
     45#include <str_error.h>
    4546#include <io/klog.h>
    4647
    47 #define NAME  "klog"
     48#define NAME       "klog"
     49#define LOG_FNAME  "/log/klog"
    4850
    4951/* Pointer to klog area */
    5052static wchar_t *klog;
    5153static size_t klog_length;
     54
     55static FILE *log;
    5256
    5357static void interrupt_received(ipc_callid_t callid, ipc_call_t *call)
     
    5862        size_t i;
    5963       
    60         for (i = klog_len - klog_stored; i < klog_len; i++)
    61                 putchar(klog[(klog_start + i) % klog_length]);
     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                        fprintf(log, "%lc", ch);
     71        }
     72       
     73        if (log != NULL) {
     74                fflush(log);
     75                fsync(fileno(log));
     76        }
    6277}
    6378
     
    91106        }
    92107       
     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       
    93118        async_set_interrupt_received(interrupt_received);
    94119        klog_update();
  • uspace/lib/c/generic/io/io.c

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

    r1720cf9 r571addd  
    171171extern off64_t ftell(FILE *);
    172172extern int feof(FILE *);
     173extern int fileno(FILE *);
    173174
    174175extern int fflush(FILE *);
Note: See TracChangeset for help on using the changeset viewer.