提交 181da3c3 编写于 作者: L Linus Torvalds

Merge branch 'x86-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull x86 fixes from Peter Anvin:
 "A somewhat unpleasantly large collection of small fixes.  The big ones
  are the __visible tree sweep and a fix for 'earlyprintk=efi,keep'.  It
  was using __init functions with predictably suboptimal results.

  Another key fix is a build fix which would produce output that simply
  would not decompress correctly in some configuration, due to the
  existing Makefiles picking up an unfortunate local label and mistaking
  it for the global symbol _end.

  Additional fixes include the handling of 64-bit numbers when setting
  the vdso data page (a latent bug which became manifest when i386
  started exporting a vdso with time functions), a fix to the new MSR
  manipulation accessors which would cause features to not get properly
  unblocked, a build fix for 32-bit userland, and a few new platform
  quirks"

* 'x86-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  x86, vdso, time: Cast tv_nsec to u64 for proper shifting in update_vsyscall()
  x86: Fix typo in MSR_IA32_MISC_ENABLE_LIMIT_CPUID macro
  x86: Fix typo preventing msr_set/clear_bit from having an effect
  x86/intel: Add quirk to disable HPET for the Baytrail platform
  x86/hpet: Make boot_hpet_disable extern
  x86-64, build: Fix stack protector Makefile breakage with 32-bit userland
  x86/reboot: Add reboot quirk for Certec BPC600
  asmlinkage: Add explicit __visible to drivers/*, lib/*, kernel/*
  asmlinkage, x86: Add explicit __visible to arch/x86/*
  asmlinkage: Revert "lto: Make asmlinkage __visible"
  x86, build: Don't get confused by local symbols
  x86/efi: earlyprintk=efi,keep fix
...@@ -79,6 +79,7 @@ else ...@@ -79,6 +79,7 @@ else
UTS_MACHINE := x86_64 UTS_MACHINE := x86_64
CHECKFLAGS += -D__x86_64__ -m64 CHECKFLAGS += -D__x86_64__ -m64
biarch := -m64
KBUILD_AFLAGS += -m64 KBUILD_AFLAGS += -m64
KBUILD_CFLAGS += -m64 KBUILD_CFLAGS += -m64
......
...@@ -71,7 +71,7 @@ $(obj)/vmlinux.bin: $(obj)/compressed/vmlinux FORCE ...@@ -71,7 +71,7 @@ $(obj)/vmlinux.bin: $(obj)/compressed/vmlinux FORCE
SETUP_OBJS = $(addprefix $(obj)/,$(setup-y)) SETUP_OBJS = $(addprefix $(obj)/,$(setup-y))
sed-voffset := -e 's/^\([0-9a-fA-F]*\) . \(_text\|_end\)$$/\#define VO_\2 0x\1/p' sed-voffset := -e 's/^\([0-9a-fA-F]*\) [ABCDGRSTVW] \(_text\|_end\)$$/\#define VO_\2 0x\1/p'
quiet_cmd_voffset = VOFFSET $@ quiet_cmd_voffset = VOFFSET $@
cmd_voffset = $(NM) $< | sed -n $(sed-voffset) > $@ cmd_voffset = $(NM) $< | sed -n $(sed-voffset) > $@
...@@ -80,7 +80,7 @@ targets += voffset.h ...@@ -80,7 +80,7 @@ targets += voffset.h
$(obj)/voffset.h: vmlinux FORCE $(obj)/voffset.h: vmlinux FORCE
$(call if_changed,voffset) $(call if_changed,voffset)
sed-zoffset := -e 's/^\([0-9a-fA-F]*\) . \(startup_32\|startup_64\|efi32_stub_entry\|efi64_stub_entry\|efi_pe_entry\|input_data\|_end\|z_.*\)$$/\#define ZO_\2 0x\1/p' sed-zoffset := -e 's/^\([0-9a-fA-F]*\) [ABCDGRSTVW] \(startup_32\|startup_64\|efi32_stub_entry\|efi64_stub_entry\|efi_pe_entry\|input_data\|_end\|z_.*\)$$/\#define ZO_\2 0x\1/p'
quiet_cmd_zoffset = ZOFFSET $@ quiet_cmd_zoffset = ZOFFSET $@
cmd_zoffset = $(NM) $< | sed -n $(sed-zoffset) > $@ cmd_zoffset = $(NM) $< | sed -n $(sed-zoffset) > $@
......
...@@ -354,7 +354,7 @@ static void parse_elf(void *output) ...@@ -354,7 +354,7 @@ static void parse_elf(void *output)
free(phdrs); free(phdrs);
} }
asmlinkage void *decompress_kernel(void *rmode, memptr heap, asmlinkage __visible void *decompress_kernel(void *rmode, memptr heap,
unsigned char *input_data, unsigned char *input_data,
unsigned long input_len, unsigned long input_len,
unsigned char *output, unsigned char *output,
......
...@@ -63,6 +63,7 @@ ...@@ -63,6 +63,7 @@
/* hpet memory map physical address */ /* hpet memory map physical address */
extern unsigned long hpet_address; extern unsigned long hpet_address;
extern unsigned long force_hpet_address; extern unsigned long force_hpet_address;
extern int boot_hpet_disable;
extern u8 hpet_blockid; extern u8 hpet_blockid;
extern int hpet_force_user; extern int hpet_force_user;
extern u8 hpet_msi_disable; extern u8 hpet_msi_disable;
......
...@@ -384,7 +384,7 @@ ...@@ -384,7 +384,7 @@
#define MSR_IA32_MISC_ENABLE_MWAIT_BIT 18 #define MSR_IA32_MISC_ENABLE_MWAIT_BIT 18
#define MSR_IA32_MISC_ENABLE_MWAIT (1ULL << MSR_IA32_MISC_ENABLE_MWAIT_BIT) #define MSR_IA32_MISC_ENABLE_MWAIT (1ULL << MSR_IA32_MISC_ENABLE_MWAIT_BIT)
#define MSR_IA32_MISC_ENABLE_LIMIT_CPUID_BIT 22 #define MSR_IA32_MISC_ENABLE_LIMIT_CPUID_BIT 22
#define MSR_IA32_MISC_ENABLE_LIMIT_CPUID (1ULL << MSR_IA32_MISC_ENABLE_LIMIT_CPUID_BIT); #define MSR_IA32_MISC_ENABLE_LIMIT_CPUID (1ULL << MSR_IA32_MISC_ENABLE_LIMIT_CPUID_BIT)
#define MSR_IA32_MISC_ENABLE_XTPR_DISABLE_BIT 23 #define MSR_IA32_MISC_ENABLE_XTPR_DISABLE_BIT 23
#define MSR_IA32_MISC_ENABLE_XTPR_DISABLE (1ULL << MSR_IA32_MISC_ENABLE_XTPR_DISABLE_BIT) #define MSR_IA32_MISC_ENABLE_XTPR_DISABLE (1ULL << MSR_IA32_MISC_ENABLE_XTPR_DISABLE_BIT)
#define MSR_IA32_MISC_ENABLE_XD_DISABLE_BIT 34 #define MSR_IA32_MISC_ENABLE_XD_DISABLE_BIT 34
......
...@@ -31,7 +31,7 @@ static char temp_stack[4096]; ...@@ -31,7 +31,7 @@ static char temp_stack[4096];
* *
* Wrapper around acpi_enter_sleep_state() to be called by assmebly. * Wrapper around acpi_enter_sleep_state() to be called by assmebly.
*/ */
acpi_status asmlinkage x86_acpi_enter_sleep_state(u8 state) acpi_status asmlinkage __visible x86_acpi_enter_sleep_state(u8 state)
{ {
return acpi_enter_sleep_state(state); return acpi_enter_sleep_state(state);
} }
......
...@@ -2189,7 +2189,7 @@ void send_cleanup_vector(struct irq_cfg *cfg) ...@@ -2189,7 +2189,7 @@ void send_cleanup_vector(struct irq_cfg *cfg)
cfg->move_in_progress = 0; cfg->move_in_progress = 0;
} }
asmlinkage void smp_irq_move_cleanup_interrupt(void) asmlinkage __visible void smp_irq_move_cleanup_interrupt(void)
{ {
unsigned vector, me; unsigned vector, me;
......
...@@ -429,14 +429,14 @@ static inline void __smp_thermal_interrupt(void) ...@@ -429,14 +429,14 @@ static inline void __smp_thermal_interrupt(void)
smp_thermal_vector(); smp_thermal_vector();
} }
asmlinkage void smp_thermal_interrupt(struct pt_regs *regs) asmlinkage __visible void smp_thermal_interrupt(struct pt_regs *regs)
{ {
entering_irq(); entering_irq();
__smp_thermal_interrupt(); __smp_thermal_interrupt();
exiting_ack_irq(); exiting_ack_irq();
} }
asmlinkage void smp_trace_thermal_interrupt(struct pt_regs *regs) asmlinkage __visible void smp_trace_thermal_interrupt(struct pt_regs *regs)
{ {
entering_irq(); entering_irq();
trace_thermal_apic_entry(THERMAL_APIC_VECTOR); trace_thermal_apic_entry(THERMAL_APIC_VECTOR);
......
...@@ -24,14 +24,14 @@ static inline void __smp_threshold_interrupt(void) ...@@ -24,14 +24,14 @@ static inline void __smp_threshold_interrupt(void)
mce_threshold_vector(); mce_threshold_vector();
} }
asmlinkage void smp_threshold_interrupt(void) asmlinkage __visible void smp_threshold_interrupt(void)
{ {
entering_irq(); entering_irq();
__smp_threshold_interrupt(); __smp_threshold_interrupt();
exiting_ack_irq(); exiting_ack_irq();
} }
asmlinkage void smp_trace_threshold_interrupt(void) asmlinkage __visible void smp_trace_threshold_interrupt(void)
{ {
entering_irq(); entering_irq();
trace_threshold_apic_entry(THRESHOLD_APIC_VECTOR); trace_threshold_apic_entry(THRESHOLD_APIC_VECTOR);
......
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
#include <asm/dma.h> #include <asm/dma.h>
#include <asm/io_apic.h> #include <asm/io_apic.h>
#include <asm/apic.h> #include <asm/apic.h>
#include <asm/hpet.h>
#include <asm/iommu.h> #include <asm/iommu.h>
#include <asm/gart.h> #include <asm/gart.h>
#include <asm/irq_remapping.h> #include <asm/irq_remapping.h>
...@@ -530,6 +531,15 @@ static void __init intel_graphics_stolen(int num, int slot, int func) ...@@ -530,6 +531,15 @@ static void __init intel_graphics_stolen(int num, int slot, int func)
} }
} }
static void __init force_disable_hpet(int num, int slot, int func)
{
#ifdef CONFIG_HPET_TIMER
boot_hpet_disable = 1;
pr_info("x86/hpet: Will disable the HPET for this platform because it's not reliable\n");
#endif
}
#define QFLAG_APPLY_ONCE 0x1 #define QFLAG_APPLY_ONCE 0x1
#define QFLAG_APPLIED 0x2 #define QFLAG_APPLIED 0x2
#define QFLAG_DONE (QFLAG_APPLY_ONCE|QFLAG_APPLIED) #define QFLAG_DONE (QFLAG_APPLY_ONCE|QFLAG_APPLIED)
...@@ -567,6 +577,12 @@ static struct chipset early_qrk[] __initdata = { ...@@ -567,6 +577,12 @@ static struct chipset early_qrk[] __initdata = {
PCI_BASE_CLASS_BRIDGE, 0, intel_remapping_check }, PCI_BASE_CLASS_BRIDGE, 0, intel_remapping_check },
{ PCI_VENDOR_ID_INTEL, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA, PCI_ANY_ID, { PCI_VENDOR_ID_INTEL, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA, PCI_ANY_ID,
QFLAG_APPLY_ONCE, intel_graphics_stolen }, QFLAG_APPLY_ONCE, intel_graphics_stolen },
/*
* HPET on current version of Baytrail platform has accuracy
* problems, disable it for now:
*/
{ PCI_VENDOR_ID_INTEL, 0x0f00,
PCI_CLASS_BRIDGE_HOST, PCI_ANY_ID, 0, force_disable_hpet},
{} {}
}; };
......
...@@ -29,7 +29,7 @@ static void __init i386_default_early_setup(void) ...@@ -29,7 +29,7 @@ static void __init i386_default_early_setup(void)
reserve_ebda_region(); reserve_ebda_region();
} }
asmlinkage void __init i386_start_kernel(void) asmlinkage __visible void __init i386_start_kernel(void)
{ {
sanitize_boot_params(&boot_params); sanitize_boot_params(&boot_params);
......
...@@ -137,7 +137,7 @@ static void __init copy_bootdata(char *real_mode_data) ...@@ -137,7 +137,7 @@ static void __init copy_bootdata(char *real_mode_data)
} }
} }
asmlinkage void __init x86_64_start_kernel(char * real_mode_data) asmlinkage __visible void __init x86_64_start_kernel(char * real_mode_data)
{ {
int i; int i;
......
...@@ -88,7 +88,7 @@ static inline void hpet_clear_mapping(void) ...@@ -88,7 +88,7 @@ static inline void hpet_clear_mapping(void)
/* /*
* HPET command line enable / disable * HPET command line enable / disable
*/ */
static int boot_hpet_disable; int boot_hpet_disable;
int hpet_force_user; int hpet_force_user;
static int hpet_verbose; static int hpet_verbose;
......
...@@ -52,7 +52,7 @@ ...@@ -52,7 +52,7 @@
asmlinkage extern void ret_from_fork(void); asmlinkage extern void ret_from_fork(void);
asmlinkage DEFINE_PER_CPU(unsigned long, old_rsp); __visible DEFINE_PER_CPU(unsigned long, old_rsp);
/* Prints also some state that isn't saved in the pt_regs */ /* Prints also some state that isn't saved in the pt_regs */
void __show_regs(struct pt_regs *regs, int all) void __show_regs(struct pt_regs *regs, int all)
......
...@@ -191,6 +191,16 @@ static struct dmi_system_id __initdata reboot_dmi_table[] = { ...@@ -191,6 +191,16 @@ static struct dmi_system_id __initdata reboot_dmi_table[] = {
}, },
}, },
/* Certec */
{ /* Handle problems with rebooting on Certec BPC600 */
.callback = set_pci_reboot,
.ident = "Certec BPC600",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "Certec"),
DMI_MATCH(DMI_PRODUCT_NAME, "BPC600"),
},
},
/* Dell */ /* Dell */
{ /* Handle problems with rebooting on Dell DXP061 */ { /* Handle problems with rebooting on Dell DXP061 */
.callback = set_bios_reboot, .callback = set_bios_reboot,
......
...@@ -168,7 +168,7 @@ static int smp_stop_nmi_callback(unsigned int val, struct pt_regs *regs) ...@@ -168,7 +168,7 @@ static int smp_stop_nmi_callback(unsigned int val, struct pt_regs *regs)
* this function calls the 'stop' function on all other CPUs in the system. * this function calls the 'stop' function on all other CPUs in the system.
*/ */
asmlinkage void smp_reboot_interrupt(void) asmlinkage __visible void smp_reboot_interrupt(void)
{ {
ack_APIC_irq(); ack_APIC_irq();
irq_enter(); irq_enter();
......
...@@ -357,7 +357,7 @@ dotraplinkage void __kprobes notrace do_int3(struct pt_regs *regs, long error_co ...@@ -357,7 +357,7 @@ dotraplinkage void __kprobes notrace do_int3(struct pt_regs *regs, long error_co
* for scheduling or signal handling. The actual stack switch is done in * for scheduling or signal handling. The actual stack switch is done in
* entry.S * entry.S
*/ */
asmlinkage __kprobes struct pt_regs *sync_regs(struct pt_regs *eregs) asmlinkage __visible __kprobes struct pt_regs *sync_regs(struct pt_regs *eregs)
{ {
struct pt_regs *regs = eregs; struct pt_regs *regs = eregs;
/* Did already sync */ /* Did already sync */
...@@ -601,11 +601,11 @@ do_spurious_interrupt_bug(struct pt_regs *regs, long error_code) ...@@ -601,11 +601,11 @@ do_spurious_interrupt_bug(struct pt_regs *regs, long error_code)
#endif #endif
} }
asmlinkage void __attribute__((weak)) smp_thermal_interrupt(void) asmlinkage __visible void __attribute__((weak)) smp_thermal_interrupt(void)
{ {
} }
asmlinkage void __attribute__((weak)) smp_threshold_interrupt(void) asmlinkage __visible void __attribute__((weak)) smp_threshold_interrupt(void)
{ {
} }
......
...@@ -36,7 +36,7 @@ static int irq_routing_comply = 1; ...@@ -36,7 +36,7 @@ static int irq_routing_comply = 1;
* and vice versa. * and vice versa.
*/ */
asmlinkage unsigned long vsmp_save_fl(void) asmlinkage __visible unsigned long vsmp_save_fl(void)
{ {
unsigned long flags = native_save_fl(); unsigned long flags = native_save_fl();
...@@ -56,7 +56,7 @@ __visible void vsmp_restore_fl(unsigned long flags) ...@@ -56,7 +56,7 @@ __visible void vsmp_restore_fl(unsigned long flags)
} }
PV_CALLEE_SAVE_REGS_THUNK(vsmp_restore_fl); PV_CALLEE_SAVE_REGS_THUNK(vsmp_restore_fl);
asmlinkage void vsmp_irq_disable(void) asmlinkage __visible void vsmp_irq_disable(void)
{ {
unsigned long flags = native_save_fl(); unsigned long flags = native_save_fl();
...@@ -64,7 +64,7 @@ asmlinkage void vsmp_irq_disable(void) ...@@ -64,7 +64,7 @@ asmlinkage void vsmp_irq_disable(void)
} }
PV_CALLEE_SAVE_REGS_THUNK(vsmp_irq_disable); PV_CALLEE_SAVE_REGS_THUNK(vsmp_irq_disable);
asmlinkage void vsmp_irq_enable(void) asmlinkage __visible void vsmp_irq_enable(void)
{ {
unsigned long flags = native_save_fl(); unsigned long flags = native_save_fl();
......
...@@ -43,7 +43,7 @@ void update_vsyscall(struct timekeeper *tk) ...@@ -43,7 +43,7 @@ void update_vsyscall(struct timekeeper *tk)
vdata->monotonic_time_sec = tk->xtime_sec vdata->monotonic_time_sec = tk->xtime_sec
+ tk->wall_to_monotonic.tv_sec; + tk->wall_to_monotonic.tv_sec;
vdata->monotonic_time_snsec = tk->xtime_nsec vdata->monotonic_time_snsec = tk->xtime_nsec
+ (tk->wall_to_monotonic.tv_nsec + ((u64)tk->wall_to_monotonic.tv_nsec
<< tk->shift); << tk->shift);
while (vdata->monotonic_time_snsec >= while (vdata->monotonic_time_snsec >=
(((u64)NSEC_PER_SEC) << tk->shift)) { (((u64)NSEC_PER_SEC) << tk->shift)) {
......
...@@ -280,7 +280,7 @@ int kvm_set_apic_base(struct kvm_vcpu *vcpu, struct msr_data *msr_info) ...@@ -280,7 +280,7 @@ int kvm_set_apic_base(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
} }
EXPORT_SYMBOL_GPL(kvm_set_apic_base); EXPORT_SYMBOL_GPL(kvm_set_apic_base);
asmlinkage void kvm_spurious_fault(void) asmlinkage __visible void kvm_spurious_fault(void)
{ {
/* Fault while not rebooting. We want the trace. */ /* Fault while not rebooting. We want the trace. */
BUG(); BUG();
......
...@@ -233,13 +233,13 @@ static void lguest_end_context_switch(struct task_struct *next) ...@@ -233,13 +233,13 @@ static void lguest_end_context_switch(struct task_struct *next)
* flags word contains all kind of stuff, but in practice Linux only cares * flags word contains all kind of stuff, but in practice Linux only cares
* about the interrupt flag. Our "save_flags()" just returns that. * about the interrupt flag. Our "save_flags()" just returns that.
*/ */
asmlinkage unsigned long lguest_save_fl(void) asmlinkage __visible unsigned long lguest_save_fl(void)
{ {
return lguest_data.irq_enabled; return lguest_data.irq_enabled;
} }
/* Interrupts go off... */ /* Interrupts go off... */
asmlinkage void lguest_irq_disable(void) asmlinkage __visible void lguest_irq_disable(void)
{ {
lguest_data.irq_enabled = 0; lguest_data.irq_enabled = 0;
} }
......
...@@ -76,7 +76,7 @@ static inline int __flip_bit(u32 msr, u8 bit, bool set) ...@@ -76,7 +76,7 @@ static inline int __flip_bit(u32 msr, u8 bit, bool set)
if (m1.q == m.q) if (m1.q == m.q)
return 0; return 0;
err = msr_write(msr, &m); err = msr_write(msr, &m1);
if (err) if (err)
return err; return err;
......
...@@ -302,7 +302,7 @@ static struct { ...@@ -302,7 +302,7 @@ static struct {
0x242 in div_Xsig.S 0x242 in div_Xsig.S
*/ */
asmlinkage void FPU_exception(int n) asmlinkage __visible void FPU_exception(int n)
{ {
int i, int_type; int i, int_type;
...@@ -492,7 +492,7 @@ int real_2op_NaN(FPU_REG const *b, u_char tagb, ...@@ -492,7 +492,7 @@ int real_2op_NaN(FPU_REG const *b, u_char tagb,
/* Invalid arith operation on Valid registers */ /* Invalid arith operation on Valid registers */
/* Returns < 0 if the exception is unmasked */ /* Returns < 0 if the exception is unmasked */
asmlinkage int arith_invalid(int deststnr) asmlinkage __visible int arith_invalid(int deststnr)
{ {
EXCEPTION(EX_Invalid); EXCEPTION(EX_Invalid);
...@@ -507,7 +507,7 @@ asmlinkage int arith_invalid(int deststnr) ...@@ -507,7 +507,7 @@ asmlinkage int arith_invalid(int deststnr)
} }
/* Divide a finite number by zero */ /* Divide a finite number by zero */
asmlinkage int FPU_divide_by_zero(int deststnr, u_char sign) asmlinkage __visible int FPU_divide_by_zero(int deststnr, u_char sign)
{ {
FPU_REG *dest = &st(deststnr); FPU_REG *dest = &st(deststnr);
int tag = TAG_Valid; int tag = TAG_Valid;
...@@ -539,7 +539,7 @@ int set_precision_flag(int flags) ...@@ -539,7 +539,7 @@ int set_precision_flag(int flags)
} }
/* This may be called often, so keep it lean */ /* This may be called often, so keep it lean */
asmlinkage void set_precision_flag_up(void) asmlinkage __visible void set_precision_flag_up(void)
{ {
if (control_word & CW_Precision) if (control_word & CW_Precision)
partial_status |= (SW_Precision | SW_C1); /* The masked response */ partial_status |= (SW_Precision | SW_C1); /* The masked response */
...@@ -548,7 +548,7 @@ asmlinkage void set_precision_flag_up(void) ...@@ -548,7 +548,7 @@ asmlinkage void set_precision_flag_up(void)
} }
/* This may be called often, so keep it lean */ /* This may be called often, so keep it lean */
asmlinkage void set_precision_flag_down(void) asmlinkage __visible void set_precision_flag_down(void)
{ {
if (control_word & CW_Precision) { /* The masked response */ if (control_word & CW_Precision) { /* The masked response */
partial_status &= ~SW_C1; partial_status &= ~SW_C1;
...@@ -557,7 +557,7 @@ asmlinkage void set_precision_flag_down(void) ...@@ -557,7 +557,7 @@ asmlinkage void set_precision_flag_down(void)
EXCEPTION(EX_Precision); EXCEPTION(EX_Precision);
} }
asmlinkage int denormal_operand(void) asmlinkage __visible int denormal_operand(void)
{ {
if (control_word & CW_Denormal) { /* The masked response */ if (control_word & CW_Denormal) { /* The masked response */
partial_status |= SW_Denorm_Op; partial_status |= SW_Denorm_Op;
...@@ -568,7 +568,7 @@ asmlinkage int denormal_operand(void) ...@@ -568,7 +568,7 @@ asmlinkage int denormal_operand(void)
} }
} }
asmlinkage int arith_overflow(FPU_REG *dest) asmlinkage __visible int arith_overflow(FPU_REG *dest)
{ {
int tag = TAG_Valid; int tag = TAG_Valid;
...@@ -596,7 +596,7 @@ asmlinkage int arith_overflow(FPU_REG *dest) ...@@ -596,7 +596,7 @@ asmlinkage int arith_overflow(FPU_REG *dest)
} }
asmlinkage int arith_underflow(FPU_REG *dest) asmlinkage __visible int arith_underflow(FPU_REG *dest)
{ {
int tag = TAG_Valid; int tag = TAG_Valid;
......
...@@ -14,48 +14,92 @@ ...@@ -14,48 +14,92 @@
static const struct font_desc *font; static const struct font_desc *font;
static u32 efi_x, efi_y; static u32 efi_x, efi_y;
static void *efi_fb;
static bool early_efi_keep;
static __init void early_efi_clear_scanline(unsigned int y) /*
* efi earlyprintk need use early_ioremap to map the framebuffer.
* But early_ioremap is not usable for earlyprintk=efi,keep, ioremap should
* be used instead. ioremap will be available after paging_init() which is
* earlier than initcall callbacks. Thus adding this early initcall function
* early_efi_map_fb to map the whole efi framebuffer.
*/
static __init int early_efi_map_fb(void)
{ {
unsigned long base, *dst; unsigned long base, size;
u16 len;
if (!early_efi_keep)
return 0;
base = boot_params.screen_info.lfb_base; base = boot_params.screen_info.lfb_base;
len = boot_params.screen_info.lfb_linelength; size = boot_params.screen_info.lfb_size;
efi_fb = ioremap(base, size);
return efi_fb ? 0 : -ENOMEM;
}
early_initcall(early_efi_map_fb);
/*
* early_efi_map maps efi framebuffer region [start, start + len -1]
* In case earlyprintk=efi,keep we have the whole framebuffer mapped already
* so just return the offset efi_fb + start.
*/
static __init_refok void *early_efi_map(unsigned long start, unsigned long len)
{
unsigned long base;
base = boot_params.screen_info.lfb_base;
if (efi_fb)
return (efi_fb + start);
else
return early_ioremap(base + start, len);
}
dst = early_ioremap(base + y*len, len); static __init_refok void early_efi_unmap(void *addr, unsigned long len)
{
if (!efi_fb)
early_iounmap(addr, len);
}
static void early_efi_clear_scanline(unsigned int y)
{
unsigned long *dst;
u16 len;
len = boot_params.screen_info.lfb_linelength;
dst = early_efi_map(y*len, len);
if (!dst) if (!dst)
return; return;
memset(dst, 0, len); memset(dst, 0, len);
early_iounmap(dst, len); early_efi_unmap(dst, len);
} }
static __init void early_efi_scroll_up(void) static void early_efi_scroll_up(void)
{ {
unsigned long base, *dst, *src; unsigned long *dst, *src;
u16 len; u16 len;
u32 i, height; u32 i, height;
base = boot_params.screen_info.lfb_base;
len = boot_params.screen_info.lfb_linelength; len = boot_params.screen_info.lfb_linelength;
height = boot_params.screen_info.lfb_height; height = boot_params.screen_info.lfb_height;
for (i = 0; i < height - font->height; i++) { for (i = 0; i < height - font->height; i++) {
dst = early_ioremap(base + i*len, len); dst = early_efi_map(i*len, len);
if (!dst) if (!dst)
return; return;
src = early_ioremap(base + (i + font->height) * len, len); src = early_efi_map((i + font->height) * len, len);
if (!src) { if (!src) {
early_iounmap(dst, len); early_efi_unmap(dst, len);
return; return;
} }
memmove(dst, src, len); memmove(dst, src, len);
early_iounmap(src, len); early_efi_unmap(src, len);
early_iounmap(dst, len); early_efi_unmap(dst, len);
} }
} }
...@@ -79,16 +123,14 @@ static void early_efi_write_char(u32 *dst, unsigned char c, unsigned int h) ...@@ -79,16 +123,14 @@ static void early_efi_write_char(u32 *dst, unsigned char c, unsigned int h)
} }
} }
static __init void static void
early_efi_write(struct console *con, const char *str, unsigned int num) early_efi_write(struct console *con, const char *str, unsigned int num)
{ {
struct screen_info *si; struct screen_info *si;
unsigned long base;
unsigned int len; unsigned int len;
const char *s; const char *s;
void *dst; void *dst;
base = boot_params.screen_info.lfb_base;
si = &boot_params.screen_info; si = &boot_params.screen_info;
len = si->lfb_linelength; len = si->lfb_linelength;
...@@ -109,7 +151,7 @@ early_efi_write(struct console *con, const char *str, unsigned int num) ...@@ -109,7 +151,7 @@ early_efi_write(struct console *con, const char *str, unsigned int num)
for (h = 0; h < font->height; h++) { for (h = 0; h < font->height; h++) {
unsigned int n, x; unsigned int n, x;
dst = early_ioremap(base + (efi_y + h) * len, len); dst = early_efi_map((efi_y + h) * len, len);
if (!dst) if (!dst)
return; return;
...@@ -123,7 +165,7 @@ early_efi_write(struct console *con, const char *str, unsigned int num) ...@@ -123,7 +165,7 @@ early_efi_write(struct console *con, const char *str, unsigned int num)
s++; s++;
} }
early_iounmap(dst, len); early_efi_unmap(dst, len);
} }
num -= count; num -= count;
...@@ -179,6 +221,9 @@ static __init int early_efi_setup(struct console *con, char *options) ...@@ -179,6 +221,9 @@ static __init int early_efi_setup(struct console *con, char *options)
for (i = 0; i < (yres - efi_y) / font->height; i++) for (i = 0; i < (yres - efi_y) / font->height; i++)
early_efi_scroll_up(); early_efi_scroll_up();
/* early_console_register will unset CON_BOOT in case ,keep */
if (!(con->flags & CON_BOOT))
early_efi_keep = true;
return 0; return 0;
} }
......
...@@ -75,7 +75,7 @@ static int xo1_power_state_enter(suspend_state_t pm_state) ...@@ -75,7 +75,7 @@ static int xo1_power_state_enter(suspend_state_t pm_state)
return 0; return 0;
} }
asmlinkage int xo1_do_sleep(u8 sleep_state) asmlinkage __visible int xo1_do_sleep(u8 sleep_state)
{ {
void *pgd_addr = __va(read_cr3()); void *pgd_addr = __va(read_cr3());
......
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
extern __visible const void __nosave_begin, __nosave_end; extern __visible const void __nosave_begin, __nosave_end;
/* Defined in hibernate_asm_64.S */ /* Defined in hibernate_asm_64.S */
extern asmlinkage int restore_image(void); extern asmlinkage __visible int restore_image(void);
/* /*
* Address to jump to in the last phase of restore in order to get to the image * Address to jump to in the last phase of restore in order to get to the image
......
...@@ -1515,7 +1515,7 @@ static void __init xen_pvh_early_guest_init(void) ...@@ -1515,7 +1515,7 @@ static void __init xen_pvh_early_guest_init(void)
} }
/* First C function to be called on Xen boot */ /* First C function to be called on Xen boot */
asmlinkage void __init xen_start_kernel(void) asmlinkage __visible void __init xen_start_kernel(void)
{ {
struct physdev_set_iopl set_iopl; struct physdev_set_iopl set_iopl;
int rc; int rc;
......
...@@ -23,7 +23,7 @@ void xen_force_evtchn_callback(void) ...@@ -23,7 +23,7 @@ void xen_force_evtchn_callback(void)
(void)HYPERVISOR_xen_version(0, NULL); (void)HYPERVISOR_xen_version(0, NULL);
} }
asmlinkage unsigned long xen_save_fl(void) asmlinkage __visible unsigned long xen_save_fl(void)
{ {
struct vcpu_info *vcpu; struct vcpu_info *vcpu;
unsigned long flags; unsigned long flags;
...@@ -63,7 +63,7 @@ __visible void xen_restore_fl(unsigned long flags) ...@@ -63,7 +63,7 @@ __visible void xen_restore_fl(unsigned long flags)
} }
PV_CALLEE_SAVE_REGS_THUNK(xen_restore_fl); PV_CALLEE_SAVE_REGS_THUNK(xen_restore_fl);
asmlinkage void xen_irq_disable(void) asmlinkage __visible void xen_irq_disable(void)
{ {
/* There's a one instruction preempt window here. We need to /* There's a one instruction preempt window here. We need to
make sure we're don't switch CPUs between getting the vcpu make sure we're don't switch CPUs between getting the vcpu
...@@ -74,7 +74,7 @@ asmlinkage void xen_irq_disable(void) ...@@ -74,7 +74,7 @@ asmlinkage void xen_irq_disable(void)
} }
PV_CALLEE_SAVE_REGS_THUNK(xen_irq_disable); PV_CALLEE_SAVE_REGS_THUNK(xen_irq_disable);
asmlinkage void xen_irq_enable(void) asmlinkage __visible void xen_irq_enable(void)
{ {
struct vcpu_info *vcpu; struct vcpu_info *vcpu;
......
...@@ -37,7 +37,7 @@ __visible struct { ...@@ -37,7 +37,7 @@ __visible struct {
* kernel begins at offset 3GB... * kernel begins at offset 3GB...
*/ */
asmlinkage void pnp_bios_callfunc(void); asmlinkage __visible void pnp_bios_callfunc(void);
__asm__(".text \n" __asm__(".text \n"
__ALIGN_STR "\n" __ALIGN_STR "\n"
......
...@@ -12,9 +12,9 @@ ...@@ -12,9 +12,9 @@
#endif #endif
#ifdef __cplusplus #ifdef __cplusplus
#define CPP_ASMLINKAGE extern "C" __visible #define CPP_ASMLINKAGE extern "C"
#else #else
#define CPP_ASMLINKAGE __visible #define CPP_ASMLINKAGE
#endif #endif
#ifndef asmlinkage #ifndef asmlinkage
......
...@@ -476,7 +476,7 @@ static void __init mm_init(void) ...@@ -476,7 +476,7 @@ static void __init mm_init(void)
vmalloc_init(); vmalloc_init();
} }
asmlinkage void __init start_kernel(void) asmlinkage __visible void __init start_kernel(void)
{ {
char * command_line; char * command_line;
extern const struct kernel_param __start___param[], __stop___param[]; extern const struct kernel_param __start___param[], __stop___param[];
......
...@@ -120,7 +120,7 @@ void context_tracking_user_enter(void) ...@@ -120,7 +120,7 @@ void context_tracking_user_enter(void)
* instead of preempt_schedule() to exit user context if needed before * instead of preempt_schedule() to exit user context if needed before
* calling the scheduler. * calling the scheduler.
*/ */
asmlinkage void __sched notrace preempt_schedule_context(void) asmlinkage __visible void __sched notrace preempt_schedule_context(void)
{ {
enum ctx_state prev_ctx; enum ctx_state prev_ctx;
......
...@@ -4188,7 +4188,7 @@ void debug_show_held_locks(struct task_struct *task) ...@@ -4188,7 +4188,7 @@ void debug_show_held_locks(struct task_struct *task)
} }
EXPORT_SYMBOL_GPL(debug_show_held_locks); EXPORT_SYMBOL_GPL(debug_show_held_locks);
asmlinkage void lockdep_sys_exit(void) asmlinkage __visible void lockdep_sys_exit(void)
{ {
struct task_struct *curr = current; struct task_struct *curr = current;
......
...@@ -1586,7 +1586,7 @@ swsusp_alloc(struct memory_bitmap *orig_bm, struct memory_bitmap *copy_bm, ...@@ -1586,7 +1586,7 @@ swsusp_alloc(struct memory_bitmap *orig_bm, struct memory_bitmap *copy_bm,
return -ENOMEM; return -ENOMEM;
} }
asmlinkage int swsusp_save(void) asmlinkage __visible int swsusp_save(void)
{ {
unsigned int nr_pages, nr_highmem; unsigned int nr_pages, nr_highmem;
......
...@@ -1674,7 +1674,7 @@ EXPORT_SYMBOL(printk_emit); ...@@ -1674,7 +1674,7 @@ EXPORT_SYMBOL(printk_emit);
* *
* See the vsnprintf() documentation for format string extensions over C99. * See the vsnprintf() documentation for format string extensions over C99.
*/ */
asmlinkage int printk(const char *fmt, ...) asmlinkage __visible int printk(const char *fmt, ...)
{ {
va_list args; va_list args;
int r; int r;
...@@ -1737,7 +1737,7 @@ void early_vprintk(const char *fmt, va_list ap) ...@@ -1737,7 +1737,7 @@ void early_vprintk(const char *fmt, va_list ap)
} }
} }
asmlinkage void early_printk(const char *fmt, ...) asmlinkage __visible void early_printk(const char *fmt, ...)
{ {
va_list ap; va_list ap;
......
...@@ -2192,7 +2192,7 @@ static inline void post_schedule(struct rq *rq) ...@@ -2192,7 +2192,7 @@ static inline void post_schedule(struct rq *rq)
* schedule_tail - first thing a freshly forked thread must call. * schedule_tail - first thing a freshly forked thread must call.
* @prev: the thread we just switched away from. * @prev: the thread we just switched away from.
*/ */
asmlinkage void schedule_tail(struct task_struct *prev) asmlinkage __visible void schedule_tail(struct task_struct *prev)
__releases(rq->lock) __releases(rq->lock)
{ {
struct rq *rq = this_rq(); struct rq *rq = this_rq();
...@@ -2741,7 +2741,7 @@ static inline void sched_submit_work(struct task_struct *tsk) ...@@ -2741,7 +2741,7 @@ static inline void sched_submit_work(struct task_struct *tsk)
blk_schedule_flush_plug(tsk); blk_schedule_flush_plug(tsk);
} }
asmlinkage void __sched schedule(void) asmlinkage __visible void __sched schedule(void)
{ {
struct task_struct *tsk = current; struct task_struct *tsk = current;
...@@ -2751,7 +2751,7 @@ asmlinkage void __sched schedule(void) ...@@ -2751,7 +2751,7 @@ asmlinkage void __sched schedule(void)
EXPORT_SYMBOL(schedule); EXPORT_SYMBOL(schedule);
#ifdef CONFIG_CONTEXT_TRACKING #ifdef CONFIG_CONTEXT_TRACKING
asmlinkage void __sched schedule_user(void) asmlinkage __visible void __sched schedule_user(void)
{ {
/* /*
* If we come here after a random call to set_need_resched(), * If we come here after a random call to set_need_resched(),
...@@ -2783,7 +2783,7 @@ void __sched schedule_preempt_disabled(void) ...@@ -2783,7 +2783,7 @@ void __sched schedule_preempt_disabled(void)
* off of preempt_enable. Kernel preemptions off return from interrupt * off of preempt_enable. Kernel preemptions off return from interrupt
* occur there and call schedule directly. * occur there and call schedule directly.
*/ */
asmlinkage void __sched notrace preempt_schedule(void) asmlinkage __visible void __sched notrace preempt_schedule(void)
{ {
/* /*
* If there is a non-zero preempt_count or interrupts are disabled, * If there is a non-zero preempt_count or interrupts are disabled,
...@@ -2813,7 +2813,7 @@ EXPORT_SYMBOL(preempt_schedule); ...@@ -2813,7 +2813,7 @@ EXPORT_SYMBOL(preempt_schedule);
* Note, that this is called and return with irqs disabled. This will * Note, that this is called and return with irqs disabled. This will
* protect us against recursive calling from irq. * protect us against recursive calling from irq.
*/ */
asmlinkage void __sched preempt_schedule_irq(void) asmlinkage __visible void __sched preempt_schedule_irq(void)
{ {
enum ctx_state prev_state; enum ctx_state prev_state;
......
...@@ -223,7 +223,7 @@ static inline bool lockdep_softirq_start(void) { return false; } ...@@ -223,7 +223,7 @@ static inline bool lockdep_softirq_start(void) { return false; }
static inline void lockdep_softirq_end(bool in_hardirq) { } static inline void lockdep_softirq_end(bool in_hardirq) { }
#endif #endif
asmlinkage void __do_softirq(void) asmlinkage __visible void __do_softirq(void)
{ {
unsigned long end = jiffies + MAX_SOFTIRQ_TIME; unsigned long end = jiffies + MAX_SOFTIRQ_TIME;
unsigned long old_flags = current->flags; unsigned long old_flags = current->flags;
...@@ -299,7 +299,7 @@ asmlinkage void __do_softirq(void) ...@@ -299,7 +299,7 @@ asmlinkage void __do_softirq(void)
tsk_restore_flags(current, old_flags, PF_MEMALLOC); tsk_restore_flags(current, old_flags, PF_MEMALLOC);
} }
asmlinkage void do_softirq(void) asmlinkage __visible void do_softirq(void)
{ {
__u32 pending; __u32 pending;
unsigned long flags; unsigned long flags;
......
...@@ -23,7 +23,7 @@ static void __dump_stack(void) ...@@ -23,7 +23,7 @@ static void __dump_stack(void)
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
static atomic_t dump_lock = ATOMIC_INIT(-1); static atomic_t dump_lock = ATOMIC_INIT(-1);
asmlinkage void dump_stack(void) asmlinkage __visible void dump_stack(void)
{ {
int was_locked; int was_locked;
int old; int old;
...@@ -55,7 +55,7 @@ asmlinkage void dump_stack(void) ...@@ -55,7 +55,7 @@ asmlinkage void dump_stack(void)
preempt_enable(); preempt_enable();
} }
#else #else
asmlinkage void dump_stack(void) asmlinkage __visible void dump_stack(void)
{ {
__dump_stack(); __dump_stack();
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册