Fork us on GitHub Follow us on Facebook Follow us on Twitter

Changeset da52547 in mainline


Ignore:
Timestamp:
2010-07-02T10:16:38Z (12 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial
Children:
b5382d4f
Parents:
ad8f03d2
Message:

add early_putchar() which can be used to do early kernel console output for debugging purposes
(the availability of this feature depends on each platform and specific configuration, currently it works only on ia32/amd64 with EGA and no framebuffer)
instrument more kernel functions
mark some functions as no_instrument (context_restore(), overlaps(), main_bsp())

Location:
kernel
Files:
17 edited
1 moved

Legend:

Unmodified
Added
Removed
  • kernel/Makefile

    rad8f03d2 rda52547  
    364364#
    365365
    366 ifeq ($(CONFIG_LOG),y)
     366ifeq ($(CONFIG_TRACE),y)
    367367INSTRUMENTED_SOURCES = \
    368368        generic/src/cpu/cpu.c \
    369         generic/src/main/kinit.c
     369        generic/src/main/main.c \
     370        generic/src/main/kinit.c \
     371        generic/src/proc/the.c
    370372endif
    371373
  • kernel/arch/abs32le/src/abs32le.c

    rad8f03d2 rda52547  
    151151}
    152152
     153void early_putchar(wchar_t ch)
     154{
     155}
     156
    153157/** @}
    154158 */
  • kernel/arch/amd64/Makefile.inc

    rad8f03d2 rda52547  
    7171        arch/$(KARCH)/src/mm/page.c \
    7272        arch/$(KARCH)/src/mm/tlb.c \
    73         arch/$(KARCH)/src/asm_utils.S \
     73        arch/$(KARCH)/src/asm.S \
    7474        arch/$(KARCH)/src/cpu/cpu.c \
    7575        arch/$(KARCH)/src/proc/scheduler.c \
  • kernel/arch/amd64/src/asm.S

    rad8f03d2 rda52547  
    6464.global memcpy_from_uspace_failover_address
    6565.global memcpy_to_uspace_failover_address
     66.global early_putchar
    6667
    6768/* Wrapper for generic memsetb */
     
    339340        sysretq
    340341
     342/** Print Unicode character to EGA display.
     343 *
     344 * If CONFIG_EGA is undefined or CONFIG_FB is defined
     345 * then this function does nothing.
     346 *
     347 * Since the EGA can only display Extended ASCII (usually
     348 * ISO Latin 1) characters, some of the Unicode characters
     349 * can be displayed in a wrong way. Only the newline character
     350 * is interpreted, all other characters (even unprintable) are
     351 * printed verbatim.
     352 *
     353 * @param %rdi Unicode character to be printed.
     354 *
     355 */
     356early_putchar:
     357       
     358#if ((defined(CONFIG_EGA)) && (!defined(CONFIG_FB)))
     359       
     360        /* Prologue, save preserved registers */
     361        pushq %rbp
     362        movq %rsp, %rbp
     363        pushq %rbx
     364       
     365        movq %rdi, %rsi
     366        movq $(PA2KA(0xb8000)), %rdi  /* base of EGA text mode memory */
     367        xorq %rax, %rax
     368       
     369        /* Read bits 8 - 15 of the cursor address */
     370        movw $0x3d4, %dx
     371        movb $0xe, %al
     372        outb %al, %dx
     373       
     374        movw $0x3d5, %dx
     375        inb %dx, %al
     376        shl $8, %ax
     377       
     378        /* Read bits 0 - 7 of the cursor address */
     379        movw $0x3d4, %dx
     380        movb $0xf, %al
     381        outb %al, %dx
     382       
     383        movw $0x3d5, %dx
     384        inb %dx, %al
     385       
     386        /* Sanity check for the cursor on screen */
     387        cmp $2000, %ax
     388        jb early_putchar_cursor_ok
     389       
     390                movw $1998, %ax
     391       
     392        early_putchar_cursor_ok:
     393       
     394        movw %ax, %bx
     395        shl $1, %rax
     396        addq %rax, %rdi
     397       
     398        movq %rsi, %rax
     399       
     400        cmp $0x0a, %al
     401        jne early_putchar_print
     402       
     403                /* Interpret newline */
     404               
     405                movw %bx, %ax  /* %bx -> %dx:%ax */
     406                xorw %dx, %dx
     407               
     408                movw $80, %cx
     409                idivw %cx, %ax  /* %dx = %bx % 80 */
     410               
     411                /* %bx <- %bx + 80 - (%bx % 80) */
     412                addw %cx, %bx
     413                subw %dx, %bx
     414               
     415                jmp early_putchar_newline
     416       
     417        early_putchar_print:
     418       
     419                /* Print character */
     420               
     421                movb $0x0e, %ah  /* black background, yellow foreground */
     422                stosw
     423       
     424        early_putchar_newline:
     425       
     426        /* Sanity check for the cursor on the last line */
     427        inc %bx
     428        cmp $2000, %bx
     429        jb early_putchar_no_scroll
     430       
     431                /* Scroll the screen (24 rows) */
     432                movq $(PA2KA(0xb80a0)), %rsi
     433                movq $(PA2KA(0xb8000)), %rdi
     434                movq $1920, %rcx
     435                rep movsw
     436               
     437                /* Clear the 24th row */
     438                xorq %rax, %rax
     439                movq $80, %rcx
     440                rep stosw
     441               
     442                /* Go to row 24 */
     443                movw $1920, %bx
     444       
     445        early_putchar_no_scroll:
     446       
     447        /* Write bits 8 - 15 of the cursor address */
     448        movw $0x3d4, %dx
     449        movb $0xe, %al
     450        outb %al, %dx
     451       
     452        movw $0x3d5, %dx
     453        movb %bh, %al
     454        outb %al, %dx
     455       
     456        /* Write bits 0 - 7 of the cursor address */
     457        movw $0x3d4, %dx
     458        movb $0xf, %al
     459        outb %al, %dx
     460       
     461        movw $0x3d5, %dx
     462        movb %bl, %al
     463        outb %al, %dx
     464       
     465        /* Epilogue, restore preserved registers */
     466        popq %rbx
     467        leave
     468       
     469#endif
     470       
     471        ret
     472
    341473.data
    342474.global interrupt_handler_size
  • kernel/arch/amd64/src/boot/boot.S

    rad8f03d2 rda52547  
    192192 * some hints.
    193193 *
    194  * @param %esi NULL-terminated string to print.
     194 * @param %esi Pointer to the NULL-terminated string
     195 *             to be print.
    195196 *
    196197 */
     
    295296 * and CONFIG_FB is disabled.
    296297 *
    297  * @param %esi NULL-terminated string to print.
     298 * @param %esi Pointer to the NULL-terminated string
     299 *             to be print.
    298300 *
    299301 */
     
    450452 * then this function does nothing.
    451453 *
    452  * @param %rdi NULL-terminated string to print.
     454 * @param %rdi Pointer to the NULL-terminated string
     455 *             to be printed.
    453456 *
    454457 */
  • kernel/arch/arm32/src/asm.S

    rad8f03d2 rda52547  
    3636.global memcpy_from_uspace_failover_address
    3737.global memcpy_to_uspace_failover_address
     38.global early_putchar
    3839
    3940memsetb:
     
    108109        mov r0, #0
    109110        ldmia sp!, {r4, r5, pc}
     111
     112early_putchar:
     113        mov pc, lr
  • kernel/arch/ia32/src/asm.S

    rad8f03d2 rda52547  
    3838#define ERROR_WORD_INTERRUPT_LIST  0x00027d00
    3939
     40#include <arch/pm.h>
     41#include <arch/mm/page.h>
     42
    4043.text
    41 
    4244.global paging_on
    4345.global enable_l_apic_in_msr
     
    5052.global memcpy_to_uspace
    5153.global memcpy_to_uspace_failover_address
    52 
     54.global early_putchar
    5355
    5456/* Wrapper for generic memsetb */
     
    405407       
    406408        .align INTERRUPT_ALIGN
    407         .if (\n- \i) - 1
     409        .if (\n - \i) - 1
    408410                handler "(\i + 1)", \n
    409411        .endif
     
    411413
    412414/* Keep in sync with pm.h! */
    413 IDT_ITEMS = 64
     415#define IDT_ITEMS 64
    414416
    415417.align INTERRUPT_ALIGN
     
    419421        h_end:
    420422
     423/** Print Unicode character to EGA display.
     424 *
     425 * If CONFIG_EGA is undefined or CONFIG_FB is defined
     426 * then this function does nothing.
     427 *
     428 * Since the EGA can only display Extended ASCII (usually
     429 * ISO Latin 1) characters, some of the Unicode characters
     430 * can be displayed in a wrong way. Only the newline character
     431 * is interpreted, all other characters (even unprintable) are
     432 * printed verbatim.
     433 *
     434 * @param %ebp+0x08 Unicode character to be printed.
     435 *
     436 */
     437early_putchar:
     438       
     439#if ((defined(CONFIG_EGA)) && (!defined(CONFIG_FB)))
     440       
     441        /* Prologue, save preserved registers */
     442        pushl %ebp
     443        movl %esp, %ebp
     444        pushl %ebx
     445        pushl %esi
     446        pushl %edi
     447       
     448        movl $(PA2KA(0xb8000)), %edi  /* base of EGA text mode memory */
     449        xorl %eax, %eax
     450       
     451        /* Read bits 8 - 15 of the cursor address */
     452        movw $0x3d4, %dx
     453        movb $0xe, %al
     454        outb %al, %dx
     455       
     456        movw $0x3d5, %dx
     457        inb %dx, %al
     458        shl $8, %ax
     459       
     460        /* Read bits 0 - 7 of the cursor address */
     461        movw $0x3d4, %dx
     462        movb $0xf, %al
     463        outb %al, %dx
     464       
     465        movw $0x3d5, %dx
     466        inb %dx, %al
     467       
     468        /* Sanity check for the cursor on screen */
     469        cmp $2000, %ax
     470        jb early_putchar_cursor_ok
     471       
     472                movw $1998, %ax
     473       
     474        early_putchar_cursor_ok:
     475       
     476        movw %ax, %bx
     477        shl $1, %eax
     478        addl %eax, %edi
     479       
     480        movl 0x08(%ebp), %eax
     481       
     482        cmp $0x0a, %al
     483        jne early_putchar_print
     484       
     485                /* Interpret newline */
     486               
     487                movw %bx, %ax  /* %bx -> %dx:%ax */
     488                xorw %dx, %dx
     489               
     490                movw $80, %cx
     491                idivw %cx, %ax  /* %dx = %bx % 80 */
     492               
     493                /* %bx <- %bx + 80 - (%bx % 80) */
     494                addw %cx, %bx
     495                subw %dx, %bx
     496               
     497                jmp early_putchar_newline
     498       
     499        early_putchar_print:
     500       
     501                /* Print character */
     502               
     503                movb $0x0e, %ah  /* black background, yellow foreground */
     504                stosw
     505       
     506        early_putchar_newline:
     507       
     508        /* Sanity check for the cursor on the last line */
     509        inc %bx
     510        cmp $2000, %bx
     511        jb early_putchar_no_scroll
     512       
     513                /* Scroll the screen (24 rows) */
     514                movl $(PA2KA(0xb80a0)), %esi
     515                movl $(PA2KA(0xb8000)), %edi
     516                movl $1920, %ecx
     517                rep movsw
     518               
     519                /* Clear the 24th row */
     520                xorl %eax, %eax
     521                movl $80, %ecx
     522                rep stosw
     523               
     524                /* Go to row 24 */
     525                movw $1920, %bx
     526       
     527        early_putchar_no_scroll:
     528       
     529        /* Write bits 8 - 15 of the cursor address */
     530        movw $0x3d4, %dx
     531        movb $0xe, %al
     532        outb %al, %dx
     533       
     534        movw $0x3d5, %dx
     535        movb %bh, %al
     536        outb %al, %dx
     537       
     538        /* Write bits 0 - 7 of the cursor address */
     539        movw $0x3d4, %dx
     540        movb $0xf, %al
     541        outb %al, %dx
     542       
     543        movw $0x3d5, %dx
     544        movb %bl, %al
     545        outb %al, %dx
     546       
     547        /* Epilogue, restore preserved registers */
     548        popl %edi
     549        popl %esi
     550        popl %ebx
     551        leave
     552       
     553#endif
     554       
     555        ret
     556
    421557.data
    422558.global interrupt_handler_size
  • kernel/arch/ia64/src/asm.S

    rad8f03d2 rda52547  
    200200       
    201201        rfi ;;
     202
     203.global early_putchar
     204early_putchar:
     205        br.ret.sptk.many b0
  • kernel/arch/mips32/src/asm.S

    rad8f03d2 rda52547  
    307307        j $ra
    308308        nop
     309
     310.global early_putchar
     311early_putchar:
     312        j $ra
     313        nop
  • kernel/arch/ppc32/src/asm.S

    rad8f03d2 rda52547  
    284284        xor r3, r3, r3
    285285        blr
     286
     287early_putchar:
     288        blr
  • kernel/arch/sparc64/src/asm.S

    rad8f03d2 rda52547  
    273273        ba %xcc, _memsetw
    274274        nop
     275
     276.global early_putchar
     277early_putchar:
     278        retl
     279        nop
  • kernel/generic/include/console/console.h

    rad8f03d2 rda52547  
    5656extern outdev_t *stdout;
    5757
     58extern void early_putchar(wchar_t);
     59
    5860extern indev_t *stdin_wire(void);
    5961extern void stdout_wire(outdev_t *outdev);
  • kernel/generic/include/context.h

    rad8f03d2 rda52547  
    8787 *
    8888 * @param ctx Context structure.
     89 *
    8990 */
    90 static inline void context_restore(context_t *ctx)
     91static inline void __attribute__((no_instrument_function))
     92    context_restore(context_t *ctx)
    9193{
    9294        context_restore_arch(ctx);
  • kernel/generic/include/debug.h

    rad8f03d2 rda52547  
    9898        } while (0)
    9999
    100 extern void __cyg_profile_func_enter(void *, void *);
    101 extern void __cyg_profile_func_exit(void *, void *);
    102 
    103100#else /* CONFIG_LOG */
    104101
     
    107104#endif /* CONFIG_LOG */
    108105
     106#ifdef CONFIG_TRACE
     107
     108extern void __cyg_profile_func_enter(void *, void *);
     109extern void __cyg_profile_func_exit(void *, void *);
     110
     111#endif /* CONFIG_TRACE */
     112
    109113#endif
    110114
  • kernel/generic/include/macros.h

    rad8f03d2 rda52547  
    4747 * @param sz2 Size of the second interval.
    4848 */
    49 static inline int overlaps(uintptr_t s1, size_t sz1, uintptr_t s2, size_t sz2)
     49static inline int __attribute__((no_instrument_function))
     50    overlaps(uintptr_t s1, size_t sz1, uintptr_t s2, size_t sz2)
    5051{
    5152        uintptr_t e1 = s1 + sz1;
  • kernel/generic/src/console/console.c

    rad8f03d2 rda52547  
    294294                stdout->op->write(stdout, ch, silent);
    295295        else {
    296                 /* The character is just in the kernel log */
     296                /*
     297                 * No standard output routine defined yet.
     298                 * The character is still stored in the kernel log
     299                 * for possible future output.
     300                 *
     301                 * The early_putchar() function is used to output
     302                 * the character for low-level debugging purposes.
     303                 * Note that the early_putc() function might be
     304                 * a no-op on certain hardware configurations.
     305                 *
     306                 */
     307                early_putchar(ch);
     308               
    297309                if (klog_stored < klog_len)
    298310                        klog_stored++;
  • kernel/generic/src/debug/debug.c

    rad8f03d2 rda52547  
    3636 */
    3737
    38 #ifdef CONFIG_LOG
     38#ifdef CONFIG_TRACE
    3939
    4040#include <debug.h>
     
    5252        if (symtab_name_lookup((uintptr_t) call_site, &call_site_sym,
    5353            &call_site_off) == EOK)
    54                 printf("%s:%p->%s\n", call_site_sym, call_site_off, fn_sym);
     54                printf("%s+%" PRIp "->%s\n", call_site_sym, call_site_off,
     55                    fn_sym);
    5556        else
    5657                printf("->%s\n", fn_sym);
     
    6667        if (symtab_name_lookup((uintptr_t) call_site, &call_site_sym,
    6768            &call_site_off) == EOK)
    68                 printf("%s:%p<-%s\n", call_site_sym, call_site_off, fn_sym);
     69                printf("%s+%" PRIp "<-%s\n", call_site_sym, call_site_off,
     70                    fn_sym);
    6971        else
    7072                printf("<-%s\n", fn_sym);
    7173}
    7274
    73 #endif /* CONFIG_LOG */
     75#endif /* CONFIG_TRACE */
    7476
    7577/** @}
  • kernel/generic/src/main/main.c

    rad8f03d2 rda52547  
    131131 *
    132132 */
    133 void main_bsp(void)
     133void __attribute__((no_instrument_function)) main_bsp(void)
    134134{
    135135        config.cpu_count = 1;
     
    183183        version_print();
    184184       
    185         LOG("\nconfig.base=%#" PRIp " config.kernel_size=%" PRIs
    186             "\nconfig.stack_base=%#" PRIp " config.stack_size=%" PRIs,
     185        LOG("\nconfig.base=%p config.kernel_size=%" PRIs
     186            "\nconfig.stack_base=%p config.stack_size=%" PRIs,
    187187            config.base, config.kernel_size, config.stack_base,
    188188            config.stack_size);
     
    241241                size_t i;
    242242                for (i = 0; i < init.cnt; i++)
    243                         LOG("init[%" PRIs "].addr=%#" PRIp ", init[%" PRIs
    244                             "].size=%#" PRIs, i, init.tasks[i].addr, i,
     243                        LOG("init[%" PRIs "].addr=%p, init[%" PRIs
     244                            "].size=%" PRIs, i, init.tasks[i].addr, i,
    245245                            init.tasks[i].size);
    246246        } else
Note: See TracChangeset for help on using the changeset viewer.