Changeset 86


Ignore:
Timestamp:
Jun 28, 2017, 3:24:02 PM (7 years ago)
Author:
max@…
Message:

enable the timer (not yet calibrated)

Location:
trunk/hal/x86_64/core
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/hal/x86_64/core/hal_apic.c

    r83 r86  
    105105        hal_lapic_write(LAPIC_LVT_THM, LAPIC_THM_M);
    106106        hal_lapic_write(LAPIC_LVT_ERR, LAPIC_ERR_M);
     107
     108        /* Now, enable the timer in repeated mode. */
     109        hal_lapic_write(LAPIC_LVT_TMR, LAPIC_TMR_TM|LAPIC_TMR_M);
     110        hal_lapic_write(LAPIC_DCR_TIMER, LAPIC_DCRT_DIV1);
     111        hal_lapic_write(LAPIC_ICR_TIMER, 1000000000); // XXX calibrate
     112        hal_lapic_write(LAPIC_LVT_TMR, LAPIC_TMR_TM|LAPIC_TIMER_VECTOR);
    107113}
    108114
  • trunk/hal/x86_64/core/hal_apic.h

    r82 r86  
    2020 */
    2121
     22#ifndef x86_ASM
    2223uint32_t hal_lapic_gid();
    2324void hal_apic_init();
     25#endif
    2426
    2527#define LAPIC_SPURIOUS_VECTOR   LAPICVEC_MIN
  • trunk/hal/x86_64/core/hal_init.c

    r82 r86  
    191191
    192192        sti();
     193        while (1);
    193194
    194195        int m = 0;
  • trunk/hal/x86_64/core/hal_kentry.S

    r82 r86  
    2323#include <hal_boot.h>
    2424#include <hal_kentry.h>
     25#include <hal_apic.h>
    2526
    2627#define TRAPENTRY(a)    \
    27         pushq $(a);     \
    28         jmp alltraps;
     28        pushq   $(a);   \
     29        jmp     alltraps;
    2930
    3031#define ZTRAPENTRY(a) \
    31         pushq $0; \
     32        pushq   $0; \
    3233        TRAPENTRY(a)
    3334
    3435        .text
    3536        .globl  hal_trap_entry
     37        .globl  hal_timer_intr
    3638        .type   hal_trap_entry, @function
     39        .type   hal_timer_intr, @function
    3740
    3841        /*
     
    118121         * LAPIC interrupts.
    119122         */
    120 ASM_ENTRY(x86_spurious)
     123ASM_ENTRY(x86_lapic_spurious)
    121124        ZTRAPENTRY(T_ASTFLT)
    122 ASM_ENTRY(x86_timer)
    123         ZTRAPENTRY(T_ASTFLT)
     125
     126ASM_ENTRY(x86_lapic_timer)
     127        pushq   $0
     128        pushq   $T_ASTFLT
     129        INTR_SAVE_REGS
     130
     131        movq    %rsp,%rdi
     132        call    hal_timer_intr
     133
     134        movq    lapic_va(%rip),%rax
     135        movl    $0,LAPIC_EOI(%rax)
     136
     137        INTR_RESTORE_REGS
     138        addq    $16,%rsp
     139        iretq
    124140
    125141/*
     
    164180
    165181x86_intrs:
    166         .quad   x86_spurious
    167         .quad   x86_timer
     182        .quad   x86_lapic_spurious
     183        .quad   x86_lapic_timer
    168184
  • trunk/hal/x86_64/core/hal_kentry.h

    r51 r86  
    4545#define T_USER  0x100
    4646
     47#define TF_REGSIZE      (19 * 8)
     48
     49#define INTR_SAVE_REGS  \
     50        subq    $TF_REGSIZE,%rsp        ; \
     51        movq    %rax,TF_RAX(%rsp)       ; \
     52        movq    %rbx,TF_RBX(%rsp)       ; \
     53        movq    %rcx,TF_RCX(%rsp)       ; \
     54        movq    %rdx,TF_RDX(%rsp)       ; \
     55        movq    %rbp,TF_RBP(%rsp)       ; \
     56        movq    %rdi,TF_RDI(%rsp)       ; \
     57        movq    %rsi,TF_RSI(%rsp)       ; \
     58        movq    %r8,TF_R8(%rsp)         ; \
     59        movq    %r9,TF_R9(%rsp)         ; \
     60        movq    %r10,TF_R10(%rsp)       ; \
     61        movq    %r11,TF_R11(%rsp)       ; \
     62        movq    %r12,TF_R12(%rsp)       ; \
     63        movq    %r13,TF_R13(%rsp)       ; \
     64        movq    %r14,TF_R14(%rsp)       ; \
     65        movq    %r15,TF_R15(%rsp)       ; \
     66        movw    %gs,TF_GS(%rsp)         ; \
     67        movw    %fs,TF_FS(%rsp)         ; \
     68        movw    %es,TF_ES(%rsp)         ; \
     69        movw    %ds,TF_DS(%rsp)         ; \
     70        cld
     71
     72#define INTR_RESTORE_REGS       \
     73        movq    TF_RAX(%rsp),%rax       ; \
     74        movq    TF_RBX(%rsp),%rbx       ; \
     75        movq    TF_RCX(%rsp),%rcx       ; \
     76        movq    TF_RDX(%rsp),%rdx       ; \
     77        movq    TF_RBP(%rsp),%rbp       ; \
     78        movq    TF_RDI(%rsp),%rdi       ; \
     79        movq    TF_RSI(%rsp),%rsi       ; \
     80        movq    TF_R8(%rsp),%r8         ; \
     81        movq    TF_R9(%rsp),%r9         ; \
     82        movq    TF_R10(%rsp),%r10       ; \
     83        movq    TF_R11(%rsp),%r11       ; \
     84        movq    TF_R12(%rsp),%r12       ; \
     85        movq    TF_R13(%rsp),%r13       ; \
     86        movq    TF_R14(%rsp),%r14       ; \
     87        movq    TF_R15(%rsp),%r15       ; \
     88        movw    TF_GS(%rsp),%gs         ; \
     89        movw    TF_FS(%rsp),%fs         ; \
     90        movw    TF_ES(%rsp),%es         ; \
     91        movw    TF_DS(%rsp),%ds         ; \
     92        addq    $TF_REGSIZE,%rsp        ; \
     93        cld
     94
    4795#ifndef x86_ASM
    4896
     
    5199 */
    52100struct trapframe {
     101        /* Pushed by INTR_SAVE_REGS */
     102        uint64_t tf_rax;
     103        uint64_t tf_rbx;
     104        uint64_t tf_rcx;
     105        uint64_t tf_rdx;
    53106        uint64_t tf_rdi;
    54107        uint64_t tf_rsi;
    55         uint64_t tf_rdx;
    56         uint64_t tf_r10;
     108        uint64_t tf_rbp;
    57109        uint64_t tf_r8;
    58110        uint64_t tf_r9;
    59 
    60         uint64_t tf_arg6;
    61         uint64_t tf_arg7;
    62         uint64_t tf_arg8;
    63         uint64_t tf_arg9;
    64 
    65         uint64_t tf_rcx;
     111        uint64_t tf_r10;
    66112        uint64_t tf_r11;
    67113        uint64_t tf_r12;
     
    69115        uint64_t tf_r14;
    70116        uint64_t tf_r15;
    71         uint64_t tf_rbp;
    72         uint64_t tf_rbx;
    73         uint64_t tf_rax;
    74 
    75117        uint64_t tf_gs;
    76118        uint64_t tf_fs;
     
    78120        uint64_t tf_ds;
    79121
     122        /* Pushed by the ISR */
    80123        uint64_t tf_trapno;
    81124
     
    98141
    99142        /* These are pushed for a trap */
    100         uint64_t tf_err;
     143        uint64_t tf_err;        /* in fact, this one may not... */
    101144        uint64_t tf_rip;
    102145        uint64_t tf_cs;
     
    108151};
    109152
     153#else
     154
     155/* offsets in the trapframe structure */
     156#define TF_RAX  0
     157#define TF_RBX  8
     158#define TF_RCX  16
     159#define TF_RDX  24
     160#define TF_RDI  32
     161#define TF_RSI  40
     162#define TF_RBP  48
     163#define TF_R8   56
     164#define TF_R9   64
     165#define TF_R10  72
     166#define TF_R11  80
     167#define TF_R12  88
     168#define TF_R13  96
     169#define TF_R14  104
     170#define TF_R15  112
     171#define TF_GS   120
     172#define TF_FS   128
     173#define TF_ES   136
     174#define TF_DS   144
     175
    110176#endif
    111177
  • trunk/hal/x86_64/core/hal_trap.c

    r82 r86  
    5252 * Trap handler.
    5353 */
    54 void
    55 hal_trap_entry(struct small_trapframe *tf)
     54void hal_trap_entry(struct small_trapframe *tf)
    5655{
    5756        uint64_t trapno = tf->tf_trapno;
     
    6867        x86_printf("-> rip = %Z\n", tf->tf_rip);
    6968        x86_printf("-> rsp = %Z\n", tf->tf_rsp);
     69        x86_printf("-> err = %Z\n", tf->tf_err);
    7070        x86_printf("****** FAULT OCCURRED ******\n\n");
    7171
     
    7373}
    7474
     75/*
     76 * Timer interrupt
     77 */
     78void hal_timer_intr(struct trapframe *tf)
     79{
     80        x86_printf("-> got timer: rip=%Z\n", tf->tf_rip);
     81        return;
     82}
    7583
Note: See TracChangeset for help on using the changeset viewer.