diff options
Diffstat (limited to 'arch/parisc/kernel/processor.c')
| -rw-r--r-- | arch/parisc/kernel/processor.c | 32 | 
1 files changed, 25 insertions, 7 deletions
diff --git a/arch/parisc/kernel/processor.c b/arch/parisc/kernel/processor.c index 0ab32779dfa7..e120d63c1b28 100644 --- a/arch/parisc/kernel/processor.c +++ b/arch/parisc/kernel/processor.c @@ -30,6 +30,7 @@  #include <linux/mm.h>  #include <linux/module.h>  #include <linux/seq_file.h> +#include <linux/random.h>  #include <linux/slab.h>  #include <linux/cpu.h>  #include <asm/param.h> @@ -89,7 +90,7 @@ init_percpu_prof(unsigned long cpunum)   * (return 1).  If so, initialize the chip and tell other partners in crime    * they have work to do.   */ -static int processor_probe(struct parisc_device *dev) +static int __init processor_probe(struct parisc_device *dev)  {  	unsigned long txn_addr;  	unsigned long cpuid; @@ -237,28 +238,45 @@ static int processor_probe(struct parisc_device *dev)   */  void __init collect_boot_cpu_data(void)  { +	unsigned long cr16_seed; +  	memset(&boot_cpu_data, 0, sizeof(boot_cpu_data)); +	cr16_seed = get_cycles(); +	add_device_randomness(&cr16_seed, sizeof(cr16_seed)); +  	boot_cpu_data.cpu_hz = 100 * PAGE0->mem_10msec; /* Hz of this PARISC */  	/* get CPU-Model Information... */  #define p ((unsigned long *)&boot_cpu_data.pdc.model) -	if (pdc_model_info(&boot_cpu_data.pdc.model) == PDC_OK) +	if (pdc_model_info(&boot_cpu_data.pdc.model) == PDC_OK) {  		printk(KERN_INFO   			"model %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx %08lx\n",  			p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7], p[8]); + +		add_device_randomness(&boot_cpu_data.pdc.model, +			sizeof(boot_cpu_data.pdc.model)); +	}  #undef p -	if (pdc_model_versions(&boot_cpu_data.pdc.versions, 0) == PDC_OK) +	if (pdc_model_versions(&boot_cpu_data.pdc.versions, 0) == PDC_OK) {  		printk(KERN_INFO "vers  %08lx\n",   			boot_cpu_data.pdc.versions); -	if (pdc_model_cpuid(&boot_cpu_data.pdc.cpuid) == PDC_OK) +		add_device_randomness(&boot_cpu_data.pdc.versions, +			sizeof(boot_cpu_data.pdc.versions)); +	} + +	if (pdc_model_cpuid(&boot_cpu_data.pdc.cpuid) == PDC_OK) {  		printk(KERN_INFO "CPUID vers %ld rev %ld (0x%08lx)\n",  			(boot_cpu_data.pdc.cpuid >> 5) & 127,  			boot_cpu_data.pdc.cpuid & 31,  			boot_cpu_data.pdc.cpuid); +		add_device_randomness(&boot_cpu_data.pdc.cpuid, +			sizeof(boot_cpu_data.pdc.cpuid)); +	} +  	if (pdc_model_capabilities(&boot_cpu_data.pdc.capabilities) == PDC_OK)  		printk(KERN_INFO "capabilities 0x%lx\n",  			boot_cpu_data.pdc.capabilities); @@ -299,7 +317,7 @@ void __init collect_boot_cpu_data(void)   *   * o Enable CPU profiling hooks.   */ -int init_per_cpu(int cpunum) +int __init init_per_cpu(int cpunum)  {  	int ret;  	struct pdc_coproc_cfg coproc_cfg; @@ -414,12 +432,12 @@ show_cpuinfo (struct seq_file *m, void *v)  	return 0;  } -static const struct parisc_device_id processor_tbl[] = { +static const struct parisc_device_id processor_tbl[] __initconst = {  	{ HPHW_NPROC, HVERSION_REV_ANY_ID, HVERSION_ANY_ID, SVERSION_ANY_ID },  	{ 0, }  }; -static struct parisc_driver cpu_driver = { +static struct parisc_driver cpu_driver __refdata = {  	.name		= "CPU",  	.id_table	= processor_tbl,  	.probe		= processor_probe  |