提交 760dcc6e 编写于 作者: L Linus Torvalds

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
...@@ -210,7 +210,7 @@ static noinline __init void detect_machine_type(void) ...@@ -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) ...@@ -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) ...@@ -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: ...@@ -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 @@ ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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) ...@@ -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;
} }
/** /**
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册