Changeset 45


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

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

Location:
trunk
Files:
2 added
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/Makefile.x86

    r36 r45  
    6363              build/kernel/hal/hal_kentry.o       \
    6464              build/kernel/hal/hal_acpi.o         \
     65              build/kernel/hal/hal_lapic.o        \
    6566              build/kernel/hal/x86_printf.o       \
    6667              build/kernel/hal/hal_special.o      \
     
    307308        $(DU) -D $@ > $@.txt
    308309
    309 build/kernel/hal/hal_init.o:    hal/x86_64/hal_init.c \
    310                                 hal/x86_64/hal_boot.h        \
    311                                 hal/x86_64/hal_multiboot.h   \
     310build/kernel/hal/hal_init.o:    hal/x86_64/hal_init.c         \
     311                                hal/x86_64/hal_boot.h         \
     312                                hal/x86_64/hal_multiboot.h    \
    312313                                hal/x86_64/hal_segmentation.h \
    313                                 kernel_config.h              \
     314                                hal/x86_64/hal_acpi.h         \
     315                                hal/x86_64/hal_lapic.h        \
     316                                hal/x86_64/hal_internal.h     \
     317                                kernel_config.h               \
    314318                                hal/x86_64/hal_types.h
    315319        $(CC) $(KERNEL_INCLUDE) $(CFLAGS) -c -o $@ $<
     
    342346build/kernel/hal/hal_acpi.o:    hal/x86_64/hal_acpi.c        \
    343347                                hal/x86_64/hal_acpi.h        \
     348                                kernel_config.h              \
     349                                hal/x86_64/hal_types.h
     350        $(CC) $(KERNEL_INCLUDE) $(CFLAGS) -c -o $@ $<
     351        $(DU) -D $@ > $@.txt
     352
     353build/kernel/hal/hal_lapic.o:   hal/x86_64/hal_lapic.c       \
     354                                hal/x86_64/hal_lapic.h       \
    344355                                kernel_config.h              \
    345356                                hal/x86_64/hal_types.h
  • 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.