-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
selftests/x86: Add check_initial_reg_state()
This checks that ELF binaries are started with an appropriately blank register state. ( There's currently a nasty special case in the entry asm to arrange for this. I'm planning on removing the special case, and this will help make sure I don't break it. ) Signed-off-by: Andy Lutomirski <luto@kernel.org> Cc: Andy Lutomirski <luto@amacapital.net> Cc: Borislav Petkov <bp@alien8.de> Cc: Brian Gerst <brgerst@gmail.com> Cc: Denys Vlasenko <dvlasenk@redhat.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: H. Peter Anvin <hpa@zytor.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Thomas Gleixner <tglx@linutronix.de> Link: http://lkml.kernel.org/r/ef54f8d066b30a3eb36bbf26300eebb242185700.1454022279.git.luto@kernel.org Signed-off-by: Ingo Molnar <mingo@kernel.org>
- Loading branch information
Andy Lutomirski
authored and
Ingo Molnar
committed
Jan 29, 2016
1 parent
c31b342
commit e21d50f
Showing
2 changed files
with
117 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,109 @@ | ||
/* | ||
* check_initial_reg_state.c - check that execve sets the correct state | ||
* Copyright (c) 2014-2016 Andrew Lutomirski | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms and conditions of the GNU General Public License, | ||
* version 2, as published by the Free Software Foundation. | ||
* | ||
* This program is distributed in the hope it will be useful, but | ||
* WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
* General Public License for more details. | ||
*/ | ||
|
||
#define _GNU_SOURCE | ||
|
||
#include <stdio.h> | ||
|
||
unsigned long ax, bx, cx, dx, si, di, bp, sp, flags; | ||
unsigned long r8, r9, r10, r11, r12, r13, r14, r15; | ||
|
||
asm ( | ||
".pushsection .text\n\t" | ||
".type real_start, @function\n\t" | ||
".global real_start\n\t" | ||
"real_start:\n\t" | ||
#ifdef __x86_64__ | ||
"mov %rax, ax\n\t" | ||
"mov %rbx, bx\n\t" | ||
"mov %rcx, cx\n\t" | ||
"mov %rdx, dx\n\t" | ||
"mov %rsi, si\n\t" | ||
"mov %rdi, di\n\t" | ||
"mov %rbp, bp\n\t" | ||
"mov %rsp, sp\n\t" | ||
"mov %r8, r8\n\t" | ||
"mov %r9, r9\n\t" | ||
"mov %r10, r10\n\t" | ||
"mov %r11, r11\n\t" | ||
"mov %r12, r12\n\t" | ||
"mov %r13, r13\n\t" | ||
"mov %r14, r14\n\t" | ||
"mov %r15, r15\n\t" | ||
"pushfq\n\t" | ||
"popq flags\n\t" | ||
#else | ||
"mov %eax, ax\n\t" | ||
"mov %ebx, bx\n\t" | ||
"mov %ecx, cx\n\t" | ||
"mov %edx, dx\n\t" | ||
"mov %esi, si\n\t" | ||
"mov %edi, di\n\t" | ||
"mov %ebp, bp\n\t" | ||
"mov %esp, sp\n\t" | ||
"pushfl\n\t" | ||
"popl flags\n\t" | ||
#endif | ||
"jmp _start\n\t" | ||
".size real_start, . - real_start\n\t" | ||
".popsection"); | ||
|
||
int main() | ||
{ | ||
int nerrs = 0; | ||
|
||
if (sp == 0) { | ||
printf("[FAIL]\tTest was built incorrectly\n"); | ||
return 1; | ||
} | ||
|
||
if (ax || bx || cx || dx || si || di || bp | ||
#ifdef __x86_64__ | ||
|| r8 || r9 || r10 || r11 || r12 || r13 || r14 || r15 | ||
#endif | ||
) { | ||
printf("[FAIL]\tAll GPRs except SP should be 0\n"); | ||
#define SHOW(x) printf("\t" #x " = 0x%lx\n", x); | ||
SHOW(ax); | ||
SHOW(bx); | ||
SHOW(cx); | ||
SHOW(dx); | ||
SHOW(si); | ||
SHOW(di); | ||
SHOW(bp); | ||
SHOW(sp); | ||
#ifdef __x86_64__ | ||
SHOW(r8); | ||
SHOW(r9); | ||
SHOW(r10); | ||
SHOW(r11); | ||
SHOW(r12); | ||
SHOW(r13); | ||
SHOW(r14); | ||
SHOW(r15); | ||
#endif | ||
nerrs++; | ||
} else { | ||
printf("[OK]\tAll GPRs except SP are 0\n"); | ||
} | ||
|
||
if (flags != 0x202) { | ||
printf("[FAIL]\tFLAGS is 0x%lx, but it should be 0x202\n", flags); | ||
nerrs++; | ||
} else { | ||
printf("[OK]\tFLAGS is 0x202\n"); | ||
} | ||
|
||
return nerrs ? 1 : 0; | ||
} |