mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-09 14:43:16 +00:00
Merge branch 'for-linus' of git://git390.marist.edu/pub/scm/linux-2.6
* 'for-linus' of git://git390.marist.edu/pub/scm/linux-2.6: [S390] zcrypt: fix scheduling of hrtimer ap_poll_timer [S390] vdso: clock_gettime of CLOCK_THREAD_CPUTIME_ID with noexec=on [S390] vdso: fix per cpu area allocation [S390] hibernation: fix register corruption on machine checks [S390] hibernation: fix lowcore handling
This commit is contained in:
commit
760dcc6e18
@ -210,7 +210,7 @@ static noinline __init void detect_machine_type(void)
|
|||||||
machine_flags |= MACHINE_FLAG_VM;
|
machine_flags |= MACHINE_FLAG_VM;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void early_pgm_check_handler(void)
|
static __init void early_pgm_check_handler(void)
|
||||||
{
|
{
|
||||||
unsigned long addr;
|
unsigned long addr;
|
||||||
const struct exception_table_entry *fixup;
|
const struct exception_table_entry *fixup;
|
||||||
@ -222,7 +222,7 @@ static void early_pgm_check_handler(void)
|
|||||||
S390_lowcore.program_old_psw.addr = fixup->fixup | PSW_ADDR_AMODE;
|
S390_lowcore.program_old_psw.addr = fixup->fixup | PSW_ADDR_AMODE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void setup_lowcore_early(void)
|
static noinline __init void setup_lowcore_early(void)
|
||||||
{
|
{
|
||||||
psw_t psw;
|
psw_t psw;
|
||||||
|
|
||||||
|
@ -687,13 +687,14 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
|
|||||||
#ifndef CONFIG_64BIT
|
#ifndef CONFIG_64BIT
|
||||||
if (MACHINE_HAS_IEEE)
|
if (MACHINE_HAS_IEEE)
|
||||||
lowcore->extended_save_area_addr = (u32) save_area;
|
lowcore->extended_save_area_addr = (u32) save_area;
|
||||||
#else
|
|
||||||
if (vdso_alloc_per_cpu(smp_processor_id(), lowcore))
|
|
||||||
BUG();
|
|
||||||
#endif
|
#endif
|
||||||
set_prefix((u32)(unsigned long) lowcore);
|
set_prefix((u32)(unsigned long) lowcore);
|
||||||
local_mcck_enable();
|
local_mcck_enable();
|
||||||
local_irq_enable();
|
local_irq_enable();
|
||||||
|
#ifdef CONFIG_64BIT
|
||||||
|
if (vdso_alloc_per_cpu(smp_processor_id(), &S390_lowcore))
|
||||||
|
BUG();
|
||||||
|
#endif
|
||||||
for_each_possible_cpu(cpu)
|
for_each_possible_cpu(cpu)
|
||||||
if (cpu != smp_processor_id())
|
if (cpu != smp_processor_id())
|
||||||
smp_create_idle(cpu);
|
smp_create_idle(cpu);
|
||||||
|
@ -88,10 +88,17 @@ __kernel_clock_gettime:
|
|||||||
llilh %r4,0x0100
|
llilh %r4,0x0100
|
||||||
sar %a4,%r4
|
sar %a4,%r4
|
||||||
lghi %r4,0
|
lghi %r4,0
|
||||||
|
epsw %r5,0
|
||||||
sacf 512 /* Magic ectg instruction */
|
sacf 512 /* Magic ectg instruction */
|
||||||
.insn ssf,0xc80100000000,__VDSO_ECTG_BASE(4),__VDSO_ECTG_USER(4),4
|
.insn ssf,0xc80100000000,__VDSO_ECTG_BASE(4),__VDSO_ECTG_USER(4),4
|
||||||
sacf 0
|
tml %r5,0x4000
|
||||||
sar %a4,%r2
|
jo 11f
|
||||||
|
tml %r5,0x8000
|
||||||
|
jno 10f
|
||||||
|
sacf 256
|
||||||
|
j 11f
|
||||||
|
10: sacf 0
|
||||||
|
11: sar %a4,%r2
|
||||||
algr %r1,%r0 /* r1 = cputime as TOD value */
|
algr %r1,%r0 /* r1 = cputime as TOD value */
|
||||||
mghi %r1,1000 /* convert to nanoseconds */
|
mghi %r1,1000 /* convert to nanoseconds */
|
||||||
srlg %r1,%r1,12 /* r1 = cputime in nanosec */
|
srlg %r1,%r1,12 /* r1 = cputime in nanosec */
|
||||||
|
@ -7,24 +7,36 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <asm/system.h>
|
||||||
|
|
||||||
/*
|
|
||||||
* save CPU registers before creating a hibernation image and before
|
|
||||||
* restoring the memory state from it
|
|
||||||
*/
|
|
||||||
void save_processor_state(void)
|
void save_processor_state(void)
|
||||||
{
|
{
|
||||||
/* implentation contained in the
|
/* swsusp_arch_suspend() actually saves all cpu register contents.
|
||||||
* swsusp_arch_suspend function
|
* Machine checks must be disabled since swsusp_arch_suspend() stores
|
||||||
|
* register contents to their lowcore save areas. That's the same
|
||||||
|
* place where register contents on machine checks would be saved.
|
||||||
|
* To avoid register corruption disable machine checks.
|
||||||
|
* We must also disable machine checks in the new psw mask for
|
||||||
|
* program checks, since swsusp_arch_suspend() may generate program
|
||||||
|
* checks. Disabling machine checks for all other new psw masks is
|
||||||
|
* just paranoia.
|
||||||
*/
|
*/
|
||||||
|
local_mcck_disable();
|
||||||
|
/* Disable lowcore protection */
|
||||||
|
__ctl_clear_bit(0,28);
|
||||||
|
S390_lowcore.external_new_psw.mask &= ~PSW_MASK_MCHECK;
|
||||||
|
S390_lowcore.svc_new_psw.mask &= ~PSW_MASK_MCHECK;
|
||||||
|
S390_lowcore.io_new_psw.mask &= ~PSW_MASK_MCHECK;
|
||||||
|
S390_lowcore.program_new_psw.mask &= ~PSW_MASK_MCHECK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* restore the contents of CPU registers
|
|
||||||
*/
|
|
||||||
void restore_processor_state(void)
|
void restore_processor_state(void)
|
||||||
{
|
{
|
||||||
/* implentation contained in the
|
S390_lowcore.external_new_psw.mask |= PSW_MASK_MCHECK;
|
||||||
* swsusp_arch_resume function
|
S390_lowcore.svc_new_psw.mask |= PSW_MASK_MCHECK;
|
||||||
*/
|
S390_lowcore.io_new_psw.mask |= PSW_MASK_MCHECK;
|
||||||
|
S390_lowcore.program_new_psw.mask |= PSW_MASK_MCHECK;
|
||||||
|
/* Enable lowcore protection */
|
||||||
|
__ctl_set_bit(0,28);
|
||||||
|
local_mcck_enable();
|
||||||
}
|
}
|
||||||
|
@ -32,19 +32,14 @@ swsusp_arch_suspend:
|
|||||||
/* Deactivate DAT */
|
/* Deactivate DAT */
|
||||||
stnsm __SF_EMPTY(%r15),0xfb
|
stnsm __SF_EMPTY(%r15),0xfb
|
||||||
|
|
||||||
/* Switch off lowcore protection */
|
|
||||||
stctg %c0,%c0,__SF_EMPTY(%r15)
|
|
||||||
ni __SF_EMPTY+4(%r15),0xef
|
|
||||||
lctlg %c0,%c0,__SF_EMPTY(%r15)
|
|
||||||
|
|
||||||
/* Store prefix register on stack */
|
/* Store prefix register on stack */
|
||||||
stpx __SF_EMPTY(%r15)
|
stpx __SF_EMPTY(%r15)
|
||||||
|
|
||||||
/* Setup base register for lowcore (absolute 0) */
|
/* Save prefix register contents for lowcore */
|
||||||
llgf %r1,__SF_EMPTY(%r15)
|
llgf %r4,__SF_EMPTY(%r15)
|
||||||
|
|
||||||
/* Get pointer to save area */
|
/* Get pointer to save area */
|
||||||
aghi %r1,0x1000
|
lghi %r1,0x1000
|
||||||
|
|
||||||
/* Store registers */
|
/* Store registers */
|
||||||
mvc 0x318(4,%r1),__SF_EMPTY(%r15) /* move prefix to lowcore */
|
mvc 0x318(4,%r1),__SF_EMPTY(%r15) /* move prefix to lowcore */
|
||||||
@ -79,17 +74,15 @@ swsusp_arch_suspend:
|
|||||||
xc __SF_EMPTY(4,%r15),__SF_EMPTY(%r15)
|
xc __SF_EMPTY(4,%r15),__SF_EMPTY(%r15)
|
||||||
spx __SF_EMPTY(%r15)
|
spx __SF_EMPTY(%r15)
|
||||||
|
|
||||||
/* Setup lowcore */
|
lghi %r2,0
|
||||||
brasl %r14,setup_lowcore_early
|
lghi %r3,2*PAGE_SIZE
|
||||||
|
lghi %r5,2*PAGE_SIZE
|
||||||
|
1: mvcle %r2,%r4,0
|
||||||
|
jo 1b
|
||||||
|
|
||||||
/* Save image */
|
/* Save image */
|
||||||
brasl %r14,swsusp_save
|
brasl %r14,swsusp_save
|
||||||
|
|
||||||
/* Switch on lowcore protection */
|
|
||||||
stctg %c0,%c0,__SF_EMPTY(%r15)
|
|
||||||
oi __SF_EMPTY+4(%r15),0x10
|
|
||||||
lctlg %c0,%c0,__SF_EMPTY(%r15)
|
|
||||||
|
|
||||||
/* Restore prefix register and return */
|
/* Restore prefix register and return */
|
||||||
lghi %r1,0x1000
|
lghi %r1,0x1000
|
||||||
spx 0x318(%r1)
|
spx 0x318(%r1)
|
||||||
@ -117,11 +110,6 @@ swsusp_arch_resume:
|
|||||||
/* Deactivate DAT */
|
/* Deactivate DAT */
|
||||||
stnsm __SF_EMPTY(%r15),0xfb
|
stnsm __SF_EMPTY(%r15),0xfb
|
||||||
|
|
||||||
/* Switch off lowcore protection */
|
|
||||||
stctg %c0,%c0,__SF_EMPTY(%r15)
|
|
||||||
ni __SF_EMPTY+4(%r15),0xef
|
|
||||||
lctlg %c0,%c0,__SF_EMPTY(%r15)
|
|
||||||
|
|
||||||
/* Set prefix page to zero */
|
/* Set prefix page to zero */
|
||||||
xc __SF_EMPTY(4,%r15),__SF_EMPTY(%r15)
|
xc __SF_EMPTY(4,%r15),__SF_EMPTY(%r15)
|
||||||
spx __SF_EMPTY(%r15)
|
spx __SF_EMPTY(%r15)
|
||||||
@ -175,7 +163,7 @@ swsusp_arch_resume:
|
|||||||
/* Load old stack */
|
/* Load old stack */
|
||||||
lg %r15,0x2f8(%r13)
|
lg %r15,0x2f8(%r13)
|
||||||
|
|
||||||
/* Pointer to save arae */
|
/* Pointer to save area */
|
||||||
lghi %r13,0x1000
|
lghi %r13,0x1000
|
||||||
|
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
@ -187,11 +175,6 @@ swsusp_arch_resume:
|
|||||||
/* Restore prefix register */
|
/* Restore prefix register */
|
||||||
spx 0x318(%r13)
|
spx 0x318(%r13)
|
||||||
|
|
||||||
/* Switch on lowcore protection */
|
|
||||||
stctg %c0,%c0,__SF_EMPTY(%r15)
|
|
||||||
oi __SF_EMPTY+4(%r15),0x10
|
|
||||||
lctlg %c0,%c0,__SF_EMPTY(%r15)
|
|
||||||
|
|
||||||
/* Activate DAT */
|
/* Activate DAT */
|
||||||
stosm __SF_EMPTY(%r15),0x04
|
stosm __SF_EMPTY(%r15),0x04
|
||||||
|
|
||||||
|
@ -1145,12 +1145,17 @@ ap_config_timeout(unsigned long ptr)
|
|||||||
*/
|
*/
|
||||||
static inline void ap_schedule_poll_timer(void)
|
static inline void ap_schedule_poll_timer(void)
|
||||||
{
|
{
|
||||||
|
ktime_t hr_time;
|
||||||
if (ap_using_interrupts() || ap_suspend_flag)
|
if (ap_using_interrupts() || ap_suspend_flag)
|
||||||
return;
|
return;
|
||||||
if (hrtimer_is_queued(&ap_poll_timer))
|
if (hrtimer_is_queued(&ap_poll_timer))
|
||||||
return;
|
return;
|
||||||
hrtimer_start(&ap_poll_timer, ktime_set(0, poll_timeout),
|
if (ktime_to_ns(hrtimer_expires_remaining(&ap_poll_timer)) <= 0) {
|
||||||
HRTIMER_MODE_ABS);
|
hr_time = ktime_set(0, poll_timeout);
|
||||||
|
hrtimer_forward_now(&ap_poll_timer, hr_time);
|
||||||
|
hrtimer_restart(&ap_poll_timer);
|
||||||
|
}
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
x
Reference in New Issue
Block a user