74 lines
2.3 KiB
Diff
74 lines
2.3 KiB
Diff
|
--- common/lib/modules/fglrx/build_mod/firegl_public.c 2006-12-18 10:58:15.000000000 -0500
|
||
|
+++ common/lib/modules/fglrx/build_mod/firegl_public.c 2006-12-18 11:14:04.000000000 -0500
|
||
|
@@ -181,6 +181,70 @@
|
||
|
int errno;
|
||
|
#endif // __ia64__
|
||
|
|
||
|
+#if defined(__i386__)
|
||
|
+#define __syscall_return(type, res) \
|
||
|
+do { \
|
||
|
+ if ((unsigned long)(res) >= (unsigned long)(-(128 + 1))) { \
|
||
|
+ errno = -(res); \
|
||
|
+ res = -1; \
|
||
|
+ } \
|
||
|
+ return (type) (res); \
|
||
|
+} while (0)
|
||
|
+#define _syscall2(type,name,type1,arg1,type2,arg2) \
|
||
|
+type name(type1 arg1,type2 arg2) \
|
||
|
+{ \
|
||
|
+long __res; \
|
||
|
+__asm__ volatile ("push %%ebx ; movl %2,%%ebx ; int $0x80 ; pop %%ebx" \
|
||
|
+ : "=a" (__res) \
|
||
|
+ : "0" (__NR_##name),"ri" ((long)(arg1)),"c" ((long)(arg2)) \
|
||
|
+ : "memory"); \
|
||
|
+__syscall_return(type,__res); \
|
||
|
+}
|
||
|
+
|
||
|
+#define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3) \
|
||
|
+type name(type1 arg1,type2 arg2,type3 arg3) \
|
||
|
+{ \
|
||
|
+long __res; \
|
||
|
+__asm__ volatile ("push %%ebx ; movl %2,%%ebx ; int $0x80 ; pop %%ebx" \
|
||
|
+ : "=a" (__res) \
|
||
|
+ : "0" (__NR_##name),"ri" ((long)(arg1)),"c" ((long)(arg2)), \
|
||
|
+ "d" ((long)(arg3)) : "memory"); \
|
||
|
+__syscall_return(type,__res); \
|
||
|
+}
|
||
|
+#elif defined(__x86_64__)
|
||
|
+#define __syscall_clobber "r11","rcx","memory"
|
||
|
+#define __syscall "syscall"
|
||
|
+
|
||
|
+#define __syscall_return(type, res) \
|
||
|
+do { \
|
||
|
+ if ((unsigned long)(res) >= (unsigned long)(-127)) { \
|
||
|
+ errno = -(res); \
|
||
|
+ res = -1; \
|
||
|
+ } \
|
||
|
+ return (type) (res); \
|
||
|
+} while (0)
|
||
|
+#define _syscall2(type,name,type1,arg1,type2,arg2) \
|
||
|
+type name(type1 arg1,type2 arg2) \
|
||
|
+{ \
|
||
|
+long __res; \
|
||
|
+__asm__ volatile (__syscall \
|
||
|
+ : "=a" (__res) \
|
||
|
+ : "0" (__NR_##name),"D" ((long)(arg1)),"S" ((long)(arg2)) : __syscall_clobber ); \
|
||
|
+__syscall_return(type,__res); \
|
||
|
+}
|
||
|
+
|
||
|
+#define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3) \
|
||
|
+type name(type1 arg1,type2 arg2,type3 arg3) \
|
||
|
+{ \
|
||
|
+long __res; \
|
||
|
+__asm__ volatile (__syscall \
|
||
|
+ : "=a" (__res) \
|
||
|
+ : "0" (__NR_##name),"D" ((long)(arg1)),"S" ((long)(arg2)), \
|
||
|
+ "d" ((long)(arg3)) : __syscall_clobber); \
|
||
|
+__syscall_return(type,__res); \
|
||
|
+}
|
||
|
+#endif
|
||
|
+
|
||
|
// int mlock(const void *addr, size_t len);
|
||
|
_syscall2(int, mlock, const void *, addr, size_t, len )
|
||
|
// int munlock(const void *addr, size_t len);
|