1
0
mirror of https://github.com/golang/go synced 2024-11-23 16:20:04 -07:00

runtime: check and fail early with a message if MMX is not available on 386

Fixes #12970.

Change-Id: Id0026e8274e071d65d47df63d65a93110abbec5d
Reviewed-on: https://go-review.googlesource.com/15998
Reviewed-by: Keith Randall <khr@golang.org>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
Shenghou Ma 2015-10-17 17:46:25 -04:00 committed by Brad Fitzpatrick
parent 4a2915052b
commit 35e84546d7

View File

@ -26,6 +26,32 @@ TEXT runtime·rt0_go(SB),NOSPLIT,$0
MOVL SP, (g_stack+stack_hi)(BP)
// find out information about the processor we're on
#ifdef GOOS_nacl // NaCl doesn't like PUSHFL/POPFL
JMP has_cpuid
#else
// first see if CPUID instruction is supported.
PUSHFL
PUSHFL
XORL $(1<<21), 0(SP) // flip ID bit
POPFL
PUSHFL
POPL AX
XORL 0(SP), AX
POPFL // restore EFLAGS
TESTL $(1<<21), AX
JNE has_cpuid
#endif
bad_proc: // show that the program requires MMX.
MOVL $2, 0(SP)
MOVL $bad_proc_msg<>(SB), 4(SP)
MOVL $0x3d, 8(SP)
CALL runtime·write(SB)
MOVL $1, 0(SP)
CALL runtime·exit(SB)
INT $3
has_cpuid:
MOVL $0, AX
CPUID
CMPL AX, $0
@ -48,6 +74,11 @@ notintel:
MOVL CX, AX // Move to global variable clobbers CX when generating PIC
MOVL AX, runtime·cpuid_ecx(SB)
MOVL DX, runtime·cpuid_edx(SB)
// Check for MMX support
TESTL $(1<<23), DX // MMX
JZ bad_proc
nocpuinfo:
// if there is an _cgo_init, call it to let it
@ -129,6 +160,17 @@ ok:
INT $3
RET
DATA bad_proc_msg<>+0x00(SB)/8, $"This pro"
DATA bad_proc_msg<>+0x08(SB)/8, $"gram can"
DATA bad_proc_msg<>+0x10(SB)/8, $" only be"
DATA bad_proc_msg<>+0x18(SB)/8, $" run on "
DATA bad_proc_msg<>+0x20(SB)/8, $"processe"
DATA bad_proc_msg<>+0x28(SB)/8, $"rs with "
DATA bad_proc_msg<>+0x30(SB)/8, $"MMX supp"
DATA bad_proc_msg<>+0x38(SB)/4, $"ort."
DATA bad_proc_msg<>+0x3c(SB)/1, $0xa
GLOBL bad_proc_msg<>(SB), RODATA, $0x3d
DATA runtime·mainPC+0(SB)/4,$runtime·main(SB)
GLOBL runtime·mainPC(SB),RODATA,$4