diff options
Diffstat (limited to 'arch/sparc/kernel')
47 files changed, 517 insertions, 905 deletions
diff --git a/arch/sparc/kernel/apc.c b/arch/sparc/kernel/apc.c index 812e10bbb0b3..eefda32b595e 100644 --- a/arch/sparc/kernel/apc.c +++ b/arch/sparc/kernel/apc.c @@ -20,6 +20,7 @@  #include <asm/uaccess.h>  #include <asm/auxio.h>  #include <asm/apc.h> +#include <asm/processor.h>  /* Debugging   *  @@ -31,7 +32,7 @@  #define APC_DEVNAME "apc"  static u8 __iomem *regs; -static int apc_no_idle __devinitdata = 0; +static int apc_no_idle = 0;  #define apc_readb(offs)		(sbus_readb(regs+offs))  #define apc_writeb(val, offs) 	(sbus_writeb(val, regs+offs)) @@ -138,7 +139,7 @@ static const struct file_operations apc_fops = {  static struct miscdevice apc_miscdev = { APC_MINOR, APC_DEVNAME, &apc_fops }; -static int __devinit apc_probe(struct platform_device *op) +static int apc_probe(struct platform_device *op)  {  	int err; @@ -158,7 +159,7 @@ static int __devinit apc_probe(struct platform_device *op)  	/* Assign power management IDLE handler */  	if (!apc_no_idle) -		pm_idle = apc_swift_idle;	 +		sparc_idle = apc_swift_idle;  	printk(KERN_INFO "%s: power management initialized%s\n",   	       APC_DEVNAME, apc_no_idle ? " (CPU idle disabled)" : ""); diff --git a/arch/sparc/kernel/auxio_64.c b/arch/sparc/kernel/auxio_64.c index 773091ac71a3..86e55778e4af 100644 --- a/arch/sparc/kernel/auxio_64.c +++ b/arch/sparc/kernel/auxio_64.c @@ -102,7 +102,7 @@ static const struct of_device_id auxio_match[] = {  MODULE_DEVICE_TABLE(of, auxio_match); -static int __devinit auxio_probe(struct platform_device *dev) +static int auxio_probe(struct platform_device *dev)  {  	struct device_node *dp = dev->dev.of_node;  	unsigned long size; diff --git a/arch/sparc/kernel/central.c b/arch/sparc/kernel/central.c index 9708851a8b9f..052b5a44318f 100644 --- a/arch/sparc/kernel/central.c +++ b/arch/sparc/kernel/central.c @@ -33,7 +33,7 @@ struct fhc {  	struct platform_device	leds_pdev;  }; -static int __devinit clock_board_calc_nslots(struct clock_board *p) +static int clock_board_calc_nslots(struct clock_board *p)  {  	u8 reg = upa_readb(p->clock_regs + CLOCK_STAT1) & 0xc0; @@ -60,7 +60,7 @@ static int __devinit clock_board_calc_nslots(struct clock_board *p)  	}  } -static int __devinit clock_board_probe(struct platform_device *op) +static int clock_board_probe(struct platform_device *op)  {  	struct clock_board *p = kzalloc(sizeof(*p), GFP_KERNEL);  	int err = -ENOMEM; @@ -157,7 +157,7 @@ static struct platform_driver clock_board_driver = {  	},  }; -static int __devinit fhc_probe(struct platform_device *op) +static int fhc_probe(struct platform_device *op)  {  	struct fhc *p = kzalloc(sizeof(*p), GFP_KERNEL);  	int err = -ENOMEM; diff --git a/arch/sparc/kernel/chmc.c b/arch/sparc/kernel/chmc.c index 5f450260981d..dbb210d74e21 100644 --- a/arch/sparc/kernel/chmc.c +++ b/arch/sparc/kernel/chmc.c @@ -336,9 +336,9 @@ static int jbusmc_print_dimm(int syndrome_code,  	return 0;  } -static u64 __devinit jbusmc_dimm_group_size(u64 base, -					    const struct linux_prom64_registers *mem_regs, -					    int num_mem_regs) +static u64 jbusmc_dimm_group_size(u64 base, +				  const struct linux_prom64_registers *mem_regs, +				  int num_mem_regs)  {  	u64 max = base + (8UL * 1024 * 1024 * 1024);  	u64 max_seen = base; @@ -363,10 +363,10 @@ static u64 __devinit jbusmc_dimm_group_size(u64 base,  	return max_seen - base;  } -static void __devinit jbusmc_construct_one_dimm_group(struct jbusmc *p, -						      unsigned long index, -						      const struct linux_prom64_registers *mem_regs, -						      int num_mem_regs) +static void jbusmc_construct_one_dimm_group(struct jbusmc *p, +					    unsigned long index, +					    const struct linux_prom64_registers *mem_regs, +					    int num_mem_regs)  {  	struct jbusmc_dimm_group *dp = &p->dimm_groups[index]; @@ -378,9 +378,9 @@ static void __devinit jbusmc_construct_one_dimm_group(struct jbusmc *p,  	dp->size = jbusmc_dimm_group_size(dp->base_addr, mem_regs, num_mem_regs);  } -static void __devinit jbusmc_construct_dimm_groups(struct jbusmc *p, -						   const struct linux_prom64_registers *mem_regs, -						   int num_mem_regs) +static void jbusmc_construct_dimm_groups(struct jbusmc *p, +					 const struct linux_prom64_registers *mem_regs, +					 int num_mem_regs)  {  	if (p->mc_reg_1 & JB_MC_REG1_DIMM1_BANK0) {  		jbusmc_construct_one_dimm_group(p, 0, mem_regs, num_mem_regs); @@ -392,7 +392,7 @@ static void __devinit jbusmc_construct_dimm_groups(struct jbusmc *p,  	}  } -static int __devinit jbusmc_probe(struct platform_device *op) +static int jbusmc_probe(struct platform_device *op)  {  	const struct linux_prom64_registers *mem_regs;  	struct device_node *mem_node; @@ -689,7 +689,7 @@ static void chmc_fetch_decode_regs(struct chmc *p)  				      chmc_read_mcreg(p, CHMCTRL_DECODE4));  } -static int __devinit chmc_probe(struct platform_device *op) +static int chmc_probe(struct platform_device *op)  {  	struct device_node *dp = op->dev.of_node;  	unsigned long ver; @@ -763,7 +763,7 @@ out_free:  	goto out;  } -static int __devinit us3mc_probe(struct platform_device *op) +static int us3mc_probe(struct platform_device *op)  {  	if (mc_type == MC_TYPE_SAFARI)  		return chmc_probe(op); @@ -772,21 +772,21 @@ static int __devinit us3mc_probe(struct platform_device *op)  	return -ENODEV;  } -static void __devexit chmc_destroy(struct platform_device *op, struct chmc *p) +static void chmc_destroy(struct platform_device *op, struct chmc *p)  {  	list_del(&p->list);  	of_iounmap(&op->resource[0], p->regs, 0x48);  	kfree(p);  } -static void __devexit jbusmc_destroy(struct platform_device *op, struct jbusmc *p) +static void jbusmc_destroy(struct platform_device *op, struct jbusmc *p)  {  	mc_list_del(&p->list);  	of_iounmap(&op->resource[0], p->regs, JBUSMC_REGS_SIZE);  	kfree(p);  } -static int __devexit us3mc_remove(struct platform_device *op) +static int us3mc_remove(struct platform_device *op)  {  	void *p = dev_get_drvdata(&op->dev); @@ -814,7 +814,7 @@ static struct platform_driver us3mc_driver = {  		.of_match_table = us3mc_match,  	},  	.probe		= us3mc_probe, -	.remove		= __devexit_p(us3mc_remove), +	.remove		= us3mc_remove,  };  static inline bool us3mc_platform(void) diff --git a/arch/sparc/kernel/ds.c b/arch/sparc/kernel/ds.c index f09257c86107..75bb608c423e 100644 --- a/arch/sparc/kernel/ds.c +++ b/arch/sparc/kernel/ds.c @@ -29,7 +29,7 @@  #define DRV_MODULE_VERSION	"1.0"  #define DRV_MODULE_RELDATE	"Jul 11, 2007" -static char version[] __devinitdata = +static char version[] =  	DRV_MODULE_NAME ".c:v" DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n";  MODULE_AUTHOR("David S. Miller ([email protected])");  MODULE_DESCRIPTION("Sun LDOM domain services driver"); @@ -1146,8 +1146,7 @@ static void ds_event(void *arg, int event)  	spin_unlock_irqrestore(&ds_lock, flags);  } -static int __devinit ds_probe(struct vio_dev *vdev, -			      const struct vio_device_id *id) +static int ds_probe(struct vio_dev *vdev, const struct vio_device_id *id)  {  	static int ds_version_printed;  	struct ldc_channel_config ds_cfg = { diff --git a/arch/sparc/kernel/entry.S b/arch/sparc/kernel/entry.S index 21fd1a8f47d2..e2a030045089 100644 --- a/arch/sparc/kernel/entry.S +++ b/arch/sparc/kernel/entry.S @@ -820,14 +820,6 @@ sys_sparc_pipe:  	 mov	%l5, %o7  	.align	4 -	.globl	sys_sigaltstack -sys_sigaltstack: -	mov	%o7, %l5 -	mov	%fp, %o2 -	call	do_sigaltstack -	 mov	%l5, %o7 - -	.align	4  	.globl	sys_sigstack  sys_sigstack:  	mov	%o7, %l5 diff --git a/arch/sparc/kernel/kernel.h b/arch/sparc/kernel/kernel.h index 291bb5de9ce0..a702d9ab019c 100644 --- a/arch/sparc/kernel/kernel.h +++ b/arch/sparc/kernel/kernel.h @@ -48,6 +48,10 @@ extern void sun4m_init_IRQ(void);  extern void sun4m_unmask_profile_irq(void);  extern void sun4m_clear_profile_irq(int cpu); +/* sun4m_smp.c */ +void sun4m_cpu_pre_starting(void *arg); +void sun4m_cpu_pre_online(void *arg); +  /* sun4d_irq.c */  extern spinlock_t sun4d_imsk_lock; @@ -60,6 +64,14 @@ extern int show_sun4d_interrupts(struct seq_file *, void *);  extern void sun4d_distribute_irqs(void);  extern void sun4d_free_irq(unsigned int irq, void *dev_id); +/* sun4d_smp.c */ +void sun4d_cpu_pre_starting(void *arg); +void sun4d_cpu_pre_online(void *arg); + +/* leon_smp.c */ +void leon_cpu_pre_starting(void *arg); +void leon_cpu_pre_online(void *arg); +  /* head_32.S */  extern unsigned int t_nmi[];  extern unsigned int linux_trap_ipi15_sun4d[]; diff --git a/arch/sparc/kernel/kgdb_32.c b/arch/sparc/kernel/kgdb_32.c index 2e424a576a36..dcf210811af4 100644 --- a/arch/sparc/kernel/kgdb_32.c +++ b/arch/sparc/kernel/kgdb_32.c @@ -5,6 +5,7 @@  #include <linux/kgdb.h>  #include <linux/kdebug.h> +#include <linux/sched.h>  #include <asm/kdebug.h>  #include <asm/ptrace.h> diff --git a/arch/sparc/kernel/kprobes.c b/arch/sparc/kernel/kprobes.c index a39d1ba5a119..e72212148d2a 100644 --- a/arch/sparc/kernel/kprobes.c +++ b/arch/sparc/kernel/kprobes.c @@ -511,7 +511,7 @@ int __kprobes trampoline_probe_handler(struct kprobe *p, struct pt_regs *regs)  {  	struct kretprobe_instance *ri = NULL;  	struct hlist_head *head, empty_rp; -	struct hlist_node *node, *tmp; +	struct hlist_node *tmp;  	unsigned long flags, orig_ret_address = 0;  	unsigned long trampoline_address =(unsigned long)&kretprobe_trampoline; @@ -531,7 +531,7 @@ int __kprobes trampoline_probe_handler(struct kprobe *p, struct pt_regs *regs)  	 *       real return address, and all the rest will point to  	 *       kretprobe_trampoline  	 */ -	hlist_for_each_entry_safe(ri, node, tmp, head, hlist) { +	hlist_for_each_entry_safe(ri, tmp, head, hlist) {  		if (ri->task != current)  			/* another task is sharing our hash bucket */  			continue; @@ -559,7 +559,7 @@ int __kprobes trampoline_probe_handler(struct kprobe *p, struct pt_regs *regs)  	kretprobe_hash_unlock(current, &flags);  	preempt_enable_no_resched(); -	hlist_for_each_entry_safe(ri, node, tmp, &empty_rp, hlist) { +	hlist_for_each_entry_safe(ri, tmp, &empty_rp, hlist) {  		hlist_del(&ri->hlist);  		kfree(ri);  	} diff --git a/arch/sparc/kernel/ldc.c b/arch/sparc/kernel/ldc.c index 81d92fc9983b..54df554b82d9 100644 --- a/arch/sparc/kernel/ldc.c +++ b/arch/sparc/kernel/ldc.c @@ -27,7 +27,7 @@  #define DRV_MODULE_VERSION	"1.1"  #define DRV_MODULE_RELDATE	"July 22, 2008" -static char version[] __devinitdata = +static char version[] =  	DRV_MODULE_NAME ".c:v" DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n";  #define LDC_PACKET_SIZE		64 @@ -953,9 +953,8 @@ static HLIST_HEAD(ldc_channel_list);  static int __ldc_channel_exists(unsigned long id)  {  	struct ldc_channel *lp; -	struct hlist_node *n; -	hlist_for_each_entry(lp, n, &ldc_channel_list, list) { +	hlist_for_each_entry(lp, &ldc_channel_list, list) {  		if (lp->id == id)  			return 1;  	} diff --git a/arch/sparc/kernel/leon_pci.c b/arch/sparc/kernel/leon_pci.c index fc0521161568..852dc8430528 100644 --- a/arch/sparc/kernel/leon_pci.c +++ b/arch/sparc/kernel/leon_pci.c @@ -43,7 +43,7 @@ void leon_pci_init(struct platform_device *ofdev, struct leon_pci_info *info)  	}  } -void __devinit pcibios_fixup_bus(struct pci_bus *pbus) +void pcibios_fixup_bus(struct pci_bus *pbus)  {  	struct pci_dev *dev;  	int i, has_io, has_mem; diff --git a/arch/sparc/kernel/leon_pci_grpci2.c b/arch/sparc/kernel/leon_pci_grpci2.c index b1bc38853a3d..fc4320886a3a 100644 --- a/arch/sparc/kernel/leon_pci_grpci2.c +++ b/arch/sparc/kernel/leon_pci_grpci2.c @@ -668,7 +668,7 @@ static irqreturn_t grpci2_err_interrupt(int irq, void *arg)  	return IRQ_HANDLED;  } -static int __devinit grpci2_of_probe(struct platform_device *ofdev) +static int grpci2_of_probe(struct platform_device *ofdev)  {  	struct grpci2_regs *regs;  	struct grpci2_priv *priv; diff --git a/arch/sparc/kernel/leon_pmc.c b/arch/sparc/kernel/leon_pmc.c index 4e174321097d..708bca435219 100644 --- a/arch/sparc/kernel/leon_pmc.c +++ b/arch/sparc/kernel/leon_pmc.c @@ -9,6 +9,7 @@  #include <asm/leon_amba.h>  #include <asm/cpu_type.h>  #include <asm/leon.h> +#include <asm/processor.h>  /* List of Systems that need fixup instructions around power-down instruction */  unsigned int pmc_leon_fixup_ids[] = { @@ -69,9 +70,9 @@ static int __init leon_pmc_install(void)  	if (sparc_cpu_model == sparc_leon) {  		/* Assign power management IDLE handler */  		if (pmc_leon_need_fixup()) -			pm_idle = pmc_leon_idle_fixup; +			sparc_idle = pmc_leon_idle_fixup;  		else -			pm_idle = pmc_leon_idle; +			sparc_idle = pmc_leon_idle;  		printk(KERN_INFO "leon: power management initialized\n");  	} diff --git a/arch/sparc/kernel/leon_smp.c b/arch/sparc/kernel/leon_smp.c index 0f3fb6d9c8ef..9b40c9c12a0c 100644 --- a/arch/sparc/kernel/leon_smp.c +++ b/arch/sparc/kernel/leon_smp.c @@ -69,31 +69,19 @@ static inline unsigned long do_swap(volatile unsigned long *ptr,  	return val;  } -void __cpuinit leon_callin(void) +void __cpuinit leon_cpu_pre_starting(void *arg)  { -	int cpuid = hard_smp_processor_id(); - -	local_ops->cache_all(); -	local_ops->tlb_all();  	leon_configure_cache_smp(); +} -	notify_cpu_starting(cpuid); - -	/* Get our local ticker going. */ -	register_percpu_ce(cpuid); - -	calibrate_delay(); -	smp_store_cpu_info(cpuid); - -	local_ops->cache_all(); -	local_ops->tlb_all(); +void __cpuinit leon_cpu_pre_online(void *arg) +{ +	int cpuid = hard_smp_processor_id(); -	/* -	 * Unblock the master CPU _only_ when the scheduler state -	 * of all secondary CPUs will be up-to-date, so after -	 * the SMP initialization the master will be just allowed -	 * to call the scheduler code. -	 * Allow master to continue. +	/* Allow master to continue. The master will then give us the +	 * go-ahead by setting the smp_commenced_mask and will wait without +	 * timeouts until our setup is completed fully (signified by +	 * our bit being set in the cpu_online_mask).  	 */  	do_swap(&cpu_callin_map[cpuid], 1); @@ -110,9 +98,6 @@ void __cpuinit leon_callin(void)  	while (!cpumask_test_cpu(cpuid, &smp_commenced_mask))  		mb(); - -	local_irq_enable(); -	set_cpu_online(cpuid, true);  }  /* diff --git a/arch/sparc/kernel/pci.c b/arch/sparc/kernel/pci.c index 75b31bcdeadf..baf4366e2d6a 100644 --- a/arch/sparc/kernel/pci.c +++ b/arch/sparc/kernel/pci.c @@ -356,7 +356,7 @@ static struct pci_dev *of_create_pci_dev(struct pci_pbm_info *pbm,  	return dev;  } -static void __devinit apb_calc_first_last(u8 map, u32 *first_p, u32 *last_p) +static void apb_calc_first_last(u8 map, u32 *first_p, u32 *last_p)  {  	u32 idx, first, last; @@ -378,9 +378,9 @@ static void __devinit apb_calc_first_last(u8 map, u32 *first_p, u32 *last_p)  /* Cook up fake bus resources for SUNW,simba PCI bridges which lack   * a proper 'ranges' property.   */ -static void __devinit apb_fake_ranges(struct pci_dev *dev, -				      struct pci_bus *bus, -				      struct pci_pbm_info *pbm) +static void apb_fake_ranges(struct pci_dev *dev, +			    struct pci_bus *bus, +			    struct pci_pbm_info *pbm)  {  	struct pci_bus_region region;  	struct resource *res; @@ -404,15 +404,15 @@ static void __devinit apb_fake_ranges(struct pci_dev *dev,  	pcibios_bus_to_resource(dev, res, ®ion);  } -static void __devinit pci_of_scan_bus(struct pci_pbm_info *pbm, -				      struct device_node *node, -				      struct pci_bus *bus); +static void pci_of_scan_bus(struct pci_pbm_info *pbm, +			    struct device_node *node, +			    struct pci_bus *bus);  #define GET_64BIT(prop, i)	((((u64) (prop)[(i)]) << 32) | (prop)[(i)+1]) -static void __devinit of_scan_pci_bridge(struct pci_pbm_info *pbm, -					 struct device_node *node, -					 struct pci_dev *dev) +static void of_scan_pci_bridge(struct pci_pbm_info *pbm, +			       struct device_node *node, +			       struct pci_dev *dev)  {  	struct pci_bus *bus;  	const u32 *busrange, *ranges; @@ -503,9 +503,9 @@ after_ranges:  	pci_of_scan_bus(pbm, node, bus);  } -static void __devinit pci_of_scan_bus(struct pci_pbm_info *pbm, -				      struct device_node *node, -				      struct pci_bus *bus) +static void pci_of_scan_bus(struct pci_pbm_info *pbm, +			    struct device_node *node, +			    struct pci_bus *bus)  {  	struct device_node *child;  	const u32 *reg; @@ -564,7 +564,7 @@ show_pciobppath_attr(struct device * dev, struct device_attribute * attr, char *  static DEVICE_ATTR(obppath, S_IRUSR | S_IRGRP | S_IROTH, show_pciobppath_attr, NULL); -static void __devinit pci_bus_register_of_sysfs(struct pci_bus *bus) +static void pci_bus_register_of_sysfs(struct pci_bus *bus)  {  	struct pci_dev *dev;  	struct pci_bus *child_bus; @@ -585,8 +585,8 @@ static void __devinit pci_bus_register_of_sysfs(struct pci_bus *bus)  		pci_bus_register_of_sysfs(child_bus);  } -struct pci_bus * __devinit pci_scan_one_pbm(struct pci_pbm_info *pbm, -					    struct device *parent) +struct pci_bus *pci_scan_one_pbm(struct pci_pbm_info *pbm, +				 struct device *parent)  {  	LIST_HEAD(resources);  	struct device_node *node = pbm->op->dev.of_node; @@ -618,7 +618,7 @@ struct pci_bus * __devinit pci_scan_one_pbm(struct pci_pbm_info *pbm,  	return bus;  } -void __devinit pcibios_fixup_bus(struct pci_bus *pbus) +void pcibios_fixup_bus(struct pci_bus *pbus)  {  } @@ -949,8 +949,7 @@ static int __init pcibios_init(void)  subsys_initcall(pcibios_init);  #ifdef CONFIG_SYSFS -static void __devinit pci_bus_slot_names(struct device_node *node, -					 struct pci_bus *bus) +static void pci_bus_slot_names(struct device_node *node, struct pci_bus *bus)  {  	const struct pci_slot_names {  		u32	slot_mask; diff --git a/arch/sparc/kernel/pci_fire.c b/arch/sparc/kernel/pci_fire.c index 188f935276fd..e60fc6a67e9b 100644 --- a/arch/sparc/kernel/pci_fire.c +++ b/arch/sparc/kernel/pci_fire.c @@ -408,8 +408,8 @@ static void pci_fire_hw_init(struct pci_pbm_info *pbm)  	upa_writeq(~(u64)0, pbm->pbm_regs + FIRE_PEC_IENAB);  } -static int __devinit pci_fire_pbm_init(struct pci_pbm_info *pbm, -				       struct platform_device *op, u32 portid) +static int pci_fire_pbm_init(struct pci_pbm_info *pbm, +			     struct platform_device *op, u32 portid)  {  	const struct linux_prom64_registers *regs;  	struct device_node *dp = op->dev.of_node; @@ -454,7 +454,7 @@ static int __devinit pci_fire_pbm_init(struct pci_pbm_info *pbm,  	return 0;  } -static int __devinit fire_probe(struct platform_device *op) +static int fire_probe(struct platform_device *op)  {  	struct device_node *dp = op->dev.of_node;  	struct pci_pbm_info *pbm; diff --git a/arch/sparc/kernel/pci_psycho.c b/arch/sparc/kernel/pci_psycho.c index f4d29e15ce71..c647634ead2b 100644 --- a/arch/sparc/kernel/pci_psycho.c +++ b/arch/sparc/kernel/pci_psycho.c @@ -366,8 +366,8 @@ static void pbm_config_busmastering(struct pci_pbm_info *pbm)  	pci_config_write8(addr, 64);  } -static void __devinit psycho_scan_bus(struct pci_pbm_info *pbm, -				      struct device *parent) +static void psycho_scan_bus(struct pci_pbm_info *pbm, +			    struct device *parent)  {  	pbm_config_busmastering(pbm);  	pbm->is_66mhz_capable = 0; @@ -483,15 +483,15 @@ static void psycho_pbm_strbuf_init(struct pci_pbm_info *pbm,  #define PSYCHO_MEMSPACE_B	0x180000000UL  #define PSYCHO_MEMSPACE_SIZE	0x07fffffffUL -static void __devinit psycho_pbm_init(struct pci_pbm_info *pbm, -				      struct platform_device *op, int is_pbm_a) +static void psycho_pbm_init(struct pci_pbm_info *pbm, +			    struct platform_device *op, int is_pbm_a)  {  	psycho_pbm_init_common(pbm, op, "PSYCHO", PBM_CHIP_TYPE_PSYCHO);  	psycho_pbm_strbuf_init(pbm, is_pbm_a);  	psycho_scan_bus(pbm, &op->dev);  } -static struct pci_pbm_info * __devinit psycho_find_sibling(u32 upa_portid) +static struct pci_pbm_info *psycho_find_sibling(u32 upa_portid)  {  	struct pci_pbm_info *pbm; @@ -504,7 +504,7 @@ static struct pci_pbm_info * __devinit psycho_find_sibling(u32 upa_portid)  #define PSYCHO_CONFIGSPACE	0x001000000UL -static int __devinit psycho_probe(struct platform_device *op) +static int psycho_probe(struct platform_device *op)  {  	const struct linux_prom64_registers *pr_regs;  	struct device_node *dp = op->dev.of_node; diff --git a/arch/sparc/kernel/pci_sabre.c b/arch/sparc/kernel/pci_sabre.c index 3efaa4644d60..6f00d27e8dac 100644 --- a/arch/sparc/kernel/pci_sabre.c +++ b/arch/sparc/kernel/pci_sabre.c @@ -403,8 +403,7 @@ static void apb_init(struct pci_bus *sabre_bus)  	}  } -static void __devinit sabre_scan_bus(struct pci_pbm_info *pbm, -				     struct device *parent) +static void sabre_scan_bus(struct pci_pbm_info *pbm, struct device *parent)  {  	static int once; @@ -443,8 +442,8 @@ static void __devinit sabre_scan_bus(struct pci_pbm_info *pbm,  	sabre_register_error_handlers(pbm);  } -static void __devinit sabre_pbm_init(struct pci_pbm_info *pbm, -				     struct platform_device *op) +static void sabre_pbm_init(struct pci_pbm_info *pbm, +			   struct platform_device *op)  {  	psycho_pbm_init_common(pbm, op, "SABRE", PBM_CHIP_TYPE_SABRE);  	pbm->pci_afsr = pbm->controller_regs + SABRE_PIOAFSR; @@ -454,7 +453,7 @@ static void __devinit sabre_pbm_init(struct pci_pbm_info *pbm,  }  static const struct of_device_id sabre_match[]; -static int __devinit sabre_probe(struct platform_device *op) +static int sabre_probe(struct platform_device *op)  {  	const struct of_device_id *match;  	const struct linux_prom64_registers *pr_regs; diff --git a/arch/sparc/kernel/pci_schizo.c b/arch/sparc/kernel/pci_schizo.c index 13d4aa20b5a5..8f76f23dac38 100644 --- a/arch/sparc/kernel/pci_schizo.c +++ b/arch/sparc/kernel/pci_schizo.c @@ -1064,8 +1064,7 @@ static void pbm_config_busmastering(struct pci_pbm_info *pbm)  	pci_config_write8(addr, 64);  } -static void __devinit schizo_scan_bus(struct pci_pbm_info *pbm, -				      struct device *parent) +static void schizo_scan_bus(struct pci_pbm_info *pbm, struct device *parent)  {  	pbm_config_busmastering(pbm);  	pbm->is_66mhz_capable = @@ -1307,9 +1306,9 @@ static void schizo_pbm_hw_init(struct pci_pbm_info *pbm)  	}  } -static int __devinit schizo_pbm_init(struct pci_pbm_info *pbm, -				     struct platform_device *op, u32 portid, -				     int chip_type) +static int schizo_pbm_init(struct pci_pbm_info *pbm, +			   struct platform_device *op, u32 portid, +			   int chip_type)  {  	const struct linux_prom64_registers *regs;  	struct device_node *dp = op->dev.of_node; @@ -1400,8 +1399,7 @@ static inline int portid_compare(u32 x, u32 y, int chip_type)  	return (x == y);  } -static struct pci_pbm_info * __devinit schizo_find_sibling(u32 portid, -							   int chip_type) +static struct pci_pbm_info *schizo_find_sibling(u32 portid, int chip_type)  {  	struct pci_pbm_info *pbm; @@ -1412,7 +1410,7 @@ static struct pci_pbm_info * __devinit schizo_find_sibling(u32 portid,  	return NULL;  } -static int __devinit __schizo_init(struct platform_device *op, unsigned long chip_type) +static int __schizo_init(struct platform_device *op, unsigned long chip_type)  {  	struct device_node *dp = op->dev.of_node;  	struct pci_pbm_info *pbm; @@ -1460,7 +1458,7 @@ out_err:  }  static const struct of_device_id schizo_match[]; -static int __devinit schizo_probe(struct platform_device *op) +static int schizo_probe(struct platform_device *op)  {  	const struct of_device_id *match; diff --git a/arch/sparc/kernel/pci_sun4v.c b/arch/sparc/kernel/pci_sun4v.c index 051b69caeffd..d07f6b29aed8 100644 --- a/arch/sparc/kernel/pci_sun4v.c +++ b/arch/sparc/kernel/pci_sun4v.c @@ -536,8 +536,7 @@ static struct dma_map_ops sun4v_dma_ops = {  	.unmap_sg			= dma_4v_unmap_sg,  }; -static void __devinit pci_sun4v_scan_bus(struct pci_pbm_info *pbm, -					 struct device *parent) +static void pci_sun4v_scan_bus(struct pci_pbm_info *pbm, struct device *parent)  {  	struct property *prop;  	struct device_node *dp; @@ -550,8 +549,8 @@ static void __devinit pci_sun4v_scan_bus(struct pci_pbm_info *pbm,  	/* XXX register error interrupt handlers XXX */  } -static unsigned long __devinit probe_existing_entries(struct pci_pbm_info *pbm, -						      struct iommu *iommu) +static unsigned long probe_existing_entries(struct pci_pbm_info *pbm, +					    struct iommu *iommu)  {  	struct iommu_arena *arena = &iommu->arena;  	unsigned long i, cnt = 0; @@ -578,7 +577,7 @@ static unsigned long __devinit probe_existing_entries(struct pci_pbm_info *pbm,  	return cnt;  } -static int __devinit pci_sun4v_iommu_init(struct pci_pbm_info *pbm) +static int pci_sun4v_iommu_init(struct pci_pbm_info *pbm)  {  	static const u32 vdma_default[] = { 0x80000000, 0x80000000 };  	struct iommu *iommu = pbm->iommu; @@ -879,8 +878,8 @@ static void pci_sun4v_msi_init(struct pci_pbm_info *pbm)  }  #endif /* !(CONFIG_PCI_MSI) */ -static int __devinit pci_sun4v_pbm_init(struct pci_pbm_info *pbm, -					struct platform_device *op, u32 devhandle) +static int pci_sun4v_pbm_init(struct pci_pbm_info *pbm, +			      struct platform_device *op, u32 devhandle)  {  	struct device_node *dp = op->dev.of_node;  	int err; @@ -919,7 +918,7 @@ static int __devinit pci_sun4v_pbm_init(struct pci_pbm_info *pbm,  	return 0;  } -static int __devinit pci_sun4v_probe(struct platform_device *op) +static int pci_sun4v_probe(struct platform_device *op)  {  	const struct linux_prom64_registers *regs;  	static int hvapi_negotiated = 0; diff --git a/arch/sparc/kernel/pcic.c b/arch/sparc/kernel/pcic.c index 521fdf1b20e5..09f4fdd8d808 100644 --- a/arch/sparc/kernel/pcic.c +++ b/arch/sparc/kernel/pcic.c @@ -439,8 +439,7 @@ int pcic_present(void)  	return pcic0_up;  } -static int __devinit pdev_to_pnode(struct linux_pbm_info *pbm, -				    struct pci_dev *pdev) +static int pdev_to_pnode(struct linux_pbm_info *pbm, struct pci_dev *pdev)  {  	struct linux_prom_pci_registers regs[PROMREG_MAX];  	int err; @@ -595,7 +594,7 @@ pcic_fill_irq(struct linux_pcic *pcic, struct pci_dev *dev, int node)  /*   * Normally called from {do_}pci_scan_bus...   */ -void __devinit pcibios_fixup_bus(struct pci_bus *bus) +void pcibios_fixup_bus(struct pci_bus *bus)  {  	struct pci_dev *dev;  	int i, has_io, has_mem; diff --git a/arch/sparc/kernel/pmc.c b/arch/sparc/kernel/pmc.c index 0e3202239ff5..8b7297faca79 100644 --- a/arch/sparc/kernel/pmc.c +++ b/arch/sparc/kernel/pmc.c @@ -17,6 +17,7 @@  #include <asm/oplib.h>  #include <asm/uaccess.h>  #include <asm/auxio.h> +#include <asm/processor.h>  /* Debug   * @@ -52,7 +53,7 @@ static void pmc_swift_idle(void)  #endif  } -static int __devinit pmc_probe(struct platform_device *op) +static int pmc_probe(struct platform_device *op)  {  	regs = of_ioremap(&op->resource[0], 0,  			  resource_size(&op->resource[0]), PMC_OBPNAME); @@ -63,7 +64,7 @@ static int __devinit pmc_probe(struct platform_device *op)  #ifndef PMC_NO_IDLE  	/* Assign power management IDLE handler */ -	pm_idle = pmc_swift_idle; +	sparc_idle = pmc_swift_idle;  #endif  	printk(KERN_INFO "%s: power management initialized\n", PMC_DEVNAME); diff --git a/arch/sparc/kernel/power.c b/arch/sparc/kernel/power.c index 0d39075063b2..4cb23c41553f 100644 --- a/arch/sparc/kernel/power.c +++ b/arch/sparc/kernel/power.c @@ -23,7 +23,7 @@ static irqreturn_t power_handler(int irq, void *dev_id)  	return IRQ_HANDLED;  } -static int __devinit has_button_interrupt(unsigned int irq, struct device_node *dp) +static int has_button_interrupt(unsigned int irq, struct device_node *dp)  {  	if (irq == 0xffffffff)  		return 0; @@ -33,7 +33,7 @@ static int __devinit has_button_interrupt(unsigned int irq, struct device_node *  	return 1;  } -static int __devinit power_probe(struct platform_device *op) +static int power_probe(struct platform_device *op)  {  	struct resource *res = &op->resource[0];  	unsigned int irq = op->archdata.irqs[0]; diff --git a/arch/sparc/kernel/process_32.c b/arch/sparc/kernel/process_32.c index be8e862badaf..62eede13831a 100644 --- a/arch/sparc/kernel/process_32.c +++ b/arch/sparc/kernel/process_32.c @@ -43,8 +43,7 @@   * Power management idle function    * Set in pm platform drivers (apc.c and pmc.c)   */ -void (*pm_idle)(void); -EXPORT_SYMBOL(pm_idle); +void (*sparc_idle)(void);  /*    * Power-off handler instantiation for pm.h compliance @@ -75,8 +74,8 @@ void cpu_idle(void)  	/* endless idle loop with no priority at all */  	for (;;) {  		while (!need_resched()) { -			if (pm_idle) -				(*pm_idle)(); +			if (sparc_idle) +				(*sparc_idle)();  			else  				cpu_relax();  		} diff --git a/arch/sparc/kernel/prom_common.c b/arch/sparc/kernel/prom_common.c index 1303021748c8..9f20566b0773 100644 --- a/arch/sparc/kernel/prom_common.c +++ b/arch/sparc/kernel/prom_common.c @@ -64,7 +64,7 @@ int of_set_property(struct device_node *dp, const char *name, void *val, int len  	err = -ENODEV;  	mutex_lock(&of_set_property_mutex); -	write_lock(&devtree_lock); +	raw_spin_lock(&devtree_lock);  	prevp = &dp->properties;  	while (*prevp) {  		struct property *prop = *prevp; @@ -91,7 +91,7 @@ int of_set_property(struct device_node *dp, const char *name, void *val, int len  		}  		prevp = &(*prevp)->next;  	} -	write_unlock(&devtree_lock); +	raw_spin_unlock(&devtree_lock);  	mutex_unlock(&of_set_property_mutex);  	/* XXX Upate procfs if necessary... */ diff --git a/arch/sparc/kernel/sbus.c b/arch/sparc/kernel/sbus.c index 1271b3a27d4e..be5bdf93c767 100644 --- a/arch/sparc/kernel/sbus.c +++ b/arch/sparc/kernel/sbus.c @@ -554,10 +554,8 @@ static void __init sbus_iommu_init(struct platform_device *op)  	regs = pr->phys_addr;  	iommu = kzalloc(sizeof(*iommu), GFP_ATOMIC); -	if (!iommu) -		goto fatal_memory_error;  	strbuf = kzalloc(sizeof(*strbuf), GFP_ATOMIC); -	if (!strbuf) +	if (!iommu || !strbuf)  		goto fatal_memory_error;  	op->dev.archdata.iommu = iommu; @@ -656,6 +654,8 @@ static void __init sbus_iommu_init(struct platform_device *op)  	return;  fatal_memory_error: +	kfree(iommu); +	kfree(strbuf);  	prom_printf("sbus_iommu_init: Fatal memory allocation error.\n");  } diff --git a/arch/sparc/kernel/setup_64.c b/arch/sparc/kernel/setup_64.c index 0eaf0059aaef..88a127b9c69e 100644 --- a/arch/sparc/kernel/setup_64.c +++ b/arch/sparc/kernel/setup_64.c @@ -115,7 +115,7 @@ static void __init process_switch(char c)  			break;  		}  		cheetah_pcache_forced_on = 1; -		add_taint(TAINT_MACHINE_CHECK); +		add_taint(TAINT_MACHINE_CHECK, LOCKDEP_NOW_UNRELIABLE);  		cheetah_enable_pcache();  		break; diff --git a/arch/sparc/kernel/signal32.c b/arch/sparc/kernel/signal32.c index 53e48f721ce3..b524f91dd0e5 100644 --- a/arch/sparc/kernel/signal32.c +++ b/arch/sparc/kernel/signal32.c @@ -61,7 +61,7 @@ struct rt_signal_frame32 {  	compat_sigset_t		mask;  	/* __siginfo_fpu_t * */ u32 fpu_save;  	unsigned int		insns[2]; -	stack_t32		stack; +	compat_stack_t		stack;  	unsigned int		extra_size; /* Should be sizeof(siginfo_extra_v8plus_t) */  	/* Only valid if (regs.psr & (PSR_VERS|PSR_IMPL)) == PSR_V8PLUS */  	siginfo_extra_v8plus_t	v8plus; @@ -230,13 +230,11 @@ segv:  asmlinkage void do_rt_sigreturn32(struct pt_regs *regs)  {  	struct rt_signal_frame32 __user *sf; -	unsigned int psr, pc, npc, u_ss_sp; +	unsigned int psr, pc, npc;  	compat_uptr_t fpu_save;  	compat_uptr_t rwin_save; -	mm_segment_t old_fs;  	sigset_t set;  	compat_sigset_t seta; -	stack_t st;  	int err, i;  	/* Always make any pending restarted system calls return -EINTR */ @@ -295,20 +293,10 @@ asmlinkage void do_rt_sigreturn32(struct pt_regs *regs)  	if (!err && fpu_save)  		err |= restore_fpu_state(regs, compat_ptr(fpu_save));  	err |= copy_from_user(&seta, &sf->mask, sizeof(compat_sigset_t)); -	err |= __get_user(u_ss_sp, &sf->stack.ss_sp); -	st.ss_sp = compat_ptr(u_ss_sp); -	err |= __get_user(st.ss_flags, &sf->stack.ss_flags); -	err |= __get_user(st.ss_size, &sf->stack.ss_size); +	err |= compat_restore_altstack(&sf->stack);  	if (err)  		goto segv; -	/* It is more difficult to avoid calling this function than to -	   call it and ignore errors.  */ -	old_fs = get_fs(); -	set_fs(KERNEL_DS); -	do_sigaltstack((stack_t __user *) &st, NULL, (unsigned long)sf); -	set_fs(old_fs); -	  	err |= __get_user(rwin_save, &sf->rwin_save);  	if (!err && rwin_save) {  		if (restore_rwin_state(compat_ptr(rwin_save))) @@ -335,7 +323,7 @@ static int invalid_frame_pointer(void __user *fp, int fplen)  	return 0;  } -static void __user *get_sigframe(struct sigaction *sa, struct pt_regs *regs, unsigned long framesize) +static void __user *get_sigframe(struct ksignal *ksig, struct pt_regs *regs, unsigned long framesize)  {  	unsigned long sp; @@ -350,12 +338,7 @@ static void __user *get_sigframe(struct sigaction *sa, struct pt_regs *regs, uns  		return (void __user *) -1L;  	/* This is the X/Open sanctioned signal stack switching.  */ -	if (sa->sa_flags & SA_ONSTACK) { -		if (sas_ss_flags(sp) == 0) -			sp = current->sas_ss_sp + current->sas_ss_size; -	} - -	sp -= framesize; +	sp = sigsp(sp, ksig) - framesize;  	/* Always align the stack frame.  This handles two cases.  First,  	 * sigaltstack need not be mindful of platform specific stack @@ -426,8 +409,8 @@ out_irqs_on:  } -static int setup_frame32(struct k_sigaction *ka, struct pt_regs *regs, -			 int signo, sigset_t *oldset) +static int setup_frame32(struct ksignal *ksig, struct pt_regs *regs, +			 sigset_t *oldset)  {  	struct signal_frame32 __user *sf;  	int i, err, wsaved; @@ -449,10 +432,12 @@ static int setup_frame32(struct k_sigaction *ka, struct pt_regs *regs,  		sigframe_size += sizeof(__siginfo_rwin_t);  	sf = (struct signal_frame32 __user *) -		get_sigframe(&ka->sa, regs, sigframe_size); +		get_sigframe(ksig, regs, sigframe_size); -	if (invalid_frame_pointer(sf, sigframe_size)) -		goto sigill; +	if (invalid_frame_pointer(sf, sigframe_size)) { +		do_exit(SIGILL); +		return -EINVAL; +	}  	tail = (sf + 1); @@ -526,16 +511,16 @@ static int setup_frame32(struct k_sigaction *ka, struct pt_regs *regs,  		err |= __put_user(rp->ins[7], &sf->ss.callers_pc);  	}	  	if (err) -		goto sigsegv; +		return err;  	/* 3. signal handler back-trampoline and parameters */  	regs->u_regs[UREG_FP] = (unsigned long) sf; -	regs->u_regs[UREG_I0] = signo; +	regs->u_regs[UREG_I0] = ksig->sig;  	regs->u_regs[UREG_I1] = (unsigned long) &sf->info;  	regs->u_regs[UREG_I2] = (unsigned long) &sf->info;  	/* 4. signal handler */ -	regs->tpc = (unsigned long) ka->sa.sa_handler; +	regs->tpc = (unsigned long) ksig->ka.sa.sa_handler;  	regs->tnpc = (regs->tpc + 4);  	if (test_thread_flag(TIF_32BIT)) {  		regs->tpc &= 0xffffffff; @@ -543,8 +528,8 @@ static int setup_frame32(struct k_sigaction *ka, struct pt_regs *regs,  	}  	/* 5. return to kernel instructions */ -	if (ka->ka_restorer) { -		regs->u_regs[UREG_I7] = (unsigned long)ka->ka_restorer; +	if (ksig->ka.ka_restorer) { +		regs->u_regs[UREG_I7] = (unsigned long)ksig->ka.ka_restorer;  	} else {  		unsigned long address = ((unsigned long)&(sf->insns[0])); @@ -553,23 +538,14 @@ static int setup_frame32(struct k_sigaction *ka, struct pt_regs *regs,  		err  = __put_user(0x821020d8, &sf->insns[0]); /*mov __NR_sigreturn, %g1*/  		err |= __put_user(0x91d02010, &sf->insns[1]); /*t 0x10*/  		if (err) -			goto sigsegv; +			return err;  		flush_signal_insns(address);  	}  	return 0; - -sigill: -	do_exit(SIGILL); -	return -EINVAL; - -sigsegv: -	force_sigsegv(signo, current); -	return -EFAULT;  } -static int setup_rt_frame32(struct k_sigaction *ka, struct pt_regs *regs, -			    unsigned long signr, sigset_t *oldset, -			    siginfo_t *info) +static int setup_rt_frame32(struct ksignal *ksig, struct pt_regs *regs, +			    sigset_t *oldset)  {  	struct rt_signal_frame32 __user *sf;  	int i, err, wsaved; @@ -591,10 +567,12 @@ static int setup_rt_frame32(struct k_sigaction *ka, struct pt_regs *regs,  		sigframe_size += sizeof(__siginfo_rwin_t);  	sf = (struct rt_signal_frame32 __user *) -		get_sigframe(&ka->sa, regs, sigframe_size); +		get_sigframe(ksig, regs, sigframe_size); -	if (invalid_frame_pointer(sf, sigframe_size)) -		goto sigill; +	if (invalid_frame_pointer(sf, sigframe_size)) { +		do_exit(SIGILL); +		return -EINVAL; +	}  	tail = (sf + 1); @@ -639,12 +617,10 @@ static int setup_rt_frame32(struct k_sigaction *ka, struct pt_regs *regs,  	}  	/* Update the siginfo structure.  */ -	err |= copy_siginfo_to_user32(&sf->info, info); +	err |= copy_siginfo_to_user32(&sf->info, &ksig->info);  	/* Setup sigaltstack */ -	err |= __put_user(current->sas_ss_sp, &sf->stack.ss_sp); -	err |= __put_user(sas_ss_flags(regs->u_regs[UREG_FP]), &sf->stack.ss_flags); -	err |= __put_user(current->sas_ss_size, &sf->stack.ss_size); +	err |= __compat_save_altstack(&sf->stack, regs->u_regs[UREG_FP]);  	switch (_NSIG_WORDS) {  	case 4: seta.sig[7] = (oldset->sig[3] >> 32); @@ -674,16 +650,16 @@ static int setup_rt_frame32(struct k_sigaction *ka, struct pt_regs *regs,  		err |= __put_user(rp->ins[7], &sf->ss.callers_pc);  	}  	if (err) -		goto sigsegv; +		return err;  	/* 3. signal handler back-trampoline and parameters */  	regs->u_regs[UREG_FP] = (unsigned long) sf; -	regs->u_regs[UREG_I0] = signr; +	regs->u_regs[UREG_I0] = ksig->sig;  	regs->u_regs[UREG_I1] = (unsigned long) &sf->info;  	regs->u_regs[UREG_I2] = (unsigned long) &sf->regs;  	/* 4. signal handler */ -	regs->tpc = (unsigned long) ka->sa.sa_handler; +	regs->tpc = (unsigned long) ksig->ka.sa.sa_handler;  	regs->tnpc = (regs->tpc + 4);  	if (test_thread_flag(TIF_32BIT)) {  		regs->tpc &= 0xffffffff; @@ -691,8 +667,8 @@ static int setup_rt_frame32(struct k_sigaction *ka, struct pt_regs *regs,  	}  	/* 5. return to kernel instructions */ -	if (ka->ka_restorer) -		regs->u_regs[UREG_I7] = (unsigned long)ka->ka_restorer; +	if (ksig->ka.ka_restorer) +		regs->u_regs[UREG_I7] = (unsigned long)ksig->ka.ka_restorer;  	else {  		unsigned long address = ((unsigned long)&(sf->insns[0])); @@ -704,36 +680,25 @@ static int setup_rt_frame32(struct k_sigaction *ka, struct pt_regs *regs,  		/* t 0x10 */  		err |= __put_user(0x91d02010, &sf->insns[1]);  		if (err) -			goto sigsegv; +			return err;  		flush_signal_insns(address);  	}  	return 0; - -sigill: -	do_exit(SIGILL); -	return -EINVAL; - -sigsegv: -	force_sigsegv(signr, current); -	return -EFAULT;  } -static inline void handle_signal32(unsigned long signr, struct k_sigaction *ka, -				  siginfo_t *info, -				  sigset_t *oldset, struct pt_regs *regs) +static inline void handle_signal32(struct ksignal *ksig,  +				  struct pt_regs *regs)  { +	sigset_t *oldset = sigmask_to_save();  	int err; -	if (ka->sa.sa_flags & SA_SIGINFO) -		err = setup_rt_frame32(ka, regs, signr, oldset, info); +	if (ksig->ka.sa.sa_flags & SA_SIGINFO) +		err = setup_rt_frame32(ksig, regs, oldset);  	else -		err = setup_frame32(ka, regs, signr, oldset); - -	if (err) -		return; +		err = setup_frame32(ksig, regs, oldset); -	signal_delivered(signr, info, ka, regs, 0); +	signal_setup_done(err, ksig, 0);  }  static inline void syscall_restart32(unsigned long orig_i0, struct pt_regs *regs, @@ -761,52 +726,43 @@ static inline void syscall_restart32(unsigned long orig_i0, struct pt_regs *regs   * want to handle. Thus you cannot kill init even with a SIGKILL even by   * mistake.   */ -void do_signal32(sigset_t *oldset, struct pt_regs * regs) +void do_signal32(struct pt_regs * regs)  { -	struct k_sigaction ka; -	unsigned long orig_i0; -	int restart_syscall; -	siginfo_t info; -	int signr; -	 -	signr = get_signal_to_deliver(&info, &ka, regs, NULL); +	struct ksignal ksig; +	unsigned long orig_i0 = 0; +	int restart_syscall = 0; +	bool has_handler = get_signal(&ksig); -	restart_syscall = 0; -	orig_i0 = 0;  	if (pt_regs_is_syscall(regs) &&  	    (regs->tstate & (TSTATE_XCARRY | TSTATE_ICARRY))) {  		restart_syscall = 1;  		orig_i0 = regs->u_regs[UREG_G6];  	} -	if (signr > 0) { +	if (has_handler) {  		if (restart_syscall) -			syscall_restart32(orig_i0, regs, &ka.sa); -		handle_signal32(signr, &ka, &info, oldset, regs); -		return; -	} -	if (restart_syscall && -	    (regs->u_regs[UREG_I0] == ERESTARTNOHAND || -	     regs->u_regs[UREG_I0] == ERESTARTSYS || -	     regs->u_regs[UREG_I0] == ERESTARTNOINTR)) { -		/* replay the system call when we are done */ -		regs->u_regs[UREG_I0] = orig_i0; -		regs->tpc -= 4; -		regs->tnpc -= 4; -		pt_regs_clear_syscall(regs); -	} -	if (restart_syscall && -	    regs->u_regs[UREG_I0] == ERESTART_RESTARTBLOCK) { -		regs->u_regs[UREG_G1] = __NR_restart_syscall; -		regs->tpc -= 4; -		regs->tnpc -= 4; -		pt_regs_clear_syscall(regs); +			syscall_restart32(orig_i0, regs, &ksig.ka.sa); +		handle_signal32(&ksig, regs); +	} else { +		if (restart_syscall) { +			switch (regs->u_regs[UREG_I0]) { +			case ERESTARTNOHAND: +	     		case ERESTARTSYS: +			case ERESTARTNOINTR: +				/* replay the system call when we are done */ +				regs->u_regs[UREG_I0] = orig_i0; +				regs->tpc -= 4; +				regs->tnpc -= 4; +				pt_regs_clear_syscall(regs); +			case ERESTART_RESTARTBLOCK: +				regs->u_regs[UREG_G1] = __NR_restart_syscall; +				regs->tpc -= 4; +				regs->tnpc -= 4; +				pt_regs_clear_syscall(regs); +			} +		} +		restore_saved_sigmask();  	} - -	/* If there's no signal to deliver, we just put the saved sigmask -	 * back -	 */ -	restore_saved_sigmask();  }  struct sigstack32 { @@ -856,29 +812,3 @@ asmlinkage int do_sys32_sigstack(u32 u_ssptr, u32 u_ossptr, unsigned long sp)  out:  	return ret;  } - -asmlinkage long do_sys32_sigaltstack(u32 ussa, u32 uossa, unsigned long sp) -{ -	stack_t uss, uoss; -	u32 u_ss_sp = 0; -	int ret; -	mm_segment_t old_fs; -	stack_t32 __user *uss32 = compat_ptr(ussa); -	stack_t32 __user *uoss32 = compat_ptr(uossa); -	 -	if (ussa && (get_user(u_ss_sp, &uss32->ss_sp) || -		    __get_user(uss.ss_flags, &uss32->ss_flags) || -		    __get_user(uss.ss_size, &uss32->ss_size))) -		return -EFAULT; -	uss.ss_sp = compat_ptr(u_ss_sp); -	old_fs = get_fs(); -	set_fs(KERNEL_DS); -	ret = do_sigaltstack(ussa ? (stack_t __user *) &uss : NULL, -			     uossa ? (stack_t __user *) &uoss : NULL, sp); -	set_fs(old_fs); -	if (!ret && uossa && (put_user(ptr_to_compat(uoss.ss_sp), &uoss32->ss_sp) || -		    __put_user(uoss.ss_flags, &uoss32->ss_flags) || -		    __put_user(uoss.ss_size, &uoss32->ss_size))) -		return -EFAULT; -	return ret; -} diff --git a/arch/sparc/kernel/signal_32.c b/arch/sparc/kernel/signal_32.c index 68f9c8650af4..7d5d8e1f8415 100644 --- a/arch/sparc/kernel/signal_32.c +++ b/arch/sparc/kernel/signal_32.c @@ -59,18 +59,6 @@ struct rt_signal_frame {  #define SF_ALIGNEDSZ  (((sizeof(struct signal_frame) + 7) & (~7)))  #define RT_ALIGNEDSZ  (((sizeof(struct rt_signal_frame) + 7) & (~7))) -static int _sigpause_common(old_sigset_t set) -{ -	sigset_t blocked; -	siginitset(&blocked, set); -	return sigsuspend(&blocked); -} - -asmlinkage int sys_sigsuspend(old_sigset_t set) -{ -	return _sigpause_common(set); -} -  asmlinkage void do_sigreturn(struct pt_regs *regs)  {  	struct signal_frame __user *sf; @@ -141,9 +129,7 @@ asmlinkage void do_rt_sigreturn(struct pt_regs *regs)  	unsigned int psr, pc, npc;  	__siginfo_fpu_t __user *fpu_save;  	__siginfo_rwin_t __user *rwin_save; -	mm_segment_t old_fs;  	sigset_t set; -	stack_t st;  	int err;  	synchronize_user_stack(); @@ -171,8 +157,7 @@ asmlinkage void do_rt_sigreturn(struct pt_regs *regs)  	if (!err && fpu_save)  		err |= restore_fpu_state(regs, fpu_save);  	err |= __copy_from_user(&set, &sf->mask, sizeof(sigset_t)); -	 -	err |= __copy_from_user(&st, &sf->stack, sizeof(stack_t)); +	err |= restore_altstack(&sf->stack);  	if (err)  		goto segv; @@ -180,14 +165,6 @@ asmlinkage void do_rt_sigreturn(struct pt_regs *regs)  	regs->pc = pc;  	regs->npc = npc; -	/* It is more difficult to avoid calling this function than to -	 * call it and ignore errors. -	 */ -	old_fs = get_fs(); -	set_fs(KERNEL_DS); -	do_sigaltstack((const stack_t __user *) &st, NULL, (unsigned long)sf); -	set_fs(old_fs); -  	err |= __get_user(rwin_save, &sf->rwin_save);  	if (!err && rwin_save) {  		if (restore_rwin_state(rwin_save)) @@ -209,7 +186,7 @@ static inline int invalid_frame_pointer(void __user *fp, int fplen)  	return 0;  } -static inline void __user *get_sigframe(struct sigaction *sa, struct pt_regs *regs, unsigned long framesize) +static inline void __user *get_sigframe(struct ksignal *ksig, struct pt_regs *regs, unsigned long framesize)  {  	unsigned long sp = regs->u_regs[UREG_FP]; @@ -221,12 +198,7 @@ static inline void __user *get_sigframe(struct sigaction *sa, struct pt_regs *re  		return (void __user *) -1L;  	/* This is the X/Open sanctioned signal stack switching.  */ -	if (sa->sa_flags & SA_ONSTACK) { -		if (sas_ss_flags(sp) == 0) -			sp = current->sas_ss_sp + current->sas_ss_size; -	} - -	sp -= framesize; +	sp = sigsp(sp, ksig) - framesize;  	/* Always align the stack frame.  This handles two cases.  First,  	 * sigaltstack need not be mindful of platform specific stack @@ -239,8 +211,8 @@ static inline void __user *get_sigframe(struct sigaction *sa, struct pt_regs *re  	return (void __user *) sp;  } -static int setup_frame(struct k_sigaction *ka, struct pt_regs *regs, -		       int signo, sigset_t *oldset) +static int setup_frame(struct ksignal *ksig, struct pt_regs *regs, +		       sigset_t *oldset)  {  	struct signal_frame __user *sf;  	int sigframe_size, err, wsaved; @@ -258,10 +230,12 @@ static int setup_frame(struct k_sigaction *ka, struct pt_regs *regs,  		sigframe_size += sizeof(__siginfo_rwin_t);  	sf = (struct signal_frame __user *) -		get_sigframe(&ka->sa, regs, sigframe_size); +		get_sigframe(ksig, regs, sigframe_size); -	if (invalid_frame_pointer(sf, sigframe_size)) -		goto sigill_and_return; +	if (invalid_frame_pointer(sf, sigframe_size)) { +		do_exit(SIGILL); +		return -EINVAL; +	}  	tail = sf + 1; @@ -300,21 +274,21 @@ static int setup_frame(struct k_sigaction *ka, struct pt_regs *regs,  		err |= __copy_to_user(sf, rp, sizeof(struct reg_window32));  	}  	if (err) -		goto sigsegv; +		return err;  	/* 3. signal handler back-trampoline and parameters */  	regs->u_regs[UREG_FP] = (unsigned long) sf; -	regs->u_regs[UREG_I0] = signo; +	regs->u_regs[UREG_I0] = ksig->sig;  	regs->u_regs[UREG_I1] = (unsigned long) &sf->info;  	regs->u_regs[UREG_I2] = (unsigned long) &sf->info;  	/* 4. signal handler */ -	regs->pc = (unsigned long) ka->sa.sa_handler; +	regs->pc = (unsigned long) ksig->ka.sa.sa_handler;  	regs->npc = (regs->pc + 4);  	/* 5. return to kernel instructions */ -	if (ka->ka_restorer) -		regs->u_regs[UREG_I7] = (unsigned long)ka->ka_restorer; +	if (ksig->ka.ka_restorer) +		regs->u_regs[UREG_I7] = (unsigned long)ksig->ka.ka_restorer;  	else {  		regs->u_regs[UREG_I7] = (unsigned long)(&(sf->insns[0]) - 2); @@ -324,24 +298,16 @@ static int setup_frame(struct k_sigaction *ka, struct pt_regs *regs,  		/* t 0x10 */  		err |= __put_user(0x91d02010, &sf->insns[1]);  		if (err) -			goto sigsegv; +			return err;  		/* Flush instruction space. */  		flush_sig_insns(current->mm, (unsigned long) &(sf->insns[0]));  	}  	return 0; - -sigill_and_return: -	do_exit(SIGILL); -	return -EINVAL; - -sigsegv: -	force_sigsegv(signo, current); -	return -EFAULT;  } -static int setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs, -			  int signo, sigset_t *oldset, siginfo_t *info) +static int setup_rt_frame(struct ksignal *ksig, struct pt_regs *regs, +			  sigset_t *oldset)  {  	struct rt_signal_frame __user *sf;  	int sigframe_size, wsaved; @@ -357,9 +323,11 @@ static int setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs,  	if (wsaved)  		sigframe_size += sizeof(__siginfo_rwin_t);  	sf = (struct rt_signal_frame __user *) -		get_sigframe(&ka->sa, regs, sigframe_size); -	if (invalid_frame_pointer(sf, sigframe_size)) -		goto sigill; +		get_sigframe(ksig, regs, sigframe_size); +	if (invalid_frame_pointer(sf, sigframe_size)) { +		do_exit(SIGILL); +		return -EINVAL; +	}  	tail = sf + 1;  	err  = __put_user(regs->pc, &sf->regs.pc); @@ -391,9 +359,7 @@ static int setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs,  	err |= __copy_to_user(&sf->mask, &oldset->sig[0], sizeof(sigset_t));  	/* Setup sigaltstack */ -	err |= __put_user(current->sas_ss_sp, &sf->stack.ss_sp); -	err |= __put_user(sas_ss_flags(regs->u_regs[UREG_FP]), &sf->stack.ss_flags); -	err |= __put_user(current->sas_ss_size, &sf->stack.ss_size); +	err |= __save_altstack(&sf->stack, regs->u_regs[UREG_FP]);  	if (!wsaved) {  		err |= __copy_to_user(sf, (char *) regs->u_regs[UREG_FP], @@ -405,21 +371,21 @@ static int setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs,  		err |= __copy_to_user(sf, rp, sizeof(struct reg_window32));  	} -	err |= copy_siginfo_to_user(&sf->info, info); +	err |= copy_siginfo_to_user(&sf->info, &ksig->info);  	if (err) -		goto sigsegv; +		return err;  	regs->u_regs[UREG_FP] = (unsigned long) sf; -	regs->u_regs[UREG_I0] = signo; +	regs->u_regs[UREG_I0] = ksig->sig;  	regs->u_regs[UREG_I1] = (unsigned long) &sf->info;  	regs->u_regs[UREG_I2] = (unsigned long) &sf->regs; -	regs->pc = (unsigned long) ka->sa.sa_handler; +	regs->pc = (unsigned long) ksig->ka.sa.sa_handler;  	regs->npc = (regs->pc + 4); -	if (ka->ka_restorer) -		regs->u_regs[UREG_I7] = (unsigned long)ka->ka_restorer; +	if (ksig->ka.ka_restorer) +		regs->u_regs[UREG_I7] = (unsigned long)ksig->ka.ka_restorer;  	else {  		regs->u_regs[UREG_I7] = (unsigned long)(&(sf->insns[0]) - 2); @@ -429,38 +395,25 @@ static int setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs,  		/* t 0x10 */  		err |= __put_user(0x91d02010, &sf->insns[1]);  		if (err) -			goto sigsegv; +			return err;  		/* Flush instruction space. */  		flush_sig_insns(current->mm, (unsigned long) &(sf->insns[0]));  	}  	return 0; - -sigill: -	do_exit(SIGILL); -	return -EINVAL; - -sigsegv: -	force_sigsegv(signo, current); -	return -EFAULT;  }  static inline void -handle_signal(unsigned long signr, struct k_sigaction *ka, -	      siginfo_t *info, struct pt_regs *regs) +handle_signal(struct ksignal *ksig, struct pt_regs *regs)  {  	sigset_t *oldset = sigmask_to_save();  	int err; -	if (ka->sa.sa_flags & SA_SIGINFO) -		err = setup_rt_frame(ka, regs, signr, oldset, info); +	if (ksig->ka.sa.sa_flags & SA_SIGINFO) +		err = setup_rt_frame(ksig, regs, oldset);  	else -		err = setup_frame(ka, regs, signr, oldset); - -	if (err) -		return; - -	signal_delivered(signr, info, ka, regs, 0); +		err = setup_frame(ksig, regs, oldset); +	signal_setup_done(err, ksig, 0);  }  static inline void syscall_restart(unsigned long orig_i0, struct pt_regs *regs, @@ -490,10 +443,9 @@ static inline void syscall_restart(unsigned long orig_i0, struct pt_regs *regs,   */  static void do_signal(struct pt_regs *regs, unsigned long orig_i0)  { -	struct k_sigaction ka; +	struct ksignal ksig;  	int restart_syscall; -	siginfo_t info; -	int signr; +	bool has_handler;  	/* It's a lot of work and synchronization to add a new ptrace  	 * register for GDB to save and restore in order to get @@ -516,7 +468,7 @@ static void do_signal(struct pt_regs *regs, unsigned long orig_i0)  	if (pt_regs_is_syscall(regs) && (regs->psr & PSR_C))  		regs->u_regs[UREG_G6] = orig_i0; -	signr = get_signal_to_deliver(&info, &ka, regs, NULL); +	has_handler = get_signal(&ksig);  	/* If the debugger messes with the program counter, it clears  	 * the software "in syscall" bit, directing us to not perform @@ -528,35 +480,30 @@ static void do_signal(struct pt_regs *regs, unsigned long orig_i0)  		orig_i0 = regs->u_regs[UREG_G6];  	} - -	if (signr > 0) { +	if (has_handler) {  		if (restart_syscall) -			syscall_restart(orig_i0, regs, &ka.sa); -		handle_signal(signr, &ka, &info, regs); -		return; -	} -	if (restart_syscall && -	    (regs->u_regs[UREG_I0] == ERESTARTNOHAND || -	     regs->u_regs[UREG_I0] == ERESTARTSYS || -	     regs->u_regs[UREG_I0] == ERESTARTNOINTR)) { -		/* replay the system call when we are done */ -		regs->u_regs[UREG_I0] = orig_i0; -		regs->pc -= 4; -		regs->npc -= 4; -		pt_regs_clear_syscall(regs); -	} -	if (restart_syscall && -	    regs->u_regs[UREG_I0] == ERESTART_RESTARTBLOCK) { -		regs->u_regs[UREG_G1] = __NR_restart_syscall; -		regs->pc -= 4; -		regs->npc -= 4; -		pt_regs_clear_syscall(regs); +			syscall_restart(orig_i0, regs, &ksig.ka.sa); +		handle_signal(&ksig, regs); +	} else { +		if (restart_syscall) { +			switch (regs->u_regs[UREG_I0]) { +			case ERESTARTNOHAND: +	     		case ERESTARTSYS: +			case ERESTARTNOINTR: +				/* replay the system call when we are done */ +				regs->u_regs[UREG_I0] = orig_i0; +				regs->pc -= 4; +				regs->npc -= 4; +				pt_regs_clear_syscall(regs); +			case ERESTART_RESTARTBLOCK: +				regs->u_regs[UREG_G1] = __NR_restart_syscall; +				regs->pc -= 4; +				regs->npc -= 4; +				pt_regs_clear_syscall(regs); +			} +		} +		restore_saved_sigmask();  	} - -	/* if there's no signal to deliver, we just put the saved sigmask -	 * back -	 */ -	restore_saved_sigmask();  }  void do_notify_resume(struct pt_regs *regs, unsigned long orig_i0, diff --git a/arch/sparc/kernel/signal_64.c b/arch/sparc/kernel/signal_64.c index 689e1ba62809..35923e8abd82 100644 --- a/arch/sparc/kernel/signal_64.c +++ b/arch/sparc/kernel/signal_64.c @@ -236,23 +236,6 @@ struct rt_signal_frame {  	__siginfo_rwin_t	*rwin_save;  }; -static long _sigpause_common(old_sigset_t set) -{ -	sigset_t blocked; -	siginitset(&blocked, set); -	return sigsuspend(&blocked); -} - -asmlinkage long sys_sigpause(unsigned int set) -{ -	return _sigpause_common(set); -} - -asmlinkage long sys_sigsuspend(old_sigset_t set) -{ -	return _sigpause_common(set); -} -  void do_rt_sigreturn(struct pt_regs *regs)  {  	struct rt_signal_frame __user *sf; @@ -295,7 +278,8 @@ void do_rt_sigreturn(struct pt_regs *regs)  		err |= restore_fpu_state(regs, fpu_save);  	err |= __copy_from_user(&set, &sf->mask, sizeof(sigset_t)); -	if (err || do_sigaltstack(&sf->stack, NULL, (unsigned long)sf) == -EFAULT) +	err |= restore_altstack(&sf->stack); +	if (err)  		goto segv;  	err |= __get_user(rwin_save, &sf->rwin_save); @@ -324,7 +308,7 @@ static int invalid_frame_pointer(void __user *fp)  	return 0;  } -static inline void __user *get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, unsigned long framesize) +static inline void __user *get_sigframe(struct ksignal *ksig, struct pt_regs *regs, unsigned long framesize)  {  	unsigned long sp = regs->u_regs[UREG_FP] + STACK_BIAS; @@ -336,12 +320,7 @@ static inline void __user *get_sigframe(struct k_sigaction *ka, struct pt_regs *  		return (void __user *) -1L;  	/* This is the X/Open sanctioned signal stack switching.  */ -	if (ka->sa.sa_flags & SA_ONSTACK) { -		if (sas_ss_flags(sp) == 0) -			sp = current->sas_ss_sp + current->sas_ss_size; -	} - -	sp -= framesize; +	sp = sigsp(sp, ksig) - framesize;  	/* Always align the stack frame.  This handles two cases.  First,  	 * sigaltstack need not be mindful of platform specific stack @@ -355,8 +334,7 @@ static inline void __user *get_sigframe(struct k_sigaction *ka, struct pt_regs *  }  static inline int -setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs, -	       int signo, sigset_t *oldset, siginfo_t *info) +setup_rt_frame(struct ksignal *ksig, struct pt_regs *regs)  {  	struct rt_signal_frame __user *sf;  	int wsaved, err, sf_size; @@ -374,10 +352,12 @@ setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs,  	if (wsaved)  		sf_size += sizeof(__siginfo_rwin_t);  	sf = (struct rt_signal_frame __user *) -		get_sigframe(ka, regs, sf_size); +		get_sigframe(ksig, regs, sf_size); -	if (invalid_frame_pointer (sf)) -		goto sigill; +	if (invalid_frame_pointer (sf)) { +		do_exit(SIGILL);	/* won't return, actually */ +		return -EINVAL; +	}  	tail = (sf + 1); @@ -403,11 +383,9 @@ setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs,  	}  	/* Setup sigaltstack */ -	err |= __put_user(current->sas_ss_sp, &sf->stack.ss_sp); -	err |= __put_user(sas_ss_flags(regs->u_regs[UREG_FP]), &sf->stack.ss_flags); -	err |= __put_user(current->sas_ss_size, &sf->stack.ss_size); +	err |= __save_altstack(&sf->stack, regs->u_regs[UREG_FP]); -	err |= copy_to_user(&sf->mask, oldset, sizeof(sigset_t)); +	err |= copy_to_user(&sf->mask, sigmask_to_save(), sizeof(sigset_t));  	if (!wsaved) {  		err |= copy_in_user((u64 __user *)sf, @@ -420,18 +398,18 @@ setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs,  		rp = ¤t_thread_info()->reg_window[wsaved - 1];  		err |= copy_to_user(sf, rp, sizeof(struct reg_window));  	} -	if (info) -		err |= copy_siginfo_to_user(&sf->info, info); +	if (ksig->ka.sa.sa_flags & SA_SIGINFO) +		err |= copy_siginfo_to_user(&sf->info, &ksig->info);  	else { -		err |= __put_user(signo, &sf->info.si_signo); +		err |= __put_user(ksig->sig, &sf->info.si_signo);  		err |= __put_user(SI_NOINFO, &sf->info.si_code);  	}  	if (err) -		goto sigsegv; +		return err;  	/* 3. signal handler back-trampoline and parameters */  	regs->u_regs[UREG_FP] = ((unsigned long) sf) - STACK_BIAS; -	regs->u_regs[UREG_I0] = signo; +	regs->u_regs[UREG_I0] = ksig->sig;  	regs->u_regs[UREG_I1] = (unsigned long) &sf->info;  	/* The sigcontext is passed in this way because of how it @@ -441,37 +419,15 @@ setup_rt_frame(struct k_sigaction *ka, struct pt_regs *regs,  	regs->u_regs[UREG_I2] = (unsigned long) &sf->info;  	/* 5. signal handler */ -	regs->tpc = (unsigned long) ka->sa.sa_handler; +	regs->tpc = (unsigned long) ksig->ka.sa.sa_handler;  	regs->tnpc = (regs->tpc + 4);  	if (test_thread_flag(TIF_32BIT)) {  		regs->tpc &= 0xffffffff;  		regs->tnpc &= 0xffffffff;  	}  	/* 4. return to kernel instructions */ -	regs->u_regs[UREG_I7] = (unsigned long)ka->ka_restorer; +	regs->u_regs[UREG_I7] = (unsigned long)ksig->ka.ka_restorer;  	return 0; - -sigill: -	do_exit(SIGILL); -	return -EINVAL; - -sigsegv: -	force_sigsegv(signo, current); -	return -EFAULT; -} - -static inline void handle_signal(unsigned long signr, struct k_sigaction *ka, -				siginfo_t *info, -				sigset_t *oldset, struct pt_regs *regs) -{ -	int err; - -	err = setup_rt_frame(ka, regs, signr, oldset, -			     (ka->sa.sa_flags & SA_SIGINFO) ? info : NULL); -	if (err) -		return; - -	signal_delivered(signr, info, ka, regs, 0);  }  static inline void syscall_restart(unsigned long orig_i0, struct pt_regs *regs, @@ -501,11 +457,9 @@ static inline void syscall_restart(unsigned long orig_i0, struct pt_regs *regs,   */  static void do_signal(struct pt_regs *regs, unsigned long orig_i0)  { -	struct k_sigaction ka; +	struct ksignal ksig;  	int restart_syscall; -	sigset_t *oldset = sigmask_to_save(); -	siginfo_t info; -	int signr; +	bool has_handler;  	/* It's a lot of work and synchronization to add a new ptrace  	 * register for GDB to save and restore in order to get @@ -531,13 +485,13 @@ static void do_signal(struct pt_regs *regs, unsigned long orig_i0)  #ifdef CONFIG_COMPAT  	if (test_thread_flag(TIF_32BIT)) { -		extern void do_signal32(sigset_t *, struct pt_regs *); -		do_signal32(oldset, regs); +		extern void do_signal32(struct pt_regs *); +		do_signal32(regs);  		return;  	}  #endif	 -	signr = get_signal_to_deliver(&info, &ka, regs, NULL); +	has_handler = get_signal(&ksig);  	restart_syscall = 0;  	if (pt_regs_is_syscall(regs) && @@ -546,34 +500,30 @@ static void do_signal(struct pt_regs *regs, unsigned long orig_i0)  		orig_i0 = regs->u_regs[UREG_G6];  	} -	if (signr > 0) { +	if (has_handler) {  		if (restart_syscall) -			syscall_restart(orig_i0, regs, &ka.sa); -		handle_signal(signr, &ka, &info, oldset, regs); -		return; -	} -	if (restart_syscall && -	    (regs->u_regs[UREG_I0] == ERESTARTNOHAND || -	     regs->u_regs[UREG_I0] == ERESTARTSYS || -	     regs->u_regs[UREG_I0] == ERESTARTNOINTR)) { -		/* replay the system call when we are done */ -		regs->u_regs[UREG_I0] = orig_i0; -		regs->tpc -= 4; -		regs->tnpc -= 4; -		pt_regs_clear_syscall(regs); -	} -	if (restart_syscall && -	    regs->u_regs[UREG_I0] == ERESTART_RESTARTBLOCK) { -		regs->u_regs[UREG_G1] = __NR_restart_syscall; -		regs->tpc -= 4; -		regs->tnpc -= 4; -		pt_regs_clear_syscall(regs); +			syscall_restart(orig_i0, regs, &ksig.ka.sa); +		signal_setup_done(setup_rt_frame(&ksig, regs), &ksig, 0); +	} else { +		if (restart_syscall) { +			switch (regs->u_regs[UREG_I0]) { +			case ERESTARTNOHAND: +	     		case ERESTARTSYS: +			case ERESTARTNOINTR: +				/* replay the system call when we are done */ +				regs->u_regs[UREG_I0] = orig_i0; +				regs->tpc -= 4; +				regs->tnpc -= 4; +				pt_regs_clear_syscall(regs); +			case ERESTART_RESTARTBLOCK: +				regs->u_regs[UREG_G1] = __NR_restart_syscall; +				regs->tpc -= 4; +				regs->tnpc -= 4; +				pt_regs_clear_syscall(regs); +			} +		} +		restore_saved_sigmask();  	} - -	/* If there's no signal to deliver, we just put the saved sigmask -	 * back -	 */ -	restore_saved_sigmask();  }  void do_notify_resume(struct pt_regs *regs, unsigned long orig_i0, unsigned long thread_info_flags) diff --git a/arch/sparc/kernel/smp_32.c b/arch/sparc/kernel/smp_32.c index 79db45e5134a..9e7e6d718367 100644 --- a/arch/sparc/kernel/smp_32.c +++ b/arch/sparc/kernel/smp_32.c @@ -20,6 +20,7 @@  #include <linux/seq_file.h>  #include <linux/cache.h>  #include <linux/delay.h> +#include <linux/cpu.h>  #include <asm/ptrace.h>  #include <linux/atomic.h> @@ -32,8 +33,10 @@  #include <asm/cacheflush.h>  #include <asm/tlbflush.h>  #include <asm/cpudata.h> +#include <asm/timer.h>  #include <asm/leon.h> +#include "kernel.h"  #include "irq.h"  volatile unsigned long cpu_callin_map[NR_CPUS] __cpuinitdata = {0,}; @@ -294,6 +297,89 @@ int __cpuinit __cpu_up(unsigned int cpu, struct task_struct *tidle)  	return ret;  } +void __cpuinit arch_cpu_pre_starting(void *arg) +{ +	local_ops->cache_all(); +	local_ops->tlb_all(); + +	switch(sparc_cpu_model) { +	case sun4m: +		sun4m_cpu_pre_starting(arg); +		break; +	case sun4d: +		sun4d_cpu_pre_starting(arg); +		break; +	case sparc_leon: +		leon_cpu_pre_starting(arg); +		break; +	default: +		BUG(); +	} +} + +void __cpuinit arch_cpu_pre_online(void *arg) +{ +	unsigned int cpuid = hard_smp_processor_id(); + +	register_percpu_ce(cpuid); + +	calibrate_delay(); +	smp_store_cpu_info(cpuid); + +	local_ops->cache_all(); +	local_ops->tlb_all(); + +	switch(sparc_cpu_model) { +	case sun4m: +		sun4m_cpu_pre_online(arg); +		break; +	case sun4d: +		sun4d_cpu_pre_online(arg); +		break; +	case sparc_leon: +		leon_cpu_pre_online(arg); +		break; +	default: +		BUG(); +	} +} + +void __cpuinit sparc_start_secondary(void *arg) +{ +	unsigned int cpu; + +	/* +	 * SMP booting is extremely fragile in some architectures. So run +	 * the cpu initialization code first before anything else. +	 */ +	arch_cpu_pre_starting(arg); + +	preempt_disable(); +	cpu = smp_processor_id(); + +	/* Invoke the CPU_STARTING notifier callbacks */ +	notify_cpu_starting(cpu); + +	arch_cpu_pre_online(arg); + +	/* Set the CPU in the cpu_online_mask */ +	set_cpu_online(cpu, true); + +	/* Enable local interrupts now */ +	local_irq_enable(); + +	wmb(); +	cpu_idle(); + +	/* We should never reach here! */ +	BUG(); +} + +void __cpuinit smp_callin(void) +{ +	sparc_start_secondary(NULL); +} +  void smp_bogo(struct seq_file *m)  {  	int i; diff --git a/arch/sparc/kernel/smp_64.c b/arch/sparc/kernel/smp_64.c index d94b878577b7..537eb66abd06 100644 --- a/arch/sparc/kernel/smp_64.c +++ b/arch/sparc/kernel/smp_64.c @@ -1180,7 +1180,7 @@ void __init smp_prepare_cpus(unsigned int max_cpus)  {  } -void __devinit smp_prepare_boot_cpu(void) +void smp_prepare_boot_cpu(void)  {  } @@ -1194,7 +1194,7 @@ void __init smp_setup_processor_id(void)  		xcall_deliver_impl = hypervisor_xcall_deliver;  } -void __devinit smp_fill_in_sib_core_maps(void) +void smp_fill_in_sib_core_maps(void)  {  	unsigned int i; diff --git a/arch/sparc/kernel/sun4d_smp.c b/arch/sparc/kernel/sun4d_smp.c index ddaea31de586..c9eb82f23d92 100644 --- a/arch/sparc/kernel/sun4d_smp.c +++ b/arch/sparc/kernel/sun4d_smp.c @@ -50,10 +50,9 @@ static inline void show_leds(int cpuid)  			      "i" (ASI_M_CTL));  } -void __cpuinit smp4d_callin(void) +void __cpuinit sun4d_cpu_pre_starting(void *arg)  {  	int cpuid = hard_smp_processor_id(); -	unsigned long flags;  	/* Show we are alive */  	cpu_leds[cpuid] = 0x6; @@ -61,26 +60,20 @@ void __cpuinit smp4d_callin(void)  	/* Enable level15 interrupt, disable level14 interrupt for now */  	cc_set_imsk((cc_get_imsk() & ~0x8000) | 0x4000); +} -	local_ops->cache_all(); -	local_ops->tlb_all(); +void __cpuinit sun4d_cpu_pre_online(void *arg) +{ +	unsigned long flags; +	int cpuid; -	notify_cpu_starting(cpuid); -	/* -	 * Unblock the master CPU _only_ when the scheduler state +	cpuid = hard_smp_processor_id(); + +	/* Unblock the master CPU _only_ when the scheduler state  	 * of all secondary CPUs will be up-to-date, so after  	 * the SMP initialization the master will be just allowed  	 * to call the scheduler code.  	 */ -	/* Get our local ticker going. */ -	register_percpu_ce(cpuid); - -	calibrate_delay(); -	smp_store_cpu_info(cpuid); -	local_ops->cache_all(); -	local_ops->tlb_all(); - -	/* Allow master to continue. */  	sun4d_swap((unsigned long *)&cpu_callin_map[cpuid], 1);  	local_ops->cache_all();  	local_ops->tlb_all(); @@ -106,16 +99,12 @@ void __cpuinit smp4d_callin(void)  	local_ops->cache_all();  	local_ops->tlb_all(); -	local_irq_enable();	/* We don't allow PIL 14 yet */ -  	while (!cpumask_test_cpu(cpuid, &smp_commenced_mask))  		barrier();  	spin_lock_irqsave(&sun4d_imsk_lock, flags);  	cc_set_imsk(cc_get_imsk() & ~0x4000); /* Allow PIL 14 as well */  	spin_unlock_irqrestore(&sun4d_imsk_lock, flags); -	set_cpu_online(cpuid, true); -  }  /* diff --git a/arch/sparc/kernel/sun4m_smp.c b/arch/sparc/kernel/sun4m_smp.c index 128af7304288..8a65f158153d 100644 --- a/arch/sparc/kernel/sun4m_smp.c +++ b/arch/sparc/kernel/sun4m_smp.c @@ -34,30 +34,19 @@ swap_ulong(volatile unsigned long *ptr, unsigned long val)  	return val;  } -void __cpuinit smp4m_callin(void) +void __cpuinit sun4m_cpu_pre_starting(void *arg)  { -	int cpuid = hard_smp_processor_id(); - -	local_ops->cache_all(); -	local_ops->tlb_all(); - -	notify_cpu_starting(cpuid); - -	register_percpu_ce(cpuid); - -	calibrate_delay(); -	smp_store_cpu_info(cpuid); +} -	local_ops->cache_all(); -	local_ops->tlb_all(); +void __cpuinit sun4m_cpu_pre_online(void *arg) +{ +	int cpuid = hard_smp_processor_id(); -	/* -	 * Unblock the master CPU _only_ when the scheduler state -	 * of all secondary CPUs will be up-to-date, so after -	 * the SMP initialization the master will be just allowed -	 * to call the scheduler code. +	/* Allow master to continue. The master will then give us the +	 * go-ahead by setting the smp_commenced_mask and will wait without +	 * timeouts until our setup is completed fully (signified by +	 * our bit being set in the cpu_online_mask).  	 */ -	/* Allow master to continue. */  	swap_ulong(&cpu_callin_map[cpuid], 1);  	/* XXX: What's up with all the flushes? */ @@ -75,10 +64,6 @@ void __cpuinit smp4m_callin(void)  	while (!cpumask_test_cpu(cpuid, &smp_commenced_mask))  		mb(); - -	local_irq_enable(); - -	set_cpu_online(cpuid, true);  }  /* diff --git a/arch/sparc/kernel/sys32.S b/arch/sparc/kernel/sys32.S index 8475a474273a..240a3cecc11e 100644 --- a/arch/sparc/kernel/sys32.S +++ b/arch/sparc/kernel/sys32.S @@ -36,108 +36,22 @@ STUB:	sra	REG1, 0, REG1; \  	jmpl	%g1 + %lo(SYSCALL), %g0; \  	sra	REG3, 0, REG3 -#define SIGN4(STUB,SYSCALL,REG1,REG2,REG3,REG4) \ -	.align	32; \ -	.globl	STUB; \ -STUB:	sra	REG1, 0, REG1; \ -	sethi	%hi(SYSCALL), %g1; \ -	sra	REG2, 0, REG2; \ -	sra	REG3, 0, REG3; \ -	jmpl	%g1 + %lo(SYSCALL), %g0; \ -	sra	REG4, 0, REG4 - -SIGN1(sys32_exit, sparc_exit, %o0) -SIGN1(sys32_exit_group, sparc_exit_group, %o0) -SIGN1(sys32_wait4, compat_sys_wait4, %o2) -SIGN1(sys32_creat, sys_creat, %o1) -SIGN1(sys32_mknod, sys_mknod, %o1) -SIGN1(sys32_umount, sys_umount, %o1) -SIGN1(sys32_signal, sys_signal, %o0) -SIGN1(sys32_access, sys_access, %o1) -SIGN1(sys32_msync, sys_msync, %o2) -SIGN2(sys32_reboot, sys_reboot, %o0, %o1) -SIGN1(sys32_setitimer, compat_sys_setitimer, %o0) -SIGN1(sys32_getitimer, compat_sys_getitimer, %o0) -SIGN1(sys32_sethostname, sys_sethostname, %o1) -SIGN1(sys32_swapon, sys_swapon, %o1) -SIGN1(sys32_sigaction, compat_sys_sigaction, %o0) -SIGN1(sys32_rt_sigaction, compat_sys_rt_sigaction, %o0) -SIGN1(sys32_sigprocmask, compat_sys_sigprocmask, %o0) -SIGN1(sys32_rt_sigprocmask, compat_sys_rt_sigprocmask, %o0) -SIGN2(sys32_rt_sigqueueinfo, compat_sys_rt_sigqueueinfo, %o0, %o1)  SIGN1(sys32_getrusage, compat_sys_getrusage, %o0) -SIGN1(sys32_setxattr, sys_setxattr, %o4) -SIGN1(sys32_lsetxattr, sys_lsetxattr, %o4) -SIGN1(sys32_fsetxattr, sys_fsetxattr, %o4) -SIGN1(sys32_fgetxattr, sys_fgetxattr, %o0) -SIGN1(sys32_flistxattr, sys_flistxattr, %o0) -SIGN1(sys32_fremovexattr, sys_fremovexattr, %o0) -SIGN2(sys32_tkill, sys_tkill, %o0, %o1) -SIGN1(sys32_epoll_create, sys_epoll_create, %o0) -SIGN3(sys32_epoll_ctl, sys_epoll_ctl, %o0, %o1, %o2) -SIGN3(sys32_epoll_wait, sys_epoll_wait, %o0, %o2, %o3)  SIGN1(sys32_readahead, compat_sys_readahead, %o0)  SIGN2(sys32_fadvise64, compat_sys_fadvise64, %o0, %o4)  SIGN2(sys32_fadvise64_64, compat_sys_fadvise64_64, %o0, %o5) -SIGN2(sys32_bdflush, sys_bdflush, %o0, %o1) -SIGN1(sys32_mlockall, sys_mlockall, %o0)  SIGN1(sys32_clock_nanosleep, compat_sys_clock_nanosleep, %o1)  SIGN1(sys32_timer_settime, compat_sys_timer_settime, %o1)  SIGN1(sys32_io_submit, compat_sys_io_submit, %o1)  SIGN1(sys32_mq_open, compat_sys_mq_open, %o1)  SIGN1(sys32_select, compat_sys_select, %o0) -SIGN1(sys32_mkdir, sys_mkdir, %o1)  SIGN3(sys32_futex, compat_sys_futex, %o1, %o2, %o5) -SIGN1(sys32_sysfs, compat_sys_sysfs, %o0)  SIGN2(sys32_sendfile, compat_sys_sendfile, %o0, %o1) -SIGN2(sys32_sendfile64, sys_sendfile, %o0, %o1) -SIGN1(sys32_prctl, sys_prctl, %o0) -SIGN1(sys32_sched_rr_get_interval, compat_sys_sched_rr_get_interval, %o0) -SIGN2(sys32_waitpid, sys_waitpid, %o0, %o2) -SIGN1(sys32_getgroups, sys_getgroups, %o0) -SIGN1(sys32_getpgid, sys_getpgid, %o0) -SIGN2(sys32_getpriority, sys_getpriority, %o0, %o1) -SIGN1(sys32_getsid, sys_getsid, %o0) -SIGN2(sys32_kill, sys_kill, %o0, %o1) -SIGN1(sys32_nice, sys_nice, %o0) -SIGN1(sys32_lseek, sys_lseek, %o1) -SIGN2(sys32_open, sparc32_open, %o1, %o2) -SIGN1(sys32_readlink, sys_readlink, %o2) -SIGN1(sys32_sched_get_priority_max, sys_sched_get_priority_max, %o0) -SIGN1(sys32_sched_get_priority_min, sys_sched_get_priority_min, %o0) -SIGN1(sys32_sched_getparam, sys_sched_getparam, %o0) -SIGN1(sys32_sched_getscheduler, sys_sched_getscheduler, %o0) -SIGN1(sys32_sched_setparam, sys_sched_setparam, %o0) -SIGN2(sys32_sched_setscheduler, sys_sched_setscheduler, %o0, %o1) -SIGN1(sys32_getdomainname, sys_getdomainname, %o1) -SIGN1(sys32_setdomainname, sys_setdomainname, %o1) -SIGN1(sys32_setgroups, sys_setgroups, %o0) -SIGN2(sys32_setpgid, sys_setpgid, %o0, %o1) -SIGN3(sys32_setpriority, sys_setpriority, %o0, %o1, %o2) -SIGN1(sys32_ssetmask, sys_ssetmask, %o0) -SIGN2(sys32_syslog, sys_syslog, %o0, %o2) -SIGN1(sys32_umask, sys_umask, %o0) -SIGN3(sys32_tgkill, sys_tgkill, %o0, %o1, %o2) -SIGN1(sys32_sendto, sys_sendto, %o0)  SIGN1(sys32_recvfrom, compat_sys_recvfrom, %o0) -SIGN3(sys32_socket, sys_socket, %o0, %o1, %o2) -SIGN2(sys32_connect, sys_connect, %o0, %o2) -SIGN2(sys32_bind, sys_bind, %o0, %o2) -SIGN2(sys32_listen, sys_listen, %o0, %o1)  SIGN1(sys32_recvmsg, compat_sys_recvmsg, %o0)  SIGN1(sys32_sendmsg, compat_sys_sendmsg, %o0) -SIGN2(sys32_shutdown, sys_shutdown, %o0, %o1) -SIGN3(sys32_socketpair, sys_socketpair, %o0, %o1, %o2) -SIGN1(sys32_getpeername, sys_getpeername, %o0) -SIGN1(sys32_getsockname, sys_getsockname, %o0) -SIGN2(sys32_ioprio_get, sys_ioprio_get, %o0, %o1) -SIGN3(sys32_ioprio_set, sys_ioprio_set, %o0, %o1, %o2) -SIGN2(sys32_splice, sys_splice, %o0, %o2)  SIGN2(sys32_sync_file_range, compat_sync_file_range, %o0, %o5) -SIGN2(sys32_tee, sys_tee, %o0, %o1)  SIGN1(sys32_vmsplice, compat_sys_vmsplice, %o0) -SIGN1(sys32_truncate, sys_truncate, %o1) -SIGN1(sys32_ftruncate, sys_ftruncate, %o1)  	.globl		sys32_mmap2  sys32_mmap2: diff --git a/arch/sparc/kernel/sys_sparc32.c b/arch/sparc/kernel/sys_sparc32.c index 4a4cdc633f6b..f38f2280fade 100644 --- a/arch/sparc/kernel/sys_sparc32.c +++ b/arch/sparc/kernel/sys_sparc32.c @@ -206,133 +206,19 @@ asmlinkage long compat_sys_fstatat64(unsigned int dfd,  	return cp_compat_stat64(&stat, statbuf);  } -asmlinkage long compat_sys_sysfs(int option, u32 arg1, u32 arg2) +COMPAT_SYSCALL_DEFINE3(sparc_sigaction, int, sig, +			struct compat_old_sigaction __user *,act, +			struct compat_old_sigaction __user *,oact)  { -	return sys_sysfs(option, arg1, arg2); -} - -asmlinkage long compat_sys_rt_sigprocmask(int how, -					  compat_sigset_t __user *set, -					  compat_sigset_t __user *oset, -					  compat_size_t sigsetsize) -{ -	sigset_t s; -	compat_sigset_t s32; -	int ret; -	mm_segment_t old_fs = get_fs(); -	 -	if (set) { -		if (copy_from_user (&s32, set, sizeof(compat_sigset_t))) -			return -EFAULT; -		switch (_NSIG_WORDS) { -		case 4: s.sig[3] = s32.sig[6] | (((long)s32.sig[7]) << 32); -		case 3: s.sig[2] = s32.sig[4] | (((long)s32.sig[5]) << 32); -		case 2: s.sig[1] = s32.sig[2] | (((long)s32.sig[3]) << 32); -		case 1: s.sig[0] = s32.sig[0] | (((long)s32.sig[1]) << 32); -		} -	} -	set_fs (KERNEL_DS); -	ret = sys_rt_sigprocmask(how, -				 set ? (sigset_t __user *) &s : NULL, -				 oset ? (sigset_t __user *) &s : NULL, -				 sigsetsize); -	set_fs (old_fs); -	if (ret) return ret; -	if (oset) { -		switch (_NSIG_WORDS) { -		case 4: s32.sig[7] = (s.sig[3] >> 32); s32.sig[6] = s.sig[3]; -		case 3: s32.sig[5] = (s.sig[2] >> 32); s32.sig[4] = s.sig[2]; -		case 2: s32.sig[3] = (s.sig[1] >> 32); s32.sig[2] = s.sig[1]; -		case 1: s32.sig[1] = (s.sig[0] >> 32); s32.sig[0] = s.sig[0]; -		} -		if (copy_to_user (oset, &s32, sizeof(compat_sigset_t))) -			return -EFAULT; -	} -	return 0; -} - -asmlinkage long sys32_rt_sigpending(compat_sigset_t __user *set, -				    compat_size_t sigsetsize) -{ -	sigset_t s; -	compat_sigset_t s32; -	int ret; -	mm_segment_t old_fs = get_fs(); -		 -	set_fs (KERNEL_DS); -	ret = sys_rt_sigpending((sigset_t __user *) &s, sigsetsize); -	set_fs (old_fs); -	if (!ret) { -		switch (_NSIG_WORDS) { -		case 4: s32.sig[7] = (s.sig[3] >> 32); s32.sig[6] = s.sig[3]; -		case 3: s32.sig[5] = (s.sig[2] >> 32); s32.sig[4] = s.sig[2]; -		case 2: s32.sig[3] = (s.sig[1] >> 32); s32.sig[2] = s.sig[1]; -		case 1: s32.sig[1] = (s.sig[0] >> 32); s32.sig[0] = s.sig[0]; -		} -		if (copy_to_user (set, &s32, sizeof(compat_sigset_t))) -			return -EFAULT; -	} -	return ret; -} - -asmlinkage long compat_sys_rt_sigqueueinfo(int pid, int sig, -					   struct compat_siginfo __user *uinfo) -{ -	siginfo_t info; -	int ret; -	mm_segment_t old_fs = get_fs(); -	 -	if (copy_siginfo_from_user32(&info, uinfo)) -		return -EFAULT; - -	set_fs (KERNEL_DS); -	ret = sys_rt_sigqueueinfo(pid, sig, (siginfo_t __user *) &info); -	set_fs (old_fs); -	return ret; -} - -asmlinkage long compat_sys_sigaction(int sig, struct old_sigaction32 __user *act, -				     struct old_sigaction32 __user *oact) -{ -        struct k_sigaction new_ka, old_ka; -        int ret; -  	WARN_ON_ONCE(sig >= 0); -	sig = -sig; - -        if (act) { -		compat_old_sigset_t mask; -		u32 u_handler, u_restorer; -		 -		ret = get_user(u_handler, &act->sa_handler); -		new_ka.sa.sa_handler =  compat_ptr(u_handler); -		ret |= __get_user(u_restorer, &act->sa_restorer); -		new_ka.sa.sa_restorer = compat_ptr(u_restorer); -		ret |= __get_user(new_ka.sa.sa_flags, &act->sa_flags); -		ret |= __get_user(mask, &act->sa_mask); -		if (ret) -			return ret; -		new_ka.ka_restorer = NULL; -		siginitset(&new_ka.sa.sa_mask, mask); -        } - -        ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL); - -	if (!ret && oact) { -		ret = put_user(ptr_to_compat(old_ka.sa.sa_handler), &oact->sa_handler); -		ret |= __put_user(ptr_to_compat(old_ka.sa.sa_restorer), &oact->sa_restorer); -		ret |= __put_user(old_ka.sa.sa_flags, &oact->sa_flags); -		ret |= __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask); -        } - -	return ret; +	return compat_sys_sigaction(-sig, act, oact);  } -asmlinkage long compat_sys_rt_sigaction(int sig, -					struct sigaction32 __user *act, -					struct sigaction32 __user *oact, -					void __user *restorer, -					compat_size_t sigsetsize) +COMPAT_SYSCALL_DEFINE5(rt_sigaction, int, sig, +			struct compat_sigaction __user *,act, +			struct compat_sigaction __user *,oact, +			void __user *,restorer, +			compat_size_t,sigsetsize)  {          struct k_sigaction new_ka, old_ka;          int ret; @@ -349,12 +235,7 @@ asmlinkage long compat_sys_rt_sigaction(int sig,  		ret = get_user(u_handler, &act->sa_handler);  		new_ka.sa.sa_handler =  compat_ptr(u_handler);  		ret |= __copy_from_user(&set32, &act->sa_mask, sizeof(compat_sigset_t)); -		switch (_NSIG_WORDS) { -		case 4: new_ka.sa.sa_mask.sig[3] = set32.sig[6] | (((long)set32.sig[7]) << 32); -		case 3: new_ka.sa.sa_mask.sig[2] = set32.sig[4] | (((long)set32.sig[5]) << 32); -		case 2: new_ka.sa.sa_mask.sig[1] = set32.sig[2] | (((long)set32.sig[3]) << 32); -		case 1: new_ka.sa.sa_mask.sig[0] = set32.sig[0] | (((long)set32.sig[1]) << 32); -		} +		sigset_from_compat(&new_ka.sa.sa_mask, &set32);  		ret |= __get_user(new_ka.sa.sa_flags, &act->sa_flags);  		ret |= __get_user(u_restorer, &act->sa_restorer);  		new_ka.sa.sa_restorer = compat_ptr(u_restorer); @@ -365,12 +246,7 @@ asmlinkage long compat_sys_rt_sigaction(int sig,  	ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);  	if (!ret && oact) { -		switch (_NSIG_WORDS) { -		case 4: set32.sig[7] = (old_ka.sa.sa_mask.sig[3] >> 32); set32.sig[6] = old_ka.sa.sa_mask.sig[3]; -		case 3: set32.sig[5] = (old_ka.sa.sa_mask.sig[2] >> 32); set32.sig[4] = old_ka.sa.sa_mask.sig[2]; -		case 2: set32.sig[3] = (old_ka.sa.sa_mask.sig[1] >> 32); set32.sig[2] = old_ka.sa.sa_mask.sig[1]; -		case 1: set32.sig[1] = (old_ka.sa.sa_mask.sig[0] >> 32); set32.sig[0] = old_ka.sa.sa_mask.sig[0]; -		} +		sigset_to_compat(&set32, &old_ka.sa.sa_mask);  		ret = put_user(ptr_to_compat(old_ka.sa.sa_handler), &oact->sa_handler);  		ret |= __copy_to_user(&oact->sa_mask, &set32, sizeof(compat_sigset_t));  		ret |= __put_user(old_ka.sa.sa_flags, &oact->sa_flags); @@ -382,35 +258,6 @@ asmlinkage long compat_sys_rt_sigaction(int sig,          return ret;  } -#ifdef CONFIG_MODULES - -asmlinkage long sys32_init_module(void __user *umod, u32 len, -				  const char __user *uargs) -{ -	return sys_init_module(umod, len, uargs); -} - -asmlinkage long sys32_delete_module(const char __user *name_user, -				    unsigned int flags) -{ -	return sys_delete_module(name_user, flags); -} - -#else /* CONFIG_MODULES */ - -asmlinkage long sys32_init_module(const char __user *name_user, -				  struct module __user *mod_user) -{ -	return -ENOSYS; -} - -asmlinkage long sys32_delete_module(const char __user *name_user) -{ -	return -ENOSYS; -} - -#endif  /* CONFIG_MODULES */ -  asmlinkage compat_ssize_t sys32_pread64(unsigned int fd,  					char __user *ubuf,  					compat_size_t count, @@ -456,16 +303,6 @@ long compat_sys_fadvise64_64(int fd,  				advice);  } -/* This is just a version for 32-bit applications which does - * not force O_LARGEFILE on. - */ - -asmlinkage long sparc32_open(const char __user *filename, -			     int flags, int mode) -{ -	return do_sys_open(AT_FDCWD, filename, flags, mode); -} -  long sys32_lookup_dcookie(unsigned long cookie_high,  			  unsigned long cookie_low,  			  char __user *buf, size_t len) diff --git a/arch/sparc/kernel/sys_sparc_32.c b/arch/sparc/kernel/sys_sparc_32.c index 2da0bdcae52f..3a8d1844402e 100644 --- a/arch/sparc/kernel/sys_sparc_32.c +++ b/arch/sparc/kernel/sys_sparc_32.c @@ -160,49 +160,19 @@ sparc_breakpoint (struct pt_regs *regs)  #endif  } -asmlinkage int -sparc_sigaction (int sig, const struct old_sigaction __user *act, -		 struct old_sigaction __user *oact) +SYSCALL_DEFINE3(sparc_sigaction, int, sig, +		struct old_sigaction __user *,act, +		struct old_sigaction __user *,oact)  { -	struct k_sigaction new_ka, old_ka; -	int ret; -  	WARN_ON_ONCE(sig >= 0); -	sig = -sig; - -	if (act) { -		unsigned long mask; - -		if (!access_ok(VERIFY_READ, act, sizeof(*act)) || -		    __get_user(new_ka.sa.sa_handler, &act->sa_handler) || -		    __get_user(new_ka.sa.sa_restorer, &act->sa_restorer) || -		    __get_user(new_ka.sa.sa_flags, &act->sa_flags) || -		    __get_user(mask, &act->sa_mask)) -			return -EFAULT; -		siginitset(&new_ka.sa.sa_mask, mask); -		new_ka.ka_restorer = NULL; -	} - -	ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL); - -	if (!ret && oact) { -		if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) || -		    __put_user(old_ka.sa.sa_handler, &oact->sa_handler) || -		    __put_user(old_ka.sa.sa_restorer, &oact->sa_restorer) || -		    __put_user(old_ka.sa.sa_flags, &oact->sa_flags) || -		    __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask)) -			return -EFAULT; -	} - -	return ret; +	return sys_sigaction(-sig, act, oact);  } -asmlinkage long -sys_rt_sigaction(int sig, -		 const struct sigaction __user *act, -		 struct sigaction __user *oact, -		 void __user *restorer, -		 size_t sigsetsize) +SYSCALL_DEFINE5(rt_sigaction, int, sig, +		 const struct sigaction __user *, act, +		 struct sigaction __user *, oact, +		 void __user *, restorer, +		 size_t, sigsetsize)  {  	struct k_sigaction new_ka, old_ka;  	int ret; diff --git a/arch/sparc/kernel/syscalls.S b/arch/sparc/kernel/syscalls.S index e0fed7711a94..22a1098961f5 100644 --- a/arch/sparc/kernel/syscalls.S +++ b/arch/sparc/kernel/syscalls.S @@ -25,16 +25,10 @@ sys_nis_syscall:  sys_memory_ordering:  	ba,pt	%xcc, sparc_memory_ordering  	 add	%sp, PTREGS_OFF, %o1 -sys_sigaltstack: -	ba,pt	%xcc, do_sigaltstack -	 add	%i6, STACK_BIAS, %o2  #ifdef CONFIG_COMPAT  sys32_sigstack:  	ba,pt	%xcc, do_sys32_sigstack  	 mov	%i6, %o2 -sys32_sigaltstack: -	ba,pt	%xcc, do_sys32_sigaltstack -	 mov	%i6, %o2  #endif  	.align	32  #ifdef CONFIG_COMPAT diff --git a/arch/sparc/kernel/systbls.h b/arch/sparc/kernel/systbls.h index 118759cd7342..26e6dd72e92a 100644 --- a/arch/sparc/kernel/systbls.h +++ b/arch/sparc/kernel/systbls.h @@ -3,8 +3,8 @@  #include <linux/kernel.h>  #include <linux/types.h> +#include <linux/signal.h>  #include <asm/utrap.h> -#include <asm/signal.h>  extern asmlinkage unsigned long sys_getpagesize(void);  extern asmlinkage long sparc_pipe(struct pt_regs *regs); @@ -36,8 +36,6 @@ extern asmlinkage long sys_rt_sigaction(int sig,  extern asmlinkage void sparc64_set_context(struct pt_regs *regs);  extern asmlinkage void sparc64_get_context(struct pt_regs *regs); -extern asmlinkage long sys_sigpause(unsigned int set); -extern asmlinkage long sys_sigsuspend(old_sigset_t set);  extern void do_rt_sigreturn(struct pt_regs *regs);  #endif /* _SYSTBLS_H */ diff --git a/arch/sparc/kernel/systbls_32.S b/arch/sparc/kernel/systbls_32.S index 5147f574f125..7b87171ecf1e 100644 --- a/arch/sparc/kernel/systbls_32.S +++ b/arch/sparc/kernel/systbls_32.S @@ -55,7 +55,7 @@ sys_call_table:  /*180*/	.long sys_flistxattr, sys_removexattr, sys_lremovexattr, sys_sigpending, sys_ni_syscall  /*185*/	.long sys_setpgid, sys_fremovexattr, sys_tkill, sys_exit_group, sys_newuname  /*190*/	.long sys_init_module, sys_personality, sparc_remap_file_pages, sys_epoll_create, sys_epoll_ctl -/*195*/	.long sys_epoll_wait, sys_ioprio_set, sys_getppid, sparc_sigaction, sys_sgetmask +/*195*/	.long sys_epoll_wait, sys_ioprio_set, sys_getppid, sys_sparc_sigaction, sys_sgetmask  /*200*/	.long sys_ssetmask, sys_sigsuspend, sys_newlstat, sys_uselib, sys_old_readdir  /*205*/	.long sys_readahead, sys_socketcall, sys_syslog, sys_lookup_dcookie, sys_fadvise64  /*210*/	.long sys_fadvise64_64, sys_tgkill, sys_waitpid, sys_swapoff, sys_sysinfo @@ -85,4 +85,4 @@ sys_call_table:  /*325*/	.long sys_pwritev, sys_rt_tgsigqueueinfo, sys_perf_event_open, sys_recvmmsg, sys_fanotify_init  /*330*/	.long sys_fanotify_mark, sys_prlimit64, sys_name_to_handle_at, sys_open_by_handle_at, sys_clock_adjtime  /*335*/	.long sys_syncfs, sys_sendmmsg, sys_setns, sys_process_vm_readv, sys_process_vm_writev -/*340*/	.long sys_ni_syscall, sys_kcmp +/*340*/	.long sys_ni_syscall, sys_kcmp, sys_finit_module diff --git a/arch/sparc/kernel/systbls_64.S b/arch/sparc/kernel/systbls_64.S index cdbd9b817751..088134834dab 100644 --- a/arch/sparc/kernel/systbls_64.S +++ b/arch/sparc/kernel/systbls_64.S @@ -18,63 +18,63 @@  	.globl sys_call_table32  sys_call_table32: -/*0*/	.word sys_restart_syscall, sys32_exit, sys_fork, sys_read, sys_write -/*5*/	.word sys32_open, sys_close, sys32_wait4, sys32_creat, sys_link -/*10*/  .word sys_unlink, sunos_execv, sys_chdir, sys_chown16, sys32_mknod -/*15*/	.word sys_chmod, sys_lchown16, sys_brk, sys_nis_syscall, sys32_lseek +/*0*/	.word sys_restart_syscall, sparc_exit, sys_fork, sys_read, sys_write +/*5*/	.word compat_sys_open, sys_close, compat_sys_wait4, sys_creat, sys_link +/*10*/  .word sys_unlink, sunos_execv, sys_chdir, sys_chown16, sys_mknod +/*15*/	.word sys_chmod, sys_lchown16, sys_brk, sys_nis_syscall, compat_sys_lseek  /*20*/	.word sys_getpid, sys_capget, sys_capset, sys_setuid16, sys_getuid16 -/*25*/	.word sys32_vmsplice, compat_sys_ptrace, sys_alarm, sys32_sigaltstack, sys_pause -/*30*/	.word compat_sys_utime, sys_lchown, sys_fchown, sys32_access, sys32_nice -	.word sys_chown, sys_sync, sys32_kill, compat_sys_newstat, sys32_sendfile +/*25*/	.word sys32_vmsplice, compat_sys_ptrace, sys_alarm, compat_sys_sigaltstack, sys_pause +/*30*/	.word compat_sys_utime, sys_lchown, sys_fchown, sys_access, sys_nice +	.word sys_chown, sys_sync, sys_kill, compat_sys_newstat, sys32_sendfile  /*40*/	.word compat_sys_newlstat, sys_dup, sys_sparc_pipe, compat_sys_times, sys_getuid -	.word sys32_umount, sys_setgid16, sys_getgid16, sys32_signal, sys_geteuid16 +	.word sys_umount, sys_setgid16, sys_getgid16, sys_signal, sys_geteuid16  /*50*/	.word sys_getegid16, sys_acct, sys_nis_syscall, sys_getgid, compat_sys_ioctl -	.word sys32_reboot, sys32_mmap2, sys_symlink, sys32_readlink, sys32_execve -/*60*/	.word sys32_umask, sys_chroot, compat_sys_newfstat, compat_sys_fstat64, sys_getpagesize -	.word sys32_msync, sys_vfork, sys32_pread64, sys32_pwrite64, sys_geteuid +	.word sys_reboot, sys32_mmap2, sys_symlink, sys_readlink, sys32_execve +/*60*/	.word sys_umask, sys_chroot, compat_sys_newfstat, compat_sys_fstat64, sys_getpagesize +	.word sys_msync, sys_vfork, sys32_pread64, sys32_pwrite64, sys_geteuid  /*70*/	.word sys_getegid, sys_mmap, sys_setreuid, sys_munmap, sys_mprotect  	.word sys_madvise, sys_vhangup, sys32_truncate64, sys_mincore, sys_getgroups16 -/*80*/	.word sys_setgroups16, sys_getpgrp, sys32_setgroups, sys32_setitimer, sys32_ftruncate64 -	.word sys32_swapon, sys32_getitimer, sys_setuid, sys32_sethostname, sys_setgid +/*80*/	.word sys_setgroups16, sys_getpgrp, sys_setgroups, compat_sys_setitimer, sys32_ftruncate64 +	.word sys_swapon, compat_sys_getitimer, sys_setuid, sys_sethostname, sys_setgid  /*90*/	.word sys_dup2, sys_setfsuid, compat_sys_fcntl, sys32_select, sys_setfsgid -	.word sys_fsync, sys32_setpriority, sys_nis_syscall, sys_nis_syscall, sys_nis_syscall -/*100*/ .word sys32_getpriority, sys32_rt_sigreturn, sys32_rt_sigaction, sys32_rt_sigprocmask, sys32_rt_sigpending -	.word compat_sys_rt_sigtimedwait, sys32_rt_sigqueueinfo, compat_sys_rt_sigsuspend, sys_setresuid, sys_getresuid +	.word sys_fsync, sys_setpriority, sys_nis_syscall, sys_nis_syscall, sys_nis_syscall +/*100*/ .word sys_getpriority, sys32_rt_sigreturn, compat_sys_rt_sigaction, compat_sys_rt_sigprocmask, compat_sys_rt_sigpending +	.word compat_sys_rt_sigtimedwait, compat_sys_rt_sigqueueinfo, compat_sys_rt_sigsuspend, sys_setresuid, sys_getresuid  /*110*/	.word sys_setresgid, sys_getresgid, sys_setregid, sys_nis_syscall, sys_nis_syscall -	.word sys32_getgroups, compat_sys_gettimeofday, sys32_getrusage, sys_nis_syscall, sys_getcwd +	.word sys_getgroups, compat_sys_gettimeofday, sys32_getrusage, sys_nis_syscall, sys_getcwd  /*120*/	.word compat_sys_readv, compat_sys_writev, compat_sys_settimeofday, sys_fchown16, sys_fchmod -	.word sys_nis_syscall, sys_setreuid16, sys_setregid16, sys_rename, sys32_truncate -/*130*/	.word sys32_ftruncate, sys_flock, compat_sys_lstat64, sys_nis_syscall, sys_nis_syscall -	.word sys_nis_syscall, sys32_mkdir, sys_rmdir, compat_sys_utimes, compat_sys_stat64 -/*140*/	.word sys32_sendfile64, sys_nis_syscall, sys32_futex, sys_gettid, compat_sys_getrlimit -	.word compat_sys_setrlimit, sys_pivot_root, sys32_prctl, sys_pciconfig_read, sys_pciconfig_write +	.word sys_nis_syscall, sys_setreuid16, sys_setregid16, sys_rename, compat_sys_truncate +/*130*/	.word compat_sys_ftruncate, sys_flock, compat_sys_lstat64, sys_nis_syscall, sys_nis_syscall +	.word sys_nis_syscall, sys_mkdir, sys_rmdir, compat_sys_utimes, compat_sys_stat64 +/*140*/	.word sys_sendfile64, sys_nis_syscall, sys32_futex, sys_gettid, compat_sys_getrlimit +	.word compat_sys_setrlimit, sys_pivot_root, sys_prctl, sys_pciconfig_read, sys_pciconfig_write  /*150*/	.word sys_nis_syscall, sys_inotify_init, sys_inotify_add_watch, sys_poll, sys_getdents64  	.word compat_sys_fcntl64, sys_inotify_rm_watch, compat_sys_statfs, compat_sys_fstatfs, sys_oldumount -/*160*/	.word compat_sys_sched_setaffinity, compat_sys_sched_getaffinity, sys32_getdomainname, sys32_setdomainname, sys_nis_syscall -	.word sys_quotactl, sys_set_tid_address, compat_sys_mount, compat_sys_ustat, sys32_setxattr -/*170*/	.word sys32_lsetxattr, sys32_fsetxattr, sys_getxattr, sys_lgetxattr, compat_sys_getdents -	.word sys_setsid, sys_fchdir, sys32_fgetxattr, sys_listxattr, sys_llistxattr -/*180*/	.word sys32_flistxattr, sys_removexattr, sys_lremovexattr, compat_sys_sigpending, sys_ni_syscall -	.word sys32_setpgid, sys32_fremovexattr, sys32_tkill, sys32_exit_group, sys_newuname -/*190*/	.word sys32_init_module, sys_sparc64_personality, sys_remap_file_pages, sys32_epoll_create, sys32_epoll_ctl -	.word sys32_epoll_wait, sys32_ioprio_set, sys_getppid, sys32_sigaction, sys_sgetmask -/*200*/	.word sys32_ssetmask, sys_sigsuspend, compat_sys_newlstat, sys_uselib, compat_sys_old_readdir -	.word sys32_readahead, sys32_socketcall, sys32_syslog, sys32_lookup_dcookie, sys32_fadvise64 -/*210*/	.word sys32_fadvise64_64, sys32_tgkill, sys32_waitpid, sys_swapoff, compat_sys_sysinfo -	.word compat_sys_ipc, sys32_sigreturn, sys_clone, sys32_ioprio_get, compat_sys_adjtimex -/*220*/	.word sys32_sigprocmask, sys_ni_syscall, sys32_delete_module, sys_ni_syscall, sys32_getpgid -	.word sys32_bdflush, sys32_sysfs, sys_nis_syscall, sys_setfsuid16, sys_setfsgid16 -/*230*/	.word sys32_select, compat_sys_time, sys32_splice, compat_sys_stime, compat_sys_statfs64 -	.word compat_sys_fstatfs64, sys_llseek, sys_mlock, sys_munlock, sys32_mlockall -/*240*/	.word sys_munlockall, sys32_sched_setparam, sys32_sched_getparam, sys32_sched_setscheduler, sys32_sched_getscheduler -	.word sys_sched_yield, sys32_sched_get_priority_max, sys32_sched_get_priority_min, sys32_sched_rr_get_interval, compat_sys_nanosleep -/*250*/	.word sys_mremap, compat_sys_sysctl, sys32_getsid, sys_fdatasync, sys_nis_syscall +/*160*/	.word compat_sys_sched_setaffinity, compat_sys_sched_getaffinity, sys_getdomainname, sys_setdomainname, sys_nis_syscall +	.word sys_quotactl, sys_set_tid_address, compat_sys_mount, compat_sys_ustat, sys_setxattr +/*170*/	.word sys_lsetxattr, sys_fsetxattr, sys_getxattr, sys_lgetxattr, compat_sys_getdents +	.word sys_setsid, sys_fchdir, sys_fgetxattr, sys_listxattr, sys_llistxattr +/*180*/	.word sys_flistxattr, sys_removexattr, sys_lremovexattr, compat_sys_sigpending, sys_ni_syscall +	.word sys_setpgid, sys_fremovexattr, sys_tkill, sparc_exit_group, sys_newuname +/*190*/	.word sys_init_module, sys_sparc64_personality, sys_remap_file_pages, sys_epoll_create, sys_epoll_ctl +	.word sys_epoll_wait, sys_ioprio_set, sys_getppid, compat_sys_sparc_sigaction, sys_sgetmask +/*200*/	.word sys_ssetmask, sys_sigsuspend, compat_sys_newlstat, sys_uselib, compat_sys_old_readdir +	.word sys32_readahead, sys32_socketcall, sys_syslog, sys32_lookup_dcookie, sys32_fadvise64 +/*210*/	.word sys32_fadvise64_64, sys_tgkill, sys_waitpid, sys_swapoff, compat_sys_sysinfo +	.word compat_sys_ipc, sys32_sigreturn, sys_clone, sys_ioprio_get, compat_sys_adjtimex +/*220*/	.word compat_sys_sigprocmask, sys_ni_syscall, sys_delete_module, sys_ni_syscall, sys_getpgid +	.word sys_bdflush, sys_sysfs, sys_nis_syscall, sys_setfsuid16, sys_setfsgid16 +/*230*/	.word sys32_select, compat_sys_time, sys_splice, compat_sys_stime, compat_sys_statfs64 +	.word compat_sys_fstatfs64, sys_llseek, sys_mlock, sys_munlock, sys_mlockall +/*240*/	.word sys_munlockall, sys_sched_setparam, sys_sched_getparam, sys_sched_setscheduler, sys_sched_getscheduler +	.word sys_sched_yield, sys_sched_get_priority_max, sys_sched_get_priority_min, compat_sys_sched_rr_get_interval, compat_sys_nanosleep +/*250*/	.word sys_mremap, compat_sys_sysctl, sys_getsid, sys_fdatasync, sys_nis_syscall  	.word sys32_sync_file_range, compat_sys_clock_settime, compat_sys_clock_gettime, compat_sys_clock_getres, sys32_clock_nanosleep  /*260*/	.word compat_sys_sched_getaffinity, compat_sys_sched_setaffinity, sys32_timer_settime, compat_sys_timer_gettime, sys_timer_getoverrun  	.word sys_timer_delete, compat_sys_timer_create, sys_ni_syscall, compat_sys_io_setup, sys_io_destroy  /*270*/	.word sys32_io_submit, sys_io_cancel, compat_sys_io_getevents, sys32_mq_open, sys_mq_unlink  	.word compat_sys_mq_timedsend, compat_sys_mq_timedreceive, compat_sys_mq_notify, compat_sys_mq_getsetattr, compat_sys_waitid -/*280*/	.word sys32_tee, sys_add_key, sys_request_key, compat_sys_keyctl, compat_sys_openat +/*280*/	.word sys_tee, sys_add_key, sys_request_key, compat_sys_keyctl, compat_sys_openat  	.word sys_mkdirat, sys_mknodat, sys_fchownat, compat_sys_futimesat, compat_sys_fstatat64  /*290*/	.word sys_unlinkat, sys_renameat, sys_linkat, sys_symlinkat, sys_readlinkat  	.word sys_fchmodat, sys_faccessat, compat_sys_pselect6, compat_sys_ppoll, sys_unshare @@ -86,7 +86,7 @@ sys_call_table32:  	.word compat_sys_pwritev, compat_sys_rt_tgsigqueueinfo, sys_perf_event_open, compat_sys_recvmmsg, sys_fanotify_init  /*330*/	.word sys32_fanotify_mark, sys_prlimit64, sys_name_to_handle_at, compat_sys_open_by_handle_at, compat_sys_clock_adjtime  	.word sys_syncfs, compat_sys_sendmmsg, sys_setns, compat_sys_process_vm_readv, compat_sys_process_vm_writev -/*340*/	.word sys_kern_features, sys_kcmp +/*340*/	.word sys_kern_features, sys_kcmp, sys_finit_module  #endif /* CONFIG_COMPAT */ @@ -164,4 +164,4 @@ sys_call_table:  	.word sys_pwritev, sys_rt_tgsigqueueinfo, sys_perf_event_open, sys_recvmmsg, sys_fanotify_init  /*330*/	.word sys_fanotify_mark, sys_prlimit64, sys_name_to_handle_at, sys_open_by_handle_at, sys_clock_adjtime  	.word sys_syncfs, sys_sendmmsg, sys_setns, sys_process_vm_readv, sys_process_vm_writev -/*340*/	.word sys_kern_features, sys_kcmp +/*340*/	.word sys_kern_features, sys_kcmp, sys_finit_module diff --git a/arch/sparc/kernel/time_32.c b/arch/sparc/kernel/time_32.c index 953641549e82..c4c27b0f9063 100644 --- a/arch/sparc/kernel/time_32.c +++ b/arch/sparc/kernel/time_32.c @@ -278,7 +278,7 @@ static struct platform_device m48t59_rtc = {  	},  }; -static int __devinit clock_probe(struct platform_device *op) +static int clock_probe(struct platform_device *op)  {  	struct device_node *dp = op->dev.of_node;  	const char *model = of_get_property(dp, "model", NULL); diff --git a/arch/sparc/kernel/time_64.c b/arch/sparc/kernel/time_64.c index e861072b9c52..c3d82b5f54ca 100644 --- a/arch/sparc/kernel/time_64.c +++ b/arch/sparc/kernel/time_64.c @@ -419,7 +419,7 @@ static struct platform_device rtc_cmos_device = {  	.num_resources	= 1,  }; -static int __devinit rtc_probe(struct platform_device *op) +static int rtc_probe(struct platform_device *op)  {  	struct resource *r; @@ -477,7 +477,7 @@ static struct platform_device rtc_bq4802_device = {  	.num_resources	= 1,  }; -static int __devinit bq4802_probe(struct platform_device *op) +static int bq4802_probe(struct platform_device *op)  {  	printk(KERN_INFO "%s: BQ4802 regs at 0x%llx\n", @@ -534,7 +534,7 @@ static struct platform_device m48t59_rtc = {  	},  }; -static int __devinit mostek_probe(struct platform_device *op) +static int mostek_probe(struct platform_device *op)  {  	struct device_node *dp = op->dev.of_node; @@ -746,7 +746,7 @@ void __irq_entry timer_interrupt(int irq, struct pt_regs *regs)  	set_irq_regs(old_regs);  } -void __devinit setup_sparc64_timer(void) +void setup_sparc64_timer(void)  {  	struct clock_event_device *sevt;  	unsigned long pstate; @@ -844,7 +844,7 @@ unsigned long long sched_clock(void)  		>> SPARC64_NSEC_PER_CYC_SHIFT;  } -int __devinit read_current_timer(unsigned long *timer_val) +int read_current_timer(unsigned long *timer_val)  {  	*timer_val = tick_ops->get_tick();  	return 0; diff --git a/arch/sparc/kernel/trampoline_32.S b/arch/sparc/kernel/trampoline_32.S index af27acab4486..6cdb08cdabf0 100644 --- a/arch/sparc/kernel/trampoline_32.S +++ b/arch/sparc/kernel/trampoline_32.S @@ -79,18 +79,15 @@ cpu3_startup:  	 nop  	/* Start this processor. */ -	call	smp4m_callin +	call	smp_callin  	 nop -	b,a	smp_do_cpu_idle +	b,a	smp_panic  	.text  	.align	4 -smp_do_cpu_idle: -	call	cpu_idle -	 mov	0, %o0 - +smp_panic:  	call	cpu_panic  	 nop @@ -144,10 +141,10 @@ sun4d_cpu_startup:  	 nop  	/* Start this processor. */ -	call	smp4d_callin +	call	smp_callin  	 nop -	b,a	smp_do_cpu_idle +	b,a	smp_panic  	__CPUINIT  	.align	4 @@ -201,7 +198,7 @@ leon_smp_cpu_startup:  	 nop  	/* Start this processor. */ -	call	leon_callin +	call	smp_callin  	 nop -	b,a	smp_do_cpu_idle +	b,a	smp_panic diff --git a/arch/sparc/kernel/traps_32.c b/arch/sparc/kernel/traps_32.c index a5785ea2a85d..662982946a89 100644 --- a/arch/sparc/kernel/traps_32.c +++ b/arch/sparc/kernel/traps_32.c @@ -58,7 +58,7 @@ void die_if_kernel(char *str, struct pt_regs *regs)  	printk("%s(%d): %s [#%d]\n", current->comm, task_pid_nr(current), str, ++die_counter);  	show_regs(regs); -	add_taint(TAINT_DIE); +	add_taint(TAINT_DIE, LOCKDEP_NOW_UNRELIABLE);  	__SAVE; __SAVE; __SAVE; __SAVE;  	__SAVE; __SAVE; __SAVE; __SAVE; diff --git a/arch/sparc/kernel/traps_64.c b/arch/sparc/kernel/traps_64.c index e7ecf1507d90..8d38ca97aa23 100644 --- a/arch/sparc/kernel/traps_64.c +++ b/arch/sparc/kernel/traps_64.c @@ -2383,7 +2383,7 @@ void die_if_kernel(char *str, struct pt_regs *regs)  	notify_die(DIE_OOPS, str, regs, 0, 255, SIGSEGV);  	__asm__ __volatile__("flushw");  	show_regs(regs); -	add_taint(TAINT_DIE); +	add_taint(TAINT_DIE, LOCKDEP_NOW_UNRELIABLE);  	if (regs->tstate & TSTATE_PRIV) {  		struct thread_info *tp = current_thread_info();  		struct reg_window *rw = (struct reg_window *) diff --git a/arch/sparc/kernel/tsb.S b/arch/sparc/kernel/tsb.S index d4bdc7a62375..a313e4a9399b 100644 --- a/arch/sparc/kernel/tsb.S +++ b/arch/sparc/kernel/tsb.S @@ -136,12 +136,43 @@ tsb_miss_page_table_walk_sun4v_fastpath:  	 nop  	/* It is a huge page, use huge page TSB entry address we -	 * calculated above. +	 * calculated above.  If the huge page TSB has not been +	 * allocated, setup a trap stack and call hugetlb_setup() +	 * to do so, then return from the trap to replay the TLB +	 * miss. +	 * +	 * This is necessary to handle the case of transparent huge +	 * pages where we don't really have a non-atomic context +	 * in which to allocate the hugepage TSB hash table.  When +	 * the 'mm' faults in the hugepage for the first time, we +	 * thus handle it here.  This also makes sure that we can +	 * allocate the TSB hash table on the correct NUMA node.  	 */  	TRAP_LOAD_TRAP_BLOCK(%g7, %g2) -	ldx		[%g7 + TRAP_PER_CPU_TSB_HUGE_TEMP], %g2 -	cmp		%g2, -1 -	movne		%xcc, %g2, %g1 +	ldx		[%g7 + TRAP_PER_CPU_TSB_HUGE_TEMP], %g1 +	cmp		%g1, -1 +	bne,pt		%xcc, 60f +	 nop + +661:	rdpr		%pstate, %g5 +	wrpr		%g5, PSTATE_AG | PSTATE_MG, %pstate +	.section	.sun4v_2insn_patch, "ax" +	.word		661b +	SET_GL(1) +	nop +	.previous + +	rdpr	%tl, %g3 +	cmp	%g3, 1 +	bne,pn	%xcc, winfix_trampoline +	 nop +	ba,pt	%xcc, etrap +	 rd	%pc, %g7 +	call	hugetlb_setup +	 add	%sp, PTREGS_OFF, %o0 +	ba,pt	%xcc, rtrap +	 nop +  60:  #endif  |