Changeset 45 for trunk/hal


Ignore:
Timestamp:
Jun 23, 2017, 11:55:08 AM (5 years ago)
Author:
max@…
Message:

Add some code for LAPIC; far from complete, but a good start.

Location:
trunk/hal/x86_64
Files:
2 added
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/hal/x86_64/hal_acpi.c

    r43 r45  
    111111static void hal_acpi_parse_madt(madt_t *madt)
    112112{
    113         paddr_t lapic_pa = (paddr_t)madt->Address;
     113        extern paddr_t lapic_pa;
     114        lapic_pa = (paddr_t)madt->Address;
    114115        x86_printf("-> LAPIC address: %Z\n", lapic_pa);
    115116}
  • trunk/hal/x86_64/hal_gpt.c

    r44 r45  
    6565}
    6666
     67/*
     68 * Reset the bootstrap VA we've used in cluster0 so far. After this
     69 * function, cluster0's heap is empty.
     70 */
     71void hal_gpt_bootstrap_reset()
     72{
     73        size_t npages = (va_avail - CLUSTER_HEAP_MIN_VA(0)) / PAGE_SIZE;
     74        hal_gpt_leave_range(CLUSTER_HEAP_MIN_VA(0), npages);
     75}
     76
     77
    6778void hal_gpt_enter(vaddr_t va, paddr_t pa)
    6879{
    69         XASSERT((va % PAGE_SIZE == 0));
    70         XASSERT((pa % PAGE_SIZE == 0));
     80        XASSERT(va % PAGE_SIZE == 0);
     81        XASSERT(pa % PAGE_SIZE == 0);
     82        XASSERT(va == tmpva || PTE_BASE[pl1_i(va)] == 0);
    7183        PTE_BASE[pl1_i(va)] = (pa & PG_FRAME) | PG_V | PG_KW | PG_NX;
    7284}
     
    7789        for (i = 0; i < n; i++) {
    7890                hal_gpt_enter(va + i * PAGE_SIZE, pa + i * PAGE_SIZE);
     91                invlpg(va + i * PAGE_SIZE);
     92        }
     93}
     94
     95void hal_gpt_leave(vaddr_t va)
     96{
     97        XASSERT(va % PAGE_SIZE == 0);
     98        XASSERT(PTE_BASE[pl1_i(va)] != 0);
     99        PTE_BASE[pl1_i(va)] = 0;
     100}
     101
     102void hal_gpt_leave_range(vaddr_t va, size_t n)
     103{
     104        size_t i;
     105        for (i = 0; i < n; i++) {
     106                hal_gpt_leave(va + i * PAGE_SIZE);
    79107                invlpg(va + i * PAGE_SIZE);
    80108        }
  • trunk/hal/x86_64/hal_init.c

    r44 r45  
    2424#include <hal_multiboot.h>
    2525#include <hal_segmentation.h>
     26#include <hal_acpi.h>
     27#include <hal_lapic.h>
    2628#include <hal_internal.h>
    2729
     
    98100        hal_acpi_init();
    99101        x86_printf("[+] hal_acpi_init called\n");
     102
     103        hal_gpt_bootstrap_reset();
     104        x86_printf("[+] hal_gpt_bootstrap_reset called\n");
     105
     106        hal_init_lapic();
     107        x86_printf("[+] hal_init_lapic called\n");
    100108
    101109        x86_printf("-> mytest = %z\n", mytest);
     
    207215static void idt_create()
    208216{
    209         extern uint64_t x86_traps[];
     217        extern uint64_t x86_traps[], x86_intrs[];
    210218        struct idt_seg *idt;
    211219        size_t i;
    212220
    213221        idt = (struct idt_seg *)&idtstore;
    214         for (i = 0; i < NCPUIDT; i++) {
    215                 idt_set_seg(&idt[i], (void *)x86_traps[i], 0, SDT_SYS386IGT,
    216                     SEL_KPL, GDT_FIXED_SEL(GDT_KCODE_SEL, SEL_KPL));
     222
     223        /* General exceptions */
     224        for (i = CPUVEC_MIN; i < CPUVEC_MAX; i++) {
     225                idt_set_seg(&idt[i], (void *)x86_traps[i - CPUVEC_MIN], 0,
     226                    SDT_SYS386IGT, SEL_KPL, GDT_FIXED_SEL(GDT_KCODE_SEL, SEL_KPL));
    217227        }
     228
     229        /* LAPIC interrupts */
     230        for (i = LAPICVEC_MIN; i < LAPICVEC_MAX; i++) {
     231                idt_set_seg(&idt[i], (void *)x86_intrs[i - LAPICVEC_MIN], 0,
     232                    SDT_SYS386IGT, SEL_KPL, GDT_FIXED_SEL(GDT_KCODE_SEL, SEL_KPL));
     233        }
     234
    218235}
    219236
  • trunk/hal/x86_64/hal_internal.h

    r39 r45  
    3434paddr_t hal_gpt_bootstrap_palloc(size_t npages);
    3535vaddr_t hal_gpt_bootstrap_valloc(size_t npages);
     36void hal_gpt_bootstrap_reset();
    3637void hal_gpt_enter(vaddr_t va, paddr_t pa);
    3738void hal_gpt_enter_range(vaddr_t va, paddr_t pa, size_t n);
     39void hal_gpt_leave(vaddr_t va);
     40void hal_gpt_leave_range(vaddr_t va, size_t n);
    3841void hal_gpt_init(paddr_t firstpa);
    3942
  • trunk/hal/x86_64/hal_kentry.S

    r29 r45  
    3636        .type   hal_trap_entry, @function
    3737
     38        /*
     39         * General exceptions.
     40         */
    3841ASM_ENTRY(x86_trap00)
    3942        ZTRAPENTRY(T_DIVIDE)
     
    111114        ZTRAPENTRY(T_RESERVED)
    112115
     116        /*
     117         * LAPIC interrupts.
     118         */
     119ASM_ENTRY(x86_spurious)
     120        ZTRAPENTRY(T_ASTFLT)
     121
     122
     123
    113124/*
    114125 * Arguments pushed on the stack:
     
    128139        .data
    129140        .globl  x86_traps
     141        .globl  x86_intrs
    130142        .type   x86_traps, @object
     143        .type   x86_intrs, @object
    131144
    132145        .align  64
     
    149162        .quad   x86_trap1e, x86_trap1f
    150163
     164x86_intrs:
     165        .quad   x86_spurious
     166
  • trunk/hal/x86_64/hal_segmentation.h

    r31 r45  
    191191 * Entries in the Interrupt Descriptor Table (IDT)
    192192 */
    193 #define NCPUIDT 32      /* reserved entries for CPU exceptions */
     193#define CPUVEC_MIN      0
     194#define CPUVEC_MAX      32      /* reserved entries for CPU exceptions */
     195#define LAPICVEC_MIN    CPUVEC_MAX
     196#define LAPICVEC_MAX    (LAPICVEC_MIN + 1)
     197
    194198#define NIDT    256     /* total number of IDT entries */
    195199
Note: See TracChangeset for help on using the changeset viewer.