#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <syscall.h>

#include <sys/syscall.h>

#include <asm/page.h>

#define __NR_sys_read __NR_read
#define __NR_sys_kill __NR_kill
#define __NR_sys_getpid __NR_getpid


char stack[4096 * 6];
static int errno;

inline pid_t sys_getpid() {
    __asm__ __volatile("int $0x80" : : "a"(__NR_sys_getpid));
}

inline ssize_t sys_read(int fd, void *buf, size_t count) {
    __asm__ __volatile("int $0x80" : : "a"(__NR_sys_read), "b"(fd), "c"(buf), "d"(count));
}

inline int sys_kill(pid_t pid, int sig) {
    __asm__ __volatile("int $0x80" : : "a"(__NR_sys_kill), "b"(pid), "c"(sig));
}


// inline _syscall3(int, sys_read, int, a, void*, b, int, l);
// inline _syscall2(int, sys_kill, int, c, int, a);
// inline _syscall0(int, sys_getpid);


// yeah, lets do it
void killme()
{
char c='a';
int pid;

        pid = sys_getpid();
        for(;;) {
                sys_read(0, &c, 1);
                sys_kill(pid, 11);
        }
}


// safe stack stub
__asm__(
        " nop \n"
        "_start: movl \$0xbfff6ffc, %esp \n"
        " jmp killme \n"
        ".global _start \n"
);
