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>
26 #include <linux/hugetlb.h>
28 #include <linux/uaccess.h>
29 #include <asm/unistd.h>
33 /* #define DEBUG_UNIMP_SYSCALL */
35 /* XXX Make this per-binary type, this way we can detect the type of
36 * XXX a binary. Every Sparc executable calls this very early on.
38 SYSCALL_DEFINE0(getpagesize
)
40 return PAGE_SIZE
; /* Possibly older binaries want 8192 on sun4's? */
43 unsigned long arch_get_unmapped_area(struct file
*filp
, unsigned long addr
, unsigned long len
, unsigned long pgoff
, unsigned long flags
, vm_flags_t vm_flags
)
45 struct vm_unmapped_area_info info
= {};
46 bool file_hugepage
= false;
48 if (filp
&& is_file_hugepages(filp
))
51 if (flags
& MAP_FIXED
) {
52 /* We do not accept a shared mapping if it would violate
53 * cache aliasing constraints.
55 if (!file_hugepage
&& (flags
& MAP_SHARED
) &&
56 ((addr
- (pgoff
<< PAGE_SHIFT
)) & (SHMLBA
- 1)))
61 /* See asm-sparc/uaccess.h */
62 if (len
> TASK_SIZE
- PAGE_SIZE
)
65 addr
= TASK_UNMAPPED_BASE
;
68 info
.low_limit
= addr
;
69 info
.high_limit
= TASK_SIZE
;
71 info
.align_mask
= (flags
& MAP_SHARED
) ?
72 (PAGE_MASK
& (SHMLBA
- 1)) : 0;
73 info
.align_offset
= pgoff
<< PAGE_SHIFT
;
75 info
.align_mask
= huge_page_mask_align(filp
);
77 return vm_unmapped_area(&info
);
81 * sys_pipe() is the normal C calling standard for creating
82 * a pipe. It's not the way unix traditionally does this, though.
84 SYSCALL_DEFINE0(sparc_pipe
)
89 error
= do_pipe_flags(fd
, 0);
92 current_pt_regs()->u_regs
[UREG_I1
] = fd
[1];
98 int sparc_mmap_check(unsigned long addr
, unsigned long len
)
100 /* See asm-sparc/uaccess.h */
101 if (len
> TASK_SIZE
- PAGE_SIZE
|| addr
+ len
> TASK_SIZE
- PAGE_SIZE
)
107 /* Linux version of mmap */
109 SYSCALL_DEFINE6(mmap2
, unsigned long, addr
, unsigned long, len
,
110 unsigned long, prot
, unsigned long, flags
, unsigned long, fd
,
111 unsigned long, pgoff
)
113 /* Make sure the shift for mmap2 is constant (12), no matter what PAGE_SIZE
115 return ksys_mmap_pgoff(addr
, len
, prot
, flags
, fd
,
116 pgoff
>> (PAGE_SHIFT
- 12));
119 SYSCALL_DEFINE6(mmap
, unsigned long, addr
, unsigned long, len
,
120 unsigned long, prot
, unsigned long, flags
, unsigned long, fd
,
123 /* no alignment check? */
124 return ksys_mmap_pgoff(addr
, len
, prot
, flags
, fd
, off
>> PAGE_SHIFT
);
127 SYSCALL_DEFINE5(sparc_remap_file_pages
, unsigned long, start
, unsigned long, size
,
128 unsigned long, prot
, unsigned long, pgoff
,
129 unsigned long, flags
)
131 /* This works on an existing mmap so we don't need to validate
132 * the range as that was done at the original mmap call.
134 return sys_remap_file_pages(start
, size
, prot
,
135 (pgoff
>> (PAGE_SHIFT
- 12)), flags
);
138 SYSCALL_DEFINE0(nis_syscall
)
140 static int count
= 0;
141 struct pt_regs
*regs
= current_pt_regs();
145 printk ("%s[%d]: Unimplemented SPARC system call %d\n",
146 current
->comm
, task_pid_nr(current
), (int)regs
->u_regs
[1]);
147 #ifdef DEBUG_UNIMP_SYSCALL
153 /* #define DEBUG_SPARC_BREAKPOINT */
156 sparc_breakpoint (struct pt_regs
*regs
)
159 #ifdef DEBUG_SPARC_BREAKPOINT
160 printk ("TRAP: Entering kernel PC=%x, nPC=%x\n", regs
->pc
, regs
->npc
);
162 force_sig_fault(SIGTRAP
, TRAP_BRKPT
, (void __user
*)regs
->pc
);
164 #ifdef DEBUG_SPARC_BREAKPOINT
165 printk ("TRAP: Returning to space: PC=%x nPC=%x\n", regs
->pc
, regs
->npc
);
169 SYSCALL_DEFINE3(sparc_sigaction
, int, sig
,
170 struct old_sigaction __user
*,act
,
171 struct old_sigaction __user
*,oact
)
173 WARN_ON_ONCE(sig
>= 0);
174 return sys_sigaction(-sig
, act
, oact
);
177 SYSCALL_DEFINE5(rt_sigaction
, int, sig
,
178 const struct sigaction __user
*, act
,
179 struct sigaction __user
*, oact
,
180 void __user
*, restorer
,
183 struct k_sigaction new_ka
, old_ka
;
186 /* XXX: Don't preclude handling different sized sigset_t's. */
187 if (sigsetsize
!= sizeof(sigset_t
))
191 new_ka
.ka_restorer
= restorer
;
192 if (copy_from_user(&new_ka
.sa
, act
, sizeof(*act
)))
196 ret
= do_sigaction(sig
, act
? &new_ka
: NULL
, oact
? &old_ka
: NULL
);
199 if (copy_to_user(oact
, &old_ka
.sa
, sizeof(*oact
)))
206 SYSCALL_DEFINE2(getdomainname
, char __user
*, name
, int, len
)
209 char tmp
[__NEW_UTS_LEN
+ 1];
216 nlen
= strlen(utsname()->domainname
) + 1;
220 memcpy(tmp
, utsname()->domainname
, nlen
);
224 if (copy_to_user(name
, tmp
, nlen
))