lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite for Android: free password hash cracker in your pocket
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:	Sat, 19 Jul 2008 11:16:12 +0200
From:	Joerg Roedel <joro@...tes.org>
To:	Yinghai Lu <yhlu.kernel@...il.com>
Cc:	Ingo Molnar <mingo@...e.hu>, Thomas Gleixner <tglx@...utronix.de>,
	"H. Peter Anvin" <hpa@...or.com>, linux-kernel@...r.kernel.org
Subject: Re: [PATCH] x86: introduce x86_ops

Hi Yinghai,

can you please write a short commit message explaining the benefit? Also
x86_ops sounds a bit too generic for some architecture specific
initialization function pointers imho.

Joerg

On Sat, Jul 19, 2008 at 02:07:25AM -0700, Yinghai Lu wrote:
> 
> Signed-off-by: Yinghai Lu <yhlu.kernel@...il.com>
> 
> ---
>  arch/x86/kernel/e820.c         |    9 +-------
>  arch/x86/kernel/mpparse.c      |   17 ++++------------
>  arch/x86/kernel/setup.c        |    4 +++
>  arch/x86/kernel/visws_quirks.c |   42 +++++++++++++++++++----------------------
>  arch/x86/mach-default/setup.c  |   24 +++++++----------------
>  include/asm-x86/setup.h        |   18 ++++++++++-------
>  6 files changed, 50 insertions(+), 64 deletions(-)
> 
> Index: linux-2.6/arch/x86/kernel/e820.c
> ===================================================================
> --- linux-2.6.orig/arch/x86/kernel/e820.c
> +++ linux-2.6/arch/x86/kernel/e820.c
> @@ -1299,11 +1299,6 @@ void __init e820_reserve_resources(void)
>  	}
>  }
>  
> -/*
> - * Non-standard memory setup can be specified via this quirk:
> - */
> -char * (*arch_memory_setup_quirk)(void);
> -
>  char *__init default_machine_specific_memory_setup(void)
>  {
>  	char *who = "BIOS-e820";
> @@ -1344,8 +1339,8 @@ char *__init default_machine_specific_me
>  
>  char *__init __attribute__((weak)) machine_specific_memory_setup(void)
>  {
> -	if (arch_memory_setup_quirk) {
> -		char *who = arch_memory_setup_quirk();
> +	if (x86_ops->arch_memory_setup) {
> +		char *who = x86_ops->arch_memory_setup();
>  
>  		if (who)
>  			return who;
> Index: linux-2.6/arch/x86/kernel/mpparse.c
> ===================================================================
> --- linux-2.6.orig/arch/x86/kernel/mpparse.c
> +++ linux-2.6/arch/x86/kernel/mpparse.c
> @@ -27,6 +27,7 @@
>  #include <asm/bios_ebda.h>
>  #include <asm/e820.h>
>  #include <asm/trampoline.h>
> +#include <asm/setup.h>
>  
>  #include <mach_apic.h>
>  #ifdef CONFIG_X86_32
> @@ -728,20 +729,14 @@ static inline void __init construct_defa
>  static struct intel_mp_floating *mpf_found;
>  
>  /*
> - * Machine specific quirk for finding the SMP config before other setup
> - * activities destroy the table:
> - */
> -int (*mach_get_smp_config_quirk)(unsigned int early);
> -
> -/*
>   * Scan the memory blocks for an SMP configuration block.
>   */
>  static void __init __get_smp_config(unsigned int early)
>  {
>  	struct intel_mp_floating *mpf = mpf_found;
>  
> -	if (mach_get_smp_config_quirk) {
> -		if (mach_get_smp_config_quirk(early))
> +	if (x86_ops->mach_get_smp_config) {
> +		if (x86_ops->mach_get_smp_config(early))
>  			return;
>  	}
>  	if (acpi_lapic && early)
> @@ -901,14 +896,12 @@ static int __init smp_scan_config(unsign
>  	return 0;
>  }
>  
> -int (*mach_find_smp_config_quirk)(unsigned int reserve);
> -
>  static void __init __find_smp_config(unsigned int reserve)
>  {
>  	unsigned int address;
>  
> -	if (mach_find_smp_config_quirk) {
> -		if (mach_find_smp_config_quirk(reserve))
> +	if (x86_ops->mach_find_smp_config) {
> +		if (x86_ops->mach_find_smp_config(reserve))
>  			return;
>  	}
>  	/*
> Index: linux-2.6/arch/x86/kernel/setup.c
> ===================================================================
> --- linux-2.6.orig/arch/x86/kernel/setup.c
> +++ linux-2.6/arch/x86/kernel/setup.c
> @@ -574,6 +574,10 @@ static int __init setup_elfcorehdr(char
>  early_param("elfcorehdr", setup_elfcorehdr);
>  #endif
>  
> +static struct x86_ops default_x86_ops __initdata;
> +
> +struct x86_ops *x86_ops __initdata = &default_x86_ops;
> +
>  /*
>   * Determine if we were loaded by an EFI loader.  If so, then we have also been
>   * passed the efi memmap, systab, etc., so we should use these data structures
> Index: linux-2.6/arch/x86/kernel/visws_quirks.c
> ===================================================================
> --- linux-2.6.orig/arch/x86/kernel/visws_quirks.c
> +++ linux-2.6/arch/x86/kernel/visws_quirks.c
> @@ -73,7 +73,7 @@ int is_visws_box(void)
>  	return visws_board_type >= 0;
>  }
>  
> -static int __init visws_time_init_quirk(void)
> +static int __init visws_time_init(void)
>  {
>  	printk(KERN_INFO "Starting Cobalt Timer system clock\n");
>  
> @@ -93,7 +93,7 @@ static int __init visws_time_init_quirk(
>  	return 0;
>  }
>  
> -static int __init visws_pre_intr_init_quirk(void)
> +static int __init visws_pre_intr_init(void)
>  {
>  	init_VISWS_APIC_irqs();
>  
> @@ -114,7 +114,7 @@ EXPORT_SYMBOL(sgivwfb_mem_size);
>  
>  long long mem_size __initdata = 0;
>  
> -static char * __init visws_memory_setup_quirk(void)
> +static char * __init visws_memory_setup(void)
>  {
>  	long long gfx_mem_size = 8 * MB;
>  
> @@ -176,7 +176,7 @@ static void visws_machine_power_off(void
>  	outl(PIIX_SPECIAL_STOP, 0xCFC);
>  }
>  
> -static int __init visws_get_smp_config_quirk(unsigned int early)
> +static int __init visws_get_smp_config(unsigned int early)
>  {
>  	/*
>  	 * Prevent MP-table parsing by the generic code:
> @@ -192,7 +192,7 @@ extern unsigned int __cpuinitdata maxcpu
>   * No problem for Linux.
>   */
>  
> -static void __init MP_processor_info (struct mpc_config_processor *m)
> +static void __init MP_processor_info(struct mpc_config_processor *m)
>  {
>  	int ver, logical_apicid;
>  	physid_mask_t apic_cpus;
> @@ -232,7 +232,7 @@ static void __init MP_processor_info (st
>  	apic_version[m->mpc_apicid] = ver;
>  }
>  
> -int __init visws_find_smp_config_quirk(unsigned int reserve)
> +static int __init visws_find_smp_config(unsigned int reserve)
>  {
>  	struct mpc_config_processor *mp = phys_to_virt(CO_CPU_TAB_PHYS);
>  	unsigned short ncpus = readw(phys_to_virt(CO_CPU_NUM_PHYS));
> @@ -258,7 +258,17 @@ int __init visws_find_smp_config_quirk(u
>  	return 1;
>  }
>  
> -extern int visws_trap_init_quirk(void);
> +static int visws_trap_init(void);
> +
> +static struct x86_ops visws_x86_ops __initdata = {
> +	.arch_time_init		= visws_time_init,
> +	.arch_pre_intr_init	= visws_pre_intr_init,
> +	.arch_memory_setup	= visws_memory_setup,
> +	.arch_intr_init		= NULL,
> +	.arch_trap_init		= visws_trap_init,
> +	.mach_get_smp_config	= visws_get_smp_config,
> +	.mach_find_smp_config	= visws_find_smp_config,
> +};
>  
>  void __init visws_early_detect(void)
>  {
> @@ -272,16 +282,10 @@ void __init visws_early_detect(void)
>  
>  	/*
>  	 * Install special quirks for timer, interrupt and memory setup:
> -	 */
> -	arch_time_init_quirk		= visws_time_init_quirk;
> -	arch_pre_intr_init_quirk	= visws_pre_intr_init_quirk;
> -	arch_memory_setup_quirk		= visws_memory_setup_quirk;
> -
> -	/*
>  	 * Fall back to generic behavior for traps:
> +	 * Override generic MP-table parsing:
>  	 */
> -	arch_intr_init_quirk		= NULL;
> -	arch_trap_init_quirk		= visws_trap_init_quirk;
> +	x86_ops = &visws_x86_ops;
>  
>  	/*
>  	 * Install reboot quirks:
> @@ -294,12 +298,6 @@ void __init visws_early_detect(void)
>  	 */
>  	no_broadcast = 0;
>  
> -	/*
> -	 * Override generic MP-table parsing:
> -	 */
> -	mach_get_smp_config_quirk	= visws_get_smp_config_quirk;
> -	mach_find_smp_config_quirk	= visws_find_smp_config_quirk;
> -
>  #ifdef CONFIG_X86_IO_APIC
>  	/*
>  	 * Turn off IO-APIC detection and initialization:
> @@ -426,7 +424,7 @@ static __init void cobalt_init(void)
>  		co_apic_read(CO_APIC_ID));
>  }
>  
> -int __init visws_trap_init_quirk(void)
> +static int __init visws_trap_init(void)
>  {
>  	lithium_init();
>  	cobalt_init();
> Index: linux-2.6/arch/x86/mach-default/setup.c
> ===================================================================
> --- linux-2.6.orig/arch/x86/mach-default/setup.c
> +++ linux-2.6/arch/x86/mach-default/setup.c
> @@ -10,14 +10,6 @@
>  #include <asm/e820.h>
>  #include <asm/setup.h>
>  
> -/*
> - * Any quirks to be performed to initialize timers/irqs/etc?
> - */
> -int (*arch_time_init_quirk)(void);
> -int (*arch_pre_intr_init_quirk)(void);
> -int (*arch_intr_init_quirk)(void);
> -int (*arch_trap_init_quirk)(void);
> -
>  #ifdef CONFIG_HOTPLUG_CPU
>  #define DEFAULT_SEND_IPI	(1)
>  #else
> @@ -37,8 +29,8 @@ int no_broadcast=DEFAULT_SEND_IPI;
>   **/
>  void __init pre_intr_init_hook(void)
>  {
> -	if (arch_pre_intr_init_quirk) {
> -		if (arch_pre_intr_init_quirk())
> +	if (x86_ops->arch_pre_intr_init) {
> +		if (x86_ops->arch_pre_intr_init())
>  			return;
>  	}
>  	init_ISA_irqs();
> @@ -64,8 +56,8 @@ static struct irqaction irq2 = {
>   **/
>  void __init intr_init_hook(void)
>  {
> -	if (arch_intr_init_quirk) {
> -		if (arch_intr_init_quirk())
> +	if (x86_ops->arch_intr_init) {
> +		if (x86_ops->arch_intr_init())
>  			return;
>  	}
>  #ifdef CONFIG_X86_LOCAL_APIC
> @@ -97,8 +89,8 @@ void __init pre_setup_arch_hook(void)
>   **/
>  void __init trap_init_hook(void)
>  {
> -	if (arch_trap_init_quirk) {
> -		if (arch_trap_init_quirk())
> +	if (x86_ops->arch_trap_init) {
> +		if (x86_ops->arch_trap_init())
>  			return;
>  	}
>  }
> @@ -119,13 +111,13 @@ static struct irqaction irq0  = {
>   **/
>  void __init time_init_hook(void)
>  {
> -	if (arch_time_init_quirk) {
> +	if (x86_ops->arch_time_init) {
>  		/*
>  		 * A nonzero return code does not mean failure, it means
>  		 * that the architecture quirk does not want any
>  		 * generic (timer) setup to be performed after this:
>  		 */
> -		if (arch_time_init_quirk())
> +		if (x86_ops->arch_time_init())
>  			return;
>  	}
>  
> Index: linux-2.6/include/asm-x86/setup.h
> ===================================================================
> --- linux-2.6.orig/include/asm-x86/setup.h
> +++ linux-2.6/include/asm-x86/setup.h
> @@ -19,13 +19,17 @@ static inline int is_visws_box(void) { r
>  /*
>   * Any setup quirks to be performed?
>   */
> -extern int (*arch_time_init_quirk)(void);
> -extern int (*arch_pre_intr_init_quirk)(void);
> -extern int (*arch_intr_init_quirk)(void);
> -extern int (*arch_trap_init_quirk)(void);
> -extern char * (*arch_memory_setup_quirk)(void);
> -extern int (*mach_get_smp_config_quirk)(unsigned int early);
> -extern int (*mach_find_smp_config_quirk)(unsigned int reserve);
> +struct x86_ops {
> +	int (*arch_time_init)(void);
> +	int (*arch_pre_intr_init)(void);
> +	int (*arch_intr_init)(void);
> +	int (*arch_trap_init)(void);
> +	char * (*arch_memory_setup)(void);
> +	int (*mach_get_smp_config)(unsigned int early);
> +	int (*mach_find_smp_config)(unsigned int reserve);
> +};
> +
> +extern struct x86_ops *x86_ops;
>  
>  #ifndef CONFIG_PARAVIRT
>  #define paravirt_post_allocator_init()	do {} while (0)
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@...r.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at  http://www.tux.org/lkml/
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists