while others dislike them being extra commits, let's clean them up once and for all for the existing code. If it's ugly, let it only be ugly once :-) Signed-off-by: Stefan Reinauer <stepan@coresystems.de> Acked-by: Stefan Reinauer <stepan@coresystems.de> git-svn-id: svn://svn.coreboot.org/coreboot/trunk@5507 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
		
			
				
	
	
		
			70 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			70 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| struct syscall_result {
 | |
| 	long val;
 | |
| 	int errno;
 | |
| };
 | |
| 
 | |
| static struct syscall_result syscall_return(long result)
 | |
| {
 | |
| 	struct syscall_result res;
 | |
| 	if (((unsigned long)result) >= ((unsigned long)-125)) {
 | |
| 		res.errno = - result;
 | |
| 		res.val = -1;
 | |
| 	} else {
 | |
| 		res.errno = 0;
 | |
| 		res.val = result;
 | |
| 	}
 | |
| 	return res;
 | |
| }
 | |
| static struct syscall_result syscall1(unsigned long nr, unsigned long arg1)
 | |
| {
 | |
| 	long res;
 | |
| 	asm volatile(
 | |
| 		"int $0x80"
 | |
| 		: "=a" (res)
 | |
| 		: "a" (nr), "b" (arg1));
 | |
| 	return syscall_return(res);
 | |
| 
 | |
| }
 | |
| 
 | |
| static struct syscall_result syscall3(unsigned long nr, unsigned long arg1, unsigned long arg2,
 | |
| 	unsigned long arg3)
 | |
| {
 | |
| 	long res;
 | |
| 	asm volatile(
 | |
| 		"int $0x80"
 | |
| 		: "=a" (res)
 | |
| 		: "a" (nr), "b" (arg1), "c" (arg2), "d" (arg3));
 | |
| 	return syscall_return(res);
 | |
| 
 | |
| }
 | |
| 
 | |
| #define NR_exit                 1
 | |
| #define NR_write                4
 | |
| /* Standard file descriptors */
 | |
| #define STDIN_FILENO    0  /* Standard input */
 | |
| #define STDOUT_FILENO   1  /* Standard output */
 | |
| #define STDERR_FILENO   2  /* Standard error output */
 | |
| 
 | |
| typedef long ssize_t;
 | |
| typedef unsigned long size_t;
 | |
| 
 | |
| static ssize_t write(int fd, const void *buf, size_t count)
 | |
| {
 | |
| 	struct syscall_result res;
 | |
| 	res = syscall3(NR_write, fd, (unsigned long)buf, count);
 | |
| 	return res.val;
 | |
| }
 | |
| 
 | |
| static void _exit(int status)
 | |
| {
 | |
| 	struct syscall_result res;
 | |
| 	res = syscall1(NR_exit, status);
 | |
| }
 | |
| 
 | |
| static void main(void)
 | |
| {
 | |
| 	static const char msg[] = "hello world\r\n";
 | |
| 	write(STDOUT_FILENO, msg, sizeof(msg));
 | |
| 	_exit(0);
 | |
| }
 |