1/* sclow.S: Low level special syscall handling.
2 *          Basically these are cases where we can completely
3 *          handle the system call without saving any state
4 *          because we know that the process will not sleep.
5 *
6 * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu)
7 */
8
9#include <asm/ptrace.h>
10#include <asm/asm-offsets.h>
11#include <asm/errno.h>
12#include <asm/winmacro.h>
13#include <asm/thread_info.h>
14#include <asm/psr.h>
15#include <asm/page.h>
16
17#define CC_AND_RETT  \
18	set	PSR_C, %l4; \
19	andn	%l0, %l4, %l4; \
20	wr	%l4, 0x0, %psr; \
21	nop; nop; nop; \
22	jmp	%l2; \
23	rett	%l2 + 4;
24
25#define SC_AND_RETT  \
26	set	PSR_C, %l4; \
27	or	%l0, %l4, %l4; \
28	wr	%l4, 0x0, %psr; \
29	nop; nop; nop; \
30	jmp	%l2; \
31	rett	%l2 + 4;
32
33#define LABEL(func)  func##_low
34
35	.globl	LABEL(sunosnop)
36LABEL(sunosnop):
37	CC_AND_RETT
38
39#if (ASIZ_task_uid == 2 && ASIZ_task_euid == 2)
40	.globl	LABEL(sunosgetuid)
41LABEL(sunosgetuid):
42	LOAD_CURRENT(l4, l5)
43	ld	[%l4 + TI_TASK], %l4
44	lduh	[%l4 + AOFF_task_uid], %i0
45	lduh	[%l4 + AOFF_task_euid], %i1
46	CC_AND_RETT
47#endif
48
49#if (ASIZ_task_gid == 2 && ASIZ_task_egid == 2)
50	.globl	LABEL(sunosgetgid)
51LABEL(sunosgetgid):
52	LOAD_CURRENT(l4, l5)
53	ld	[%l4 + TI_TASK], %l4
54	lduh	[%l4 + AOFF_task_gid], %i0
55	lduh	[%l4 + AOFF_task_egid], %i1
56	CC_AND_RETT
57#endif
58
59	.globl	LABEL(sunosmctl)
60LABEL(sunosmctl):
61	mov	0, %i0
62	CC_AND_RETT
63
64	.globl	LABEL(sunosgdtsize)
65LABEL(sunosgdtsize):
66	mov	256, %i0
67	CC_AND_RETT
68
69	.globl	LABEL(getpagesize)
70LABEL(getpagesize):
71	set	PAGE_SIZE, %i0
72	CC_AND_RETT
73