linux/tools/testing/selftests/x86/check_initial_reg_state.c
<<
>>
Prefs
   1/*
   2 * check_initial_reg_state.c - check that execve sets the correct state
   3 * Copyright (c) 2014-2016 Andrew Lutomirski
   4 *
   5 * This program is free software; you can redistribute it and/or modify
   6 * it under the terms and conditions of the GNU General Public License,
   7 * version 2, as published by the Free Software Foundation.
   8 *
   9 * This program is distributed in the hope it will be useful, but
  10 * WITHOUT ANY WARRANTY; without even the implied warranty of
  11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  12 * General Public License for more details.
  13 */
  14
  15#define _GNU_SOURCE
  16
  17#include <stdio.h>
  18
  19unsigned long ax, bx, cx, dx, si, di, bp, sp, flags;
  20unsigned long r8, r9, r10, r11, r12, r13, r14, r15;
  21
  22asm (
  23        ".pushsection .text\n\t"
  24        ".type real_start, @function\n\t"
  25        ".global real_start\n\t"
  26        "real_start:\n\t"
  27#ifdef __x86_64__
  28        "mov %rax, ax\n\t"
  29        "mov %rbx, bx\n\t"
  30        "mov %rcx, cx\n\t"
  31        "mov %rdx, dx\n\t"
  32        "mov %rsi, si\n\t"
  33        "mov %rdi, di\n\t"
  34        "mov %rbp, bp\n\t"
  35        "mov %rsp, sp\n\t"
  36        "mov %r8, r8\n\t"
  37        "mov %r9, r9\n\t"
  38        "mov %r10, r10\n\t"
  39        "mov %r11, r11\n\t"
  40        "mov %r12, r12\n\t"
  41        "mov %r13, r13\n\t"
  42        "mov %r14, r14\n\t"
  43        "mov %r15, r15\n\t"
  44        "pushfq\n\t"
  45        "popq flags\n\t"
  46#else
  47        "mov %eax, ax\n\t"
  48        "mov %ebx, bx\n\t"
  49        "mov %ecx, cx\n\t"
  50        "mov %edx, dx\n\t"
  51        "mov %esi, si\n\t"
  52        "mov %edi, di\n\t"
  53        "mov %ebp, bp\n\t"
  54        "mov %esp, sp\n\t"
  55        "pushfl\n\t"
  56        "popl flags\n\t"
  57#endif
  58        "jmp _start\n\t"
  59        ".size real_start, . - real_start\n\t"
  60        ".popsection");
  61
  62int main()
  63{
  64        int nerrs = 0;
  65
  66        if (sp == 0) {
  67                printf("[FAIL]\tTest was built incorrectly\n");
  68                return 1;
  69        }
  70
  71        if (ax || bx || cx || dx || si || di || bp
  72#ifdef __x86_64__
  73            || r8 || r9 || r10 || r11 || r12 || r13 || r14 || r15
  74#endif
  75                ) {
  76                printf("[FAIL]\tAll GPRs except SP should be 0\n");
  77#define SHOW(x) printf("\t" #x " = 0x%lx\n", x);
  78                SHOW(ax);
  79                SHOW(bx);
  80                SHOW(cx);
  81                SHOW(dx);
  82                SHOW(si);
  83                SHOW(di);
  84                SHOW(bp);
  85                SHOW(sp);
  86#ifdef __x86_64__
  87                SHOW(r8);
  88                SHOW(r9);
  89                SHOW(r10);
  90                SHOW(r11);
  91                SHOW(r12);
  92                SHOW(r13);
  93                SHOW(r14);
  94                SHOW(r15);
  95#endif
  96                nerrs++;
  97        } else {
  98                printf("[OK]\tAll GPRs except SP are 0\n");
  99        }
 100
 101        if (flags != 0x202) {
 102                printf("[FAIL]\tFLAGS is 0x%lx, but it should be 0x202\n", flags);
 103                nerrs++;
 104        } else {
 105                printf("[OK]\tFLAGS is 0x202\n");
 106        }
 107
 108        return nerrs ? 1 : 0;
 109}
 110