Commit e945e849 authored by Linus Torvalds's avatar Linus Torvalds

Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-2.6

* git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-2.6:
  sparc: video drivers: add facility level
  sparc: tcx.c make tcx_init and tcx_exit static
  sparc: ffb.c make ffb_init and ffb_exit static
  sparc: cg14.c make cg14_init and cg15_exit static
  sparc: bw2.c fix bw2_exit
  sparc64: Fix accidental syscall restart on child return from clone/fork/vfork.
  sparc64: Clean up handling of pt_regs trap type encoding.
  sparc: Remove old style signal frame support.
  sparc64: Kill bogus RT_ALIGNEDSZ macro from signal.c
  sparc: sunzilog.c remove unused argument
  sparc: fix drivers/video/tcx.c warning
  sparc64: Kill unused local ISA bus layer.
  input: Rewrite sparcspkr device probing.
  sparc64: Do not ignore 'pmu' device ranges.
  sparc64: Kill ISA_FLOPPY_WORKS code.
  sparc64: Kill CONFIG_SPARC32_COMPAT
  sparc64: Cleanups and corrections for arch/sparc64/Kconfig
  sparc64: Fix wedged irq regression.
parents 77a50df2 194f1a68
...@@ -357,8 +357,6 @@ void flush_thread(void) ...@@ -357,8 +357,6 @@ void flush_thread(void)
{ {
current_thread_info()->w_saved = 0; current_thread_info()->w_saved = 0;
/* No new signal delivery by default */
current->thread.new_signal = 0;
#ifndef CONFIG_SMP #ifndef CONFIG_SMP
if(last_task_used_math == current) { if(last_task_used_math == current) {
#else #else
......
/* $Id: signal.c,v 1.110 2002/02/08 03:57:14 davem Exp $ /* linux/arch/sparc/kernel/signal.c
* linux/arch/sparc/kernel/signal.c
* *
* Copyright (C) 1991, 1992 Linus Torvalds * Copyright (C) 1991, 1992 Linus Torvalds
* Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
...@@ -32,37 +31,7 @@ extern void fpsave(unsigned long *fpregs, unsigned long *fsr, ...@@ -32,37 +31,7 @@ extern void fpsave(unsigned long *fpregs, unsigned long *fsr,
void *fpqueue, unsigned long *fpqdepth); void *fpqueue, unsigned long *fpqdepth);
extern void fpload(unsigned long *fpregs, unsigned long *fsr); extern void fpload(unsigned long *fpregs, unsigned long *fsr);
/* Signal frames: the original one (compatible with SunOS): struct signal_frame {
*
* Set up a signal frame... Make the stack look the way SunOS
* expects it to look which is basically:
*
* ---------------------------------- <-- %sp at signal time
* Struct sigcontext
* Signal address
* Ptr to sigcontext area above
* Signal code
* The signal number itself
* One register window
* ---------------------------------- <-- New %sp
*/
struct signal_sframe {
struct reg_window sig_window;
int sig_num;
int sig_code;
struct sigcontext __user *sig_scptr;
int sig_address;
struct sigcontext sig_context;
unsigned int extramask[_NSIG_WORDS - 1];
};
/*
* And the new one, intended to be used for Linux applications only
* (we have enough in there to work with clone).
* All the interesting bits are in the info field.
*/
struct new_signal_frame {
struct sparc_stackf ss; struct sparc_stackf ss;
__siginfo_t info; __siginfo_t info;
__siginfo_fpu_t __user *fpu_save; __siginfo_fpu_t __user *fpu_save;
...@@ -85,8 +54,7 @@ struct rt_signal_frame { ...@@ -85,8 +54,7 @@ struct rt_signal_frame {
}; };
/* Align macros */ /* Align macros */
#define SF_ALIGNEDSZ (((sizeof(struct signal_sframe) + 7) & (~7))) #define SF_ALIGNEDSZ (((sizeof(struct signal_frame) + 7) & (~7)))
#define NF_ALIGNEDSZ (((sizeof(struct new_signal_frame) + 7) & (~7)))
#define RT_ALIGNEDSZ (((sizeof(struct rt_signal_frame) + 7) & (~7))) #define RT_ALIGNEDSZ (((sizeof(struct rt_signal_frame) + 7) & (~7)))
static int _sigpause_common(old_sigset_t set) static int _sigpause_common(old_sigset_t set)
...@@ -141,15 +109,20 @@ restore_fpu_state(struct pt_regs *regs, __siginfo_fpu_t __user *fpu) ...@@ -141,15 +109,20 @@ restore_fpu_state(struct pt_regs *regs, __siginfo_fpu_t __user *fpu)
return err; return err;
} }
static inline void do_new_sigreturn (struct pt_regs *regs) asmlinkage void do_sigreturn(struct pt_regs *regs)
{ {
struct new_signal_frame __user *sf; struct signal_frame __user *sf;
unsigned long up_psr, pc, npc; unsigned long up_psr, pc, npc;
sigset_t set; sigset_t set;
__siginfo_fpu_t __user *fpu_save; __siginfo_fpu_t __user *fpu_save;
int err; int err;
sf = (struct new_signal_frame __user *) regs->u_regs[UREG_FP]; /* Always make any pending restarted system calls return -EINTR */
current_thread_info()->restart_block.fn = do_no_restart_syscall;
synchronize_user_stack();
sf = (struct signal_frame __user *) regs->u_regs[UREG_FP];
/* 1. Make sure we are not getting garbage from the user */ /* 1. Make sure we are not getting garbage from the user */
if (!access_ok(VERIFY_READ, sf, sizeof(*sf))) if (!access_ok(VERIFY_READ, sf, sizeof(*sf)))
...@@ -198,73 +171,6 @@ static inline void do_new_sigreturn (struct pt_regs *regs) ...@@ -198,73 +171,6 @@ static inline void do_new_sigreturn (struct pt_regs *regs)
force_sig(SIGSEGV, current); force_sig(SIGSEGV, current);
} }
asmlinkage void do_sigreturn(struct pt_regs *regs)
{
struct sigcontext __user *scptr;
unsigned long pc, npc, psr;
sigset_t set;
int err;
/* Always make any pending restarted system calls return -EINTR */
current_thread_info()->restart_block.fn = do_no_restart_syscall;
synchronize_user_stack();
if (current->thread.new_signal) {
do_new_sigreturn(regs);
return;
}
scptr = (struct sigcontext __user *) regs->u_regs[UREG_I0];
/* Check sanity of the user arg. */
if (!access_ok(VERIFY_READ, scptr, sizeof(struct sigcontext)) ||
(((unsigned long) scptr) & 3))
goto segv_and_exit;
err = __get_user(pc, &scptr->sigc_pc);
err |= __get_user(npc, &scptr->sigc_npc);
if ((pc | npc) & 3)
goto segv_and_exit;
/* This is pretty much atomic, no amount locking would prevent
* the races which exist anyways.
*/
err |= __get_user(set.sig[0], &scptr->sigc_mask);
/* Note that scptr + 1 points to extramask */
err |= __copy_from_user(&set.sig[1], scptr + 1,
(_NSIG_WORDS - 1) * sizeof(unsigned int));
if (err)
goto segv_and_exit;
sigdelsetmask(&set, ~_BLOCKABLE);
spin_lock_irq(&current->sighand->siglock);
current->blocked = set;
recalc_sigpending();
spin_unlock_irq(&current->sighand->siglock);
regs->pc = pc;
regs->npc = npc;
err = __get_user(regs->u_regs[UREG_FP], &scptr->sigc_sp);
err |= __get_user(regs->u_regs[UREG_I0], &scptr->sigc_o0);
err |= __get_user(regs->u_regs[UREG_G1], &scptr->sigc_g1);
/* User can only change condition codes in %psr. */
err |= __get_user(psr, &scptr->sigc_psr);
if (err)
goto segv_and_exit;
regs->psr &= ~(PSR_ICC);
regs->psr |= (psr & PSR_ICC);
return;
segv_and_exit:
force_sig(SIGSEGV, current);
}
asmlinkage void do_rt_sigreturn(struct pt_regs *regs) asmlinkage void do_rt_sigreturn(struct pt_regs *regs)
{ {
struct rt_signal_frame __user *sf; struct rt_signal_frame __user *sf;
...@@ -351,128 +257,6 @@ static inline void __user *get_sigframe(struct sigaction *sa, struct pt_regs *re ...@@ -351,128 +257,6 @@ static inline void __user *get_sigframe(struct sigaction *sa, struct pt_regs *re
return (void __user *)(sp - framesize); return (void __user *)(sp - framesize);
} }
static inline void
setup_frame(struct sigaction *sa, struct pt_regs *regs, int signr, sigset_t *oldset, siginfo_t *info)
{
struct signal_sframe __user *sframep;
struct sigcontext __user *sc;
int window = 0, err;
unsigned long pc = regs->pc;
unsigned long npc = regs->npc;
struct thread_info *tp = current_thread_info();
void __user *sig_address;
int sig_code;
synchronize_user_stack();
sframep = (struct signal_sframe __user *)
get_sigframe(sa, regs, SF_ALIGNEDSZ);
if (invalid_frame_pointer(sframep, sizeof(*sframep))){
/* Don't change signal code and address, so that
* post mortem debuggers can have a look.
*/
goto sigill_and_return;
}
sc = &sframep->sig_context;
/* We've already made sure frame pointer isn't in kernel space... */
err = __put_user((sas_ss_flags(regs->u_regs[UREG_FP]) == SS_ONSTACK),
&sc->sigc_onstack);
err |= __put_user(oldset->sig[0], &sc->sigc_mask);
err |= __copy_to_user(sframep->extramask, &oldset->sig[1],
(_NSIG_WORDS - 1) * sizeof(unsigned int));
err |= __put_user(regs->u_regs[UREG_FP], &sc->sigc_sp);
err |= __put_user(pc, &sc->sigc_pc);
err |= __put_user(npc, &sc->sigc_npc);
err |= __put_user(regs->psr, &sc->sigc_psr);
err |= __put_user(regs->u_regs[UREG_G1], &sc->sigc_g1);
err |= __put_user(regs->u_regs[UREG_I0], &sc->sigc_o0);
err |= __put_user(tp->w_saved, &sc->sigc_oswins);
if (tp->w_saved)
for (window = 0; window < tp->w_saved; window++) {
put_user((char *)tp->rwbuf_stkptrs[window],
&sc->sigc_spbuf[window]);
err |= __copy_to_user(&sc->sigc_wbuf[window],
&tp->reg_window[window],
sizeof(struct reg_window));
}
else
err |= __copy_to_user(sframep, (char *) regs->u_regs[UREG_FP],
sizeof(struct reg_window));
tp->w_saved = 0; /* So process is allowed to execute. */
err |= __put_user(signr, &sframep->sig_num);
sig_address = NULL;
sig_code = 0;
if (SI_FROMKERNEL (info) && (info->si_code & __SI_MASK) == __SI_FAULT) {
sig_address = info->si_addr;
switch (signr) {
case SIGSEGV:
switch (info->si_code) {
case SEGV_MAPERR: sig_code = SUBSIG_NOMAPPING; break;
default: sig_code = SUBSIG_PROTECTION; break;
}
break;
case SIGILL:
switch (info->si_code) {
case ILL_ILLOPC: sig_code = SUBSIG_ILLINST; break;
case ILL_PRVOPC: sig_code = SUBSIG_PRIVINST; break;
case ILL_ILLTRP: sig_code = SUBSIG_BADTRAP(info->si_trapno); break;
default: sig_code = SUBSIG_STACK; break;
}
break;
case SIGFPE:
switch (info->si_code) {
case FPE_INTDIV: sig_code = SUBSIG_IDIVZERO; break;
case FPE_INTOVF: sig_code = SUBSIG_FPINTOVFL; break;
case FPE_FLTDIV: sig_code = SUBSIG_FPDIVZERO; break;
case FPE_FLTOVF: sig_code = SUBSIG_FPOVFLOW; break;
case FPE_FLTUND: sig_code = SUBSIG_FPUNFLOW; break;
case FPE_FLTRES: sig_code = SUBSIG_FPINEXACT; break;
case FPE_FLTINV: sig_code = SUBSIG_FPOPERROR; break;
default: sig_code = SUBSIG_FPERROR; break;
}
break;
case SIGBUS:
switch (info->si_code) {
case BUS_ADRALN: sig_code = SUBSIG_ALIGNMENT; break;
case BUS_ADRERR: sig_code = SUBSIG_MISCERROR; break;
default: sig_code = SUBSIG_BUSTIMEOUT; break;
}
break;
case SIGEMT:
switch (info->si_code) {
case EMT_TAGOVF: sig_code = SUBSIG_TAG; break;
}
break;
case SIGSYS:
if (info->si_code == (__SI_FAULT|0x100)) {
sig_code = info->si_trapno;
break;
}
default:
sig_address = NULL;
}
}
err |= __put_user((unsigned long)sig_address, &sframep->sig_address);
err |= __put_user(sig_code, &sframep->sig_code);
err |= __put_user(sc, &sframep->sig_scptr);
if (err)
goto sigsegv;
regs->u_regs[UREG_FP] = (unsigned long) sframep;
regs->pc = (unsigned long) sa->sa_handler;
regs->npc = (regs->pc + 4);
return;
sigill_and_return:
do_exit(SIGILL);
sigsegv:
force_sigsegv(signr, current);
}
static inline int static inline int
save_fpu_state(struct pt_regs *regs, __siginfo_fpu_t __user *fpu) save_fpu_state(struct pt_regs *regs, __siginfo_fpu_t __user *fpu)
{ {
...@@ -508,21 +292,20 @@ save_fpu_state(struct pt_regs *regs, __siginfo_fpu_t __user *fpu) ...@@ -508,21 +292,20 @@ save_fpu_state(struct pt_regs *regs, __siginfo_fpu_t __user *fpu)
return err; return err;
} }
static inline void static void setup_frame(struct k_sigaction *ka, struct pt_regs *regs,
new_setup_frame(struct k_sigaction *ka, struct pt_regs *regs, int signo, sigset_t *oldset)
int signo, sigset_t *oldset)
{ {
struct new_signal_frame __user *sf; struct signal_frame __user *sf;
int sigframe_size, err; int sigframe_size, err;
/* 1. Make sure everything is clean */ /* 1. Make sure everything is clean */
synchronize_user_stack(); synchronize_user_stack();
sigframe_size = NF_ALIGNEDSZ; sigframe_size = SF_ALIGNEDSZ;
if (!used_math()) if (!used_math())
sigframe_size -= sizeof(__siginfo_fpu_t); sigframe_size -= sizeof(__siginfo_fpu_t);
sf = (struct new_signal_frame __user *) sf = (struct signal_frame __user *)
get_sigframe(&ka->sa, regs, sigframe_size); get_sigframe(&ka->sa, regs, sigframe_size);
if (invalid_frame_pointer(sf, sigframe_size)) if (invalid_frame_pointer(sf, sigframe_size))
...@@ -586,9 +369,8 @@ new_setup_frame(struct k_sigaction *ka, struct pt_regs *regs, ...@@ -586,9 +369,8 @@ new_setup_frame(struct k_sigaction *ka, struct pt_regs *regs,
force_sigsegv(signo, current); force_sigsegv(signo, current);
} }
static inline void static void setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs,
new_setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs, int signo, sigset_t *oldset, siginfo_t *info)
int signo, sigset_t *oldset, siginfo_t *info)
{ {
struct rt_signal_frame __user *sf; struct rt_signal_frame __user *sf;
int sigframe_size; int sigframe_size;
...@@ -674,11 +456,9 @@ handle_signal(unsigned long signr, struct k_sigaction *ka, ...@@ -674,11 +456,9 @@ handle_signal(unsigned long signr, struct k_sigaction *ka,
siginfo_t *info, sigset_t *oldset, struct pt_regs *regs) siginfo_t *info, sigset_t *oldset, struct pt_regs *regs)
{ {
if (ka->sa.sa_flags & SA_SIGINFO) if (ka->sa.sa_flags & SA_SIGINFO)
new_setup_rt_frame(ka, regs, signr, oldset, info); setup_rt_frame(ka, regs, signr, oldset, info);
else if (current->thread.new_signal)
new_setup_frame(ka, regs, signr, oldset);
else else
setup_frame(&ka->sa, regs, signr, oldset, info); setup_frame(ka, regs, signr, oldset);
spin_lock_irq(&current->sighand->siglock); spin_lock_irq(&current->sighand->siglock);
sigorsets(&current->blocked,&current->blocked,&ka->sa.sa_mask); sigorsets(&current->blocked,&current->blocked,&ka->sa.sa_mask);
......
/* $Id: sys_sparc.c,v 1.70 2001/04/14 01:12:02 davem Exp $ /* linux/arch/sparc/kernel/sys_sparc.c
* linux/arch/sparc/kernel/sys_sparc.c
* *
* This file contains various random system calls that * This file contains various random system calls that
* have a non-standard calling sequence on the Linux/sparc * have a non-standard calling sequence on the Linux/sparc
...@@ -395,10 +394,8 @@ sparc_sigaction (int sig, const struct old_sigaction __user *act, ...@@ -395,10 +394,8 @@ sparc_sigaction (int sig, const struct old_sigaction __user *act,
struct k_sigaction new_ka, old_ka; struct k_sigaction new_ka, old_ka;
int ret; int ret;
if (sig < 0) { WARN_ON_ONCE(sig >= 0);
current->thread.new_signal = 1; sig = -sig;
sig = -sig;
}
if (act) { if (act) {
unsigned long mask; unsigned long mask;
...@@ -446,11 +443,6 @@ sys_rt_sigaction(int sig, ...@@ -446,11 +443,6 @@ sys_rt_sigaction(int sig,
if (sigsetsize != sizeof(sigset_t)) if (sigsetsize != sizeof(sigset_t))
return -EINVAL; return -EINVAL;
/* All tasks which use RT signals (effectively) use
* new style signals.
*/
current->thread.new_signal = 1;
if (act) { if (act) {
new_ka.ka_restorer = restorer; new_ka.ka_restorer = restorer;
if (copy_from_user(&new_ka.sa, act, sizeof(*act))) if (copy_from_user(&new_ka.sa, act, sizeof(*act)))
......
# $Id: config.in,v 1.158 2002/01/24 22:14:44 davem Exp $ # sparc64 configuration
# For a description of the syntax of this configuration file, mainmenu "Linux Kernel Configuration for 64-bit SPARC"
# see the Configure script.
#
mainmenu "Linux/UltraSPARC Kernel Configuration"
config SPARC config SPARC
bool bool
...@@ -17,12 +13,6 @@ config SPARC64 ...@@ -17,12 +13,6 @@ config SPARC64
default y default y
select HAVE_IDE select HAVE_IDE
select HAVE_LMB select HAVE_LMB
help
SPARC is a family of RISC microprocessors designed and marketed by
Sun Microsystems, incorporated. This port covers the newer 64-bit
UltraSPARC. The UltraLinux project maintains both the SPARC32 and
SPARC64 ports; its web page is available at
<http://www.ultralinux.org/>.
config GENERIC_TIME config GENERIC_TIME
bool bool
...@@ -97,7 +87,7 @@ config SPARC64_PAGE_SIZE_8KB ...@@ -97,7 +87,7 @@ config SPARC64_PAGE_SIZE_8KB
help help
This lets you select the page size of the kernel. This lets you select the page size of the kernel.
8KB and 64KB work quite well, since Sparc ELF sections 8KB and 64KB work quite well, since SPARC ELF sections
provide for up to 64KB alignment. provide for up to 64KB alignment.
Therefore, 512KB and 4MB are for expert hackers only. Therefore, 512KB and 4MB are for expert hackers only.
...@@ -138,7 +128,7 @@ config HOTPLUG_CPU ...@@ -138,7 +128,7 @@ config HOTPLUG_CPU
bool "Support for hot-pluggable CPUs" bool "Support for hot-pluggable CPUs"
depends on SMP depends on SMP
select HOTPLUG select HOTPLUG
---help--- help
Say Y here to experiment with turning CPUs off and on. CPUs Say Y here to experiment with turning CPUs off and on. CPUs
can be controlled through /sys/devices/system/cpu/cpu#. can be controlled through /sys/devices/system/cpu/cpu#.
Say N if you want to disable CPU hotplug. Say N if you want to disable CPU hotplug.
...@@ -155,23 +145,16 @@ source "kernel/time/Kconfig" ...@@ -155,23 +145,16 @@ source "kernel/time/Kconfig"
config SMP config SMP
bool "Symmetric multi-processing support" bool "Symmetric multi-processing support"
---help--- help
This enables support for systems with more than one CPU. If you have This enables support for systems with more than one CPU. If you have
a system with only one CPU, say N. If you have a system with more than a system with only one CPU, say N. If you have a system with more than
one CPU, say Y. one CPU, say Y.
If you say N here, the kernel will run on single and multiprocessor If you say N here, the kernel will run on single and multiprocessor
machines, but will use only one CPU of a multiprocessor machine. If machines, but will use only one CPU of a multiprocessor machine. If
you say Y here, the kernel will run on many, but not all, you say Y here, the kernel will run on single-processor machines.
singleprocessor machines. On a singleprocessor machine, the kernel On a single-processor machine, the kernel will run faster if you say
will run faster if you say N here. N here.
People using multiprocessor machines who say Y here should also say
Y to "Enhanced Real Time Clock Support", below. The "Advanced Power
Management" code will be disabled if you say Y here.
See also <file:Documentation/nmi_watchdog.txt> and the SMP-HOWTO
available at <http://www.tldp.org/docs.html#howto>.
If you don't know what to do here, say N. If you don't know what to do here, say N.
...@@ -284,50 +267,19 @@ source "mm/Kconfig" ...@@ -284,50 +267,19 @@ source "mm/Kconfig"
config ISA config ISA
bool bool
help
Find out whether you have ISA slots on your motherboard. ISA is the
name of a bus system, i.e. the way the CPU talks to the other stuff
inside your box. Other bus systems are PCI, EISA, MicroChannel
(MCA) or VESA. ISA is an older system, now being displaced by PCI;
newer boards don't support it. If you have ISA, say Y, otherwise N.
config ISAPNP config ISAPNP
bool bool
help
Say Y here if you would like support for ISA Plug and Play devices.
Some information is in <file:Documentation/isapnp.txt>.
To compile this driver as a module, choose M here: the
module will be called isapnp.
If unsure, say Y.
config EISA config EISA
bool bool
---help---
The Extended Industry Standard Architecture (EISA) bus was
developed as an open alternative to the IBM MicroChannel bus.
The EISA bus provided some of the features of the IBM MicroChannel
bus while maintaining backward compatibility with cards made for
the older ISA bus. The EISA bus saw limited use between 1988 and
1995 when it was made obsolete by the PCI bus.
Say Y here if you are building a kernel for an EISA-based machine.
Otherwise, say N.
config MCA config MCA
bool bool
help
MicroChannel Architecture is found in some IBM PS/2 machines and
laptops. It is a bus system similar to PCI or ISA. See
<file:Documentation/mca.txt> (and especially the web page given
there) before attempting to build an MCA bus kernel.
config PCMCIA config PCMCIA
tristate tristate
---help--- help
Say Y here if you want to attach PCMCIA- or PC-cards to your Linux Say Y here if you want to attach PCMCIA- or PC-cards to your Linux
computer. These are credit-card size devices such as network cards, computer. These are credit-card size devices such as network cards,
modems or hard drives often used with laptops computers. There are modems or hard drives often used with laptops computers. There are
...@@ -369,10 +321,10 @@ config PCI ...@@ -369,10 +321,10 @@ config PCI
bool "PCI support" bool "PCI support"
select ARCH_SUPPORTS_MSI select ARCH_SUPPORTS_MSI
help help
Find out whether you have a PCI motherboard. PCI is the name of a Find out whether your system includes a PCI bus. PCI is the name of
bus system, i.e. the way the CPU talks to the other stuff inside a bus system, i.e. the way the CPU talks to the other stuff inside
your box. Other bus systems are ISA, EISA, MicroChannel (MCA) or your box. If you say Y here, the kernel will include drivers and
VESA. If you have PCI, say Y, otherwise N. infrastructure code to support PCI bus devices.
config PCI_DOMAINS config PCI_DOMAINS
def_bool PCI def_bool PCI
...@@ -396,15 +348,8 @@ menu "Executable file formats" ...@@ -396,15 +348,8 @@ menu "Executable file formats"
source "fs/Kconfig.binfmt" source "fs/Kconfig.binfmt"
config SPARC32_COMPAT
bool "Kernel support for Linux/Sparc 32bit binary compatibility"
help
This allows you to run 32-bit binaries on your Ultra.
Everybody wants this; say Y.
config COMPAT config COMPAT
bool bool
depends on SPARC32_COMPAT
default y default y
select COMPAT_BINFMT_ELF select COMPAT_BINFMT_ELF
...@@ -421,8 +366,8 @@ config SCHED_SMT ...@@ -421,8 +366,8 @@ config SCHED_SMT
default y default y
help help
SMT scheduler support improves the CPU scheduler's decision making SMT scheduler support improves the CPU scheduler's decision making
when dealing with UltraSPARC cpus at a cost of slightly increased when dealing with SPARC cpus at a cost of slightly increased overhead
overhead in some places. If unsure say N here. in some places. If unsure say N here.
config SCHED_MC config SCHED_MC
bool "Multi-core scheduler support" bool "Multi-core scheduler support"
......
# #
# Automatically generated make config: don't edit # Automatically generated make config: don't edit
# Linux kernel version: 2.6.25-numa # Linux kernel version: 2.6.25
# Wed Apr 23 04:49:08 2008 # Sat Apr 26 03:11:06 2008
# #
CONFIG_SPARC=y CONFIG_SPARC=y
CONFIG_SPARC64=y CONFIG_SPARC64=y
...@@ -152,7 +152,9 @@ CONFIG_GENERIC_CALIBRATE_DELAY=y ...@@ -152,7 +152,9 @@ CONFIG_GENERIC_CALIBRATE_DELAY=y
CONFIG_HUGETLB_PAGE_SIZE_4MB=y CONFIG_HUGETLB_PAGE_SIZE_4MB=y
# CONFIG_HUGETLB_PAGE_SIZE_512K is not set # CONFIG_HUGETLB_PAGE_SIZE_512K is not set
# CONFIG_HUGETLB_PAGE_SIZE_64K is not set # CONFIG_HUGETLB_PAGE_SIZE_64K is not set
# CONFIG_NUMA is not set CONFIG_NUMA=y
CONFIG_NODES_SHIFT=4
CONFIG_NODES_SPAN_OTHER_NODES=y
CONFIG_ARCH_POPULATES_NODE_MAP=y CONFIG_ARCH_POPULATES_NODE_MAP=y
CONFIG_ARCH_SELECT_MEMORY_MODEL=y CONFIG_ARCH_SELECT_MEMORY_MODEL=y
CONFIG_ARCH_SPARSEMEM_ENABLE=y CONFIG_ARCH_SPARSEMEM_ENABLE=y
...@@ -162,12 +164,14 @@ CONFIG_SELECT_MEMORY_MODEL=y ...@@ -162,12 +164,14 @@ CONFIG_SELECT_MEMORY_MODEL=y
# CONFIG_DISCONTIGMEM_MANUAL is not set # CONFIG_DISCONTIGMEM_MANUAL is not set
CONFIG_SPARSEMEM_MANUAL=y CONFIG_SPARSEMEM_MANUAL=y
CONFIG_SPARSEMEM=y CONFIG_SPARSEMEM=y
CONFIG_NEED_MULTIPLE_NODES=y
CONFIG_HAVE_MEMORY_PRESENT=y CONFIG_HAVE_MEMORY_PRESENT=y
# CONFIG_SPARSEMEM_STATIC is not set # CONFIG_SPARSEMEM_STATIC is not set
CONFIG_SPARSEMEM_EXTREME=y CONFIG_SPARSEMEM_EXTREME=y
CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y
CONFIG_SPARSEMEM_VMEMMAP=y CONFIG_SPARSEMEM_VMEMMAP=y
CONFIG_SPLIT_PTLOCK_CPUS=4 CONFIG_SPLIT_PTLOCK_CPUS=4
CONFIG_MIGRATION=y
CONFIG_RESOURCES_64BIT=y CONFIG_RESOURCES_64BIT=y
CONFIG_ZONE_DMA_FLAG=0 CONFIG_ZONE_DMA_FLAG=0
CONFIG_NR_QUICK=1 CONFIG_NR_QUICK=1
...@@ -191,7 +195,6 @@ CONFIG_SUN_OPENPROMFS=m ...@@ -191,7 +195,6 @@ CONFIG_SUN_OPENPROMFS=m
CONFIG_BINFMT_ELF=y CONFIG_BINFMT_ELF=y
CONFIG_COMPAT_BINFMT_ELF=y CONFIG_COMPAT_BINFMT_ELF=y
CONFIG_BINFMT_MISC=m CONFIG_BINFMT_MISC=m
CONFIG_SPARC32_COMPAT=y
CONFIG_COMPAT=y CONFIG_COMPAT=y
CONFIG_SYSVIPC_COMPAT=y CONFIG_SYSVIPC_COMPAT=y
CONFIG_SCHED_SMT=y CONFIG_SCHED_SMT=y
...@@ -746,13 +749,7 @@ CONFIG_DEVPORT=y ...@@ -746,13 +749,7 @@ CONFIG_DEVPORT=y
CONFIG_I2C=y CONFIG_I2C=y
CONFIG_I2C_BOARDINFO=y CONFIG_I2C_BOARDINFO=y
# CONFIG_I2C_CHARDEV is not set # CONFIG_I2C_CHARDEV is not set
#
# I2C Algorithms
#
CONFIG_I2C_ALGOBIT=y CONFIG_I2C_ALGOBIT=y
# CONFIG_I2C_ALGOPCF is not set
# CONFIG_I2C_ALGOPCA is not set
# #
# I2C Hardware Bus support # I2C Hardware Bus support
...@@ -780,6 +777,7 @@ CONFIG_I2C_ALGOBIT=y ...@@ -780,6 +777,7 @@ CONFIG_I2C_ALGOBIT=y
# CONFIG_I2C_VIA is not set # CONFIG_I2C_VIA is not set
# CONFIG_I2C_VIAPRO is not set # CONFIG_I2C_VIAPRO is not set
# CONFIG_I2C_VOODOO3 is not set # CONFIG_I2C_VOODOO3 is not set
# CONFIG_I2C_PCA_PLATFORM is not set
# #
# Miscellaneous I2C Chip support # Miscellaneous I2C Chip support
...@@ -1026,6 +1024,7 @@ CONFIG_SND_ALI5451=m ...@@ -1026,6 +1024,7 @@ CONFIG_SND_ALI5451=m
# CONFIG_SND_AU8810 is not set # CONFIG_SND_AU8810 is not set
# CONFIG_SND_AU8820 is not set # CONFIG_SND_AU8820 is not set
# CONFIG_SND_AU8830 is not set # CONFIG_SND_AU8830 is not set
# CONFIG_SND_AW2 is not set
# CONFIG_SND_AZT3328 is not set # CONFIG_SND_AZT3328 is not set
# CONFIG_SND_BT87X is not set # CONFIG_SND_BT87X is not set
# CONFIG_SND_CA0106 is not set # CONFIG_SND_CA0106 is not set
...@@ -1096,10 +1095,6 @@ CONFIG_SND_SUN_CS4231=m ...@@ -1096,10 +1095,6 @@ CONFIG_SND_SUN_CS4231=m
# #
# CONFIG_SND_SOC is not set # CONFIG_SND_SOC is not set
#
# SoC Audio support for SuperH
#
# #
# ALSA SoC audio for Freescale SOCs # ALSA SoC audio for Freescale SOCs
# #
......
...@@ -15,17 +15,17 @@ obj-y := process.o setup.o cpu.o idprom.o \ ...@@ -15,17 +15,17 @@ obj-y := process.o setup.o cpu.o idprom.o \
visemul.o prom.o of_device.o hvapi.o sstate.o mdesc.o visemul.o prom.o of_device.o hvapi.o sstate.o mdesc.o
obj-$(CONFIG_STACKTRACE) += stacktrace.o obj-$(CONFIG_STACKTRACE) += stacktrace.o
obj-$(CONFIG_PCI) += ebus.o isa.o pci_common.o \ obj-$(CONFIG_PCI) += ebus.o pci_common.o \
pci_psycho.o pci_sabre.o pci_schizo.o \ pci_psycho.o pci_sabre.o pci_schizo.o \
pci_sun4v.o pci_sun4v_asm.o pci_fire.o pci_sun4v.o pci_sun4v_asm.o pci_fire.o
obj-$(CONFIG_PCI_MSI) += pci_msi.o obj-$(CONFIG_PCI_MSI) += pci_msi.o
obj-$(CONFIG_SMP) += smp.o trampoline.o hvtramp.o obj-$(CONFIG_SMP) += smp.o trampoline.o hvtramp.o
obj-$(CONFIG_SPARC32_COMPAT) += sys32.o sys_sparc32.o signal32.o obj-$(CONFIG_COMPAT) += sys32.o sys_sparc32.o signal32.o
obj-$(CONFIG_MODULES) += module.o obj-$(CONFIG_MODULES) += module.o
obj-$(CONFIG_US3_FREQ) += us3_cpufreq.o obj-$(CONFIG_US3_FREQ) += us3_cpufreq.o
obj-$(CONFIG_US2E_FREQ) += us2e_cpufreq.o obj-$(CONFIG_US2E_FREQ) += us2e_cpufreq.o
obj-$(CONFIG_KPROBES) += kprobes.o obj-$(CONFIG_KPROBES) += kprobes.o
obj-$(CONFIG_SUN_LDOMS) += ldc.o vio.o viohs.o ds.o obj-$(CONFIG_SUN_LDOMS) += ldc.o vio.o viohs.o ds.o
obj-$(CONFIG_AUDIT) += audit.o obj-$(CONFIG_AUDIT) += audit.o
obj-$(CONFIG_AUDIT)$(CONFIG_SPARC32_COMPAT) += compat_audit.o obj-$(CONFIG_AUDIT)$(CONFIG_COMPAT) += compat_audit.o
obj-y += $(obj-yy) obj-y += $(obj-yy)
...@@ -30,7 +30,7 @@ static unsigned signal_class[] = { ...@@ -30,7 +30,7 @@ static unsigned signal_class[] = {
int audit_classify_arch(int arch) int audit_classify_arch(int arch)
{ {
#ifdef CONFIG_SPARC32_COMPAT #ifdef CONFIG_COMPAT
if (arch == AUDIT_ARCH_SPARC) if (arch == AUDIT_ARCH_SPARC)
return 1; return 1;
#endif #endif
...@@ -39,7 +39,7 @@ int audit_classify_arch(int arch) ...@@ -39,7 +39,7 @@ int audit_classify_arch(int arch)
int audit_classify_syscall(int abi, unsigned syscall) int audit_classify_syscall(int abi, unsigned syscall)
{ {
#ifdef CONFIG_SPARC32_COMPAT #ifdef CONFIG_COMPAT
extern int sparc32_classify_syscall(unsigned); extern int sparc32_classify_syscall(unsigned);
if (abi == AUDIT_ARCH_SPARC) if (abi == AUDIT_ARCH_SPARC)
return sparc32_classify_syscall(syscall); return sparc32_classify_syscall(syscall);
...@@ -60,7 +60,7 @@ int audit_classify_syscall(int abi, unsigned syscall) ...@@ -60,7 +60,7 @@ int audit_classify_syscall(int abi, unsigned syscall)
static int __init audit_classes_init(void) static int __init audit_classes_init(void)
{ {
#ifdef CONFIG_SPARC32_COMPAT #ifdef CONFIG_COMPAT
extern __u32 sparc32_dir_class[]; extern __u32 sparc32_dir_class[];
extern __u32 sparc32_write_class[]; extern __u32 sparc32_write_class[];
extern __u32 sparc32_read_class[]; extern __u32 sparc32_read_class[];
......
/* irq.c: UltraSparc IRQ handling/init/registry. /* irq.c: UltraSparc IRQ handling/init/registry.
* *
* Copyright (C) 1997, 2007 David S. Miller (davem@davemloft.net) * Copyright (C) 1997, 2007, 2008 David S. Miller (davem@davemloft.net)
* Copyright (C) 1998 Eddie C. Dost (ecd@skynet.be) * Copyright (C) 1998 Eddie C. Dost (ecd@skynet.be)
* Copyright (C) 1998 Jakub Jelinek (jj@ultra.linux.cz) * Copyright (C) 1998 Jakub Jelinek (jj@ultra.linux.cz)
*/ */
...@@ -308,6 +308,7 @@ static void sun4u_irq_enable(unsigned int virt_irq) ...@@ -308,6 +308,7 @@ static void sun4u_irq_enable(unsigned int virt_irq)
IMAP_AID_SAFARI | IMAP_NID_SAFARI); IMAP_AID_SAFARI | IMAP_NID_SAFARI);
val |= tid | IMAP_VALID; val |= tid | IMAP_VALID;
upa_writeq(val, imap); upa_writeq(val, imap);
upa_writeq(ICLR_IDLE, data->iclr);
} }
} }
......
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/pci.h>
#include <linux/slab.h>
#include <asm/oplib.h>
#include <asm/prom.h>
#include <asm/of_device.h>
#include <asm/isa.h>
struct sparc_isa_bridge *isa_chain;
static void __init fatal_err(const char *reason)
{
prom_printf("ISA: fatal error, %s.\n", reason);
}
static void __init report_dev(struct sparc_isa_device *isa_dev, int child)
{
if (child)
printk(" (%s)", isa_dev->prom_node->name);
else
printk(" [%s", isa_dev->prom_node->name);
}
static void __init isa_dev_get_resource(struct sparc_isa_device *isa_dev)
{
struct of_device *op = of_find_device_by_node(isa_dev->prom_node);
memcpy(&isa_dev->resource, &op->resource[0], sizeof(struct resource));
}
static void __init isa_dev_get_irq(struct sparc_isa_device *isa_dev)
{
struct of_device *op = of_find_device_by_node(isa_dev->prom_node);
if (!op || !op->num_irqs) {
isa_dev->irq = PCI_IRQ_NONE;
} else {
isa_dev->irq = op->irqs[0];
}
}
static void __init isa_fill_children(struct sparc_isa_device *parent_isa_dev)
{
struct device_node *dp = parent_isa_dev->prom_node->child;
if (!dp)
return;
printk(" ->");
while (dp) {
struct sparc_isa_device *isa_dev;
isa_dev = kzalloc(sizeof(*isa_dev), GFP_KERNEL);
if (!isa_dev) {
fatal_err("cannot allocate child isa_dev");
prom_halt();
}
/* Link it in to parent. */
isa_dev->next = parent_isa_dev->child;
parent_isa_dev->child = isa_dev;
isa_dev->bus = parent_isa_dev->bus;
isa_dev->prom_node = dp;
isa_dev_get_resource(isa_dev);
isa_dev_get_irq(isa_dev);
report_dev(isa_dev, 1);
dp = dp->sibling;
}
}
static void __init isa_fill_devices(struct sparc_isa_bridge *isa_br)
{
struct device_node *dp = isa_br->prom_node->child;
while (dp) {
struct sparc_isa_device *isa_dev;
struct dev_archdata *sd;
isa_dev = kzalloc(sizeof(*isa_dev), GFP_KERNEL);
if (!isa_dev) {
printk(KERN_DEBUG "ISA: cannot allocate isa_dev");
return;
}
sd = &isa_dev->ofdev.dev.archdata;
sd->prom_node = dp;
sd->op = &isa_dev->ofdev;
sd->iommu = isa_br->ofdev.dev.parent->archdata.iommu;
sd->stc = isa_br->ofdev.dev.parent->archdata.stc;
sd->numa_node = isa_br->ofdev.dev.parent->archdata.numa_node;
isa_dev->ofdev.node = dp;
isa_dev->ofdev.dev.parent = &isa_br->ofdev.dev;
isa_dev->ofdev.dev.bus = &isa_bus_type;
sprintf(isa_dev->ofdev.dev.bus_id, "isa[%08x]", dp->node);
/* Register with core */
if (of_device_register(&isa_dev->ofdev) != 0) {
printk(KERN_DEBUG "isa: device registration error for %s!\n",
dp->path_component_name);
kfree(isa_dev);
goto next_sibling;
}
/* Link it in. */
isa_dev->next = NULL;
if (isa_br->devices == NULL) {
isa_br->devices = isa_dev;
} else {
struct sparc_isa_device *tmp = isa_br->devices;
while (tmp->next)
tmp = tmp->next;
tmp->next = isa_dev;
}
isa_dev->bus = isa_br;
isa_dev->prom_node = dp;
isa_dev_get_resource(isa_dev);
isa_dev_get_irq(isa_dev);
report_dev(isa_dev, 0);
isa_fill_children(isa_dev);
printk("]");
next_sibling:
dp = dp->sibling;
}
}
void __init isa_init(void)
{
struct pci_dev *pdev;
unsigned short vendor, device;
int index = 0;
vendor = PCI_VENDOR_ID_AL;
device = PCI_DEVICE_ID_AL_M1533;
pdev = NULL;
while ((pdev = pci_get_device(vendor, device, pdev)) != NULL) {
struct sparc_isa_bridge *isa_br;
struct device_node *dp;
dp = pci_device_to_OF_node(pdev);
isa_br = kzalloc(sizeof(*isa_br), GFP_KERNEL);
if (!isa_br) {
printk(KERN_DEBUG "isa: cannot allocate sparc_isa_bridge");
pci_dev_put(pdev);
return;
}
isa_br->ofdev.node = dp;
isa_br->ofdev.dev.parent = &pdev->dev;
isa_br->ofdev.dev.bus = &isa_bus_type;
sprintf(isa_br->ofdev.dev.bus_id, "isa%d", index);
/* Register with core */
if (of_device_register(&isa_br->ofdev) != 0) {
printk(KERN_DEBUG "isa: device registration error for %s!\n",
dp->path_component_name);
kfree(isa_br);
pci_dev_put(pdev);
return;
}
/* Link it in. */
isa_br->next = isa_chain;
isa_chain = isa_br;
isa_br->self = pdev;
isa_br->index = index++;
isa_br->prom_node = dp;
printk("isa%d:", isa_br->index);
isa_fill_devices(isa_br);
printk("\n");
}
}
...@@ -412,12 +412,6 @@ static int __init build_one_resource(struct device_node *parent, ...@@ -412,12 +412,6 @@ static int __init build_one_resource(struct device_node *parent,
static int __init use_1to1_mapping(struct device_node *pp) static int __init use_1to1_mapping(struct device_node *pp)
{ {
/* If this is on the PMU bus, don't try to translate it even
* if a ranges property exists.
*/
if (!strcmp(pp->name, "pmu"))
return 1;
/* If we have a ranges property in the parent, use it. */ /* If we have a ranges property in the parent, use it. */
if (of_find_property(pp, "ranges", NULL) != NULL) if (of_find_property(pp, "ranges", NULL) != NULL)
return 0; return 0;
......
...@@ -23,7 +23,6 @@ ...@@ -23,7 +23,6 @@
#include <asm/pgtable.h> #include <asm/pgtable.h>
#include <asm/irq.h> #include <asm/irq.h>
#include <asm/ebus.h> #include <asm/ebus.h>
#include <asm/isa.h>
#include <asm/prom.h> #include <asm/prom.h>
#include <asm/apb.h> #include <asm/apb.h>
...@@ -885,7 +884,6 @@ static int __init pcibios_init(void) ...@@ -885,7 +884,6 @@ static int __init pcibios_init(void)
pci_scan_each_controller_bus(); pci_scan_each_controller_bus();
isa_init();
ebus_init(); ebus_init();
power_init(); power_init();
......
/* $Id: process.c,v 1.131 2002/02/09 19:49:30 davem Exp $ /* arch/sparc64/kernel/process.c
* arch/sparc64/kernel/process.c
* *
* Copyright (C) 1995, 1996 David S. Miller (davem@caip.rutgers.edu) * Copyright (C) 1995, 1996 David S. Miller (davem@caip.rutgers.edu)
* Copyright (C) 1996 Eddie C. Dost (ecd@skynet.be) * Copyright (C) 1996 Eddie C. Dost (ecd@skynet.be)
...@@ -368,9 +367,6 @@ void flush_thread(void) ...@@ -368,9 +367,6 @@ void flush_thread(void)
if (get_thread_current_ds() != ASI_AIUS) if (get_thread_current_ds() != ASI_AIUS)
set_fs(USER_DS); set_fs(USER_DS);
/* Init new signal delivery disposition. */
clear_thread_flag(TIF_NEWSIGNALS);
} }
/* It's a bit more tricky when 64-bit tasks are involved... */ /* It's a bit more tricky when 64-bit tasks are involved... */
...@@ -595,6 +591,12 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long sp, ...@@ -595,6 +591,12 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long sp,
if (clone_flags & CLONE_SETTLS) if (clone_flags & CLONE_SETTLS)
t->kregs->u_regs[UREG_G7] = regs->u_regs[UREG_I3]; t->kregs->u_regs[UREG_G7] = regs->u_regs[UREG_I3];
/* We do not want to accidently trigger system call restart
* handling in the new thread. Therefore, clear out the trap
* type, which will make pt_regs_regs_is_syscall() return false.
*/
pt_regs_clear_trap_type(t->kregs);
return 0; return 0;
} }
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* Copyright (C) 1997,1998 Jakub Jelinek (jj@sunsite.mff.cuni.cz) * Copyright (C) 1997,1998 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
*/ */
#ifdef CONFIG_SPARC32_COMPAT #ifdef CONFIG_COMPAT
#include <linux/compat.h> /* for compat_old_sigset_t */ #include <linux/compat.h> /* for compat_old_sigset_t */
#endif #endif
#include <linux/sched.h> #include <linux/sched.h>
...@@ -236,9 +236,6 @@ struct rt_signal_frame { ...@@ -236,9 +236,6 @@ struct rt_signal_frame {
__siginfo_fpu_t fpu_state; __siginfo_fpu_t fpu_state;
}; };
/* Align macros */
#define RT_ALIGNEDSZ (((sizeof(struct rt_signal_frame) + 7) & (~7)))
static long _sigpause_common(old_sigset_t set) static long _sigpause_common(old_sigset_t set)
{ {
set &= _BLOCKABLE; set &= _BLOCKABLE;
...@@ -400,7 +397,7 @@ setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs, ...@@ -400,7 +397,7 @@ setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs,
synchronize_user_stack(); synchronize_user_stack();
save_and_clear_fpu(); save_and_clear_fpu();
sigframe_size = RT_ALIGNEDSZ; sigframe_size = sizeof(struct rt_signal_frame);
if (!(current_thread_info()->fpsaved[0] & FPRS_FEF)) if (!(current_thread_info()->fpsaved[0] & FPRS_FEF))
sigframe_size -= sizeof(__siginfo_fpu_t); sigframe_size -= sizeof(__siginfo_fpu_t);
...@@ -516,11 +513,10 @@ static void do_signal(struct pt_regs *regs, unsigned long orig_i0) ...@@ -516,11 +513,10 @@ static void do_signal(struct pt_regs *regs, unsigned long orig_i0)
struct k_sigaction ka; struct k_sigaction ka;
sigset_t *oldset; sigset_t *oldset;
siginfo_t info; siginfo_t info;
int signr, tt; int signr;
tt = regs->magic & 0x1ff; if (pt_regs_is_syscall(regs)) {
if (tt == 0x110 || tt == 0x111 || tt == 0x16d) { pt_regs_clear_trap_type(regs);
regs->magic &= ~0x1ff;
cookie.restart_syscall = 1; cookie.restart_syscall = 1;
} else } else
cookie.restart_syscall = 0; cookie.restart_syscall = 0;
...@@ -531,7 +527,7 @@ static void do_signal(struct pt_regs *regs, unsigned long orig_i0) ...@@ -531,7 +527,7 @@ static void do_signal(struct pt_regs *regs, unsigned long orig_i0)
else else
oldset = &current->blocked; oldset = &current->blocked;
#ifdef CONFIG_SPARC32_COMPAT #ifdef CONFIG_COMPAT
if (test_thread_flag(TIF_32BIT)) { if (test_thread_flag(TIF_32BIT)) {
extern void do_signal32(sigset_t *, struct pt_regs *, extern void do_signal32(sigset_t *, struct pt_regs *,
struct signal_deliver_cookie *); struct signal_deliver_cookie *);
......
/* $Id: signal32.c,v 1.74 2002/02/09 19:49:30 davem Exp $ /* arch/sparc64/kernel/signal32.c
* arch/sparc64/kernel/signal32.c
* *
* Copyright (C) 1991, 1992 Linus Torvalds * Copyright (C) 1991, 1992 Linus Torvalds
* Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
...@@ -31,30 +30,6 @@ ...@@ -31,30 +30,6 @@
#define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP))) #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
/* Signal frames: the original one (compatible with SunOS):
*
* Set up a signal frame... Make the stack look the way SunOS
* expects it to look which is basically:
*
* ---------------------------------- <-- %sp at signal time
* Struct sigcontext
* Signal address
* Ptr to sigcontext area above
* Signal code
* The signal number itself
* One register window
* ---------------------------------- <-- New %sp
*/
struct signal_sframe32 {
struct reg_window32 sig_window;
int sig_num;
int sig_code;
/* struct sigcontext32 * */ u32 sig_scptr;
int sig_address;
struct sigcontext32 sig_context;
unsigned int extramask[_COMPAT_NSIG_WORDS - 1];
};
/* This magic should be in g_upper[0] for all upper parts /* This magic should be in g_upper[0] for all upper parts
* to be valid. * to be valid.
*/ */
...@@ -65,12 +40,7 @@ typedef struct { ...@@ -65,12 +40,7 @@ typedef struct {
unsigned int asi; unsigned int asi;
} siginfo_extra_v8plus_t; } siginfo_extra_v8plus_t;
/* struct signal_frame32 {
* And the new one, intended to be used for Linux applications only
* (we have enough in there to work with clone).
* All the interesting bits are in the info field.
*/
struct new_signal_frame32 {
struct sparc_stackf32 ss; struct sparc_stackf32 ss;
__siginfo32_t info; __siginfo32_t info;
/* __siginfo_fpu32_t * */ u32 fpu_save; /* __siginfo_fpu32_t * */ u32 fpu_save;
...@@ -149,8 +119,7 @@ struct rt_signal_frame32 { ...@@ -149,8 +119,7 @@ struct rt_signal_frame32 {
}; };
/* Align macros */ /* Align macros */
#define SF_ALIGNEDSZ (((sizeof(struct signal_sframe32) + 7) & (~7))) #define SF_ALIGNEDSZ (((sizeof(struct signal_frame32) + 7) & (~7)))
#define NF_ALIGNEDSZ (((sizeof(struct new_signal_frame32) + 7) & (~7)))
#define RT_ALIGNEDSZ (((sizeof(struct rt_signal_frame32) + 7) & (~7))) #define RT_ALIGNEDSZ (((sizeof(struct rt_signal_frame32) + 7) & (~7)))
int copy_siginfo_to_user32(compat_siginfo_t __user *to, siginfo_t *from) int copy_siginfo_to_user32(compat_siginfo_t __user *to, siginfo_t *from)
...@@ -241,17 +210,22 @@ static int restore_fpu_state32(struct pt_regs *regs, __siginfo_fpu_t __user *fpu ...@@ -241,17 +210,22 @@ static int restore_fpu_state32(struct pt_regs *regs, __siginfo_fpu_t __user *fpu
return err; return err;
} }
void do_new_sigreturn32(struct pt_regs *regs) void do_sigreturn32(struct pt_regs *regs)
{ {
struct new_signal_frame32 __user *sf; struct signal_frame32 __user *sf;
unsigned int psr; unsigned int psr;
unsigned pc, npc, fpu_save; unsigned pc, npc, fpu_save;
sigset_t set; sigset_t set;
unsigned seta[_COMPAT_NSIG_WORDS]; unsigned seta[_COMPAT_NSIG_WORDS];
int err, i; int err, i;
/* Always make any pending restarted system calls return -EINTR */
current_thread_info()->restart_block.fn = do_no_restart_syscall;
synchronize_user_stack();
regs->u_regs[UREG_FP] &= 0x00000000ffffffffUL; regs->u_regs[UREG_FP] &= 0x00000000ffffffffUL;
sf = (struct new_signal_frame32 __user *) regs->u_regs[UREG_FP]; sf = (struct signal_frame32 __user *) regs->u_regs[UREG_FP];
/* 1. Make sure we are not getting garbage from the user */ /* 1. Make sure we are not getting garbage from the user */
if (!access_ok(VERIFY_READ, sf, sizeof(*sf)) || if (!access_ok(VERIFY_READ, sf, sizeof(*sf)) ||
...@@ -319,76 +293,6 @@ void do_new_sigreturn32(struct pt_regs *regs) ...@@ -319,76 +293,6 @@ void do_new_sigreturn32(struct pt_regs *regs)
force_sig(SIGSEGV, current); force_sig(SIGSEGV, current);
} }
asmlinkage void do_sigreturn32(struct pt_regs *regs)
{
struct sigcontext32 __user *scptr;
unsigned int pc, npc, psr;
sigset_t set;
unsigned int seta[_COMPAT_NSIG_WORDS];
int err;
/* Always make any pending restarted system calls return -EINTR */
current_thread_info()->restart_block.fn = do_no_restart_syscall;
synchronize_user_stack();
if (test_thread_flag(TIF_NEWSIGNALS)) {
do_new_sigreturn32(regs);
return;
}
scptr = (struct sigcontext32 __user *)
(regs->u_regs[UREG_I0] & 0x00000000ffffffffUL);
/* Check sanity of the user arg. */
if (!access_ok(VERIFY_READ, scptr, sizeof(struct sigcontext32)) ||
(((unsigned long) scptr) & 3))
goto segv;
err = __get_user(pc, &scptr->sigc_pc);
err |= __get_user(npc, &scptr->sigc_npc);
if ((pc | npc) & 3)
goto segv; /* Nice try. */
err |= __get_user(seta[0], &scptr->sigc_mask);
/* Note that scptr + 1 points to extramask */
err |= copy_from_user(seta+1, scptr + 1,
(_COMPAT_NSIG_WORDS - 1) * sizeof(unsigned int));
if (err)
goto segv;
switch (_NSIG_WORDS) {
case 4: set.sig[3] = seta[6] + (((long)seta[7]) << 32);
case 3: set.sig[2] = seta[4] + (((long)seta[5]) << 32);
case 2: set.sig[1] = seta[2] + (((long)seta[3]) << 32);
case 1: set.sig[0] = seta[0] + (((long)seta[1]) << 32);
}
sigdelsetmask(&set, ~_BLOCKABLE);
spin_lock_irq(&current->sighand->siglock);
current->blocked = set;
recalc_sigpending();
spin_unlock_irq(&current->sighand->siglock);
if (test_thread_flag(TIF_32BIT)) {
pc &= 0xffffffff;
npc &= 0xffffffff;
}
regs->tpc = pc;
regs->tnpc = npc;
err = __get_user(regs->u_regs[UREG_FP], &scptr->sigc_sp);
err |= __get_user(regs->u_regs[UREG_I0], &scptr->sigc_o0);
err |= __get_user(regs->u_regs[UREG_G1], &scptr->sigc_g1);
/* User can only change condition codes in %tstate. */
err |= __get_user(psr, &scptr->sigc_psr);
if (err)
goto segv;
regs->tstate &= ~(TSTATE_ICC|TSTATE_XCC);
regs->tstate |= psr_to_tstate_icc(psr);
return;
segv:
force_sig(SIGSEGV, current);
}
asmlinkage void do_rt_sigreturn32(struct pt_regs *regs) asmlinkage void do_rt_sigreturn32(struct pt_regs *regs)
{ {
struct rt_signal_frame32 __user *sf; struct rt_signal_frame32 __user *sf;
...@@ -504,145 +408,6 @@ static void __user *get_sigframe(struct sigaction *sa, struct pt_regs *regs, uns ...@@ -504,145 +408,6 @@ static void __user *get_sigframe(struct sigaction *sa, struct pt_regs *regs, uns
return (void __user *)(sp - framesize); return (void __user *)(sp - framesize);
} }
static void
setup_frame32(struct sigaction *sa, struct pt_regs *regs, int signr, sigset_t *oldset, siginfo_t *info)
{
struct signal_sframe32 __user *sframep;
struct sigcontext32 __user *sc;
unsigned int seta[_COMPAT_NSIG_WORDS];
int err = 0;
void __user *sig_address;
int sig_code;
unsigned long pc = regs->tpc;
unsigned long npc = regs->tnpc;
unsigned int psr;
if (test_thread_flag(TIF_32BIT)) {
pc &= 0xffffffff;
npc &= 0xffffffff;
}
synchronize_user_stack();
save_and_clear_fpu();
sframep = (struct signal_sframe32 __user *)
get_sigframe(sa, regs, SF_ALIGNEDSZ);
if (invalid_frame_pointer(sframep, sizeof(*sframep))){
/* Don't change signal code and address, so that
* post mortem debuggers can have a look.
*/
do_exit(SIGILL);
}
sc = &sframep->sig_context;
/* We've already made sure frame pointer isn't in kernel space... */
err = __put_user((sas_ss_flags(regs->u_regs[UREG_FP]) == SS_ONSTACK),
&sc->sigc_onstack);
switch (_NSIG_WORDS) {
case 4: seta[7] = (oldset->sig[3] >> 32);
seta[6] = oldset->sig[3];
case 3: seta[5] = (oldset->sig[2] >> 32);
seta[4] = oldset->sig[2];
case 2: seta[3] = (oldset->sig[1] >> 32);
seta[2] = oldset->sig[1];
case 1: seta[1] = (oldset->sig[0] >> 32);
seta[0] = oldset->sig[0];
}
err |= __put_user(seta[0], &sc->sigc_mask);
err |= __copy_to_user(sframep->extramask, seta + 1,
(_COMPAT_NSIG_WORDS - 1) * sizeof(unsigned int));
err |= __put_user(regs->u_regs[UREG_FP], &sc->sigc_sp);
err |= __put_user(pc, &sc->sigc_pc);
err |= __put_user(npc, &sc->sigc_npc);
psr = tstate_to_psr(regs->tstate);
if (current_thread_info()->fpsaved[0] & FPRS_FEF)
psr |= PSR_EF;
err |= __put_user(psr, &sc->sigc_psr);
err |= __put_user(regs->u_regs[UREG_G1], &sc->sigc_g1);
err |= __put_user(regs->u_regs[UREG_I0], &sc->sigc_o0);
err |= __put_user(get_thread_wsaved(), &sc->sigc_oswins);
err |= copy_in_user((u32 __user *)sframep,
(u32 __user *)(regs->u_regs[UREG_FP]),
sizeof(struct reg_window32));
set_thread_wsaved(0); /* So process is allowed to execute. */
err |= __put_user(signr, &sframep->sig_num);
sig_address = NULL;
sig_code = 0;
if (SI_FROMKERNEL (info) && (info->si_code & __SI_MASK) == __SI_FAULT) {
sig_address = info->si_addr;
switch (signr) {
case SIGSEGV:
switch (info->si_code) {
case SEGV_MAPERR: sig_code = SUBSIG_NOMAPPING; break;
default: sig_code = SUBSIG_PROTECTION; break;
}
break;
case SIGILL:
switch (info->si_code) {
case ILL_ILLOPC: sig_code = SUBSIG_ILLINST; break;
case ILL_PRVOPC: sig_code = SUBSIG_PRIVINST; break;
case ILL_ILLTRP: sig_code = SUBSIG_BADTRAP(info->si_trapno); break;
default: sig_code = SUBSIG_STACK; break;
}
break;
case SIGFPE:
switch (info->si_code) {
case FPE_INTDIV: sig_code = SUBSIG_IDIVZERO; break;
case FPE_INTOVF: sig_code = SUBSIG_FPINTOVFL; break;
case FPE_FLTDIV: sig_code = SUBSIG_FPDIVZERO; break;
case FPE_FLTOVF: sig_code = SUBSIG_FPOVFLOW; break;
case FPE_FLTUND: sig_code = SUBSIG_FPUNFLOW; break;
case FPE_FLTRES: sig_code = SUBSIG_FPINEXACT; break;
case FPE_FLTINV: sig_code = SUBSIG_FPOPERROR; break;
default: sig_code = SUBSIG_FPERROR; break;
}
break;
case SIGBUS:
switch (info->si_code) {
case BUS_ADRALN: sig_code = SUBSIG_ALIGNMENT; break;
case BUS_ADRERR: sig_code = SUBSIG_MISCERROR; break;
default: sig_code = SUBSIG_BUSTIMEOUT; break;
}
break;
case SIGEMT:
switch (info->si_code) {
case EMT_TAGOVF: sig_code = SUBSIG_TAG; break;
}
break;
case SIGSYS:
if (info->si_code == (__SI_FAULT|0x100)) {
/* See sys_sunos32.c */
sig_code = info->si_trapno;
break;
}
default:
sig_address = NULL;
}
}
err |= __put_user(ptr_to_compat(sig_address), &sframep->sig_address);
err |= __put_user(sig_code, &sframep->sig_code);
err |= __put_user(ptr_to_compat(sc), &sframep->sig_scptr);
if (err)
goto sigsegv;
regs->u_regs[UREG_FP] = (unsigned long) sframep;
regs->tpc = (unsigned long) sa->sa_handler;
regs->tnpc = (regs->tpc + 4);
if (test_thread_flag(TIF_32BIT)) {
regs->tpc &= 0xffffffff;
regs->tnpc &= 0xffffffff;
}
return;
sigsegv:
force_sigsegv(signr, current);
}
static int save_fpu_state32(struct pt_regs *regs, __siginfo_fpu_t __user *fpu) static int save_fpu_state32(struct pt_regs *regs, __siginfo_fpu_t __user *fpu)
{ {
unsigned long *fpregs = current_thread_info()->fpregs; unsigned long *fpregs = current_thread_info()->fpregs;
...@@ -663,10 +428,10 @@ static int save_fpu_state32(struct pt_regs *regs, __siginfo_fpu_t __user *fpu) ...@@ -663,10 +428,10 @@ static int save_fpu_state32(struct pt_regs *regs, __siginfo_fpu_t __user *fpu)
return err; return err;
} }
static void new_setup_frame32(struct k_sigaction *ka, struct pt_regs *regs, static void setup_frame32(struct k_sigaction *ka, struct pt_regs *regs,
int signo, sigset_t *oldset) int signo, sigset_t *oldset)
{ {
struct new_signal_frame32 __user *sf; struct signal_frame32 __user *sf;
int sigframe_size; int sigframe_size;
u32 psr; u32 psr;
int i, err; int i, err;
...@@ -676,11 +441,11 @@ static void new_setup_frame32(struct k_sigaction *ka, struct pt_regs *regs, ...@@ -676,11 +441,11 @@ static void new_setup_frame32(struct k_sigaction *ka, struct pt_regs *regs,
synchronize_user_stack(); synchronize_user_stack();
save_and_clear_fpu(); save_and_clear_fpu();
sigframe_size = NF_ALIGNEDSZ; sigframe_size = SF_ALIGNEDSZ;
if (!(current_thread_info()->fpsaved[0] & FPRS_FEF)) if (!(current_thread_info()->fpsaved[0] & FPRS_FEF))
sigframe_size -= sizeof(__siginfo_fpu_t); sigframe_size -= sizeof(__siginfo_fpu_t);
sf = (struct new_signal_frame32 __user *) sf = (struct signal_frame32 __user *)
get_sigframe(&ka->sa, regs, sigframe_size); get_sigframe(&ka->sa, regs, sigframe_size);
if (invalid_frame_pointer(sf, sigframe_size)) if (invalid_frame_pointer(sf, sigframe_size))
...@@ -944,10 +709,9 @@ static inline void handle_signal32(unsigned long signr, struct k_sigaction *ka, ...@@ -944,10 +709,9 @@ static inline void handle_signal32(unsigned long signr, struct k_sigaction *ka,
{ {
if (ka->sa.sa_flags & SA_SIGINFO) if (ka->sa.sa_flags & SA_SIGINFO)
setup_rt_frame32(ka, regs, signr, oldset, info); setup_rt_frame32(ka, regs, signr, oldset, info);
else if (test_thread_flag(TIF_NEWSIGNALS))
new_setup_frame32(ka, regs, signr, oldset);
else else
setup_frame32(&ka->sa, regs, signr, oldset, info); setup_frame32(ka, regs, signr, oldset);
spin_lock_irq(&current->sighand->siglock); spin_lock_irq(&current->sighand->siglock);
sigorsets(&current->blocked,&current->blocked,&ka->sa.sa_mask); sigorsets(&current->blocked,&current->blocked,&ka->sa.sa_mask);
if (!(ka->sa.sa_flags & SA_NOMASK)) if (!(ka->sa.sa_flags & SA_NOMASK))
......
...@@ -49,7 +49,6 @@ ...@@ -49,7 +49,6 @@
#endif #endif
#ifdef CONFIG_PCI #ifdef CONFIG_PCI
#include <asm/ebus.h> #include <asm/ebus.h>
#include <asm/isa.h>
#endif #endif
#include <asm/ns87303.h> #include <asm/ns87303.h>
#include <asm/timer.h> #include <asm/timer.h>
...@@ -187,7 +186,6 @@ EXPORT_SYMBOL(insw); ...@@ -187,7 +186,6 @@ EXPORT_SYMBOL(insw);
EXPORT_SYMBOL(insl); EXPORT_SYMBOL(insl);
#ifdef CONFIG_PCI #ifdef CONFIG_PCI
EXPORT_SYMBOL(ebus_chain); EXPORT_SYMBOL(ebus_chain);
EXPORT_SYMBOL(isa_chain);
EXPORT_SYMBOL(pci_alloc_consistent); EXPORT_SYMBOL(pci_alloc_consistent);
EXPORT_SYMBOL(pci_free_consistent); EXPORT_SYMBOL(pci_free_consistent);
EXPORT_SYMBOL(pci_map_single); EXPORT_SYMBOL(pci_map_single);
......
...@@ -554,10 +554,8 @@ asmlinkage long compat_sys_sigaction(int sig, struct old_sigaction32 __user *act ...@@ -554,10 +554,8 @@ asmlinkage long compat_sys_sigaction(int sig, struct old_sigaction32 __user *act
struct k_sigaction new_ka, old_ka; struct k_sigaction new_ka, old_ka;
int ret; int ret;
if (sig < 0) { WARN_ON_ONCE(sig >= 0);
set_thread_flag(TIF_NEWSIGNALS); sig = -sig;
sig = -sig;
}
if (act) { if (act) {
compat_old_sigset_t mask; compat_old_sigset_t mask;
...@@ -601,11 +599,6 @@ asmlinkage long compat_sys_rt_sigaction(int sig, ...@@ -601,11 +599,6 @@ asmlinkage long compat_sys_rt_sigaction(int sig,
if (sigsetsize != sizeof(compat_sigset_t)) if (sigsetsize != sizeof(compat_sigset_t))
return -EINVAL; return -EINVAL;
/* All tasks which use RT signals (effectively) use
* new style signals.
*/
set_thread_flag(TIF_NEWSIGNALS);
if (act) { if (act) {
u32 u_handler, u_restorer; u32 u_handler, u_restorer;
......
...@@ -2,33 +2,69 @@ ...@@ -2,33 +2,69 @@
* Driver for PC-speaker like devices found on various Sparc systems. * Driver for PC-speaker like devices found on various Sparc systems.
* *
* Copyright (c) 2002 Vojtech Pavlik * Copyright (c) 2002 Vojtech Pavlik
* Copyright (c) 2002, 2006 David S. Miller (davem@davemloft.net) * Copyright (c) 2002, 2006, 2008 David S. Miller (davem@davemloft.net)
*/ */
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/input.h> #include <linux/input.h>
#include <linux/platform_device.h> #include <linux/of_device.h>
#include <asm/io.h> #include <asm/io.h>
#include <asm/ebus.h>
#include <asm/isa.h>
MODULE_AUTHOR("David S. Miller <davem@davemloft.net>"); MODULE_AUTHOR("David S. Miller <davem@davemloft.net>");
MODULE_DESCRIPTION("Sparc Speaker beeper driver"); MODULE_DESCRIPTION("Sparc Speaker beeper driver");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
struct grover_beep_info {
void __iomem *freq_regs;
void __iomem *enable_reg;
};
struct bbc_beep_info {
u32 clock_freq;
void __iomem *regs;
};
struct sparcspkr_state { struct sparcspkr_state {
const char *name; const char *name;
unsigned long iobase;
int (*event)(struct input_dev *dev, unsigned int type, unsigned int code, int value); int (*event)(struct input_dev *dev, unsigned int type, unsigned int code, int value);
spinlock_t lock; spinlock_t lock;
struct input_dev *input_dev; struct input_dev *input_dev;
union {
struct grover_beep_info grover;
struct bbc_beep_info bbc;
} u;
}; };
static int ebus_spkr_event(struct input_dev *dev, unsigned int type, unsigned int code, int value) static u32 bbc_count_to_reg(struct bbc_beep_info *info, unsigned int count)
{
u32 val, clock_freq = info->clock_freq;
int i;
if (!count)
return 0;
if (count <= clock_freq >> 20)
return 1 << 18;
if (count >= clock_freq >> 12)
return 1 << 10;
val = 1 << 18;
for (i = 19; i >= 11; i--) {
val >>= 1;
if (count <= clock_freq >> i)
break;
}
return val;
}
static int bbc_spkr_event(struct input_dev *dev, unsigned int type, unsigned int code, int value)
{ {
struct sparcspkr_state *state = dev_get_drvdata(dev->dev.parent); struct sparcspkr_state *state = dev_get_drvdata(dev->dev.parent);
struct bbc_beep_info *info = &state->u.bbc;
unsigned int count = 0; unsigned int count = 0;
unsigned long flags; unsigned long flags;
...@@ -44,24 +80,29 @@ static int ebus_spkr_event(struct input_dev *dev, unsigned int type, unsigned in ...@@ -44,24 +80,29 @@ static int ebus_spkr_event(struct input_dev *dev, unsigned int type, unsigned in
if (value > 20 && value < 32767) if (value > 20 && value < 32767)
count = 1193182 / value; count = 1193182 / value;
count = bbc_count_to_reg(info, count);
spin_lock_irqsave(&state->lock, flags); spin_lock_irqsave(&state->lock, flags);
/* EBUS speaker only has on/off state, the frequency does not if (count) {
* appear to be programmable. outb(0x01, info->regs + 0);
*/ outb(0x00, info->regs + 2);
if (state->iobase & 0x2UL) outb((count >> 16) & 0xff, info->regs + 3);
outb(!!count, state->iobase); outb((count >> 8) & 0xff, info->regs + 4);
else outb(0x00, info->regs + 5);
outl(!!count, state->iobase); } else {
outb(0x00, info->regs + 0);
}
spin_unlock_irqrestore(&state->lock, flags); spin_unlock_irqrestore(&state->lock, flags);
return 0; return 0;
} }
static int isa_spkr_event(struct input_dev *dev, unsigned int type, unsigned int code, int value) static int grover_spkr_event(struct input_dev *dev, unsigned int type, unsigned int code, int value)
{ {
struct sparcspkr_state *state = dev_get_drvdata(dev->dev.parent); struct sparcspkr_state *state = dev_get_drvdata(dev->dev.parent);
struct grover_beep_info *info = &state->u.grover;
unsigned int count = 0; unsigned int count = 0;
unsigned long flags; unsigned long flags;
...@@ -81,15 +122,15 @@ static int isa_spkr_event(struct input_dev *dev, unsigned int type, unsigned int ...@@ -81,15 +122,15 @@ static int isa_spkr_event(struct input_dev *dev, unsigned int type, unsigned int
if (count) { if (count) {
/* enable counter 2 */ /* enable counter 2 */
outb(inb(state->iobase + 0x61) | 3, state->iobase + 0x61); outb(inb(info->enable_reg) | 3, info->enable_reg);
/* set command for counter 2, 2 byte write */ /* set command for counter 2, 2 byte write */
outb(0xB6, state->iobase + 0x43); outb(0xB6, info->freq_regs + 1);
/* select desired HZ */ /* select desired HZ */
outb(count & 0xff, state->iobase + 0x42); outb(count & 0xff, info->freq_regs + 0);
outb((count >> 8) & 0xff, state->iobase + 0x42); outb((count >> 8) & 0xff, info->freq_regs + 0);
} else { } else {
/* disable counter 2 */ /* disable counter 2 */
outb(inb_p(state->iobase + 0x61) & 0xFC, state->iobase + 0x61); outb(inb_p(info->enable_reg) & 0xFC, info->enable_reg);
} }
spin_unlock_irqrestore(&state->lock, flags); spin_unlock_irqrestore(&state->lock, flags);
...@@ -131,7 +172,7 @@ static int __devinit sparcspkr_probe(struct device *dev) ...@@ -131,7 +172,7 @@ static int __devinit sparcspkr_probe(struct device *dev)
return 0; return 0;
} }
static int __devexit sparcspkr_remove(struct of_device *dev) static int sparcspkr_shutdown(struct of_device *dev)
{ {
struct sparcspkr_state *state = dev_get_drvdata(&dev->dev); struct sparcspkr_state *state = dev_get_drvdata(&dev->dev);
struct input_dev *input_dev = state->input_dev; struct input_dev *input_dev = state->input_dev;
...@@ -139,115 +180,180 @@ static int __devexit sparcspkr_remove(struct of_device *dev) ...@@ -139,115 +180,180 @@ static int __devexit sparcspkr_remove(struct of_device *dev)
/* turn off the speaker */ /* turn off the speaker */
state->event(input_dev, EV_SND, SND_BELL, 0); state->event(input_dev, EV_SND, SND_BELL, 0);
input_unregister_device(input_dev);
dev_set_drvdata(&dev->dev, NULL);
kfree(state);
return 0; return 0;
} }
static int sparcspkr_shutdown(struct of_device *dev) static int __devinit bbc_beep_probe(struct of_device *op, const struct of_device_id *match)
{ {
struct sparcspkr_state *state = dev_get_drvdata(&dev->dev); struct sparcspkr_state *state;
struct input_dev *input_dev = state->input_dev; struct bbc_beep_info *info;
struct device_node *dp;
int err = -ENOMEM;
/* turn off the speaker */ state = kzalloc(sizeof(*state), GFP_KERNEL);
state->event(input_dev, EV_SND, SND_BELL, 0); if (!state)
goto out_err;
state->name = "Sparc BBC Speaker";
state->event = bbc_spkr_event;
spin_lock_init(&state->lock);
dp = of_find_node_by_path("/");
err = -ENODEV;
if (!dp)
goto out_free;
info = &state->u.bbc;
info->clock_freq = of_getintprop_default(dp, "clock-frequency", 0);
if (!info->clock_freq)
goto out_free;
info->regs = of_ioremap(&op->resource[0], 0, 6, "bbc beep");
if (!info->regs)
goto out_free;
dev_set_drvdata(&op->dev, state);
err = sparcspkr_probe(&op->dev);
if (err)
goto out_clear_drvdata;
return 0; return 0;
out_clear_drvdata:
dev_set_drvdata(&op->dev, NULL);
of_iounmap(&op->resource[0], info->regs, 6);
out_free:
kfree(state);
out_err:
return err;
} }
static int __devinit ebus_beep_probe(struct of_device *dev, const struct of_device_id *match) static int bbc_remove(struct of_device *op)
{ {
struct linux_ebus_device *edev = to_ebus_device(&dev->dev); struct sparcspkr_state *state = dev_get_drvdata(&op->dev);
struct sparcspkr_state *state; struct input_dev *input_dev = state->input_dev;
int err; struct bbc_beep_info *info = &state->u.bbc;
state = kzalloc(sizeof(*state), GFP_KERNEL); /* turn off the speaker */
if (!state) state->event(input_dev, EV_SND, SND_BELL, 0);
return -ENOMEM;
state->name = "Sparc EBUS Speaker"; input_unregister_device(input_dev);
state->iobase = edev->resource[0].start;
state->event = ebus_spkr_event;
spin_lock_init(&state->lock);
dev_set_drvdata(&dev->dev, state); of_iounmap(&op->resource[0], info->regs, 6);
err = sparcspkr_probe(&dev->dev); dev_set_drvdata(&op->dev, NULL);
if (err) { kfree(state);
dev_set_drvdata(&dev->dev, NULL);
kfree(state);
}
return 0; return 0;
} }
static struct of_device_id ebus_beep_match[] = { static struct of_device_id bbc_beep_match[] = {
{ {
.name = "beep", .name = "beep",
.compatible = "SUNW,bbc-beep",
}, },
{}, {},
}; };
static struct of_platform_driver ebus_beep_driver = { static struct of_platform_driver bbc_beep_driver = {
.name = "beep", .name = "bbcbeep",
.match_table = ebus_beep_match, .match_table = bbc_beep_match,
.probe = ebus_beep_probe, .probe = bbc_beep_probe,
.remove = __devexit_p(sparcspkr_remove), .remove = __devexit_p(bbc_remove),
.shutdown = sparcspkr_shutdown, .shutdown = sparcspkr_shutdown,
}; };
static int __devinit isa_beep_probe(struct of_device *dev, const struct of_device_id *match) static int __devinit grover_beep_probe(struct of_device *op, const struct of_device_id *match)
{ {
struct sparc_isa_device *idev = to_isa_device(&dev->dev);
struct sparcspkr_state *state; struct sparcspkr_state *state;
int err; struct grover_beep_info *info;
int err = -ENOMEM;
state = kzalloc(sizeof(*state), GFP_KERNEL); state = kzalloc(sizeof(*state), GFP_KERNEL);
if (!state) if (!state)
return -ENOMEM; goto out_err;
state->name = "Sparc ISA Speaker"; state->name = "Sparc Grover Speaker";
state->iobase = idev->resource.start; state->event = grover_spkr_event;
state->event = isa_spkr_event;
spin_lock_init(&state->lock); spin_lock_init(&state->lock);
dev_set_drvdata(&dev->dev, state); info = &state->u.grover;
info->freq_regs = of_ioremap(&op->resource[2], 0, 2, "grover beep freq");
if (!info->freq_regs)
goto out_free;
err = sparcspkr_probe(&dev->dev); info->enable_reg = of_ioremap(&op->resource[3], 0, 1, "grover beep enable");
if (err) { if (!info->enable_reg)
dev_set_drvdata(&dev->dev, NULL); goto out_unmap_freq_regs;
kfree(state);
} dev_set_drvdata(&op->dev, state);
err = sparcspkr_probe(&op->dev);
if (err)
goto out_clear_drvdata;
return 0;
out_clear_drvdata:
dev_set_drvdata(&op->dev, NULL);
of_iounmap(&op->resource[3], info->enable_reg, 1);
out_unmap_freq_regs:
of_iounmap(&op->resource[2], info->freq_regs, 2);
out_free:
kfree(state);
out_err:
return err;
}
static int grover_remove(struct of_device *op)
{
struct sparcspkr_state *state = dev_get_drvdata(&op->dev);
struct grover_beep_info *info = &state->u.grover;
struct input_dev *input_dev = state->input_dev;
/* turn off the speaker */
state->event(input_dev, EV_SND, SND_BELL, 0);
input_unregister_device(input_dev);
of_iounmap(&op->resource[3], info->enable_reg, 1);
of_iounmap(&op->resource[2], info->freq_regs, 2);
dev_set_drvdata(&op->dev, NULL);
kfree(state);
return 0; return 0;
} }
static struct of_device_id isa_beep_match[] = { static struct of_device_id grover_beep_match[] = {
{ {
.name = "dma", .name = "beep",
.compatible = "SUNW,smbus-beep",
}, },
{}, {},
}; };
static struct of_platform_driver isa_beep_driver = { static struct of_platform_driver grover_beep_driver = {
.name = "beep", .name = "groverbeep",
.match_table = isa_beep_match, .match_table = grover_beep_match,
.probe = isa_beep_probe, .probe = grover_beep_probe,
.remove = __devexit_p(sparcspkr_remove), .remove = __devexit_p(grover_remove),
.shutdown = sparcspkr_shutdown, .shutdown = sparcspkr_shutdown,
}; };
static int __init sparcspkr_init(void) static int __init sparcspkr_init(void)
{ {
int err = of_register_driver(&ebus_beep_driver, &ebus_bus_type); int err = of_register_driver(&bbc_beep_driver,
&of_platform_bus_type);
if (!err) { if (!err) {
err = of_register_driver(&isa_beep_driver, &isa_bus_type); err = of_register_driver(&grover_beep_driver,
&of_platform_bus_type);
if (err) if (err)
of_unregister_driver(&ebus_beep_driver); of_unregister_driver(&bbc_beep_driver);
} }
return err; return err;
...@@ -255,8 +361,8 @@ static int __init sparcspkr_init(void) ...@@ -255,8 +361,8 @@ static int __init sparcspkr_init(void)
static void __exit sparcspkr_exit(void) static void __exit sparcspkr_exit(void)
{ {
of_unregister_driver(&ebus_beep_driver); of_unregister_driver(&bbc_beep_driver);
of_unregister_driver(&isa_beep_driver); of_unregister_driver(&grover_beep_driver);
} }
module_init(sparcspkr_init); module_init(sparcspkr_init);
......
...@@ -1231,7 +1231,7 @@ static inline struct console *SUNZILOG_CONSOLE(void) ...@@ -1231,7 +1231,7 @@ static inline struct console *SUNZILOG_CONSOLE(void)
#define SUNZILOG_CONSOLE() (NULL) #define SUNZILOG_CONSOLE() (NULL)
#endif #endif
static void __devinit sunzilog_init_kbdms(struct uart_sunzilog_port *up, int channel) static void __devinit sunzilog_init_kbdms(struct uart_sunzilog_port *up)
{ {
int baud, brg; int baud, brg;
...@@ -1305,7 +1305,7 @@ static void __devinit sunzilog_init_hw(struct uart_sunzilog_port *up) ...@@ -1305,7 +1305,7 @@ static void __devinit sunzilog_init_hw(struct uart_sunzilog_port *up)
up->curregs[R7] = 0x7E; /* SDLC Flag */ up->curregs[R7] = 0x7E; /* SDLC Flag */
up->curregs[R9] = NV; up->curregs[R9] = NV;
up->curregs[R7p] = 0x00; up->curregs[R7p] = 0x00;
sunzilog_init_kbdms(up, up->port.line); sunzilog_init_kbdms(up);
/* Only enable interrupts if an ISR handler available */ /* Only enable interrupts if an ISR handler available */
if (up->flags & SUNZILOG_FLAG_ISR_HANDLER) if (up->flags & SUNZILOG_FLAG_ISR_HANDLER)
up->curregs[R9] |= MIE; up->curregs[R9] |= MIE;
......
...@@ -339,7 +339,7 @@ static int __devinit bw2_probe(struct of_device *op, const struct of_device_id * ...@@ -339,7 +339,7 @@ static int __devinit bw2_probe(struct of_device *op, const struct of_device_id *
dev_set_drvdata(&op->dev, info); dev_set_drvdata(&op->dev, info);
printk("%s: bwtwo at %lx:%lx\n", printk(KERN_INFO "%s: bwtwo at %lx:%lx\n",
dp->full_name, par->which_io, par->physbase); dp->full_name, par->which_io, par->physbase);
return 0; return 0;
...@@ -399,10 +399,9 @@ static int __init bw2_init(void) ...@@ -399,10 +399,9 @@ static int __init bw2_init(void)
static void __exit bw2_exit(void) static void __exit bw2_exit(void)
{ {
return of_unregister_driver(&bw2_driver); of_unregister_driver(&bw2_driver);
} }
module_init(bw2_init); module_init(bw2_init);
module_exit(bw2_exit); module_exit(bw2_exit);
......
...@@ -556,7 +556,7 @@ static int __devinit cg14_probe(struct of_device *op, const struct of_device_id ...@@ -556,7 +556,7 @@ static int __devinit cg14_probe(struct of_device *op, const struct of_device_id
dev_set_drvdata(&op->dev, info); dev_set_drvdata(&op->dev, info);
printk("%s: cgfourteen at %lx:%lx, %dMB\n", printk(KERN_INFO "%s: cgfourteen at %lx:%lx, %dMB\n",
dp->full_name, dp->full_name,
par->iospace, par->physbase, par->iospace, par->physbase,
par->ramsize >> 20); par->ramsize >> 20);
...@@ -605,7 +605,7 @@ static struct of_platform_driver cg14_driver = { ...@@ -605,7 +605,7 @@ static struct of_platform_driver cg14_driver = {
.remove = __devexit_p(cg14_remove), .remove = __devexit_p(cg14_remove),
}; };
int __init cg14_init(void) static int __init cg14_init(void)
{ {
if (fb_get_options("cg14fb", NULL)) if (fb_get_options("cg14fb", NULL))
return -ENODEV; return -ENODEV;
...@@ -613,7 +613,7 @@ int __init cg14_init(void) ...@@ -613,7 +613,7 @@ int __init cg14_init(void)
return of_register_driver(&cg14_driver, &of_bus_type); return of_register_driver(&cg14_driver, &of_bus_type);
} }
void __exit cg14_exit(void) static void __exit cg14_exit(void)
{ {
of_unregister_driver(&cg14_driver); of_unregister_driver(&cg14_driver);
} }
......
...@@ -419,7 +419,7 @@ static int __devinit cg3_probe(struct of_device *op, ...@@ -419,7 +419,7 @@ static int __devinit cg3_probe(struct of_device *op,
dev_set_drvdata(&op->dev, info); dev_set_drvdata(&op->dev, info);
printk("%s: cg3 at %lx:%lx\n", printk(KERN_INFO "%s: cg3 at %lx:%lx\n",
dp->full_name, par->which_io, par->physbase); dp->full_name, par->which_io, par->physbase);
return 0; return 0;
......
...@@ -781,7 +781,7 @@ static int __devinit cg6_probe(struct of_device *op, ...@@ -781,7 +781,7 @@ static int __devinit cg6_probe(struct of_device *op,
dev_set_drvdata(&op->dev, info); dev_set_drvdata(&op->dev, info);
printk("%s: CGsix [%s] at %lx:%lx\n", printk(KERN_INFO "%s: CGsix [%s] at %lx:%lx\n",
dp->full_name, info->fix.id, dp->full_name, info->fix.id,
par->which_io, par->physbase); par->which_io, par->physbase);
......
...@@ -32,7 +32,6 @@ ...@@ -32,7 +32,6 @@
static int ffb_setcolreg(unsigned, unsigned, unsigned, unsigned, static int ffb_setcolreg(unsigned, unsigned, unsigned, unsigned,
unsigned, struct fb_info *); unsigned, struct fb_info *);
static int ffb_blank(int, struct fb_info *); static int ffb_blank(int, struct fb_info *);
static void ffb_init_fix(struct fb_info *);
static void ffb_imageblit(struct fb_info *, const struct fb_image *); static void ffb_imageblit(struct fb_info *, const struct fb_image *);
static void ffb_fillrect(struct fb_info *, const struct fb_fillrect *); static void ffb_fillrect(struct fb_info *, const struct fb_fillrect *);
...@@ -1001,7 +1000,7 @@ static int __devinit ffb_probe(struct of_device *op, ...@@ -1001,7 +1000,7 @@ static int __devinit ffb_probe(struct of_device *op,
dev_set_drvdata(&op->dev, info); dev_set_drvdata(&op->dev, info);
printk("%s: %s at %016lx, type %d, " printk(KERN_INFO "%s: %s at %016lx, type %d, "
"DAC pnum[%x] rev[%d] manuf_rev[%d]\n", "DAC pnum[%x] rev[%d] manuf_rev[%d]\n",
dp->full_name, dp->full_name,
((par->flags & FFB_FLAG_AFB) ? "AFB" : "FFB"), ((par->flags & FFB_FLAG_AFB) ? "AFB" : "FFB"),
...@@ -1062,7 +1061,7 @@ static struct of_platform_driver ffb_driver = { ...@@ -1062,7 +1061,7 @@ static struct of_platform_driver ffb_driver = {
.remove = __devexit_p(ffb_remove), .remove = __devexit_p(ffb_remove),
}; };
int __init ffb_init(void) static int __init ffb_init(void)
{ {
if (fb_get_options("ffb", NULL)) if (fb_get_options("ffb", NULL))
return -ENODEV; return -ENODEV;
...@@ -1070,7 +1069,7 @@ int __init ffb_init(void) ...@@ -1070,7 +1069,7 @@ int __init ffb_init(void)
return of_register_driver(&ffb_driver, &of_bus_type); return of_register_driver(&ffb_driver, &of_bus_type);
} }
void __exit ffb_exit(void) static void __exit ffb_exit(void)
{ {
of_unregister_driver(&ffb_driver); of_unregister_driver(&ffb_driver);
} }
......
...@@ -614,7 +614,7 @@ static int __devinit leo_probe(struct of_device *op, const struct of_device_id * ...@@ -614,7 +614,7 @@ static int __devinit leo_probe(struct of_device *op, const struct of_device_id *
dev_set_drvdata(&op->dev, info); dev_set_drvdata(&op->dev, info);
printk("%s: leo at %lx:%lx\n", printk(KERN_INFO "%s: leo at %lx:%lx\n",
dp->full_name, dp->full_name,
par->which_io, par->physbase); par->which_io, par->physbase);
......
...@@ -310,7 +310,7 @@ static int __devinit p9100_probe(struct of_device *op, const struct of_device_id ...@@ -310,7 +310,7 @@ static int __devinit p9100_probe(struct of_device *op, const struct of_device_id
dev_set_drvdata(&op->dev, info); dev_set_drvdata(&op->dev, info);
printk("%s: p9100 at %lx:%lx\n", printk(KERN_INFO "%s: p9100 at %lx:%lx\n",
dp->full_name, dp->full_name,
par->which_io, par->physbase); par->which_io, par->physbase);
......
...@@ -419,7 +419,7 @@ static int __devinit tcx_init_one(struct of_device *op) ...@@ -419,7 +419,7 @@ static int __devinit tcx_init_one(struct of_device *op)
par->mmap_map[6].size = SBUS_MMAP_EMPTY; par->mmap_map[6].size = SBUS_MMAP_EMPTY;
} }
par->physbase = 0; par->physbase = op->resource[0].start;
par->which_io = op->resource[0].flags & IORESOURCE_BITS; par->which_io = op->resource[0].flags & IORESOURCE_BITS;
for (i = 0; i < TCX_MMAP_ENTRIES; i++) { for (i = 0; i < TCX_MMAP_ENTRIES; i++) {
...@@ -470,10 +470,10 @@ static int __devinit tcx_init_one(struct of_device *op) ...@@ -470,10 +470,10 @@ static int __devinit tcx_init_one(struct of_device *op)
dev_set_drvdata(&op->dev, info); dev_set_drvdata(&op->dev, info);
printk("%s: TCX at %lx:%lx, %s\n", printk(KERN_INFO "%s: TCX at %lx:%lx, %s\n",
dp->full_name, dp->full_name,
par->which_io, par->which_io,
op->resource[0].start, par->physbase,
par->lowdepth ? "8-bit only" : "24-bit depth"); par->lowdepth ? "8-bit only" : "24-bit depth");
return 0; return 0;
...@@ -527,7 +527,7 @@ static struct of_platform_driver tcx_driver = { ...@@ -527,7 +527,7 @@ static struct of_platform_driver tcx_driver = {
.remove = __devexit_p(tcx_remove), .remove = __devexit_p(tcx_remove),
}; };
int __init tcx_init(void) static int __init tcx_init(void)
{ {
if (fb_get_options("tcxfb", NULL)) if (fb_get_options("tcxfb", NULL))
return -ENODEV; return -ENODEV;
...@@ -535,7 +535,7 @@ int __init tcx_init(void) ...@@ -535,7 +535,7 @@ int __init tcx_init(void)
return of_register_driver(&tcx_driver, &of_bus_type); return of_register_driver(&tcx_driver, &of_bus_type);
} }
void __exit tcx_exit(void) static void __exit tcx_exit(void)
{ {
of_unregister_driver(&tcx_driver); of_unregister_driver(&tcx_driver);
} }
......
/* $Id: processor.h,v 1.83 2001/10/08 09:32:13 davem Exp $ /* include/asm-sparc/processor.h
* include/asm-sparc/processor.h
* *
* Copyright (C) 1994 David S. Miller (davem@caip.rutgers.edu) * Copyright (C) 1994 David S. Miller (davem@caip.rutgers.edu)
*/ */
...@@ -65,7 +64,6 @@ struct thread_struct { ...@@ -65,7 +64,6 @@ struct thread_struct {
struct fpq fpqueue[16]; struct fpq fpqueue[16];
unsigned long flags; unsigned long flags;
mm_segment_t current_ds; mm_segment_t current_ds;
int new_signal;
}; };
#define SPARC_FLAG_KTHREAD 0x1 /* task is a kernel thread */ #define SPARC_FLAG_KTHREAD 0x1 /* task is a kernel thread */
......
...@@ -293,7 +293,6 @@ static int sun_fd_eject(int drive) ...@@ -293,7 +293,6 @@ static int sun_fd_eject(int drive)
#ifdef CONFIG_PCI #ifdef CONFIG_PCI
#include <asm/ebus.h> #include <asm/ebus.h>
#include <asm/isa.h>
#include <asm/ns87303.h> #include <asm/ns87303.h>
static struct ebus_dma_info sun_pci_fd_ebus_dma; static struct ebus_dma_info sun_pci_fd_ebus_dma;
...@@ -558,82 +557,6 @@ static int __init ebus_fdthree_p(struct linux_ebus_device *edev) ...@@ -558,82 +557,6 @@ static int __init ebus_fdthree_p(struct linux_ebus_device *edev)
} }
#endif #endif
#ifdef CONFIG_PCI
#undef ISA_FLOPPY_WORKS
#ifdef ISA_FLOPPY_WORKS
static unsigned long __init isa_floppy_init(void)
{
struct sparc_isa_bridge *isa_br;
struct sparc_isa_device *isa_dev = NULL;
for_each_isa(isa_br) {
for_each_isadev(isa_dev, isa_br) {
if (!strcmp(isa_dev->prom_node->name, "dma")) {
struct sparc_isa_device *child =
isa_dev->child;
while (child) {
if (!strcmp(child->prom_node->name,
"floppy")) {
isa_dev = child;
goto isa_done;
}
child = child->next;
}
}
}
}
isa_done:
if (!isa_dev)
return 0;
/* We could use DMA on devices behind the ISA bridge, but...
*
* There is a slight problem. Normally on x86 kit the x86 processor
* delays I/O port instructions when the ISA bus "dma in progress"
* signal is active. Well, sparc64 systems do not monitor this
* signal thus we would need to block all I/O port accesses in software
* when a dma transfer is active for some device.
*/
sun_fdc = (struct sun_flpy_controller *)isa_dev->resource.start;
FLOPPY_IRQ = isa_dev->irq;
sun_fdops.fd_inb = sun_pci_fd_inb;
sun_fdops.fd_outb = sun_pci_fd_outb;
can_use_virtual_dma = use_virtual_dma = 1;
sun_fdops.fd_enable_dma = sun_fd_enable_dma;
sun_fdops.fd_disable_dma = sun_fd_disable_dma;
sun_fdops.fd_set_dma_mode = sun_fd_set_dma_mode;
sun_fdops.fd_set_dma_addr = sun_fd_set_dma_addr;
sun_fdops.fd_set_dma_count = sun_fd_set_dma_count;
sun_fdops.get_dma_residue = sun_get_dma_residue;
sun_fdops.fd_request_irq = sun_fd_request_irq;
sun_fdops.fd_free_irq = sun_fd_free_irq;
/* Floppy eject is manual. Actually, could determine this
* via presence of 'manual' property in OBP node.
*/
sun_fdops.fd_eject = sun_pci_fd_eject;
fdc_status = (unsigned long) &sun_fdc->status_82077;
allowed_drive_mask = 0;
sun_floppy_types[0] = 0;
sun_floppy_types[1] = 4;
sun_pci_broken_drive = 1;
sun_fdops.fd_outb = sun_pci_fd_broken_outb;
return sun_floppy_types[0];
}
#endif /* ISA_FLOPPY_WORKS */
#endif
static unsigned long __init sun_floppy_init(void) static unsigned long __init sun_floppy_init(void)
{ {
char state[128]; char state[128];
...@@ -667,13 +590,8 @@ static unsigned long __init sun_floppy_init(void) ...@@ -667,13 +590,8 @@ static unsigned long __init sun_floppy_init(void)
} }
} }
ebus_done: ebus_done:
if (!edev) { if (!edev)
#ifdef ISA_FLOPPY_WORKS
return isa_floppy_init();
#else
return 0; return 0;
#endif
}
state_prop = of_get_property(edev->prom_node, "status", NULL); state_prop = of_get_property(edev->prom_node, "status", NULL);
if (state_prop && !strncmp(state_prop, "disabled", 8)) if (state_prop && !strncmp(state_prop, "disabled", 8))
......
/* $Id: isa.h,v 1.1 2001/05/11 04:31:55 davem Exp $
* isa.h: Sparc64 layer for PCI to ISA bridge devices.
*
* Copyright (C) 2001 David S. Miller (davem@redhat.com)
*/
#ifndef __SPARC64_ISA_H
#define __SPARC64_ISA_H
#include <asm/oplib.h>
#include <asm/prom.h>
#include <asm/of_device.h>
struct sparc_isa_bridge;
struct sparc_isa_device {
struct of_device ofdev;
struct sparc_isa_device *next;
struct sparc_isa_device *child;
struct sparc_isa_bridge *bus;
struct device_node *prom_node;
struct resource resource;
unsigned int irq;
};
#define to_isa_device(d) container_of(d, struct sparc_isa_device, ofdev.dev)
struct sparc_isa_bridge {
struct of_device ofdev;
struct sparc_isa_bridge *next;
struct sparc_isa_device *devices;
struct pci_dev *self;
int index;
struct device_node *prom_node;
};
#define to_isa_bridge(d) container_of(d, struct sparc_isa_bridge, ofdev.dev)
extern struct sparc_isa_bridge *isa_chain;
extern void isa_init(void);
#define for_each_isa(bus) \
for((bus) = isa_chain; (bus); (bus) = (bus)->next)
#define for_each_isadev(dev, bus) \
for((dev) = (bus)->devices; (dev); (dev) = (dev)->next)
#endif /* !(__SPARC64_ISA_H) */
/* $Id: ptrace.h,v 1.14 2002/02/09 19:49:32 davem Exp $ */
#ifndef _SPARC64_PTRACE_H #ifndef _SPARC64_PTRACE_H
#define _SPARC64_PTRACE_H #define _SPARC64_PTRACE_H
...@@ -8,10 +7,15 @@ ...@@ -8,10 +7,15 @@
* stack during a system call and basically all traps. * stack during a system call and basically all traps.
*/ */
/* This magic value must have the low 9 bits clear,
* as that is where we encode the %tt value, see below.
*/
#define PT_REGS_MAGIC 0x57ac6c00 #define PT_REGS_MAGIC 0x57ac6c00
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
#include <linux/types.h>
struct pt_regs { struct pt_regs {
unsigned long u_regs[16]; /* globals and ins */ unsigned long u_regs[16]; /* globals and ins */
unsigned long tstate; unsigned long tstate;
...@@ -33,6 +37,23 @@ struct pt_regs { ...@@ -33,6 +37,23 @@ struct pt_regs {
unsigned int magic; unsigned int magic;
}; };
static inline int pt_regs_trap_type(struct pt_regs *regs)
{
return regs->magic & 0x1ff;
}
static inline int pt_regs_clear_trap_type(struct pt_regs *regs)
{
return regs->magic &= ~0x1ff;
}
static inline bool pt_regs_is_syscall(struct pt_regs *regs)
{
int tt = pt_regs_trap_type(regs);
return (tt == 0x110 || tt == 0x111 || tt == 0x16d);
}
struct pt_regs32 { struct pt_regs32 {
unsigned int psr; unsigned int psr;
unsigned int pc; unsigned int pc;
......
/* $Id: thread_info.h,v 1.1 2002/02/10 00:00:58 davem Exp $ /* thread_info.h: sparc64 low-level thread information
* thread_info.h: sparc64 low-level thread information
* *
* Copyright (C) 2002 David S. Miller (davem@redhat.com) * Copyright (C) 2002 David S. Miller (davem@redhat.com)
*/ */
...@@ -223,7 +222,7 @@ register struct thread_info *current_thread_info_reg asm("g6"); ...@@ -223,7 +222,7 @@ register struct thread_info *current_thread_info_reg asm("g6");
#define TIF_NEED_RESCHED 3 /* rescheduling necessary */ #define TIF_NEED_RESCHED 3 /* rescheduling necessary */
#define TIF_PERFCTR 4 /* performance counters active */ #define TIF_PERFCTR 4 /* performance counters active */
#define TIF_UNALIGNED 5 /* allowed to do unaligned accesses */ #define TIF_UNALIGNED 5 /* allowed to do unaligned accesses */
#define TIF_NEWSIGNALS 6 /* wants new-style signals */ /* flag bit 6 is available */
#define TIF_32BIT 7 /* 32-bit binary */ #define TIF_32BIT 7 /* 32-bit binary */
/* flag bit 8 is available */ /* flag bit 8 is available */
#define TIF_SECCOMP 9 /* secure computing */ #define TIF_SECCOMP 9 /* secure computing */
...@@ -242,7 +241,6 @@ register struct thread_info *current_thread_info_reg asm("g6"); ...@@ -242,7 +241,6 @@ register struct thread_info *current_thread_info_reg asm("g6");
#define _TIF_NEED_RESCHED (1<<TIF_NEED_RESCHED) #define _TIF_NEED_RESCHED (1<<TIF_NEED_RESCHED)
#define _TIF_PERFCTR (1<<TIF_PERFCTR) #define _TIF_PERFCTR (1<<TIF_PERFCTR)
#define _TIF_UNALIGNED (1<<TIF_UNALIGNED) #define _TIF_UNALIGNED (1<<TIF_UNALIGNED)
#define _TIF_NEWSIGNALS (1<<TIF_NEWSIGNALS)
#define _TIF_32BIT (1<<TIF_32BIT) #define _TIF_32BIT (1<<TIF_32BIT)
#define _TIF_SECCOMP (1<<TIF_SECCOMP) #define _TIF_SECCOMP (1<<TIF_SECCOMP)
#define _TIF_SYSCALL_AUDIT (1<<TIF_SYSCALL_AUDIT) #define _TIF_SYSCALL_AUDIT (1<<TIF_SYSCALL_AUDIT)
......
...@@ -517,7 +517,7 @@ menuconfig EMBEDDED ...@@ -517,7 +517,7 @@ menuconfig EMBEDDED
config UID16 config UID16
bool "Enable 16-bit UID system calls" if EMBEDDED bool "Enable 16-bit UID system calls" if EMBEDDED
depends on ARM || BLACKFIN || CRIS || FRV || H8300 || X86_32 || M68K || (S390 && !64BIT) || SUPERH || SPARC32 || (SPARC64 && SPARC32_COMPAT) || UML || (X86_64 && IA32_EMULATION) depends on ARM || BLACKFIN || CRIS || FRV || H8300 || X86_32 || M68K || (S390 && !64BIT) || SUPERH || SPARC32 || (SPARC64 && COMPAT) || UML || (X86_64 && IA32_EMULATION)
default y default y
help help
This enables the legacy 16-bit UID syscall wrappers. This enables the legacy 16-bit UID syscall wrappers.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment