Changes in / [03a4476:070e05a] in mainline


Ignore:
Files:
25 added
63 edited

Legend:

Unmodified
Added
Removed
  • boot/Makefile.common

    r03a4476 r070e05a  
    6060        $(USPACEDIR)/app/getterm/getterm \
    6161        $(USPACEDIR)/app/klog/klog \
     62        $(USPACEDIR)/app/mkfat/mkfat \
    6263        $(USPACEDIR)/app/redir/redir \
    6364        $(USPACEDIR)/app/tester/tester \
  • kernel/Makefile.build

    r03a4476 r070e05a  
    186186        generic/src/ddi/device.c \
    187187        generic/src/debug/symtab.c \
     188        generic/src/debug/stacktrace.c \
    188189        generic/src/interrupt/interrupt.c \
    189190        generic/src/main/main.c \
  • kernel/arch/amd64/Makefile.inc

    r03a4476 r070e05a  
    3838
    3939FPU_NO_CFLAGS = -mno-sse -mno-sse2
    40 CMN1 = -m64 -mcmodel=kernel -mno-red-zone -fno-unwind-tables
     40CMN1 = -m64 -mcmodel=kernel -mno-red-zone -fno-unwind-tables -fno-omit-frame-pointer
    4141GCC_CFLAGS += $(CMN1)
    4242ICC_CFLAGS += $(CMN1)
     
    6060        arch/$(KARCH)/src/boot/boot.S \
    6161        arch/$(KARCH)/src/boot/memmap.c \
     62        arch/$(KARCH)/src/debug/stacktrace.c \
     63        arch/$(KARCH)/src/debug/stacktrace_asm.S \
    6264        arch/$(KARCH)/src/pm.c \
    6365        arch/$(KARCH)/src/context.S \
  • kernel/arch/amd64/_link.ld.in

    r03a4476 r070e05a  
    4444                *(COMMON);              /* global variables */
    4545
     46                . = ALIGN(8);
    4647                symbol_table = .;
    4748                *(symtab.*);            /* Symbol table, must be LAST symbol!*/
  • kernel/arch/amd64/include/context.h

    r03a4476 r070e05a  
    4646#define SP_DELTA     16
    4747
     48#define context_set(c, _pc, stack, size) \
     49        do { \
     50                (c)->pc = (uintptr_t) (_pc); \
     51                (c)->sp = ((uintptr_t) (stack)) + (size) - SP_DELTA; \
     52                (c)->rbp = 0; \
     53        } while (0)
     54
    4855#endif /* KERNEL */
    4956
  • kernel/arch/amd64/include/interrupt.h

    r03a4476 r070e05a  
    7070
    7171/** This is passed to interrupt handlers */
    72 typedef struct {
     72typedef struct istate {
    7373        uint64_t rax;
    7474        uint64_t rcx;
     
    8080        uint64_t r10;
    8181        uint64_t r11;
     82        uint64_t rbp;
    8283        uint64_t error_word;
    8384        uint64_t rip;
     
    101102        return istate->rip;
    102103}
     104static inline unative_t istate_get_fp(istate_t *istate)
     105{
     106        return istate->rbp;
     107}
    103108
    104109extern void (* disable_irqs_function)(uint16_t irqmask);
  • kernel/arch/amd64/src/asm_utils.S

    r03a4476 r070e05a  
    2727#
    2828
    29 #define IREGISTER_SPACE 72
     29#define IREGISTER_SPACE 80
    3030
    3131#define IOFFSET_RAX     0x0
     
    3838#define IOFFSET_R10     0x38
    3939#define IOFFSET_R11     0x40
     40#define IOFFSET_RBP     0x48
    4041
    4142#  Mask for interrupts 0 - 31 (bits 0 - 31) where 0 means that int has no error word
     
    179180        movq %r10, IOFFSET_R10(%rsp)
    180181        movq %r11, IOFFSET_R11(%rsp)
     182        movq %rbp, IOFFSET_RBP(%rsp)
    181183.endm
    182184
     
    191193        movq IOFFSET_R10(%rsp), %r10
    192194        movq IOFFSET_R11(%rsp), %r11
     195        movq IOFFSET_RBP(%rsp), %rbp
    193196.endm
    194197
     
    235238        cld
    236239
     240        # Stop stack traces here
     241        xorq %rbp, %rbp
     242
    237243        movq $(\i), %rdi        # %rdi - first parameter
    238244        movq %rsp, %rsi         # %rsi - pointer to istate
  • kernel/arch/amd64/src/boot/boot.S

    r03a4476 r070e05a  
    174174        call arch_pre_main
    175175       
     176        # create the first stack frame
     177        pushq $0
     178        movq %rsp, %rbp
     179
    176180        call main_bsp
    177181       
     
    329333
    330334extended_cpuid_msg:
    331         .asciz "Extended CPUID not supported. System halted."
     335        .asciz "Error: Extended CPUID not supported -- CPU is not 64-bit. System halted."
    332336long_mode_msg:
    333         .asciz "64 bit long mode not supported. System halted."
     337        .asciz "Error: 64-bit long mode not supported. System halted."
    334338noexecute_msg:
    335         .asciz "No-execute pages not supported. System halted."
     339        .asciz "Error: No-execute pages not supported. System halted."
    336340fx_msg:
    337         .asciz "FXSAVE/FXRESTORE instructions not supported. System halted."
     341        .asciz "Error: FXSAVE/FXRESTORE instructions not supported. System halted."
    338342sse2_msg:
    339         .asciz "SSE2 instructions not supported. System halted."
     343        .asciz "Error: SSE2 instructions not supported. System halted."
  • kernel/arch/amd64/src/interrupt.c

    r03a4476 r070e05a  
    5353#include <ddi/irq.h>
    5454#include <symtab.h>
     55#include <stacktrace.h>
    5556
    5657/*
     
    8081            istate->r10, istate->r11);
    8182        printf("%%rsp=%#llx\n", &istate->stack[0]);
     83       
     84        stack_trace_istate(istate);
    8285}
    8386
  • kernel/arch/amd64/src/mm/page.c

    r03a4476 r070e05a  
    203203{
    204204        if (last_frame + ALIGN_UP(size, PAGE_SIZE) > KA2PA(KERNEL_ADDRESS_SPACE_END_ARCH))
    205                 panic("Unable to map physical memory %p (%d bytes).", physaddr, size)
     205                panic("Unable to map physical memory %p (%d bytes).", physaddr,
     206                    size);
    206207       
    207208        uintptr_t virtaddr = PA2KA(last_frame);
  • kernel/arch/amd64/src/smp/ap.S

    r03a4476 r070e05a  
    9999start64:
    100100        movq (ctx), %rsp
     101        pushq $0
     102        movq %rsp, %rbp
    101103        call main_ap - AP_BOOT_OFFSET + BOOT_OFFSET   # never returns
    102104
  • kernel/arch/arm32/Makefile.inc

    r03a4476 r070e05a  
    5757        arch/$(KARCH)/src/exception.c \
    5858        arch/$(KARCH)/src/userspace.c \
     59        arch/$(KARCH)/src/debug/stacktrace.c \
     60        arch/$(KARCH)/src/debug/stacktrace_asm.S \
    5961        arch/$(KARCH)/src/mm/as.c \
    6062        arch/$(KARCH)/src/mm/frame.c \
  • kernel/arch/arm32/_link.ld.in

    r03a4476 r070e05a  
    3434                *(.sdata);
    3535                *(.reginfo);
     36                . = ALIGN(8);
    3637                symbol_table = .;
    3738                *(symtab.*);
  • kernel/arch/arm32/include/exception.h

    r03a4476 r070e05a  
    8686
    8787/** Struct representing CPU state saved when an exception occurs. */
    88 typedef struct {
     88typedef struct istate {
    8989        uint32_t spsr;
    9090        uint32_t sp;
     
    133133}
    134134
     135static inline unative_t istate_get_fp(istate_t *istate)
     136{
     137        return istate->r11;
     138}
     139
    135140
    136141extern void install_exception_handlers(void);
  • kernel/arch/arm32/src/mm/page.c

    r03a4476 r070e05a  
    8888            KA2PA(KERNEL_ADDRESS_SPACE_END_ARCH)) {
    8989                panic("Unable to map physical memory %p (%d bytes).",
    90                     physaddr, size)
     90                    physaddr, size);
    9191        }
    9292       
  • kernel/arch/ia32/Makefile.inc

    r03a4476 r070e05a  
    7878        arch/$(KARCH)/src/context.S \
    7979        arch/$(KARCH)/src/debug/panic.s \
     80        arch/$(KARCH)/src/debug/stacktrace.c \
     81        arch/$(KARCH)/src/debug/stacktrace_asm.S \
    8082        arch/$(KARCH)/src/delay.s \
    8183        arch/$(KARCH)/src/asm.S \
  • kernel/arch/ia32/_link.ld.in

    r03a4476 r070e05a  
    4242                hardcoded_unmapped_kdata_size = .;
    4343                LONG(unmapped_kdata_end - unmapped_kdata_start);
     44                . = ALIGN(8);
    4445                symbol_table = .;
    4546                *(symtab.*);            /* Symbol table, must be LAST symbol! */
  • kernel/arch/ia32/include/context.h

    r03a4476 r070e05a  
    4949#define SP_DELTA        (8 + STACK_ITEM_SIZE)
    5050
     51#define context_set(c, _pc, stack, size) \
     52        do { \
     53                (c)->pc = (uintptr_t) (_pc); \
     54                (c)->sp = ((uintptr_t) (stack)) + (size) - SP_DELTA; \
     55                (c)->ebp = 0; \
     56        } while (0)
     57
    5158#endif /* KERNEL */
    5259
  • kernel/arch/ia32/include/interrupt.h

    r03a4476 r070e05a  
    6969#define VECTOR_DEBUG_IPI                (IVT_FREEBASE + 2)
    7070
    71 typedef struct {
     71typedef struct istate {
    7272        uint32_t eax;
    7373        uint32_t ecx;
    7474        uint32_t edx;
     75        uint32_t ebp;
    7576
    7677        uint32_t gs;
     
    102103}
    103104
     105static inline unative_t istate_get_fp(istate_t *istate)
     106{
     107        return istate->ebp;
     108}
     109
    104110extern void (* disable_irqs_function)(uint16_t irqmask);
    105111extern void (* enable_irqs_function)(uint16_t irqmask);
  • kernel/arch/ia32/src/asm.S

    r03a4476 r070e05a  
    269269        pushl %gs
    270270
     271        pushl %ebp
    271272        pushl %edx
    272273        pushl %ecx
     
    278279        movw %ax, %es
    279280
    280         cld
     281        # stop stack traces here
     282        xorl %ebp, %ebp
    281283
    282284        pushl %esp          # *istate
     
    290292        popl %ecx
    291293        popl %edx
     294        popl %ebp
    292295       
    293296        popl %gs
  • kernel/arch/ia32/src/boot/boot.S

    r03a4476 r070e05a  
    9494        pushl grub_eax
    9595        call arch_pre_main
     96
     97        # Create the first stack frame
     98        pushl $0
     99        movl %esp, %ebp
    96100       
    97101        call main_bsp
  • kernel/arch/ia32/src/interrupt.c

    r03a4476 r070e05a  
    5353#include <ddi/irq.h>
    5454#include <symtab.h>
     55#include <stacktrace.h>
    5556
    5657/*
     
    7980        printf("stack: %#lx, %#lx, %#lx, %#lx\n", istate->stack[0], istate->stack[1], istate->stack[2], istate->stack[3]);
    8081        printf("       %#lx, %#lx, %#lx, %#lx\n", istate->stack[4], istate->stack[5], istate->stack[6], istate->stack[7]);
     82
     83        stack_trace_istate(istate);
    8184}
    8285
  • kernel/arch/ia32/src/mm/page.c

    r03a4476 r070e05a  
    8080{
    8181        if (last_frame + ALIGN_UP(size, PAGE_SIZE) > KA2PA(KERNEL_ADDRESS_SPACE_END_ARCH))
    82                 panic("Unable to map physical memory %p (%d bytes).", physaddr, size)
     82                panic("Unable to map physical memory %p (%d bytes).", physaddr, size);
    8383       
    8484        uintptr_t virtaddr = PA2KA(last_frame);
  • kernel/arch/ia32/src/smp/ap.S

    r03a4476 r070e05a  
    7878        addl $0x80000000, %esp                  # PA2KA(ctx.sp)
    7979       
     80        pushl $0                                # create the first stack frame
     81        movl %esp, %ebp
     82
    8083        jmpl $KTEXT, $main_ap
    8184
  • kernel/arch/ia64/Makefile.inc

    r03a4476 r070e05a  
    5353        arch/$(KARCH)/src/context.S \
    5454        arch/$(KARCH)/src/cpu/cpu.c \
     55        arch/$(KARCH)/src/debug/stacktrace.c \
     56        arch/$(KARCH)/src/debug/stacktrace_asm.S \
    5557        arch/$(KARCH)/src/ivt.S \
    5658        arch/$(KARCH)/src/interrupt.c \
  • kernel/arch/ia64/_link.ld.in

    r03a4476 r070e05a  
    3737                *(COMMON);
    3838
     39                . = ALIGN(8);
    3940                symbol_table = .;
    4041                *(symtab.*);            /* Symbol table, must be LAST symbol!*/
  • kernel/arch/ia64/include/interrupt.h

    r03a4476 r070e05a  
    7272#define EOI  0  /**< The actual value doesn't matter. */
    7373
    74 typedef struct {
     74typedef struct istate {
    7575        uint128_t f2;
    7676        uint128_t f3;
     
    143143}
    144144
     145static inline unative_t istate_get_fp(istate_t *istate)
     146{
     147        return 0;       /* FIXME */
     148}
     149
    145150static inline int istate_from_uspace(istate_t *istate)
    146151{
  • kernel/arch/ia64/include/mm/asid.h

    r03a4476 r070e05a  
    5050 * but those extra bits are not used by the kernel.
    5151 */
    52 #define RIDS_PER_ASID           7
     52#define RIDS_PER_ASID           8
    5353
    5454#define RID_MAX                 262143          /* 2^18 - 1 */
    55 #define RID_KERNEL              0
    56 #define RID_INVALID             1
     55#define RID_KERNEL7             7
    5756
    58 #define ASID2RID(asid, vrn)     (((asid)>RIDS_PER_ASID)?(((asid)*RIDS_PER_ASID)+(vrn)):(asid))
    59 #define RID2ASID(rid)           ((rid)/RIDS_PER_ASID)
     57#define ASID2RID(asid, vrn) \
     58        ((asid) * RIDS_PER_ASID + (vrn))
    6059
    61 #define ASID_MAX_ARCH           (RID_MAX/RIDS_PER_ASID)
     60#define RID2ASID(rid) \
     61        ((rid) / RIDS_PER_ASID)
     62
     63#define ASID_MAX_ARCH           (RID_MAX / RIDS_PER_ASID)
    6264
    6365#endif
  • kernel/arch/ia64/src/mm/page.c

    r03a4476 r070e05a  
    7171
    7272        /*
    73          * First set up kernel region register.
    74          * This is redundant (see start.S) but we keep it here just for sure.
    75          */
    76         rr.word = rr_read(VRN_KERNEL);
    77         rr.map.ve = 0;                  /* disable VHPT walker */
    78         rr.map.ps = PAGE_WIDTH;
    79         rr.map.rid = ASID2RID(ASID_KERNEL, VRN_KERNEL);
    80         rr_write(VRN_KERNEL, rr.word);
    81         srlz_i();
    82         srlz_d();
    83 
    84         /*
    85          * And setup the rest of region register.
     73         * Set up kernel region registers.
     74         * VRN_KERNEL has already been set in start.S.
     75         * For paranoia reasons, we set it again.
    8676         */
    8777        for(i = 0; i < REGION_REGISTERS; i++) {
    88                 /* skip kernel rr */
    89                 if (i == VRN_KERNEL)
    90                         continue;
    91        
    9278                rr.word = rr_read(i);
    9379                rr.map.ve = 0;          /* disable VHPT walker */
    94                 rr.map.rid = RID_KERNEL;
     80                rr.map.rid = ASID2RID(ASID_KERNEL, i);
    9581                rr.map.ps = PAGE_WIDTH;
    9682                rr_write(i, rr.word);
  • kernel/arch/ia64/src/start.S

    r03a4476 r070e05a  
    7474        movl r10 = (RR_MASK)
    7575        and r9 = r10, r9
    76         movl r10 = ((RID_KERNEL << RID_SHIFT) | (KERNEL_PAGE_WIDTH << PS_SHIFT))
     76        movl r10 = (((RID_KERNEL7) << RID_SHIFT) | (KERNEL_PAGE_WIDTH << PS_SHIFT))
    7777        or r9 = r10, r9
    7878       
  • kernel/arch/mips32/Makefile.inc

    r03a4476 r070e05a  
    7070        arch/$(KARCH)/src/debugger.c \
    7171        arch/$(KARCH)/src/cpu/cpu.c \
     72        arch/$(KARCH)/src/debug/stacktrace.c \
     73        arch/$(KARCH)/src/debug/stacktrace_asm.S \
    7274        arch/$(KARCH)/src/mm/frame.c \
    7375        arch/$(KARCH)/src/mm/page.c \
  • kernel/arch/mips32/_link.ld.in

    r03a4476 r070e05a  
    3838                *(.bss);                        /* uninitialized static variables */
    3939                *(COMMON);                      /* global variables */
     40                . = ALIGN(8);
    4041                symbol_table = .;
    4142                *(symtab.*);
  • kernel/arch/mips32/include/exception.h

    r03a4476 r070e05a  
    5858#define EXC_VCED        31
    5959
    60 typedef struct {
     60typedef struct istate {
    6161        uint32_t at;
    6262        uint32_t v0;
     
    102102        return istate->epc;
    103103}
     104static inline unative_t istate_get_fp(istate_t *istate)
     105{
     106        return 0;       /* FIXME */
     107}
    104108
    105109extern void exception(istate_t *istate);
  • kernel/arch/ppc32/Makefile.inc

    r03a4476 r070e05a  
    4646        arch/$(KARCH)/src/context.S \
    4747        arch/$(KARCH)/src/debug/panic.s \
     48        arch/$(KARCH)/src/debug/stacktrace.c \
     49        arch/$(KARCH)/src/debug/stacktrace_asm.S \
    4850        arch/$(KARCH)/src/fpu_context.S \
    4951        arch/$(KARCH)/src/boot/boot.S \
  • kernel/arch/ppc32/_link.ld.in

    r03a4476 r070e05a  
    5151                *(COMMON);      /* global variables */
    5252               
     53                . = ALIGN(8);
    5354                symbol_table = .;
    5455                *(symtab.*);    /* Symbol table, must be LAST symbol!*/
  • kernel/arch/ppc32/include/exception.h

    r03a4476 r070e05a  
    3939#include <arch/regutils.h>
    4040
    41 typedef struct {
     41typedef struct istate {
    4242        uint32_t r0;
    4343        uint32_t r2;
     
    9898}
    9999
     100static inline unative_t istate_get_fp(istate_t *istate)
     101{
     102        return istate->sp;
     103}
     104
    100105#endif
    101106
  • kernel/arch/ppc32/src/mm/page.c

    r03a4476 r070e05a  
    5151            KA2PA(KERNEL_ADDRESS_SPACE_END_ARCH))
    5252                panic("Unable to map physical memory %p (%" PRIs " bytes).",
    53                     physaddr, size)
     53                    physaddr, size);
    5454       
    5555        uintptr_t virtaddr = PA2KA(last_frame);
  • kernel/arch/sparc64/Makefile.inc

    r03a4476 r070e05a  
    5454ARCH_SOURCES = \
    5555        arch/$(KARCH)/src/cpu/cpu.c \
     56        arch/$(KARCH)/src/debug/stacktrace.c \
     57        arch/$(KARCH)/src/debug/stacktrace_asm.S \
    5658        arch/$(KARCH)/src/asm.S \
    5759        arch/$(KARCH)/src/panic.S \
  • kernel/arch/sparc64/_link.ld.in

    r03a4476 r070e05a  
    3636                *(COMMON);                  /* global variables */
    3737               
     38                . = ALIGN(8);
    3839                symbol_table = .;
    3940                *(symtab.*);                /* Symbol table, must be LAST symbol!*/
  • kernel/arch/sparc64/include/interrupt.h

    r03a4476 r070e05a  
    5050};             
    5151
    52 typedef struct {
     52typedef struct istate {
    5353        uint64_t        tnpc;
    5454        uint64_t        tpc;
     
    7171}
    7272
     73static inline unative_t istate_get_fp(istate_t *istate)
     74{
     75        return 0;       /* TODO */
     76}
     77
    7378#endif
    7479
  • kernel/generic/include/debug.h

    r03a4476 r070e05a  
    7575#       define LOG(format, ...) \
    7676                printf("%s() at %s:%u: " format "\n", __func__, __FILE__, \
    77                         __LINE__, ##__VA_ARGS__);
     77                    __LINE__, ##__VA_ARGS__);
    7878#else
    7979#       define LOG(format, ...)
     
    9292                { \
    9393                        printf("%s() at %s:%u: " #fnc "\n", __func__, __FILE__, \
    94                         __LINE__); \
     94                            __LINE__); \
    9595                        fnc; \
    9696                }
  • kernel/generic/include/interrupt.h

    r03a4476 r070e05a  
    4242#include <arch.h>
    4343#include <ddi/irq.h>
     44#include <stacktrace.h>
    4445
    4546typedef void (* iroutine)(int n, istate_t *istate);
     
    4950        if (istate_from_uspace(istate)) { \
    5051                task_t *task = TASK; \
    51                 printf("Task %s (%" PRIu64 ") killed due to an exception at %p: ", task->name, task->taskid, istate_get_pc(istate)); \
    52                 printf(fmt "\n", ##__VA_ARGS__); \
     52                printf("Task %s (%" PRIu64 ") killed due to an exception at " \
     53                    "program counter %p.\n", task->name, task->taskid, istate_get_pc(istate)); \
     54                stack_trace_istate(istate); \
     55                printf("Kill message: " fmt "\n", ##__VA_ARGS__); \
    5356                task_kill(task->taskid); \
    5457                thread_exit(); \
  • kernel/generic/include/panic.h

    r03a4476 r070e05a  
    3636#define KERN_PANIC_H_
    3737
     38#include <stacktrace.h>
     39#include <print.h>
     40
    3841#ifdef CONFIG_DEBUG
    3942#       define panic(format, ...) \
    40                 panic_printf("Kernel panic in %s() at %s:%u: " format "\n", \
    41                 __func__, __FILE__, __LINE__, ##__VA_ARGS__);
     43                do { \
     44                        printf("Kernel panic in %s() at %s:%u.\n", \
     45                            __func__, __FILE__, __LINE__); \
     46                        stack_trace(); \
     47                        panic_printf("Panic message: " format "\n", \
     48                            ##__VA_ARGS__);\
     49                } while (0)
    4250#else
    4351#       define panic(format, ...) \
  • kernel/generic/include/symtab.h

    r03a4476 r070e05a  
    4545};
    4646
    47 extern int symtab_name_lookup(unative_t addr, char **name);
    48 extern char *symtab_fmt_name_lookup(unative_t addr);
    49 extern int symtab_addr_lookup(const char *name, uintptr_t *addr);
    50 extern void symtab_print_search(const char *name);
    51 extern int symtab_compl(char *input, size_t size);
     47extern int symtab_name_lookup(uintptr_t, char **, uintptr_t *);
     48extern char *symtab_fmt_name_lookup(uintptr_t);
     49extern int symtab_addr_lookup(const char *, uintptr_t *);
     50extern void symtab_print_search(const char *);
     51extern int symtab_compl(char *, size_t);
    5252
    5353#ifdef CONFIG_SYMTAB
  • kernel/generic/src/debug/symtab.c

    r03a4476 r070e05a  
    4646/** Get name of a symbol that seems most likely to correspond to address.
    4747 *
    48  * @param addr Address.
    49  * @param name Place to store pointer to the symbol name.
     48 * @param addr          Address.
     49 * @param name          Place to store pointer to the symbol name.
     50 * @param offset        Place to store offset from the symbol address.
    5051 *
    5152 * @return Zero on success or negative error code, ENOENT if not found,
     
    5354 *
    5455 */
    55 int symtab_name_lookup(unative_t addr, char **name)
     56int symtab_name_lookup(uintptr_t addr, char **name, uintptr_t *offset)
    5657{
    5758#ifdef CONFIG_SYMTAB
     
    6566        if (addr >= uint64_t_le2host(symbol_table[i - 1].address_le)) {
    6667                *name = symbol_table[i - 1].symbol_name;
     68                if (offset)
     69                        *offset = addr -
     70                            uint64_t_le2host(symbol_table[i - 1].address_le);
    6771                return EOK;
    6872        }
     
    8892 *
    8993 */
    90 char *symtab_fmt_name_lookup(unative_t addr)
     94char *symtab_fmt_name_lookup(uintptr_t addr)
    9195{
    9296        char *name;
    93         int rc = symtab_name_lookup(addr, &name);
     97        int rc = symtab_name_lookup(addr, &name, NULL);
    9498       
    9599        switch (rc) {
  • uspace/Makefile

    r03a4476 r070e05a  
    3838        app/init \
    3939        app/klog \
     40        app/mkfat \
    4041        app/redir \
    4142        app/tester \
  • uspace/app/bdsh/Makefile.build

    r03a4476 r070e05a  
    4242        cmds/modules/help/help.c \
    4343        cmds/modules/mkdir/mkdir.c \
     44        cmds/modules/mkfile/mkfile.c \
    4445        cmds/modules/rm/rm.c \
    4546        cmds/modules/bdd/bdd.c \
  • uspace/app/bdsh/cmds/modules/modules.h

    r03a4476 r070e05a  
    2020#include "help/entry.h"
    2121#include "mkdir/entry.h"
     22#include "mkfile/entry.h"
    2223#include "rm/entry.h"
    2324#include "bdd/entry.h"
     
    3940#include "help/help_def.h"
    4041#include "mkdir/mkdir_def.h"
     42#include "mkfile/mkfile_def.h"
    4143#include "rm/rm_def.h"
    4244#include "bdd/bdd_def.h"
  • uspace/app/edit/edit.c

    r03a4476 r070e05a  
    9898static bool done;
    9999static pane_t pane;
     100static bool cursor_visible;
    100101
    101102static int scr_rows, scr_columns;
     
    108109/** Maximum filename length that can be entered. */
    109110#define INFNAME_MAX_LEN 128
     111
     112static void cursor_show(void);
     113static void cursor_hide(void);
     114static void cursor_setvis(bool visible);
    110115
    111116static void key_handle_unmod(console_event_t const *ev);
     
    199204
    200205        /* Initial display */
     206        cursor_visible = true;
     207
     208        cursor_hide();
    201209        console_clear(con);
    202210        pane_text_display();
     
    205213                status_display("File not found. Starting empty file.");
    206214        pane_caret_display();
    207 
     215        cursor_show();
    208216
    209217        done = false;
     
    230238                /* Redraw as necessary. */
    231239
     240                cursor_hide();
     241
    232242                if (pane.rflags & REDRAW_TEXT)
    233243                        pane_text_display();
     
    238248                if (pane.rflags & REDRAW_CARET)
    239249                        pane_caret_display();
     250
     251                cursor_show();
    240252        }
    241253
     
    243255
    244256        return 0;
     257}
     258
     259static void cursor_show(void)
     260{
     261        cursor_setvis(true);
     262}
     263
     264static void cursor_hide(void)
     265{
     266        cursor_setvis(false);
     267}
     268
     269static void cursor_setvis(bool visible)
     270{
     271        if (cursor_visible != visible) {
     272                console_cursor_visibility(con, visible);
     273                cursor_visible = visible;
     274        }
    245275}
    246276
  • uspace/lib/libblock/libblock.c

    r03a4476 r070e05a  
    8787static int write_blocks(devcon_t *devcon, bn_t ba, size_t cnt);
    8888static int get_block_size(int dev_phone, size_t *bsize);
     89static int get_num_blocks(int dev_phone, bn_t *nblocks);
    8990
    9091static devcon_t *devcon_search(dev_handle_t dev_handle)
     
    714715
    715716        memcpy(devcon->comm_area, data, devcon->pblock_size * cnt);
    716         rc = read_blocks(devcon, ba, cnt);
     717        rc = write_blocks(devcon, ba, cnt);
    717718
    718719        fibril_mutex_unlock(&devcon->comm_area_lock);
     
    736737       
    737738        return get_block_size(devcon->dev_phone, bsize);
     739}
     740
     741/** Get number of blocks on device.
     742 *
     743 * @param dev_handle    Device handle of the block device.
     744 * @param nblocks       Output number of blocks.
     745 *
     746 * @return              EOK on success or negative error code on failure.
     747 */
     748int block_get_nblocks(dev_handle_t dev_handle, bn_t *nblocks)
     749{
     750        devcon_t *devcon;
     751
     752        devcon = devcon_search(dev_handle);
     753        assert(devcon);
     754       
     755        return get_num_blocks(devcon->dev_phone, nblocks);
    738756}
    739757
     
    789807}
    790808
     809/** Get total number of blocks on block device. */
     810static int get_num_blocks(int dev_phone, bn_t *nblocks)
     811{
     812        ipcarg_t nb_l, nb_h;
     813        int rc;
     814
     815        rc = async_req_0_2(dev_phone, BD_GET_NUM_BLOCKS, &nb_l, &nb_h);
     816        if (rc == EOK) {
     817                *nblocks = (bn_t) MERGE_LOUP32(nb_l, nb_h);
     818        }
     819
     820        return rc;
     821}
     822
    791823/** @}
    792824 */
  • uspace/lib/libblock/libblock.h

    r03a4476 r070e05a  
    6060#define BLOCK_FLAGS_NOREAD      1
    6161
    62 typedef uint64_t bn_t;  /**< Block number type. */
    63 
    6462typedef struct block {
    6563        /** Mutex protecting the reference count. */
     
    110108
    111109extern int block_get_bsize(dev_handle_t, size_t *);
     110extern int block_get_nblocks(dev_handle_t, bn_t *);
    112111extern int block_read_direct(dev_handle_t, bn_t, size_t, void *);
    113112extern int block_write_direct(dev_handle_t, bn_t, size_t, const void *);
  • uspace/lib/libc/arch/mips32eb/Makefile.inc

    r03a4476 r070e05a  
    3535ARCH_SOURCES += arch/$(UARCH)/src/syscall.c \
    3636        arch/$(UARCH)/src/fibril.S \
    37         arch/$(UARCH)/src/tls.c
     37        arch/$(UARCH)/src/tls.c \
     38        arch/$(UARCH)/src/stacktrace.S
    3839
    3940GCC_CFLAGS += -mips3
  • uspace/lib/libc/generic/io/io.c

    r03a4476 r070e05a  
    554554}
    555555
     556int ftell(FILE *stream)
     557{
     558        off_t rc = lseek(stream->fd, 0, SEEK_CUR);
     559        if (rc == (off_t) (-1)) {
     560                /* errno has been set by lseek. */
     561                return -1;
     562        }
     563
     564        return rc;
     565}
     566
    556567void rewind(FILE *stream)
    557568{
     
    584595}
    585596
     597void clearerr(FILE *stream)
     598{
     599        stream->eof = false;
     600        stream->error = false;
     601}
     602
    586603int fphone(FILE *stream)
    587604{
  • uspace/lib/libc/generic/stacktrace.c

    r03a4476 r070e05a  
    3939void stack_trace_fp_pc(uintptr_t fp, uintptr_t pc)
    4040{
    41         printf("Printing stack trace:\n");
    42         printf("=====================\n");
    4341        while (frame_pointer_validate(fp)) {
    4442                printf("%p: %p()\n", fp, pc);
     
    4644                fp = frame_pointer_prev(fp);
    4745        }
    48         printf("=====================\n");
    4946}
    5047
  • uspace/lib/libc/include/assert.h

    r03a4476 r070e05a  
    5151
    5252#ifndef NDEBUG
    53 #       define assert(expr) if (!(expr)) { printf("Assertion failed (%s) at file '%s', line %d.\n", #expr, __FILE__, __LINE__); abort();}
     53#       define assert(expr) \
     54                do { \
     55                        if (!(expr)) { \
     56                                printf("Assertion failed (%s) at file '%s', " \
     57                                    "line %d.\n", #expr, __FILE__, __LINE__); \
     58                                abort(); \
     59                        } \
     60                } while (0)
    5461#else
    5562#       define assert(expr)
  • uspace/lib/libc/include/ipc/bd.h

    r03a4476 r070e05a  
    4040typedef enum {
    4141        BD_GET_BLOCK_SIZE = IPC_FIRST_USER_METHOD,
     42        BD_GET_NUM_BLOCKS,
    4243        BD_READ_BLOCKS,
    4344        BD_WRITE_BLOCKS
  • uspace/lib/libc/include/sys/types.h

    r03a4476 r070e05a  
    4040typedef long off_t;
    4141typedef int mode_t;
     42typedef uint64_t bn_t;  /**< Block number type. */
    4243
    4344typedef int32_t wchar_t;
  • uspace/srv/bd/ata_bd/ata_bd.c

    r03a4476 r070e05a  
    296296                        ipc_answer_1(callid, EOK, block_size);
    297297                        continue;
     298                case BD_GET_NUM_BLOCKS:
     299                        ipc_answer_2(callid, EOK, LOWER32(disk[disk_id].blocks),
     300                            UPPER32(disk[disk_id].blocks));
     301                        continue;
    298302                default:
    299303                        retval = EINVAL;
  • uspace/srv/bd/file_bd/file_bd.c

    r03a4476 r070e05a  
    5656
    5757static const size_t block_size = 512;
     58static bn_t num_blocks;
    5859static FILE *img;
    5960
     
    99100{
    100101        int rc;
     102        long img_size;
    101103
    102104        rc = devmap_driver_register(NAME, file_bd_connection);
     
    109111        if (img == NULL)
    110112                return EINVAL;
     113
     114        if (fseek(img, 0, SEEK_END) != 0) {
     115                fclose(img);
     116                return EIO;
     117        }
     118
     119        img_size = ftell(img);
     120        if (img_size < 0) {
     121                fclose(img);
     122                return EIO;
     123        }
     124
     125        num_blocks = img_size / block_size;
    111126
    112127        fibril_mutex_initialize(&dev_lock);
     
    174189                        ipc_answer_1(callid, EOK, block_size);
    175190                        continue;
     191                case BD_GET_NUM_BLOCKS:
     192                        ipc_answer_2(callid, EOK, LOWER32(num_blocks),
     193                            UPPER32(num_blocks));
     194                        continue;
    176195                default:
    177196                        retval = EINVAL;
     
    186205{
    187206        size_t n_rd;
     207        int rc;
    188208
    189209        fibril_mutex_lock(&dev_lock);
    190210
    191         fseek(img, ba * block_size, SEEK_SET);
     211        clearerr(img);
     212        rc = fseek(img, ba * block_size, SEEK_SET);
     213        if (rc < 0) {
     214                fibril_mutex_unlock(&dev_lock);
     215                return EIO;
     216        }
     217
    192218        n_rd = fread(buf, block_size, cnt, img);
    193219
     
    209235{
    210236        size_t n_wr;
     237        int rc;
    211238
    212239        fibril_mutex_lock(&dev_lock);
    213240
    214         fseek(img, ba * block_size, SEEK_SET);
    215         n_wr = fread(buf, block_size, cnt, img);
     241        clearerr(img);
     242        rc = fseek(img, ba * block_size, SEEK_SET);
     243        if (rc < 0) {
     244                fibril_mutex_unlock(&dev_lock);
     245                return EIO;
     246        }
     247
     248        n_wr = fwrite(buf, block_size, cnt, img);
    216249
    217250        if (ferror(img) || n_wr < cnt) {
    218251                fibril_mutex_unlock(&dev_lock);
    219252                return EIO;     /* Write error */
     253        }
     254
     255        if (fflush(img) != 0) {
     256                fibril_mutex_unlock(&dev_lock);
     257                return EIO;
    220258        }
    221259
  • uspace/srv/bd/gxe_bd/gxe_bd.c

    r03a4476 r070e05a  
    234234                        ipc_answer_1(callid, EOK, block_size);
    235235                        continue;
     236                case BD_GET_NUM_BLOCKS:
     237                        retval = ENOTSUP;
     238                        break;
    236239                default:
    237240                        retval = EINVAL;
  • uspace/srv/bd/part/mbr_part/mbr_part.c

    r03a4476 r070e05a  
    463463                        ipc_answer_1(callid, EOK, block_size);
    464464                        continue;
    465 
     465                case BD_GET_NUM_BLOCKS:
     466                        ipc_answer_2(callid, EOK, LOWER32(part->length),
     467                            UPPER32(part->length));
     468                        continue;
    466469                default:
    467470                        retval = EINVAL;
  • uspace/srv/bd/rd/rd.c

    r03a4476 r070e05a  
    153153                        ipc_answer_1(callid, EOK, block_size);
    154154                        continue;
     155                case BD_GET_NUM_BLOCKS:
     156                        ipc_answer_2(callid, EOK, LOWER32(rd_size / block_size),
     157                            UPPER32(rd_size / block_size));
     158                        continue;
    155159                default:
    156160                        /*
  • uspace/srv/vfs/vfs_ops.c

    r03a4476 r070e05a  
    900900                }
    901901                newpos = size + off;
     902                file->pos = newpos;
    902903                fibril_mutex_unlock(&file->lock);
    903904                ipc_answer_1(rid, EOK, newpos);
Note: See TracChangeset for help on using the changeset viewer.