]> git.lizzy.rs Git - plan9front.git/blobdiff - sys/src/9/pc/l.s
[9front] [PATCH] audiohda: add PCI ID for Intel C610/X99
[plan9front.git] / sys / src / 9 / pc / l.s
index 955c0fd93ba23af42ee17cb590a5bd2ecb6a459c..ede492af8847fe137a379ffc362b0ac2f5dfd379 100644 (file)
@@ -42,8 +42,8 @@ TEXT _startKADDR(SB), $0
  */
 TEXT _multibootheader(SB), $0
        LONG    $0x1BADB002                     /* magic */
-       LONG    $0x00010003                     /* flags */
-       LONG    $-(0x1BADB002 + 0x00010003)     /* checksum */
+       LONG    $0x00010007                     /* flags */
+       LONG    $-(0x1BADB002 + 0x00010007)     /* checksum */
        LONG    $_multibootheader-KZERO(SB)     /* header_addr */
        LONG    $_startKADDR-KZERO(SB)          /* load_addr */
        LONG    $edata-KZERO(SB)                /* load_end_addr */
@@ -52,7 +52,7 @@ TEXT _multibootheader(SB), $0
        LONG    $0                              /* mode_type */
        LONG    $0                              /* width */
        LONG    $0                              /* height */
-       LONG    $                             /* depth */
+       LONG    $32                             /* depth */
 
 /* 
  * the kernel expects the data segment to be page-aligned
@@ -70,14 +70,12 @@ TEXT _multibootentry(SB), $0
        INCL    CX      /* one more for post decrement */
        STD
        REP; MOVSB
-       ADDL    $KZERO, BX
-       MOVL    BX, multiboot-KZERO(SB)
-       MOVL    $_startPADDR(SB), AX
-       ANDL    $~KZERO, AX
+       MOVL    BX, multibootptr-KZERO(SB)
+       MOVL    $_startPADDR-KZERO(SB), AX
        JMP*    AX
 
-/* multiboot structure pointer */
-TEXT multiboot(SB), $0
+/* multiboot structure pointer (physical address) */
+TEXT multibootptr(SB), $0
        LONG    $0
 
 /*
@@ -99,8 +97,7 @@ TEXT _startPADDR(SB), $0
        CLI                                     /* make sure interrupts are off */
 
        /* set up the gdt so we have sane plan 9 style gdts. */
-       MOVL    $tgdtptr(SB), AX
-       ANDL    $~KZERO, AX
+       MOVL    $tgdtptr-KZERO(SB), AX
        MOVL    (AX), GDTR
        MOVW    $1, AX
        MOVW    AX, MSW
@@ -147,21 +144,11 @@ TEXT tgdtptr(SB), $0
        WORD    $(3*8)
        LONG    $tgdt-KZERO(SB)
 
-TEXT m0rgdtptr(SB), $0
-       WORD    $(NGDT*8-1)
-       LONG    $(CPU0GDT-KZERO)
-
-TEXT m0gdtptr(SB), $0
-       WORD    $(NGDT*8-1)
-       LONG    $CPU0GDT
-
-TEXT m0idtptr(SB), $0
-       WORD $(256*8-1)
-       LONG $IDTADDR
+TEXT vtgdtptr(SB), $0
+       WORD    $(3*8)
+       LONG    $tgdt(SB)
 
 TEXT mode32bit(SB), $0
-       /* At this point, the GDT setup is done. */
-
        MOVL    $((CPU0END-CPU0PDB)>>2), CX
        MOVL    $PADDR(CPU0PDB), DI
        XORL    AX, AX
@@ -232,6 +219,9 @@ _setpte:
  * be initialised here.
  */
 TEXT _startpg(SB), $0
+       MOVL    $vtgdtptr(SB), AX
+       MOVL    (AX), GDTR
+
        MOVL    $0, (PDO(0))(CX)                /* undo double-map of KZERO at 0 */
        MOVL    CX, CR3                         /* load and flush the mmu */
 
@@ -437,6 +427,11 @@ TEXT getcr2(SB), $0                                /* CR2 - page fault linear address */
        MOVL    CR2, AX
        RET
 
+TEXT putcr2(SB), $0
+       MOVL    cr2+0(FP), AX
+       MOVL    AX, CR2
+       RET
+
 TEXT getcr3(SB), $0                            /* CR3 - page directory base */
        MOVL    CR3, AX
        RET
@@ -507,6 +502,17 @@ TEXT _wrmsrinst(SB), $0
        MOVL    BP, AX                          /* BP set to -1 if traped */
        RET
 
+/* fault-proof memcpy */
+TEXT peek(SB), $0
+       MOVL    src+0(FP), SI
+       MOVL    dst+4(FP), DI
+       MOVL    cnt+8(FP), CX
+       CLD
+TEXT _peekinst(SB), $0
+       REP; MOVSB
+       MOVL    CX, AX
+       RET
+
 /*
  * Try to determine the CPU type which requires fiddling with EFLAGS.
  * If the Id bit can be toggled then the CPUID instruction can be used
@@ -514,7 +520,7 @@ TEXT _wrmsrinst(SB), $0
  * a 386 (Ac bit can't be set). If it's not a 386 and the Id bit can't be
  * toggled then it's an older 486 of some kind.
  *
- *     cpuid(fun, regs[4]);
+ *     cpuid(fn, sublvl, regs[4]);
  */
 TEXT cpuid(SB), $0
        MOVL    $0x240000, AX
@@ -533,6 +539,7 @@ TEXT cpuid(SB), $0
        TESTL   $0x200000, AX                   /* Id */
        JZ      _cpu486                         /* can't toggle this bit on some 486 */
        MOVL    fn+0(FP), AX
+       MOVL    sublvl+4(FP), CX
        CPUID
        JMP     _cpuid
 _cpu486:
@@ -549,7 +556,7 @@ _zaprest:
        XORL    CX, CX
        XORL    DX, DX
 _cpuid:
-       MOVL    regs+4(FP), BP
+       MOVL    regs+8(FP), BP
        MOVL    AX, 0(BP)
        MOVL    BX, 4(BP)
        MOVL    CX, 8(BP)
@@ -618,13 +625,13 @@ TEXT fpclear(SB), $0                              /* clear pending exceptions */
        FPOFF
        RET
 
-TEXT fpssesave0(SB), $0                                /* save state and disable */
+TEXT fpssesave(SB), $0                         /* save state and disable */
        MOVL    p+0(FP), AX
        FXSAVE  0(AX)                           /* no WAIT */
        FPOFF
        RET
 
-TEXT fpsserestore0(SB), $0                     /* enable and restore state */
+TEXT fpsserestore(SB), $0                      /* enable and restore state */
        FPON
        MOVL    p+0(FP), AX
        FXRSTOR 0(AX)
@@ -910,8 +917,6 @@ TEXT vmlaunch(SB), $0
        MOVL    resume+4(FP), AX
        TESTL   AX, AX
        MOVL    ureg+0(FP), DI
-       MOVL    32(DI), AX
-       MOVL    AX, CR2
        MOVL    4(DI), SI
        MOVL    8(DI), BP
        MOVL    16(DI), BX
@@ -920,10 +925,10 @@ TEXT vmlaunch(SB), $0
        MOVL    28(DI), AX
        MOVL    0(DI), DI
        JNE     _vmresume
-       BYTE    $0x0f; BYTE $0x01; BYTE $0xc2 /* VMLAUNCH       */
+       BYTE    $0x0f; BYTE $0x01; BYTE $0xc2 /* VMLAUNCH */
        JMP     _vmout
 _vmresume:
-       BYTE    $0x0f; BYTE $0x01; BYTE $0xc3 /* VMRESUME       */
+       BYTE    $0x0f; BYTE $0x01; BYTE $0xc3 /* VMRESUME */
        JMP _vmout
 
 TEXT vmrestore(SB), $0
@@ -936,8 +941,6 @@ TEXT vmrestore(SB), $0
        MOVL    DX, 20(DI)
        MOVL    CX, 24(DI)
        MOVL    AX, 28(DI)
-       MOVL    CR2, AX
-       MOVL    AX, 32(DI)
        XORL    AX, AX
        RET