Changeset 7a0359b in mainline for kernel/arch/amd64


Ignore:
Timestamp:
2010-07-02T15:42:19Z (15 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
bbfdf62
Parents:
e3ee9b9
Message:

improve kernel function tracing

  • add support for more generic kernel sources
  • replace attribute((no_instrument_function)) with NO_TRACE macro (shorter and for future compatibility with different compilers)
  • to be on the safe side, do not instrument most of the inline and static functions (plus some specific non-static functions)

collateral code cleanup (no change in functionality)

Location:
kernel/arch/amd64/include
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/amd64/include/asm.h

    re3ee9b9 r7a0359b  
    3939#include <typedefs.h>
    4040#include <arch/cpu.h>
    41 
    42 extern void asm_delay_loop(uint32_t t);
    43 extern void asm_fake_loop(uint32_t t);
     41#include <trace.h>
    4442
    4543/** Return base address of current stack.
     
    5048 *
    5149 */
    52 static inline uintptr_t get_stack_base(void)
     50NO_TRACE static inline uintptr_t get_stack_base(void)
    5351{
    5452        uintptr_t v;
     
    5755                "andq %%rsp, %[v]\n"
    5856                : [v] "=r" (v)
    59                 : "0" (~((uint64_t) STACK_SIZE-1))
     57                : "0" (~((uint64_t) STACK_SIZE - 1))
    6058        );
    6159       
     
    6361}
    6462
    65 static inline void cpu_sleep(void)
    66 {
    67         asm volatile ("hlt\n");
    68 }
    69 
    70 static inline void __attribute__((noreturn)) cpu_halt(void)
     63NO_TRACE static inline void cpu_sleep(void)
     64{
     65        asm volatile (
     66                "hlt\n"
     67        );
     68}
     69
     70NO_TRACE static inline void __attribute__((noreturn)) cpu_halt(void)
    7171{
    7272        while (true) {
     
    7777}
    7878
    79 
    8079/** Byte from port
    8180 *
     
    8685 *
    8786 */
    88 static inline uint8_t pio_read_8(ioport8_t *port)
     87NO_TRACE static inline uint8_t pio_read_8(ioport8_t *port)
    8988{
    9089        uint8_t val;
     
    107106 *
    108107 */
    109 static inline uint16_t pio_read_16(ioport16_t *port)
     108NO_TRACE static inline uint16_t pio_read_16(ioport16_t *port)
    110109{
    111110        uint16_t val;
     
    128127 *
    129128 */
    130 static inline uint32_t pio_read_32(ioport32_t *port)
     129NO_TRACE static inline uint32_t pio_read_32(ioport32_t *port)
    131130{
    132131        uint32_t val;
     
    149148 *
    150149 */
    151 static inline void pio_write_8(ioport8_t *port, uint8_t val)
     150NO_TRACE static inline void pio_write_8(ioport8_t *port, uint8_t val)
    152151{
    153152        asm volatile (
    154153                "outb %b[val], %w[port]\n"
    155                 :: [val] "a" (val), [port] "d" (port)
     154                :: [val] "a" (val),
     155                   [port] "d" (port)
    156156        );
    157157}
     
    165165 *
    166166 */
    167 static inline void pio_write_16(ioport16_t *port, uint16_t val)
     167NO_TRACE static inline void pio_write_16(ioport16_t *port, uint16_t val)
    168168{
    169169        asm volatile (
    170170                "outw %w[val], %w[port]\n"
    171                 :: [val] "a" (val), [port] "d" (port)
     171                :: [val] "a" (val),
     172                   [port] "d" (port)
    172173        );
    173174}
     
    181182 *
    182183 */
    183 static inline void pio_write_32(ioport32_t *port, uint32_t val)
     184NO_TRACE static inline void pio_write_32(ioport32_t *port, uint32_t val)
    184185{
    185186        asm volatile (
    186187                "outl %[val], %w[port]\n"
    187                 :: [val] "a" (val), [port] "d" (port)
     188                :: [val] "a" (val),
     189                   [port] "d" (port)
    188190        );
    189191}
    190192
    191193/** Swap Hidden part of GS register with visible one */
    192 static inline void swapgs(void)
    193 {
    194         asm volatile("swapgs");
     194NO_TRACE static inline void swapgs(void)
     195{
     196        asm volatile (
     197                "swapgs"
     198        );
    195199}
    196200
     
    203207 *
    204208 */
    205 static inline ipl_t interrupts_enable(void) {
     209NO_TRACE static inline ipl_t interrupts_enable(void) {
    206210        ipl_t v;
    207211       
     
    224228 *
    225229 */
    226 static inline ipl_t interrupts_disable(void) {
     230NO_TRACE static inline ipl_t interrupts_disable(void) {
    227231        ipl_t v;
    228232       
     
    244248 *
    245249 */
    246 static inline void interrupts_restore(ipl_t ipl) {
     250NO_TRACE static inline void interrupts_restore(ipl_t ipl) {
    247251        asm volatile (
    248252                "pushq %[ipl]\n"
     
    259263 *
    260264 */
    261 static inline ipl_t interrupts_read(void) {
     265NO_TRACE static inline ipl_t interrupts_read(void) {
    262266        ipl_t v;
    263267       
     
    276280 *
    277281 */
    278 static inline bool interrupts_disabled(void)
     282NO_TRACE static inline bool interrupts_disabled(void)
    279283{
    280284        ipl_t v;
     
    289293}
    290294
    291 
    292295/** Write to MSR */
    293 static inline void write_msr(uint32_t msr, uint64_t value)
     296NO_TRACE static inline void write_msr(uint32_t msr, uint64_t value)
    294297{
    295298        asm volatile (
     
    301304}
    302305
    303 static inline unative_t read_msr(uint32_t msr)
     306NO_TRACE static inline unative_t read_msr(uint32_t msr)
    304307{
    305308        uint32_t ax, dx;
     
    314317}
    315318
    316 
    317319/** Enable local APIC
    318320 *
     
    320322 *
    321323 */
    322 static inline void enable_l_apic_in_msr()
     324NO_TRACE static inline void enable_l_apic_in_msr()
    323325{
    324326        asm volatile (
     
    328330                "orl $(0xfee00000),%%eax\n"
    329331                "wrmsr\n"
    330                 ::: "%eax","%ecx","%edx"
     332                ::: "%eax", "%ecx", "%edx"
    331333        );
    332334}
     
    337339 *
    338340 */
    339 static inline void invlpg(uintptr_t addr)
     341NO_TRACE static inline void invlpg(uintptr_t addr)
    340342{
    341343        asm volatile (
     
    350352 *
    351353 */
    352 static inline void gdtr_load(ptr_16_64_t *gdtr_reg)
     354NO_TRACE static inline void gdtr_load(ptr_16_64_t *gdtr_reg)
    353355{
    354356        asm volatile (
     
    363365 *
    364366 */
    365 static inline void gdtr_store(ptr_16_64_t *gdtr_reg)
     367NO_TRACE static inline void gdtr_store(ptr_16_64_t *gdtr_reg)
    366368{
    367369        asm volatile (
     
    376378 *
    377379 */
    378 static inline void idtr_load(ptr_16_64_t *idtr_reg)
     380NO_TRACE static inline void idtr_load(ptr_16_64_t *idtr_reg)
    379381{
    380382        asm volatile (
     
    388390 *
    389391 */
    390 static inline void tr_load(uint16_t sel)
     392NO_TRACE static inline void tr_load(uint16_t sel)
    391393{
    392394        asm volatile (
     
    396398}
    397399
    398 #define GEN_READ_REG(reg) static inline unative_t read_ ##reg (void) \
     400#define GEN_READ_REG(reg) NO_TRACE static inline unative_t read_ ##reg (void) \
    399401        { \
    400402                unative_t res; \
     
    406408        }
    407409
    408 #define GEN_WRITE_REG(reg) static inline void write_ ##reg (unative_t regn) \
     410#define GEN_WRITE_REG(reg) NO_TRACE static inline void write_ ##reg (unative_t regn) \
    409411        { \
    410412                asm volatile ( \
     
    436438extern void interrupt_handlers(void);
    437439
     440extern void asm_delay_loop(uint32_t);
     441extern void asm_fake_loop(uint32_t);
     442
    438443#endif
    439444
  • kernel/arch/amd64/include/atomic.h

    re3ee9b9 r7a0359b  
    3939#include <arch/barrier.h>
    4040#include <preemption.h>
     41#include <trace.h>
    4142
    42 static inline void atomic_inc(atomic_t *val)
     43NO_TRACE static inline void atomic_inc(atomic_t *val)
    4344{
    4445#ifdef CONFIG_SMP
     
    5556}
    5657
    57 static inline void atomic_dec(atomic_t *val)
     58NO_TRACE static inline void atomic_dec(atomic_t *val)
    5859{
    5960#ifdef CONFIG_SMP
     
    7071}
    7172
    72 static inline atomic_count_t atomic_postinc(atomic_t *val)
     73NO_TRACE static inline atomic_count_t atomic_postinc(atomic_t *val)
    7374{
    7475        atomic_count_t r = 1;
     
    8384}
    8485
    85 static inline atomic_count_t atomic_postdec(atomic_t *val)
     86NO_TRACE static inline atomic_count_t atomic_postdec(atomic_t *val)
    8687{
    8788        atomic_count_t r = -1;
     
    99100#define atomic_predec(val)  (atomic_postdec(val) - 1)
    100101
    101 static inline atomic_count_t test_and_set(atomic_t *val)
     102NO_TRACE static inline atomic_count_t test_and_set(atomic_t *val)
    102103{
    103104        atomic_count_t v = 1;
     
    113114
    114115/** amd64 specific fast spinlock */
    115 static inline void atomic_lock_arch(atomic_t *val)
     116NO_TRACE static inline void atomic_lock_arch(atomic_t *val)
    116117{
    117118        atomic_count_t tmp;
     
    120121        asm volatile (
    121122                "0:\n"
    122                 "pause\n"
    123                 "mov %[count], %[tmp]\n"
    124                 "testq %[tmp], %[tmp]\n"
    125                 "jnz 0b\n"       /* lightweight looping on locked spinlock */
     123                "       pause\n"
     124                "       mov %[count], %[tmp]\n"
     125                "       testq %[tmp], %[tmp]\n"
     126                "       jnz 0b\n"       /* lightweight looping on locked spinlock */
    126127               
    127                 "incq %[tmp]\n"  /* now use the atomic operation */
    128                 "xchgq %[count], %[tmp]\n"
    129                 "testq %[tmp], %[tmp]\n"
    130                 "jnz 0b\n"
     128                "       incq %[tmp]\n"  /* now use the atomic operation */
     129                "       xchgq %[count], %[tmp]\n"
     130                "       testq %[tmp], %[tmp]\n"
     131                "       jnz 0b\n"
    131132                : [count] "+m" (val->count),
    132133                  [tmp] "=&r" (tmp)
  • kernel/arch/amd64/include/cycle.h

    re3ee9b9 r7a0359b  
    3636#define KERN_amd64_CYCLE_H_
    3737
    38 static inline uint64_t get_cycle(void)
     38#include <trace.h>
     39
     40NO_TRACE static inline uint64_t get_cycle(void)
    3941{
    4042        uint32_t lower;
  • kernel/arch/amd64/include/interrupt.h

    re3ee9b9 r7a0359b  
    3838#include <typedefs.h>
    3939#include <arch/pm.h>
     40#include <trace.h>
    4041
    41 #define IVT_ITEMS               IDT_ITEMS
    42 #define IVT_FIRST               0
     42#define IVT_ITEMS  IDT_ITEMS
     43#define IVT_FIRST  0
    4344
    44 #define EXC_COUNT               32
    45 #define IRQ_COUNT               16
     45#define EXC_COUNT  32
     46#define IRQ_COUNT  16
    4647
    47 #define IVT_EXCBASE             0
    48 #define IVT_IRQBASE             (IVT_EXCBASE + EXC_COUNT)
    49 #define IVT_FREEBASE            (IVT_IRQBASE + IRQ_COUNT)
     48#define IVT_EXCBASE   0
     49#define IVT_IRQBASE   (IVT_EXCBASE + EXC_COUNT)
     50#define IVT_FREEBASE  (IVT_IRQBASE + IRQ_COUNT)
    5051
    51 #define IRQ_CLK                 0
    52 #define IRQ_KBD                 1
    53 #define IRQ_PIC1                2
    54 #define IRQ_PIC_SPUR            7
    55 #define IRQ_MOUSE               12
    56 #define IRQ_DP8390              9
     52#define IRQ_CLK       0
     53#define IRQ_KBD       1
     54#define IRQ_PIC1      2
     55#define IRQ_PIC_SPUR  7
     56#define IRQ_MOUSE     12
     57#define IRQ_DP8390    9
    5758
    58 /* this one must have four least significant bits set to ones */
    59 #define VECTOR_APIC_SPUR        (IVT_ITEMS - 1)
     59/* This one must have four least significant bits set to ones */
     60#define VECTOR_APIC_SPUR  (IVT_ITEMS - 1)
    6061
    6162#if (((VECTOR_APIC_SPUR + 1) % 16) || VECTOR_APIC_SPUR >= IVT_ITEMS)
     
    6364#endif
    6465
    65 #define VECTOR_DEBUG                    1
    66 #define VECTOR_CLK                      (IVT_IRQBASE + IRQ_CLK)
    67 #define VECTOR_PIC_SPUR                 (IVT_IRQBASE + IRQ_PIC_SPUR)
    68 #define VECTOR_SYSCALL                  IVT_FREEBASE
    69 #define VECTOR_TLB_SHOOTDOWN_IPI        (IVT_FREEBASE + 1)
    70 #define VECTOR_DEBUG_IPI                (IVT_FREEBASE + 2)
     66#define VECTOR_DEBUG              1
     67#define VECTOR_CLK                (IVT_IRQBASE + IRQ_CLK)
     68#define VECTOR_PIC_SPUR           (IVT_IRQBASE + IRQ_PIC_SPUR)
     69#define VECTOR_SYSCALL            IVT_FREEBASE
     70#define VECTOR_TLB_SHOOTDOWN_IPI  (IVT_FREEBASE + 1)
     71#define VECTOR_DEBUG_IPI          (IVT_FREEBASE + 2)
    7172
    7273/** This is passed to interrupt handlers */
     
    8687        uint64_t cs;
    8788        uint64_t rflags;
    88         uint64_t stack[]; /* Additional data on stack */
     89        uint64_t stack[];  /* Additional data on stack */
    8990} istate_t;
    9091
    9192/** Return true if exception happened while in userspace */
    92 static inline int istate_from_uspace(istate_t *istate)
     93NO_TRACE static inline int istate_from_uspace(istate_t *istate)
    9394{
    9495        return !(istate->rip & 0x8000000000000000);
    9596}
    9697
    97 static inline void istate_set_retaddr(istate_t *istate, uintptr_t retaddr)
     98NO_TRACE static inline void istate_set_retaddr(istate_t *istate,
     99    uintptr_t retaddr)
    98100{
    99101        istate->rip = retaddr;
    100102}
    101 static inline unative_t istate_get_pc(istate_t *istate)
     103
     104NO_TRACE static inline unative_t istate_get_pc(istate_t *istate)
    102105{
    103106        return istate->rip;
    104107}
    105 static inline unative_t istate_get_fp(istate_t *istate)
     108
     109NO_TRACE static inline unative_t istate_get_fp(istate_t *istate)
    106110{
    107111        return istate->rbp;
    108112}
    109113
    110 extern void (* disable_irqs_function)(uint16_t irqmask);
    111 extern void (* enable_irqs_function)(uint16_t irqmask);
     114extern void (* disable_irqs_function)(uint16_t);
     115extern void (* enable_irqs_function)(uint16_t);
    112116extern void (* eoi_function)(void);
    113117
    114118extern void interrupt_init(void);
    115 extern void trap_virtual_enable_irqs(uint16_t irqmask);
    116 extern void trap_virtual_disable_irqs(uint16_t irqmask);
     119extern void trap_virtual_enable_irqs(uint16_t);
     120extern void trap_virtual_disable_irqs(uint16_t);
    117121
    118122#endif
  • kernel/arch/amd64/include/mm/frame.h

    re3ee9b9 r7a0359b  
    3636#define KERN_amd64_FRAME_H_
    3737
    38 #ifndef __ASM__
    39 #include <typedefs.h>
    40 #endif /* __ASM__ */
    41 
    4238#define FRAME_WIDTH  12  /* 4K */
    4339#define FRAME_SIZE   (1 << FRAME_WIDTH)
    4440
     41#ifdef KERNEL
    4542#ifndef __ASM__
     43
     44#include <typedefs.h>
     45
    4646extern uintptr_t last_frame;
    4747extern void frame_arch_init(void);
    4848extern void physmem_print(void);
     49
    4950#endif /* __ASM__ */
     51#endif /* KERNEL */
    5052
    5153#endif
  • kernel/arch/amd64/include/mm/page.h

    re3ee9b9 r7a0359b  
    4646
    4747#include <arch/mm/frame.h>
     48#include <trace.h>
    4849
    4950#define PAGE_WIDTH  FRAME_WIDTH
     
    187188} __attribute__ ((packed)) pte_t;
    188189
    189 static inline unsigned int get_pt_flags(pte_t *pt, size_t i)
     190NO_TRACE static inline unsigned int get_pt_flags(pte_t *pt, size_t i)
    190191{
    191192        pte_t *p = &pt[i];
     
    200201}
    201202
    202 static inline void set_pt_addr(pte_t *pt, size_t i, uintptr_t a)
     203NO_TRACE static inline void set_pt_addr(pte_t *pt, size_t i, uintptr_t a)
    203204{
    204205        pte_t *p = &pt[i];
     
    208209}
    209210
    210 static inline void set_pt_flags(pte_t *pt, size_t i, int flags)
     211NO_TRACE static inline void set_pt_flags(pte_t *pt, size_t i, int flags)
    211212{
    212213        pte_t *p = &pt[i];
Note: See TracChangeset for help on using the changeset viewer.