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);
 | 
						|
}
 |