Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-only
0002 /*
0003  * check_initial_reg_state.c - check that execve sets the correct state
0004  * Copyright (c) 2014-2016 Andrew Lutomirski
0005  */
0006 
0007 #define _GNU_SOURCE
0008 
0009 #include <stdio.h>
0010 
0011 unsigned long ax, bx, cx, dx, si, di, bp, sp, flags;
0012 unsigned long r8, r9, r10, r11, r12, r13, r14, r15;
0013 
0014 asm (
0015     ".pushsection .text\n\t"
0016     ".type real_start, @function\n\t"
0017     ".global real_start\n\t"
0018     "real_start:\n\t"
0019 #ifdef __x86_64__
0020     "mov %rax, ax\n\t"
0021     "mov %rbx, bx\n\t"
0022     "mov %rcx, cx\n\t"
0023     "mov %rdx, dx\n\t"
0024     "mov %rsi, si\n\t"
0025     "mov %rdi, di\n\t"
0026     "mov %rbp, bp\n\t"
0027     "mov %rsp, sp\n\t"
0028     "mov %r8, r8\n\t"
0029     "mov %r9, r9\n\t"
0030     "mov %r10, r10\n\t"
0031     "mov %r11, r11\n\t"
0032     "mov %r12, r12\n\t"
0033     "mov %r13, r13\n\t"
0034     "mov %r14, r14\n\t"
0035     "mov %r15, r15\n\t"
0036     "pushfq\n\t"
0037     "popq flags\n\t"
0038 #else
0039     "mov %eax, ax\n\t"
0040     "mov %ebx, bx\n\t"
0041     "mov %ecx, cx\n\t"
0042     "mov %edx, dx\n\t"
0043     "mov %esi, si\n\t"
0044     "mov %edi, di\n\t"
0045     "mov %ebp, bp\n\t"
0046     "mov %esp, sp\n\t"
0047     "pushfl\n\t"
0048     "popl flags\n\t"
0049 #endif
0050     "jmp _start\n\t"
0051     ".size real_start, . - real_start\n\t"
0052     ".popsection");
0053 
0054 int main()
0055 {
0056     int nerrs = 0;
0057 
0058     if (sp == 0) {
0059         printf("[FAIL]\tTest was built incorrectly\n");
0060         return 1;
0061     }
0062 
0063     if (ax || bx || cx || dx || si || di || bp
0064 #ifdef __x86_64__
0065         || r8 || r9 || r10 || r11 || r12 || r13 || r14 || r15
0066 #endif
0067         ) {
0068         printf("[FAIL]\tAll GPRs except SP should be 0\n");
0069 #define SHOW(x) printf("\t" #x " = 0x%lx\n", x);
0070         SHOW(ax);
0071         SHOW(bx);
0072         SHOW(cx);
0073         SHOW(dx);
0074         SHOW(si);
0075         SHOW(di);
0076         SHOW(bp);
0077         SHOW(sp);
0078 #ifdef __x86_64__
0079         SHOW(r8);
0080         SHOW(r9);
0081         SHOW(r10);
0082         SHOW(r11);
0083         SHOW(r12);
0084         SHOW(r13);
0085         SHOW(r14);
0086         SHOW(r15);
0087 #endif
0088         nerrs++;
0089     } else {
0090         printf("[OK]\tAll GPRs except SP are 0\n");
0091     }
0092 
0093     if (flags != 0x202) {
0094         printf("[FAIL]\tFLAGS is 0x%lx, but it should be 0x202\n", flags);
0095         nerrs++;
0096     } else {
0097         printf("[OK]\tFLAGS is 0x202\n");
0098     }
0099 
0100     return nerrs ? 1 : 0;
0101 }