Skip to content

Commit 044a508

Browse files
authored
kernel: add avx support (#75)
1 parent 7cdf539 commit 044a508

File tree

4 files changed

+67
-6
lines changed

4 files changed

+67
-6
lines changed

kernel/asm_amd64.s

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,21 @@ TEXT ·sseInit(SB), NOSPLIT, $0
3535
MOVL AX, CR4
3636
RET
3737

38+
TEXT ·avxInit(SB), NOSPLIT, $0
39+
// enable XGETBV and XSETBV
40+
MOVL CR4, AX
41+
ORL $1<<18, AX
42+
MOVL AX, CR4
43+
44+
// enable avx
45+
XORQ CX, CX
46+
XGETBV
47+
48+
ORQ $7, AX
49+
XORQ CX, CX
50+
XSETBV
51+
RET
52+
3853
TEXT ·rdmsr(SB), NOSPLIT, $0-16
3954
MOVL reg+0(FP), CX
4055
RDMSR
@@ -55,3 +70,12 @@ TEXT ·getg(SB), NOSPLIT, $0-8
5570
MOVQ BX, ret+0(FP)
5671
RET
5772

73+
TEXT ·cpuid(SB), NOSPLIT, $0-24
74+
MOVL fn+0(FP), AX
75+
MOVL cx+4(FP), CX
76+
CPUID
77+
MOVL AX, eax+8(FP)
78+
MOVL BX, ebx+12(FP)
79+
MOVL CX, ecx+16(FP)
80+
MOVL DX, edx+20(FP)
81+
RET

kernel/rt0.go

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,6 @@ func rt0()
1313
//go:nosplit
1414
func go_entry()
1515

16-
//go:nosplit
17-
func sseInit()
18-
1916
//go:nosplit
2017
func wrmsr(reg uint32, value uintptr)
2118

@@ -24,7 +21,7 @@ func rdmsr(reg uint32) (value uintptr)
2421

2522
//go:nosplit
2623
func preinit(magic, mbiptr uintptr) {
27-
sseInit()
24+
simdInit()
2825
gdtInit()
2926
idtInit()
3027
multiboot.Init(magic, mbiptr)

kernel/simd.go

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package kernel
2+
3+
const (
4+
_CPUID_ECX_XSAVE = 1 << 26
5+
_CPUID_ECX_AVX = 1 << 28
6+
_CPUID_EBX_AVX2 = 1 << 5
7+
8+
_CPUID_FN_STD = 0x00000001
9+
_CPUID_FN_EXT = 0x80000001
10+
)
11+
12+
//go:nosplit
13+
func sseInit()
14+
15+
//go:nosplit
16+
func avxInit()
17+
18+
//go:nosplit
19+
func cpuid(fn, cx uint32) (eax, ebx, ecx, edx uint32)
20+
21+
//go:nosplit
22+
func simdInit() {
23+
sseInit()
24+
25+
// init for avx
26+
// first check avx function
27+
_, _, ecx, _ := cpuid(_CPUID_FN_STD, 0)
28+
if ecx&_CPUID_ECX_XSAVE == 0 {
29+
return
30+
}
31+
if ecx&_CPUID_ECX_AVX == 0 {
32+
return
33+
}
34+
_, ebx, _, _ := cpuid(0x0007, 0)
35+
if ebx&_CPUID_EBX_AVX2 == 0 {
36+
return
37+
}
38+
// all check passed, init avx
39+
avxInit()
40+
}

magefile.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ func Graphic() error {
135135
detectQemu()
136136

137137
mg.Deps(Iso)
138-
return eggrun(QEMU_OPT, "-k", "eggos.iso")
138+
return eggrun(QEMU_OPT, "eggos.iso")
139139
}
140140

141141
// GraphicDebug run eggos.iso on qemu in debug mode.
@@ -144,7 +144,7 @@ func GraphicDebug() error {
144144

145145
GOGCFLAGS += " -N -l"
146146
mg.Deps(Iso)
147-
return eggrun(QEMU_DEBUG_OPT, "-k", "eggos.iso")
147+
return eggrun(QEMU_DEBUG_OPT, "eggos.iso")
148148
}
149149

150150
func Egg() error {

0 commit comments

Comments
 (0)