1 // SPDX-License-Identifier: GPL-2.0
2 /* linux/arch/sparc/kernel/sys_sparc.c
4 * This file contains various random system calls that
5 * have a non-standard calling sequence on the Linux/sparc
9 #include <linux/errno.h>
10 #include <linux/types.h>
11 #include <linux/sched/signal.h>
12 #include <linux/sched/mm.h>
13 #include <linux/sched/debug.h>
16 #include <linux/file.h>
17 #include <linux/sem.h>
18 #include <linux/msg.h>
19 #include <linux/shm.h>
20 #include <linux/stat.h>
21 #include <linux/syscalls.h>
22 #include <linux/mman.h>
23 #include <linux/utsname.h>
24 #include <linux/smp.h>
25 #include <linux/ipc.h>
27 #include <linux/uaccess.h>
28 #include <asm/unistd.h>
32 /* #define DEBUG_UNIMP_SYSCALL */
34 /* XXX Make this per-binary type, this way we can detect the type of
35 * XXX a binary. Every Sparc executable calls this very early on.
37 SYSCALL_DEFINE0(getpagesize
)
39 return PAGE_SIZE
; /* Possibly older binaries want 8192 on sun4's? */
42 unsigned long arch_get_unmapped_area(struct file
*filp
, unsigned long addr
, unsigned long len
, unsigned long pgoff
, unsigned long flags
)
44 struct vm_unmapped_area_info info
;
46 if (flags
& MAP_FIXED
) {
47 /* We do not accept a shared mapping if it would violate
48 * cache aliasing constraints.
50 if ((flags
& MAP_SHARED
) &&
51 ((addr
- (pgoff
<< PAGE_SHIFT
)) & (SHMLBA
- 1)))
56 /* See asm-sparc/uaccess.h */
57 if (len
> TASK_SIZE
- PAGE_SIZE
)
60 addr
= TASK_UNMAPPED_BASE
;
64 info
.low_limit
= addr
;
65 info
.high_limit
= TASK_SIZE
;
66 info
.align_mask
= (flags
& MAP_SHARED
) ?
67 (PAGE_MASK
& (SHMLBA
- 1)) : 0;
68 info
.align_offset
= pgoff
<< PAGE_SHIFT
;
69 return vm_unmapped_area(&info
);
73 * sys_pipe() is the normal C calling standard for creating
74 * a pipe. It's not the way unix traditionally does this, though.
76 SYSCALL_DEFINE0(sparc_pipe
)
81 error
= do_pipe_flags(fd
, 0);
84 current_pt_regs()->u_regs
[UREG_I1
] = fd
[1];
90 int sparc_mmap_check(unsigned long addr
, unsigned long len
)
92 /* See asm-sparc/uaccess.h */
93 if (len
> TASK_SIZE
- PAGE_SIZE
|| addr
+ len
> TASK_SIZE
- PAGE_SIZE
)
99 /* Linux version of mmap */
101 SYSCALL_DEFINE6(mmap2
, unsigned long, addr
, unsigned long, len
,
102 unsigned long, prot
, unsigned long, flags
, unsigned long, fd
,
103 unsigned long, pgoff
)
105 /* Make sure the shift for mmap2 is constant (12), no matter what PAGE_SIZE
107 return ksys_mmap_pgoff(addr
, len
, prot
, flags
, fd
,
108 pgoff
>> (PAGE_SHIFT
- 12));
111 SYSCALL_DEFINE6(mmap
, unsigned long, addr
, unsigned long, len
,
112 unsigned long, prot
, unsigned long, flags
, unsigned long, fd
,
115 /* no alignment check? */
116 return ksys_mmap_pgoff(addr
, len
, prot
, flags
, fd
, off
>> PAGE_SHIFT
);
119 SYSCALL_DEFINE5(sparc_remap_file_pages
, unsigned long, start
, unsigned long, size
,
120 unsigned long, prot
, unsigned long, pgoff
,
121 unsigned long, flags
)
123 /* This works on an existing mmap so we don't need to validate
124 * the range as that was done at the original mmap call.
126 return sys_remap_file_pages(start
, size
, prot
,
127 (pgoff
>> (PAGE_SHIFT
- 12)), flags
);
130 SYSCALL_DEFINE0(nis_syscall
)
132 static int count
= 0;
133 struct pt_regs
*regs
= current_pt_regs();
137 printk ("%s[%d]: Unimplemented SPARC system call %d\n",
138 current
->comm
, task_pid_nr(current
), (int)regs
->u_regs
[1]);
139 #ifdef DEBUG_UNIMP_SYSCALL
145 /* #define DEBUG_SPARC_BREAKPOINT */
148 sparc_breakpoint (struct pt_regs
*regs
)
151 #ifdef DEBUG_SPARC_BREAKPOINT
152 printk ("TRAP: Entering kernel PC=%x, nPC=%x\n", regs
->pc
, regs
->npc
);
154 force_sig_fault(SIGTRAP
, TRAP_BRKPT
, (void __user
*)regs
->pc
, 0);
156 #ifdef DEBUG_SPARC_BREAKPOINT
157 printk ("TRAP: Returning to space: PC=%x nPC=%x\n", regs
->pc
, regs
->npc
);
161 SYSCALL_DEFINE3(sparc_sigaction
, int, sig
,
162 struct old_sigaction __user
*,act
,
163 struct old_sigaction __user
*,oact
)
165 WARN_ON_ONCE(sig
>= 0);
166 return sys_sigaction(-sig
, act
, oact
);
169 SYSCALL_DEFINE5(rt_sigaction
, int, sig
,
170 const struct sigaction __user
*, act
,
171 struct sigaction __user
*, oact
,
172 void __user
*, restorer
,
175 struct k_sigaction new_ka
, old_ka
;
178 /* XXX: Don't preclude handling different sized sigset_t's. */
179 if (sigsetsize
!= sizeof(sigset_t
))
183 new_ka
.ka_restorer
= restorer
;
184 if (copy_from_user(&new_ka
.sa
, act
, sizeof(*act
)))
188 ret
= do_sigaction(sig
, act
? &new_ka
: NULL
, oact
? &old_ka
: NULL
);
191 if (copy_to_user(oact
, &old_ka
.sa
, sizeof(*oact
)))
198 SYSCALL_DEFINE2(getdomainname
, char __user
*, name
, int, len
)
201 char tmp
[__NEW_UTS_LEN
+ 1];
208 nlen
= strlen(utsname()->domainname
) + 1;
212 memcpy(tmp
, utsname()->domainname
, nlen
);
216 if (copy_to_user(name
, tmp
, nlen
))