forked from Minki/linux
2025cf9e19
Based on 1 normalized pattern(s): 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 extracted by the scancode license scanner the SPDX license identifier GPL-2.0-only has been chosen to replace the boilerplate/reference in 263 file(s). Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Reviewed-by: Allison Randal <allison@lohutok.net> Reviewed-by: Alexios Zavras <alexios.zavras@intel.com> Cc: linux-spdx@vger.kernel.org Link: https://lkml.kernel.org/r/20190529141901.208660670@linutronix.de Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
102 lines
1.9 KiB
C
102 lines
1.9 KiB
C
// SPDX-License-Identifier: GPL-2.0-only
|
|
/*
|
|
* check_initial_reg_state.c - check that execve sets the correct state
|
|
* Copyright (c) 2014-2016 Andrew Lutomirski
|
|
*/
|
|
|
|
#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;
|
|
}
|