]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: check and fail early with a message if MMX is not available on 386
authorShenghou Ma <minux@golang.org>
Sat, 17 Oct 2015 21:46:25 +0000 (17:46 -0400)
committerBrad Fitzpatrick <bradfitz@golang.org>
Sat, 5 Dec 2015 17:43:51 +0000 (17:43 +0000)
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>

src/runtime/asm_386.s

index 3dcb026f0c474677aa124e375333239992e821d7..c5f0c5156643e05ce663cd952314da4e08cdd9ff 100644 (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