syscall_arch.h 6.1 KB
Newer Older
R
Rich Felker 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
#define __SYSCALL_LL_E(x) (x)
#define __SYSCALL_LL_O(x) (x)

#define SYSCALL_RLIM_INFINITY (-1UL/2)

#include <sys/stat.h>
struct kernel_stat {
	unsigned int st_dev;
	unsigned int __pad1[3];
	unsigned long long st_ino;
	unsigned int st_mode;
	unsigned int st_nlink;
	int st_uid;
	int st_gid;
	unsigned int st_rdev;
	unsigned int __pad2[3];
	long long st_size;
	unsigned int st_atime_sec;
	unsigned int st_atime_nsec;
	unsigned int st_mtime_sec;
	unsigned int st_mtime_nsec;
	unsigned int st_ctime_sec;
	unsigned int st_ctime_nsec;
	unsigned int st_blksize;
	unsigned int __pad3;
	unsigned long long st_blocks;
};

static void __stat_fix(struct kernel_stat *kst, struct stat *st)
{
	st->st_dev = kst->st_dev;
	st->st_ino = kst->st_ino;
	st->st_mode = kst->st_mode;
	st->st_nlink = kst->st_nlink;
	st->st_uid = kst->st_uid;
	st->st_gid = kst->st_gid;
	st->st_rdev = kst->st_rdev;
	st->st_size = kst->st_size;
	st->st_atim.tv_sec = kst->st_atime_sec;
	st->st_atim.tv_nsec = kst->st_atime_nsec;
	st->st_mtim.tv_sec = kst->st_mtime_sec;
	st->st_mtim.tv_nsec = kst->st_mtime_nsec;
	st->st_ctim.tv_sec = kst->st_ctime_sec;
	st->st_ctim.tv_nsec = kst->st_ctime_nsec;
	st->st_blksize = kst->st_blksize;
	st->st_blocks = kst->st_blocks;
}

static inline long __syscall0(long n)
{
	register long r7 __asm__("$7");
	register long r2 __asm__("$2");
	__asm__ __volatile__ (
		"daddu $2,$0,%2 ; syscall"
		: "=&r"(r2), "=r"(r7) : "ir"(n), "0"(r2), "1"(r7)
		: "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13",
		  "$14", "$15", "$24", "$25", "hi", "lo", "memory");
	return r7 ? -r2 : r2;
}

static inline long __syscall1(long n, long a)
{
	register long r4 __asm__("$4") = a;
	register long r7 __asm__("$7");
	register long r2 __asm__("$2");
	__asm__ __volatile__ (
		"daddu $2,$0,%2 ; syscall"
		: "=&r"(r2), "=r"(r7) : "ir"(n), "0"(r2), "1"(r7),
		  "r"(r4)
		: "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13",
		  "$14", "$15", "$24", "$25", "hi", "lo", "memory");
	return r7 ? -r2 : r2;
}

static inline long __syscall2(long n, long a, long b)
{
	struct kernel_stat kst;
	long ret;
79 80
	register long r4 __asm__("$4") = a;
	register long r5 __asm__("$5") = b;
R
Rich Felker 已提交
81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
	register long r7 __asm__("$7");
	register long r2 __asm__("$2");

	if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat)
		r5 = (long) &kst;

	__asm__ __volatile__ (
		"daddu $2,$0,%2 ; syscall"
		: "=&r"(r2), "=r"(r7) : "ir"(n), "0"(r2), "1"(r7),
		  "r"(r4), "r"(r5)
		: "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13",
		  "$14", "$15", "$24", "$25", "hi", "lo", "memory");

	if (r7) return -r2;
	ret = r2;

	if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat)
		__stat_fix(&kst, (struct stat *)b);

	return ret;
}

static inline long __syscall3(long n, long a, long b, long c)
{
	struct kernel_stat kst;
	long ret;
107 108 109
	register long r4 __asm__("$4") = a;
	register long r5 __asm__("$5") = b;
	register long r6 __asm__("$6") = c;
R
Rich Felker 已提交
110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
	register long r7 __asm__("$7");
	register long r2 __asm__("$2");

	if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat)
		r5 = (long) &kst;

	__asm__ __volatile__ (
		"daddu $2,$0,%2 ; syscall"
		: "=&r"(r2), "=r"(r7) : "ir"(n), "0"(r2), "1"(r7),
		  "r"(r4), "r"(r5), "r"(r6)
		: "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13",
		  "$14", "$15", "$24", "$25", "hi", "lo", "memory");

	if (r7) return -r2;
	ret = r2;

	if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat)
		__stat_fix(&kst, (struct stat *)b);

	return ret;
}

static inline long __syscall4(long n, long a, long b, long c, long d)
{
	struct kernel_stat kst;
	long ret;
136 137 138 139
	register long r4 __asm__("$4") = a;
	register long r5 __asm__("$5") = b;
	register long r6 __asm__("$6") = c;
	register long r7 __asm__("$7") = d;
R
Rich Felker 已提交
140 141 142 143
	register long r2 __asm__("$2");

	if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat)
		r5 = (long) &kst;
R
Rich Felker 已提交
144 145
	if (n == SYS_newfstatat)
		r6 = (long) &kst;
R
Rich Felker 已提交
146 147 148 149 150 151 152 153 154 155 156 157 158

	__asm__ __volatile__ (
		"daddu $2,$0,%2 ; syscall"
		: "=&r"(r2), "=r"(r7) : "ir"(n), "0"(r2), "1"(r7),
		  "r"(r4), "r"(r5), "r"(r6)
		: "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13",
		  "$14", "$15", "$24", "$25", "hi", "lo", "memory");

	if (r7) return -r2;
	ret = r2;

	if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat)
		__stat_fix(&kst, (struct stat *)b);
R
Rich Felker 已提交
159 160
	if (n == SYS_newfstatat)
		__stat_fix(&kst, (struct stat *)c);
R
Rich Felker 已提交
161 162 163 164 165 166 167

	return ret;
}

static inline long __syscall5(long n, long a, long b, long c, long d, long e)
{
	struct kernel_stat kst;
168 169 170 171 172 173 174
	long ret;
	register long r4 __asm__("$4") = a;
	register long r5 __asm__("$5") = b;
	register long r6 __asm__("$6") = c;
	register long r7 __asm__("$7") = d;
	register long r8 __asm__("$8") = e;
	register long r2 __asm__("$2");
R
Rich Felker 已提交
175 176

	if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat)
177
		r5 = (long) &kst;
R
Rich Felker 已提交
178
	if (n == SYS_newfstatat)
179
		r6 = (long) &kst;
R
Rich Felker 已提交
180

181 182 183 184 185 186 187 188 189
	__asm__ __volatile__ (
		"daddu $2,$0,%2 ; syscall"
		: "=&r"(r2), "=r"(r7) : "ir"(n), "0"(r2), "1"(r7),
		  "r"(r4), "r"(r5), "r"(r6), "r"(r8)
		: "$1", "$3", "$9", "$10", "$11", "$12", "$13",
		  "$14", "$15", "$24", "$25", "hi", "lo", "memory");

	if (r7) return -r2;
	ret = r2;
R
Rich Felker 已提交
190 191

	if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat)
192
		__stat_fix(&kst, (struct stat *)b);
R
Rich Felker 已提交
193
	if (n == SYS_newfstatat)
194
		__stat_fix(&kst, (struct stat *)c);
R
Rich Felker 已提交
195

196
	return ret;
R
Rich Felker 已提交
197 198 199 200 201
}

static inline long __syscall6(long n, long a, long b, long c, long d, long e, long f)
{
	struct kernel_stat kst;
202 203 204 205 206 207 208 209
	long ret;
	register long r4 __asm__("$4") = a;
	register long r5 __asm__("$5") = b;
	register long r6 __asm__("$6") = c;
	register long r7 __asm__("$7") = d;
	register long r8 __asm__("$8") = e;
	register long r9 __asm__("$9") = f;
	register long r2 __asm__("$2");
R
Rich Felker 已提交
210 211

	if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat)
212
		r5 = (long) &kst;
R
Rich Felker 已提交
213
	if (n == SYS_newfstatat)
214 215 216 217 218 219 220 221
		r6 = (long) &kst;

	__asm__ __volatile__ (
		"daddu $2,$0,%2 ; syscall"
		: "=&r"(r2), "=r"(r7) : "ir"(n), "0"(r2), "1"(r7),
		  "r"(r4), "r"(r5), "r"(r6), "r"(r8), "r"(r9)
		: "$1", "$3", "$10", "$11", "$12", "$13",
		  "$14", "$15", "$24", "$25", "hi", "lo", "memory");
R
Rich Felker 已提交
222

223 224
	if (r7) return -r2;
	ret = r2;
R
Rich Felker 已提交
225 226

	if (n == SYS_stat || n == SYS_fstat || n == SYS_lstat)
227
		__stat_fix(&kst, (struct stat *)b);
R
Rich Felker 已提交
228
	if (n == SYS_newfstatat)
229
		__stat_fix(&kst, (struct stat *)c);
R
Rich Felker 已提交
230

231
	return ret;
R
Rich Felker 已提交
232 233 234 235 236
}

#define VDSO_USEFUL
#define VDSO_CGT_SYM "__vdso_clock_gettime"
#define VDSO_CGT_VER "LINUX_2.6"