diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-07-27 15:16:38 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-07-27 15:16:38 -0400 |
| commit | 760dcc6e1839e7ca82507698fb077d5d78b24964 (patch) | |
| tree | 7b6ea512ea8cebd1573a77b9ff17c0c8a9865ddd | |
| parent | 4897f1011aff7534b8e319404f7cd4028de7a453 (diff) | |
| parent | 8d406c6de2e67b5bae3c43b62b492c4ff63afb92 (diff) | |
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
| -rw-r--r-- | arch/s390/kernel/early.c | 4 | ||||
| -rw-r--r-- | arch/s390/kernel/smp.c | 7 | ||||
| -rw-r--r-- | arch/s390/kernel/vdso64/clock_gettime.S | 11 | ||||
| -rw-r--r-- | arch/s390/power/swsusp.c | 36 | ||||
| -rw-r--r-- | arch/s390/power/swsusp_asm64.S | 35 | ||||
| -rw-r--r-- | drivers/s390/crypto/ap_bus.c | 9 |
6 files changed, 55 insertions, 47 deletions
diff --git a/arch/s390/kernel/early.c b/arch/s390/kernel/early.c index f9b144049dc9..8d15314381e0 100644 --- a/arch/s390/kernel/early.c +++ b/arch/s390/kernel/early.c | |||
| @@ -210,7 +210,7 @@ static noinline __init void detect_machine_type(void) | |||
| 210 | machine_flags |= MACHINE_FLAG_VM; | 210 | machine_flags |= MACHINE_FLAG_VM; |
| 211 | } | 211 | } |
| 212 | 212 | ||
| 213 | static void early_pgm_check_handler(void) | 213 | static __init void early_pgm_check_handler(void) |
| 214 | { | 214 | { |
| 215 | unsigned long addr; | 215 | unsigned long addr; |
| 216 | const struct exception_table_entry *fixup; | 216 | const struct exception_table_entry *fixup; |
| @@ -222,7 +222,7 @@ static void early_pgm_check_handler(void) | |||
| 222 | S390_lowcore.program_old_psw.addr = fixup->fixup | PSW_ADDR_AMODE; | 222 | S390_lowcore.program_old_psw.addr = fixup->fixup | PSW_ADDR_AMODE; |
| 223 | } | 223 | } |
| 224 | 224 | ||
| 225 | void setup_lowcore_early(void) | 225 | static noinline __init void setup_lowcore_early(void) |
| 226 | { | 226 | { |
| 227 | psw_t psw; | 227 | psw_t psw; |
| 228 | 228 | ||
diff --git a/arch/s390/kernel/smp.c b/arch/s390/kernel/smp.c index 2270730f5354..be2cae083406 100644 --- a/arch/s390/kernel/smp.c +++ b/arch/s390/kernel/smp.c | |||
| @@ -687,13 +687,14 @@ void __init smp_prepare_cpus(unsigned int max_cpus) | |||
| 687 | #ifndef CONFIG_64BIT | 687 | #ifndef CONFIG_64BIT |
| 688 | if (MACHINE_HAS_IEEE) | 688 | if (MACHINE_HAS_IEEE) |
| 689 | lowcore->extended_save_area_addr = (u32) save_area; | 689 | lowcore->extended_save_area_addr = (u32) save_area; |
| 690 | #else | ||
| 691 | if (vdso_alloc_per_cpu(smp_processor_id(), lowcore)) | ||
| 692 | BUG(); | ||
| 693 | #endif | 690 | #endif |
| 694 | set_prefix((u32)(unsigned long) lowcore); | 691 | set_prefix((u32)(unsigned long) lowcore); |
| 695 | local_mcck_enable(); | 692 | local_mcck_enable(); |
| 696 | local_irq_enable(); | 693 | local_irq_enable(); |
| 694 | #ifdef CONFIG_64BIT | ||
| 695 | if (vdso_alloc_per_cpu(smp_processor_id(), &S390_lowcore)) | ||
| 696 | BUG(); | ||
| 697 | #endif | ||
| 697 | for_each_possible_cpu(cpu) | 698 | for_each_possible_cpu(cpu) |
| 698 | if (cpu != smp_processor_id()) | 699 | if (cpu != smp_processor_id()) |
| 699 | smp_create_idle(cpu); | 700 | smp_create_idle(cpu); |
diff --git a/arch/s390/kernel/vdso64/clock_gettime.S b/arch/s390/kernel/vdso64/clock_gettime.S index 79dbfee831ec..49106c6e6f88 100644 --- a/arch/s390/kernel/vdso64/clock_gettime.S +++ b/arch/s390/kernel/vdso64/clock_gettime.S | |||
| @@ -88,10 +88,17 @@ __kernel_clock_gettime: | |||
| 88 | llilh %r4,0x0100 | 88 | llilh %r4,0x0100 |
| 89 | sar %a4,%r4 | 89 | sar %a4,%r4 |
| 90 | lghi %r4,0 | 90 | lghi %r4,0 |
| 91 | epsw %r5,0 | ||
| 91 | sacf 512 /* Magic ectg instruction */ | 92 | sacf 512 /* Magic ectg instruction */ |
| 92 | .insn ssf,0xc80100000000,__VDSO_ECTG_BASE(4),__VDSO_ECTG_USER(4),4 | 93 | .insn ssf,0xc80100000000,__VDSO_ECTG_BASE(4),__VDSO_ECTG_USER(4),4 |
| 93 | sacf 0 | 94 | tml %r5,0x4000 |
| 94 | sar %a4,%r2 | 95 | jo 11f |
| 96 | tml %r5,0x8000 | ||
| 97 | jno 10f | ||
| 98 | sacf 256 | ||
| 99 | j 11f | ||
| 100 | 10: sacf 0 | ||
| 101 | 11: sar %a4,%r2 | ||
| 95 | algr %r1,%r0 /* r1 = cputime as TOD value */ | 102 | algr %r1,%r0 /* r1 = cputime as TOD value */ |
| 96 | mghi %r1,1000 /* convert to nanoseconds */ | 103 | mghi %r1,1000 /* convert to nanoseconds */ |
| 97 | srlg %r1,%r1,12 /* r1 = cputime in nanosec */ | 104 | srlg %r1,%r1,12 /* r1 = cputime in nanosec */ |
diff --git a/arch/s390/power/swsusp.c b/arch/s390/power/swsusp.c index e6a4fe9f5f24..bd1f5c6b0b8c 100644 --- a/arch/s390/power/swsusp.c +++ b/arch/s390/power/swsusp.c | |||
| @@ -7,24 +7,36 @@ | |||
| 7 | * | 7 | * |
| 8 | */ | 8 | */ |
| 9 | 9 | ||
| 10 | #include <asm/system.h> | ||
| 10 | 11 | ||
| 11 | /* | ||
| 12 | * save CPU registers before creating a hibernation image and before | ||
| 13 | * restoring the memory state from it | ||
| 14 | */ | ||
| 15 | void save_processor_state(void) | 12 | void save_processor_state(void) |
| 16 | { | 13 | { |
| 17 | /* implentation contained in the | 14 | /* swsusp_arch_suspend() actually saves all cpu register contents. |
| 18 | * swsusp_arch_suspend function | 15 | * Machine checks must be disabled since swsusp_arch_suspend() stores |
| 16 | * register contents to their lowcore save areas. That's the same | ||
| 17 | * place where register contents on machine checks would be saved. | ||
| 18 | * To avoid register corruption disable machine checks. | ||
| 19 | * We must also disable machine checks in the new psw mask for | ||
| 20 | * program checks, since swsusp_arch_suspend() may generate program | ||
| 21 | * checks. Disabling machine checks for all other new psw masks is | ||
| 22 | * just paranoia. | ||
| 19 | */ | 23 | */ |
| 24 | local_mcck_disable(); | ||
| 25 | /* Disable lowcore protection */ | ||
| 26 | __ctl_clear_bit(0,28); | ||
| 27 | S390_lowcore.external_new_psw.mask &= ~PSW_MASK_MCHECK; | ||
| 28 | S390_lowcore.svc_new_psw.mask &= ~PSW_MASK_MCHECK; | ||
| 29 | S390_lowcore.io_new_psw.mask &= ~PSW_MASK_MCHECK; | ||
| 30 | S390_lowcore.program_new_psw.mask &= ~PSW_MASK_MCHECK; | ||
| 20 | } | 31 | } |
| 21 | 32 | ||
| 22 | /* | ||
| 23 | * restore the contents of CPU registers | ||
| 24 | */ | ||
| 25 | void restore_processor_state(void) | 33 | void restore_processor_state(void) |
| 26 | { | 34 | { |
| 27 | /* implentation contained in the | 35 | S390_lowcore.external_new_psw.mask |= PSW_MASK_MCHECK; |
| 28 | * swsusp_arch_resume function | 36 | S390_lowcore.svc_new_psw.mask |= PSW_MASK_MCHECK; |
| 29 | */ | 37 | S390_lowcore.io_new_psw.mask |= PSW_MASK_MCHECK; |
| 38 | S390_lowcore.program_new_psw.mask |= PSW_MASK_MCHECK; | ||
| 39 | /* Enable lowcore protection */ | ||
| 40 | __ctl_set_bit(0,28); | ||
| 41 | local_mcck_enable(); | ||
| 30 | } | 42 | } |
diff --git a/arch/s390/power/swsusp_asm64.S b/arch/s390/power/swsusp_asm64.S index 76d688da32fa..b26df5c5933e 100644 --- a/arch/s390/power/swsusp_asm64.S +++ b/arch/s390/power/swsusp_asm64.S | |||
| @@ -32,19 +32,14 @@ swsusp_arch_suspend: | |||
| 32 | /* Deactivate DAT */ | 32 | /* Deactivate DAT */ |
| 33 | stnsm __SF_EMPTY(%r15),0xfb | 33 | stnsm __SF_EMPTY(%r15),0xfb |
| 34 | 34 | ||
| 35 | /* Switch off lowcore protection */ | ||
| 36 | stctg %c0,%c0,__SF_EMPTY(%r15) | ||
| 37 | ni __SF_EMPTY+4(%r15),0xef | ||
| 38 | lctlg %c0,%c0,__SF_EMPTY(%r15) | ||
| 39 | |||
| 40 | /* Store prefix register on stack */ | 35 | /* Store prefix register on stack */ |
| 41 | stpx __SF_EMPTY(%r15) | 36 | stpx __SF_EMPTY(%r15) |
| 42 | 37 | ||
| 43 | /* Setup base register for lowcore (absolute 0) */ | 38 | /* Save prefix register contents for lowcore */ |
| 44 | llgf %r1,__SF_EMPTY(%r15) | 39 | llgf %r4,__SF_EMPTY(%r15) |
| 45 | 40 | ||
| 46 | /* Get pointer to save area */ | 41 | /* Get pointer to save area */ |
| 47 | aghi %r1,0x1000 | 42 | lghi %r1,0x1000 |
| 48 | 43 | ||
| 49 | /* Store registers */ | 44 | /* Store registers */ |
| 50 | mvc 0x318(4,%r1),__SF_EMPTY(%r15) /* move prefix to lowcore */ | 45 | mvc 0x318(4,%r1),__SF_EMPTY(%r15) /* move prefix to lowcore */ |
| @@ -79,17 +74,15 @@ swsusp_arch_suspend: | |||
| 79 | xc __SF_EMPTY(4,%r15),__SF_EMPTY(%r15) | 74 | xc __SF_EMPTY(4,%r15),__SF_EMPTY(%r15) |
| 80 | spx __SF_EMPTY(%r15) | 75 | spx __SF_EMPTY(%r15) |
| 81 | 76 | ||
| 82 | /* Setup lowcore */ | 77 | lghi %r2,0 |
| 83 | brasl %r14,setup_lowcore_early | 78 | lghi %r3,2*PAGE_SIZE |
| 79 | lghi %r5,2*PAGE_SIZE | ||
| 80 | 1: mvcle %r2,%r4,0 | ||
| 81 | jo 1b | ||
| 84 | 82 | ||
| 85 | /* Save image */ | 83 | /* Save image */ |
| 86 | brasl %r14,swsusp_save | 84 | brasl %r14,swsusp_save |
| 87 | 85 | ||
| 88 | /* Switch on lowcore protection */ | ||
| 89 | stctg %c0,%c0,__SF_EMPTY(%r15) | ||
| 90 | oi __SF_EMPTY+4(%r15),0x10 | ||
| 91 | lctlg %c0,%c0,__SF_EMPTY(%r15) | ||
| 92 | |||
| 93 | /* Restore prefix register and return */ | 86 | /* Restore prefix register and return */ |
| 94 | lghi %r1,0x1000 | 87 | lghi %r1,0x1000 |
| 95 | spx 0x318(%r1) | 88 | spx 0x318(%r1) |
| @@ -117,11 +110,6 @@ swsusp_arch_resume: | |||
| 117 | |||
