File Index
Files and directories
Sign in
FILE

check_initial_reg_state.c

File preview with syntax highlighting.

linux-6.19.14/tools/testing/selftests/x86/check_initial_reg_state.c C
  1// SPDX-License-Identifier: GPL-2.0-only
  2/*
  3 * check_initial_reg_state.c - check that execve sets the correct state
  4 * Copyright (c) 2014-2016 Andrew Lutomirski
  5 */
  6
  7#define _GNU_SOURCE
  8
  9#include <stdio.h>
 10
 11unsigned long ax, bx, cx, dx, si, di, bp, sp, flags;
 12unsigned long r8, r9, r10, r11, r12, r13, r14, r15;
 13
 14asm (
 15	".pushsection .text\n\t"
 16	".type real_start, @function\n\t"
 17	".global real_start\n\t"
 18	"real_start:\n\t"
 19#ifdef __x86_64__
 20	"mov %rax, ax\n\t"
 21	"mov %rbx, bx\n\t"
 22	"mov %rcx, cx\n\t"
 23	"mov %rdx, dx\n\t"
 24	"mov %rsi, si\n\t"
 25	"mov %rdi, di\n\t"
 26	"mov %rbp, bp\n\t"
 27	"mov %rsp, sp\n\t"
 28	"mov %r8, r8\n\t"
 29	"mov %r9, r9\n\t"
 30	"mov %r10, r10\n\t"
 31	"mov %r11, r11\n\t"
 32	"mov %r12, r12\n\t"
 33	"mov %r13, r13\n\t"
 34	"mov %r14, r14\n\t"
 35	"mov %r15, r15\n\t"
 36	"pushfq\n\t"
 37	"popq flags\n\t"
 38#else
 39	"mov %eax, ax\n\t"
 40	"mov %ebx, bx\n\t"
 41	"mov %ecx, cx\n\t"
 42	"mov %edx, dx\n\t"
 43	"mov %esi, si\n\t"
 44	"mov %edi, di\n\t"
 45	"mov %ebp, bp\n\t"
 46	"mov %esp, sp\n\t"
 47	"pushfl\n\t"
 48	"popl flags\n\t"
 49#endif
 50	"jmp _start\n\t"
 51	".size real_start, . - real_start\n\t"
 52	".popsection");
 53
 54int main()
 55{
 56	int nerrs = 0;
 57
 58	if (sp == 0) {
 59		printf("[FAIL]\tTest was built incorrectly\n");
 60		return 1;
 61	}
 62
 63	if (ax || bx || cx || dx || si || di || bp
 64#ifdef __x86_64__
 65	    || r8 || r9 || r10 || r11 || r12 || r13 || r14 || r15
 66#endif
 67		) {
 68		printf("[FAIL]\tAll GPRs except SP should be 0\n");
 69#define SHOW(x) printf("\t" #x " = 0x%lx\n", x);
 70		SHOW(ax);
 71		SHOW(bx);
 72		SHOW(cx);
 73		SHOW(dx);
 74		SHOW(si);
 75		SHOW(di);
 76		SHOW(bp);
 77		SHOW(sp);
 78#ifdef __x86_64__
 79		SHOW(r8);
 80		SHOW(r9);
 81		SHOW(r10);
 82		SHOW(r11);
 83		SHOW(r12);
 84		SHOW(r13);
 85		SHOW(r14);
 86		SHOW(r15);
 87#endif
 88		nerrs++;
 89	} else {
 90		printf("[OK]\tAll GPRs except SP are 0\n");
 91	}
 92
 93	if (flags != 0x202) {
 94		printf("[FAIL]\tFLAGS is 0x%lx, but it should be 0x202\n", flags);
 95		nerrs++;
 96	} else {
 97		printf("[OK]\tFLAGS is 0x202\n");
 98	}
 99
100	return nerrs ? 1 : 0;
101}
~/ Read-only file preview.