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;
|
|
}
|