This patch implements mtrr_save_fixed_ranges() which can be called from anywhere anytime to retrieve the fixed-range MTRRs from the current CPU and saves these MTRR values to the MTRR state struct.
This function calls get_fixed_ranges(), passing mtrr_state.fixed_ranges which is the element of the static struct which stores our current backup of the fixed-range MTRR values which all CPUs shall be using. Because mtrr_save_fixed_ranges calls get_fixed_ranges() after kernel initialisation time, __init needs to be removed from the declaration of get_fixed_ranges(). Signed-off-by: Bernhard Kaindl <[EMAIL PROTECTED]> --- linux-2.6.20.orig/arch/i386/kernel/cpu/mtrr/generic.c +++ linux-2.6.20/arch/i386/kernel/cpu/mtrr/generic.c @@ -37,7 +37,11 @@ get_mtrr_var_range(unsigned int index, s rdmsr(MTRRphysMask_MSR(index), vr->mask_lo, vr->mask_hi); } -static void __init +/** + * Retrieves the current fixed-range MTRRs from the current CPU + * \param frs address where to write the current MTRR contents + */ +static void get_fixed_ranges(mtrr_type * frs) { unsigned int *p = (unsigned int *) frs; @@ -51,6 +55,16 @@ get_fixed_ranges(mtrr_type * frs) rdmsr(MTRRfix4K_C0000_MSR + i, p[6 + i * 2], p[7 + i * 2]); } +/** + * Updates our copy of the state of the fixed-range MTRR values + * with the current fixed-range MTRR contents from the current CPU + * \param info dummy needed for use by smp_call_function_single() + */ +void mtrr_save_fixed_ranges(void *info) +{ + get_fixed_ranges(mtrr_state.fixed_ranges); +} + static void __init print_fixed(unsigned base, unsigned step, const mtrr_type*types) { unsigned i; Index: linux-2.6.20/include/asm-i386/mtrr.h =================================================================== --- linux-2.6.20.orig/include/asm-i386/mtrr.h +++ linux-2.6.20/include/asm-i386/mtrr.h @@ -69,6 +69,7 @@ struct mtrr_gentry /* The following functions are for use by other drivers */ # ifdef CONFIG_MTRR +extern void mtrr_save_fixed_ranges(void *); extern int mtrr_add (unsigned long base, unsigned long size, unsigned int type, char increment); extern int mtrr_add_page (unsigned long base, unsigned long size, @@ -79,6 +80,7 @@ extern void mtrr_centaur_report_mcr(int extern void mtrr_ap_init(void); extern void mtrr_bp_init(void); # else +#define mtrr_save_fixed_ranges(arg) do {} while (0) static __inline__ int mtrr_add (unsigned long base, unsigned long size, unsigned int type, char increment) { Index: linux-2.6.20/include/asm-x86_64/proto.h =================================================================== --- linux-2.6.20.orig/include/asm-x86_64/proto.h +++ linux-2.6.20/include/asm-x86_64/proto.h @@ -19,9 +19,11 @@ extern void mcheck_init(struct cpuinfo_x #ifdef CONFIG_MTRR extern void mtrr_ap_init(void); extern void mtrr_bp_init(void); +extern void mtrr_save_fixed_ranges(void *); #else #define mtrr_ap_init() do {} while (0) #define mtrr_bp_init() do {} while (0) +#define mtrr_save_fixed_ranges(arg) do {} while (0) #endif extern void init_memory_mapping(unsigned long start, unsigned long end); In this current implementation, which is used in other patches, mtrr_save_fixed_ranges() accepts a dummy void pointer because in the current implementation of one of these patches, this function may be called from smp_call_function_single() which requires that this function takes a void pointer argument. If CONFIG_MTRR is not set, we define mtrr_save_fixed_ranges as an empty statement because there is nothing to do. - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/