fixed invalid Linux asm/unistd.h header for PowerPC and gcc 3.3
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@367 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
		
							parent
							
								
									2573109866
								
							
						
					
					
						commit
						70a194b930
					
				@ -68,6 +68,129 @@
 | 
			
		||||
#define	VFAT_IOCTL_READDIR_BOTH		_IOR('r', 1, struct dirent [2])
 | 
			
		||||
#define	VFAT_IOCTL_READDIR_SHORT	_IOR('r', 2, struct dirent [2])
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#if defined(__powerpc__)
 | 
			
		||||
#undef __syscall_nr
 | 
			
		||||
#undef __sc_loadargs_0
 | 
			
		||||
#undef __sc_loadargs_1
 | 
			
		||||
#undef __sc_loadargs_2
 | 
			
		||||
#undef __sc_loadargs_3
 | 
			
		||||
#undef __sc_loadargs_4
 | 
			
		||||
#undef __sc_loadargs_5
 | 
			
		||||
#undef __sc_asm_input_0
 | 
			
		||||
#undef __sc_asm_input_1
 | 
			
		||||
#undef __sc_asm_input_2
 | 
			
		||||
#undef __sc_asm_input_3
 | 
			
		||||
#undef __sc_asm_input_4
 | 
			
		||||
#undef __sc_asm_input_5
 | 
			
		||||
#undef _syscall0
 | 
			
		||||
#undef _syscall1
 | 
			
		||||
#undef _syscall2
 | 
			
		||||
#undef _syscall3
 | 
			
		||||
#undef _syscall4
 | 
			
		||||
#undef _syscall5
 | 
			
		||||
 | 
			
		||||
/* need to redefine syscalls as Linux kernel defines are incorrect for
 | 
			
		||||
   the clobber list */
 | 
			
		||||
/* On powerpc a system call basically clobbers the same registers like a
 | 
			
		||||
 * function call, with the exception of LR (which is needed for the
 | 
			
		||||
 * "sc; bnslr" sequence) and CR (where only CR0.SO is clobbered to signal
 | 
			
		||||
 * an error return status).
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define __syscall_nr(nr, type, name, args...)				\
 | 
			
		||||
	unsigned long __sc_ret, __sc_err;				\
 | 
			
		||||
	{								\
 | 
			
		||||
		register unsigned long __sc_0  __asm__ ("r0");		\
 | 
			
		||||
		register unsigned long __sc_3  __asm__ ("r3");		\
 | 
			
		||||
		register unsigned long __sc_4  __asm__ ("r4");		\
 | 
			
		||||
		register unsigned long __sc_5  __asm__ ("r5");		\
 | 
			
		||||
		register unsigned long __sc_6  __asm__ ("r6");		\
 | 
			
		||||
		register unsigned long __sc_7  __asm__ ("r7");		\
 | 
			
		||||
									\
 | 
			
		||||
		__sc_loadargs_##nr(name, args);				\
 | 
			
		||||
		__asm__ __volatile__					\
 | 
			
		||||
			("sc           \n\t"				\
 | 
			
		||||
			 "mfcr %0      "				\
 | 
			
		||||
			: "=&r" (__sc_0),				\
 | 
			
		||||
			  "=&r" (__sc_3),  "=&r" (__sc_4),		\
 | 
			
		||||
			  "=&r" (__sc_5),  "=&r" (__sc_6),		\
 | 
			
		||||
			  "=&r" (__sc_7)				\
 | 
			
		||||
			: __sc_asm_input_##nr				\
 | 
			
		||||
			: "cr0", "ctr", "memory",			\
 | 
			
		||||
			  "r8", "r9", "r10","r11", "r12");		\
 | 
			
		||||
		__sc_ret = __sc_3;					\
 | 
			
		||||
		__sc_err = __sc_0;					\
 | 
			
		||||
	}								\
 | 
			
		||||
	if (__sc_err & 0x10000000)					\
 | 
			
		||||
	{								\
 | 
			
		||||
		errno = __sc_ret;					\
 | 
			
		||||
		__sc_ret = -1;						\
 | 
			
		||||
	}								\
 | 
			
		||||
	return (type) __sc_ret
 | 
			
		||||
 | 
			
		||||
#define __sc_loadargs_0(name, dummy...)					\
 | 
			
		||||
	__sc_0 = __NR_##name
 | 
			
		||||
#define __sc_loadargs_1(name, arg1)					\
 | 
			
		||||
	__sc_loadargs_0(name);						\
 | 
			
		||||
	__sc_3 = (unsigned long) (arg1)
 | 
			
		||||
#define __sc_loadargs_2(name, arg1, arg2)				\
 | 
			
		||||
	__sc_loadargs_1(name, arg1);					\
 | 
			
		||||
	__sc_4 = (unsigned long) (arg2)
 | 
			
		||||
#define __sc_loadargs_3(name, arg1, arg2, arg3)				\
 | 
			
		||||
	__sc_loadargs_2(name, arg1, arg2);				\
 | 
			
		||||
	__sc_5 = (unsigned long) (arg3)
 | 
			
		||||
#define __sc_loadargs_4(name, arg1, arg2, arg3, arg4)			\
 | 
			
		||||
	__sc_loadargs_3(name, arg1, arg2, arg3);			\
 | 
			
		||||
	__sc_6 = (unsigned long) (arg4)
 | 
			
		||||
#define __sc_loadargs_5(name, arg1, arg2, arg3, arg4, arg5)		\
 | 
			
		||||
	__sc_loadargs_4(name, arg1, arg2, arg3, arg4);			\
 | 
			
		||||
	__sc_7 = (unsigned long) (arg5)
 | 
			
		||||
 | 
			
		||||
#define __sc_asm_input_0 "0" (__sc_0)
 | 
			
		||||
#define __sc_asm_input_1 __sc_asm_input_0, "1" (__sc_3)
 | 
			
		||||
#define __sc_asm_input_2 __sc_asm_input_1, "2" (__sc_4)
 | 
			
		||||
#define __sc_asm_input_3 __sc_asm_input_2, "3" (__sc_5)
 | 
			
		||||
#define __sc_asm_input_4 __sc_asm_input_3, "4" (__sc_6)
 | 
			
		||||
#define __sc_asm_input_5 __sc_asm_input_4, "5" (__sc_7)
 | 
			
		||||
 | 
			
		||||
#define _syscall0(type,name)						\
 | 
			
		||||
type name(void)								\
 | 
			
		||||
{									\
 | 
			
		||||
	__syscall_nr(0, type, name);					\
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define _syscall1(type,name,type1,arg1)					\
 | 
			
		||||
type name(type1 arg1)							\
 | 
			
		||||
{									\
 | 
			
		||||
	__syscall_nr(1, type, name, arg1);				\
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define _syscall2(type,name,type1,arg1,type2,arg2)			\
 | 
			
		||||
type name(type1 arg1, type2 arg2)					\
 | 
			
		||||
{									\
 | 
			
		||||
	__syscall_nr(2, type, name, arg1, arg2);			\
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3)		\
 | 
			
		||||
type name(type1 arg1, type2 arg2, type3 arg3)				\
 | 
			
		||||
{									\
 | 
			
		||||
	__syscall_nr(3, type, name, arg1, arg2, arg3);			\
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \
 | 
			
		||||
type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4)		\
 | 
			
		||||
{									\
 | 
			
		||||
	__syscall_nr(4, type, name, arg1, arg2, arg3, arg4);		\
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,type5,arg5) \
 | 
			
		||||
type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5)	\
 | 
			
		||||
{									\
 | 
			
		||||
	__syscall_nr(5, type, name, arg1, arg2, arg3, arg4, arg5);	\
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define __NR_sys_uname __NR_uname
 | 
			
		||||
#define __NR_sys_getcwd1 __NR_getcwd
 | 
			
		||||
#define __NR_sys_statfs __NR_statfs
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user