aboutsummaryrefslogtreecommitdiffstats
path: root/arch/alpha
diff options
context:
space:
mode:
Diffstat (limited to 'arch/alpha')
-rw-r--r--arch/alpha/include/asm/Kbuild1
-rw-r--r--arch/alpha/include/asm/ioctls.h3
-rw-r--r--arch/alpha/include/asm/mman.h11
-rw-r--r--arch/alpha/include/asm/ptrace.h1
-rw-r--r--arch/alpha/include/asm/signal.h3
-rw-r--r--arch/alpha/include/asm/unistd.h3
-rw-r--r--arch/alpha/kernel/binfmt_loader.c4
-rw-r--r--arch/alpha/kernel/entry.S51
-rw-r--r--arch/alpha/kernel/process.c62
-rw-r--r--arch/alpha/kernel/signal.c16
-rw-r--r--arch/alpha/kernel/srmcons.c5
-rw-r--r--arch/alpha/kernel/systbls.S6
12 files changed, 62 insertions, 104 deletions
diff --git a/arch/alpha/include/asm/Kbuild b/arch/alpha/include/asm/Kbuild
index 64ffc9e9e548..dcfabb9f05a0 100644
--- a/arch/alpha/include/asm/Kbuild
+++ b/arch/alpha/include/asm/Kbuild
@@ -11,3 +11,4 @@ header-y += reg.h
11header-y += regdef.h 11header-y += regdef.h
12header-y += sysinfo.h 12header-y += sysinfo.h
13generic-y += exec.h 13generic-y += exec.h
14generic-y += trace_clock.h
diff --git a/arch/alpha/include/asm/ioctls.h b/arch/alpha/include/asm/ioctls.h
index 80e1cee90f1f..92c557be49fc 100644
--- a/arch/alpha/include/asm/ioctls.h
+++ b/arch/alpha/include/asm/ioctls.h
@@ -95,6 +95,9 @@
95#define TIOCGDEV _IOR('T',0x32, unsigned int) /* Get primary device node of /dev/console */ 95#define TIOCGDEV _IOR('T',0x32, unsigned int) /* Get primary device node of /dev/console */
96#define TIOCSIG _IOW('T',0x36, int) /* Generate signal on Pty slave */ 96#define TIOCSIG _IOW('T',0x36, int) /* Generate signal on Pty slave */
97#define TIOCVHANGUP 0x5437 97#define TIOCVHANGUP 0x5437
98#define TIOCGPKT _IOR('T', 0x38, int) /* Get packet mode state */
99#define TIOCGPTLCK _IOR('T', 0x39, int) /* Get Pty lock state */
100#define TIOCGEXCL _IOR('T', 0x40, int) /* Get exclusive mode state */
98 101
99#define TIOCSERCONFIG 0x5453 102#define TIOCSERCONFIG 0x5453
100#define TIOCSERGWILD 0x5454 103#define TIOCSERGWILD 0x5454
diff --git a/arch/alpha/include/asm/mman.h b/arch/alpha/include/asm/mman.h
index cbeb3616a28e..0086b472bc2b 100644
--- a/arch/alpha/include/asm/mman.h
+++ b/arch/alpha/include/asm/mman.h
@@ -63,4 +63,15 @@
63/* compatibility flags */ 63/* compatibility flags */
64#define MAP_FILE 0 64#define MAP_FILE 0
65 65
66/*
67 * When MAP_HUGETLB is set bits [26:31] encode the log2 of the huge page size.
68 * This gives us 6 bits, which is enough until someone invents 128 bit address
69 * spaces.
70 *
71 * Assume these are all power of twos.
72 * When 0 use the default page size.
73 */
74#define MAP_HUGE_SHIFT 26
75#define MAP_HUGE_MASK 0x3f
76
66#endif /* __ALPHA_MMAN_H__ */ 77#endif /* __ALPHA_MMAN_H__ */
diff --git a/arch/alpha/include/asm/ptrace.h b/arch/alpha/include/asm/ptrace.h
index b87755a19554..b4c5b2fbb647 100644
--- a/arch/alpha/include/asm/ptrace.h
+++ b/arch/alpha/include/asm/ptrace.h
@@ -78,6 +78,7 @@ struct switch_stack {
78 78
79#define current_pt_regs() \ 79#define current_pt_regs() \
80 ((struct pt_regs *) ((char *)current_thread_info() + 2*PAGE_SIZE) - 1) 80 ((struct pt_regs *) ((char *)current_thread_info() + 2*PAGE_SIZE) - 1)
81#define signal_pt_regs current_pt_regs
81 82
82#define force_successful_syscall_return() (current_pt_regs()->r0 = 0) 83#define force_successful_syscall_return() (current_pt_regs()->r0 = 0)
83 84
diff --git a/arch/alpha/include/asm/signal.h b/arch/alpha/include/asm/signal.h
index a9388300abb1..45552862cc10 100644
--- a/arch/alpha/include/asm/signal.h
+++ b/arch/alpha/include/asm/signal.h
@@ -164,9 +164,6 @@ struct sigstack {
164 164
165#ifdef __KERNEL__ 165#ifdef __KERNEL__
166#include <asm/sigcontext.h> 166#include <asm/sigcontext.h>
167
168#define ptrace_signal_deliver(regs, cookie) do { } while (0)
169
170#endif 167#endif
171 168
172#endif 169#endif
diff --git a/arch/alpha/include/asm/unistd.h b/arch/alpha/include/asm/unistd.h
index 7826e227e4d0..eb3a4664ced2 100644
--- a/arch/alpha/include/asm/unistd.h
+++ b/arch/alpha/include/asm/unistd.h
@@ -482,6 +482,9 @@
482#define __ARCH_WANT_SYS_SIGPENDING 482#define __ARCH_WANT_SYS_SIGPENDING
483#define __ARCH_WANT_SYS_RT_SIGSUSPEND 483#define __ARCH_WANT_SYS_RT_SIGSUSPEND
484#define __ARCH_WANT_SYS_EXECVE 484#define __ARCH_WANT_SYS_EXECVE
485#define __ARCH_WANT_SYS_FORK
486#define __ARCH_WANT_SYS_VFORK
487#define __ARCH_WANT_SYS_CLONE
485 488
486/* "Conditional" syscalls. What we want is 489/* "Conditional" syscalls. What we want is
487 490
diff --git a/arch/alpha/kernel/binfmt_loader.c b/arch/alpha/kernel/binfmt_loader.c
index d1f474d1d44d..9525660c93c0 100644
--- a/arch/alpha/kernel/binfmt_loader.c
+++ b/arch/alpha/kernel/binfmt_loader.c
@@ -5,7 +5,7 @@
5#include <linux/binfmts.h> 5#include <linux/binfmts.h>
6#include <linux/a.out.h> 6#include <linux/a.out.h>
7 7
8static int load_binary(struct linux_binprm *bprm, struct pt_regs *regs) 8static int load_binary(struct linux_binprm *bprm)
9{ 9{
10 struct exec *eh = (struct exec *)bprm->buf; 10 struct exec *eh = (struct exec *)bprm->buf;
11 unsigned long loader; 11 unsigned long loader;
@@ -37,7 +37,7 @@ static int load_binary(struct linux_binprm *bprm, struct pt_regs *regs)
37 retval = prepare_binprm(bprm); 37 retval = prepare_binprm(bprm);
38 if (retval < 0) 38 if (retval < 0)
39 return retval; 39 return retval;
40 return search_binary_handler(bprm,regs); 40 return search_binary_handler(bprm);
41} 41}
42 42
43static struct linux_binfmt loader_format = { 43static struct linux_binfmt loader_format = {
diff --git a/arch/alpha/kernel/entry.S b/arch/alpha/kernel/entry.S
index a7607832dd4f..f62a994ef126 100644
--- a/arch/alpha/kernel/entry.S
+++ b/arch/alpha/kernel/entry.S
@@ -612,47 +612,24 @@ ret_from_kernel_thread:
612 * Special system calls. Most of these are special in that they either 612 * Special system calls. Most of these are special in that they either
613 * have to play switch_stack games or in some way use the pt_regs struct. 613 * have to play switch_stack games or in some way use the pt_regs struct.
614 */ 614 */
615 .align 4
616 .globl sys_fork
617 .ent sys_fork
618sys_fork:
619 .prologue 0
620 mov $sp, $21
621 bsr $1, do_switch_stack
622 bis $31, SIGCHLD, $16
623 mov $31, $17
624 mov $31, $18
625 mov $31, $19
626 mov $31, $20
627 jsr $26, alpha_clone
628 bsr $1, undo_switch_stack
629 ret
630.end sys_fork
631 615
616.macro fork_like name
632 .align 4 617 .align 4
633 .globl sys_clone 618 .globl alpha_\name
634 .ent sys_clone 619 .ent alpha_\name
635sys_clone: 620alpha_\name:
636 .prologue 0 621 .prologue 0
637 mov $sp, $21
638 bsr $1, do_switch_stack 622 bsr $1, do_switch_stack
639 /* $16, $17, $18, $19, $20 come from the user. */ 623 jsr $26, sys_\name
640 jsr $26, alpha_clone 624 ldq $26, 56($sp)
641 bsr $1, undo_switch_stack 625 lda $sp, SWITCH_STACK_SIZE($sp)
642 ret 626 ret
643.end sys_clone 627.end alpha_\name
628.endm
644 629
645 .align 4 630fork_like fork
646 .globl sys_vfork 631fork_like vfork
647 .ent sys_vfork 632fork_like clone
648sys_vfork:
649 .prologue 0
650 mov $sp, $16
651 bsr $1, do_switch_stack
652 jsr $26, alpha_vfork
653 bsr $1, undo_switch_stack
654 ret
655.end sys_vfork
656 633
657 .align 4 634 .align 4
658 .globl sys_sigreturn 635 .globl sys_sigreturn
@@ -661,8 +638,6 @@ sys_sigreturn:
661 .prologue 0 638 .prologue 0
662 lda $9, ret_from_straced 639 lda $9, ret_from_straced
663 cmpult $26, $9, $9 640 cmpult $26, $9, $9
664 mov $sp, $17
665 lda $18, -SWITCH_STACK_SIZE($sp)
666 lda $sp, -SWITCH_STACK_SIZE($sp) 641 lda $sp, -SWITCH_STACK_SIZE($sp)
667 jsr $26, do_sigreturn 642 jsr $26, do_sigreturn
668 bne $9, 1f 643 bne $9, 1f
@@ -678,8 +653,6 @@ sys_rt_sigreturn:
678 .prologue 0 653 .prologue 0
679 lda $9, ret_from_straced 654 lda $9, ret_from_straced
680 cmpult $26, $9, $9 655 cmpult $26, $9, $9
681 mov $sp, $17
682 lda $18, -SWITCH_STACK_SIZE($sp)
683 lda $sp, -SWITCH_STACK_SIZE($sp) 656 lda $sp, -SWITCH_STACK_SIZE($sp)
684 jsr $26, do_rt_sigreturn 657 jsr $26, do_rt_sigreturn
685 bne $9, 1f 658 bne $9, 1f
diff --git a/arch/alpha/kernel/process.c b/arch/alpha/kernel/process.c
index 51987dcf79b8..b5d0d0923699 100644
--- a/arch/alpha/kernel/process.c
+++ b/arch/alpha/kernel/process.c
@@ -235,51 +235,28 @@ release_thread(struct task_struct *dead_task)
235} 235}
236 236
237/* 237/*
238 * "alpha_clone()".. By the time we get here, the
239 * non-volatile registers have also been saved on the
240 * stack. We do some ugly pointer stuff here.. (see
241 * also copy_thread)
242 *
243 * Notice that "fork()" is implemented in terms of clone,
244 * with parameters (SIGCHLD, 0).
245 */
246int
247alpha_clone(unsigned long clone_flags, unsigned long usp,
248 int __user *parent_tid, int __user *child_tid,
249 unsigned long tls_value, struct pt_regs *regs)
250{
251 if (!usp)
252 usp = rdusp();
253
254 return do_fork(clone_flags, usp, regs, 0, parent_tid, child_tid);
255}
256
257int
258alpha_vfork(struct pt_regs *regs)
259{
260 return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, rdusp(),
261 regs, 0, NULL, NULL);
262}
263
264/*
265 * Copy an alpha thread.. 238 * Copy an alpha thread..
266 */ 239 */
267 240
268int 241int
269copy_thread(unsigned long clone_flags, unsigned long usp, 242copy_thread(unsigned long clone_flags, unsigned long usp,
270 unsigned long arg, 243 unsigned long arg,
271 struct task_struct * p, struct pt_regs * regs) 244 struct task_struct *p)
272{ 245{
273 extern void ret_from_fork(void); 246 extern void ret_from_fork(void);
274 extern void ret_from_kernel_thread(void); 247 extern void ret_from_kernel_thread(void);
275 248
276 struct thread_info *childti = task_thread_info(p); 249 struct thread_info *childti = task_thread_info(p);
277 struct pt_regs *childregs = task_pt_regs(p); 250 struct pt_regs *childregs = task_pt_regs(p);
251 struct pt_regs *regs = current_pt_regs();
278 struct switch_stack *childstack, *stack; 252 struct switch_stack *childstack, *stack;
279 unsigned long settls; 253 unsigned long settls;
280 254
281 childstack = ((struct switch_stack *) childregs) - 1; 255 childstack = ((struct switch_stack *) childregs) - 1;
282 if (unlikely(!regs)) { 256 childti->pcb.ksp = (unsigned long) childstack;
257 childti->pcb.flags = 1; /* set FEN, clear everything else */
258
259 if (unlikely(p->flags & PF_KTHREAD)) {
283 /* kernel thread */ 260 /* kernel thread */
284 memset(childstack, 0, 261 memset(childstack, 0,
285 sizeof(struct switch_stack) + sizeof(struct pt_regs)); 262 sizeof(struct switch_stack) + sizeof(struct pt_regs));
@@ -288,12 +265,17 @@ copy_thread(unsigned long clone_flags, unsigned long usp,
288 childstack->r10 = arg; 265 childstack->r10 = arg;
289 childregs->hae = alpha_mv.hae_cache, 266 childregs->hae = alpha_mv.hae_cache,
290 childti->pcb.usp = 0; 267 childti->pcb.usp = 0;
291 childti->pcb.ksp = (unsigned long) childstack;
292 childti->pcb.flags = 1; /* set FEN, clear everything else */
293 return 0; 268 return 0;
294 } 269 }
270 /* Note: if CLONE_SETTLS is not set, then we must inherit the
271 value from the parent, which will have been set by the block
272 copy in dup_task_struct. This is non-intuitive, but is
273 required for proper operation in the case of a threaded
274 application calling fork. */
275 if (clone_flags & CLONE_SETTLS)
276 childti->pcb.unique = regs->r20;
277 childti->pcb.usp = usp ?: rdusp();
295 *childregs = *regs; 278 *childregs = *regs;
296 settls = regs->r20;
297 childregs->r0 = 0; 279 childregs->r0 = 0;
298 childregs->r19 = 0; 280 childregs->r19 = 0;
299 childregs->r20 = 1; /* OSF/1 has some strange fork() semantics. */ 281 childregs->r20 = 1; /* OSF/1 has some strange fork() semantics. */
@@ -301,22 +283,6 @@ copy_thread(unsigned long clone_flags, unsigned long usp,
301 stack = ((struct switch_stack *) regs) - 1; 283 stack = ((struct switch_stack *) regs) - 1;
302 *childstack = *stack; 284 *childstack = *stack;
303 childstack->r26 = (unsigned long) ret_from_fork; 285 childstack->r26 = (unsigned long) ret_from_fork;
304 childti->pcb.usp = usp;
305 childti->pcb.ksp = (unsigned long) childstack;
306 childti->pcb.flags = 1; /* set FEN, clear everything else */
307
308 /* Set a new TLS for the child thread? Peek back into the
309 syscall arguments that we saved on syscall entry. Oops,
310 except we'd have clobbered it with the parent/child set
311 of r20. Read the saved copy. */
312 /* Note: if CLONE_SETTLS is not set, then we must inherit the
313 value from the parent, which will have been set by the block
314 copy in dup_task_struct. This is non-intuitive, but is
315 required for proper operation in the case of a threaded
316 application calling fork. */
317 if (clone_flags & CLONE_SETTLS)
318 childti->pcb.unique = settls;
319
320 return 0; 286 return 0;
321} 287}
322 288
diff --git a/arch/alpha/kernel/signal.c b/arch/alpha/kernel/signal.c
index 32575f85507d..336393c9c11f 100644
--- a/arch/alpha/kernel/signal.c
+++ b/arch/alpha/kernel/signal.c
@@ -160,10 +160,10 @@ extern char compile_time_assert
160#define INSN_CALLSYS 0x00000083 160#define INSN_CALLSYS 0x00000083
161 161
162static long 162static long
163restore_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs, 163restore_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs)
164 struct switch_stack *sw)
165{ 164{
166 unsigned long usp; 165 unsigned long usp;
166 struct switch_stack *sw = (struct switch_stack *)regs - 1;
167 long i, err = __get_user(regs->pc, &sc->sc_pc); 167 long i, err = __get_user(regs->pc, &sc->sc_pc);
168 168
169 current_thread_info()->restart_block.fn = do_no_restart_syscall; 169 current_thread_info()->restart_block.fn = do_no_restart_syscall;
@@ -215,9 +215,9 @@ restore_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs,
215 registers and transfer control from userland. */ 215 registers and transfer control from userland. */
216 216
217asmlinkage void 217asmlinkage void
218do_sigreturn(struct sigcontext __user *sc, struct pt_regs *regs, 218do_sigreturn(struct sigcontext __user *sc)
219 struct switch_stack *sw)
220{ 219{
220 struct pt_regs *regs = current_pt_regs();
221 sigset_t set; 221 sigset_t set;
222 222
223 /* Verify that it's a good sigcontext before using it */ 223 /* Verify that it's a good sigcontext before using it */
@@ -228,7 +228,7 @@ do_sigreturn(struct sigcontext __user *sc, struct pt_regs *regs,
228 228
229 set_current_blocked(&set); 229 set_current_blocked(&set);
230 230
231 if (restore_sigcontext(sc, regs, sw)) 231 if (restore_sigcontext(sc, regs))
232 goto give_sigsegv; 232 goto give_sigsegv;
233 233
234 /* Send SIGTRAP if we're single-stepping: */ 234 /* Send SIGTRAP if we're single-stepping: */
@@ -249,9 +249,9 @@ give_sigsegv:
249} 249}
250 250
251asmlinkage void 251asmlinkage void
252do_rt_sigreturn(struct rt_sigframe __user *frame, struct pt_regs *regs, 252do_rt_sigreturn(struct rt_sigframe __user *frame)
253 struct switch_stack *sw)
254{ 253{
254 struct pt_regs *regs = current_pt_regs();
255 sigset_t set; 255 sigset_t set;
256 256
257 /* Verify that it's a good ucontext_t before using it */ 257 /* Verify that it's a good ucontext_t before using it */
@@ -262,7 +262,7 @@ do_rt_sigreturn(struct rt_sigframe __user *frame, struct pt_regs *regs,
262 262
263 set_current_blocked(&set); 263 set_current_blocked(&set);
264 264
265 if (restore_sigcontext(&frame->uc.uc_mcontext, regs, sw)) 265 if (restore_sigcontext(&frame->uc.uc_mcontext, regs))
266 goto give_sigsegv; 266 goto give_sigsegv;
267 267
268 /* Send SIGTRAP if we're single-stepping: */ 268 /* Send SIGTRAP if we're single-stepping: */
diff --git a/arch/alpha/kernel/srmcons.c b/arch/alpha/kernel/srmcons.c
index 5d5865204a1d..59b7bbad8394 100644
--- a/arch/alpha/kernel/srmcons.c
+++ b/arch/alpha/kernel/srmcons.c
@@ -205,7 +205,6 @@ static const struct tty_operations srmcons_ops = {
205static int __init 205static int __init
206srmcons_init(void) 206srmcons_init(void)
207{ 207{
208 tty_port_init(&srmcons_singleton.port);
209 setup_timer(&srmcons_singleton.timer, srmcons_receive_chars, 208 setup_timer(&srmcons_singleton.timer, srmcons_receive_chars,
210 (unsigned long)&srmcons_singleton); 209 (unsigned long)&srmcons_singleton);
211 if (srm_is_registered_console) { 210 if (srm_is_registered_console) {
@@ -215,6 +214,9 @@ srmcons_init(void)
215 driver = alloc_tty_driver(MAX_SRM_CONSOLE_DEVICES); 214 driver = alloc_tty_driver(MAX_SRM_CONSOLE_DEVICES);
216 if (!driver) 215 if (!driver)
217 return -ENOMEM; 216 return -ENOMEM;
217
218 tty_port_init(&srmcons_singleton.port);
219
218 driver->driver_name = "srm"; 220 driver->driver_name = "srm";
219 driver->name = "srm"; 221 driver->name = "srm";
220 driver->major = 0; /* dynamic */ 222 driver->major = 0; /* dynamic */
@@ -227,6 +229,7 @@ srmcons_init(void)
227 err = tty_register_driver(driver); 229 err = tty_register_driver(driver);
228 if (err) { 230 if (err) {
229 put_tty_driver(driver); 231 put_tty_driver(driver);
232 tty_port_destroy(&srmcons_singleton.port);
230 return err; 233 return err;
231 } 234 }
232 srmcons_driver = driver; 235 srmcons_driver = driver;
diff --git a/arch/alpha/kernel/systbls.S b/arch/alpha/kernel/systbls.S
index 2ac6b45c3e00..4284ec798ec9 100644
--- a/arch/alpha/kernel/systbls.S
+++ b/arch/alpha/kernel/systbls.S
@@ -12,7 +12,7 @@
12sys_call_table: 12sys_call_table:
13 .quad alpha_ni_syscall /* 0 */ 13 .quad alpha_ni_syscall /* 0 */
14 .quad sys_exit 14 .quad sys_exit
15 .quad sys_fork 15 .quad alpha_fork
16 .quad sys_read 16 .quad sys_read
17 .quad sys_write 17 .quad sys_write
18 .quad alpha_ni_syscall /* 5 */ 18 .quad alpha_ni_syscall /* 5 */
@@ -76,7 +76,7 @@ sys_call_table:
76 .quad sys_getpgrp 76 .quad sys_getpgrp
77 .quad sys_getpagesize 77 .quad sys_getpagesize
78 .quad alpha_ni_syscall /* 65 */ 78 .quad alpha_ni_syscall /* 65 */
79 .quad sys_vfork 79 .quad alpha_vfork
80 .quad sys_newstat 80 .quad sys_newstat
81 .quad sys_newlstat 81 .quad sys_newlstat
82 .quad alpha_ni_syscall 82 .quad alpha_ni_syscall
@@ -330,7 +330,7 @@ sys_call_table:
330 .quad sys_ni_syscall /* 309: old get_kernel_syms */ 330 .quad sys_ni_syscall /* 309: old get_kernel_syms */
331 .quad sys_syslog /* 310 */ 331 .quad sys_syslog /* 310 */
332 .quad sys_reboot 332 .quad sys_reboot
333 .quad sys_clone 333 .quad alpha_clone
334 .quad sys_uselib 334 .quad sys_uselib
335 .quad sys_mlock 335 .quad sys_mlock
336 .quad sys_munlock /* 315 */ 336 .quad sys_munlock /* 315 */