diff options
| author | Ingo Molnar <mingo@kernel.org> | 2013-12-17 09:27:08 -0500 |
|---|---|---|
| committer | Ingo Molnar <mingo@kernel.org> | 2013-12-17 09:27:08 -0500 |
| commit | bb799d3b980eb803ca2da4a4eefbd9308f8d988a (patch) | |
| tree | 69fbe0cd6d47b23a50f5e1d87bf7489532fae149 /arch/s390/kernel | |
| parent | 919fc6e34831d1c2b58bfb5ae261dc3facc9b269 (diff) | |
| parent | 319e2e3f63c348a9b66db4667efa73178e18b17d (diff) | |
Merge tag 'v3.13-rc4' into core/locking
Merge Linux 3.13-rc4, to refresh this rather old tree with the latest fixes.
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'arch/s390/kernel')
| -rw-r--r-- | arch/s390/kernel/asm-offsets.c | 4 | ||||
| -rw-r--r-- | arch/s390/kernel/compat_signal.c | 2 | ||||
| -rw-r--r-- | arch/s390/kernel/pgm_check.S | 2 | ||||
| -rw-r--r-- | arch/s390/kernel/signal.c | 2 | ||||
| -rw-r--r-- | arch/s390/kernel/time.c | 46 | ||||
| -rw-r--r-- | arch/s390/kernel/vdso.c | 2 | ||||
| -rw-r--r-- | arch/s390/kernel/vdso32/clock_gettime.S | 31 | ||||
| -rw-r--r-- | arch/s390/kernel/vdso32/gettimeofday.S | 9 | ||||
| -rw-r--r-- | arch/s390/kernel/vdso64/clock_getres.S | 4 | ||||
| -rw-r--r-- | arch/s390/kernel/vdso64/clock_gettime.S | 24 | ||||
| -rw-r--r-- | arch/s390/kernel/vdso64/gettimeofday.S | 9 |
11 files changed, 69 insertions, 66 deletions
diff --git a/arch/s390/kernel/asm-offsets.c b/arch/s390/kernel/asm-offsets.c index 2416138ebd3e..e4c99a183651 100644 --- a/arch/s390/kernel/asm-offsets.c +++ b/arch/s390/kernel/asm-offsets.c | |||
| @@ -65,12 +65,14 @@ int main(void) | |||
| 65 | DEFINE(__VDSO_WTOM_NSEC, offsetof(struct vdso_data, wtom_clock_nsec)); | 65 | DEFINE(__VDSO_WTOM_NSEC, offsetof(struct vdso_data, wtom_clock_nsec)); |
| 66 | DEFINE(__VDSO_TIMEZONE, offsetof(struct vdso_data, tz_minuteswest)); | 66 | DEFINE(__VDSO_TIMEZONE, offsetof(struct vdso_data, tz_minuteswest)); |
| 67 | DEFINE(__VDSO_ECTG_OK, offsetof(struct vdso_data, ectg_available)); | 67 | DEFINE(__VDSO_ECTG_OK, offsetof(struct vdso_data, ectg_available)); |
| 68 | DEFINE(__VDSO_NTP_MULT, offsetof(struct vdso_data, ntp_mult)); | 68 | DEFINE(__VDSO_TK_MULT, offsetof(struct vdso_data, tk_mult)); |
| 69 | DEFINE(__VDSO_TK_SHIFT, offsetof(struct vdso_data, tk_shift)); | ||
| 69 | DEFINE(__VDSO_ECTG_BASE, offsetof(struct vdso_per_cpu_data, ectg_timer_base)); | 70 | DEFINE(__VDSO_ECTG_BASE, offsetof(struct vdso_per_cpu_data, ectg_timer_base)); |
| 70 | DEFINE(__VDSO_ECTG_USER, offsetof(struct vdso_per_cpu_data, ectg_user_time)); | 71 | DEFINE(__VDSO_ECTG_USER, offsetof(struct vdso_per_cpu_data, ectg_user_time)); |
| 71 | /* constants used by the vdso */ | 72 | /* constants used by the vdso */ |
| 72 | DEFINE(__CLOCK_REALTIME, CLOCK_REALTIME); | 73 | DEFINE(__CLOCK_REALTIME, CLOCK_REALTIME); |
| 73 | DEFINE(__CLOCK_MONOTONIC, CLOCK_MONOTONIC); | 74 | DEFINE(__CLOCK_MONOTONIC, CLOCK_MONOTONIC); |
| 75 | DEFINE(__CLOCK_THREAD_CPUTIME_ID, CLOCK_THREAD_CPUTIME_ID); | ||
| 74 | DEFINE(__CLOCK_REALTIME_RES, MONOTONIC_RES_NSEC); | 76 | DEFINE(__CLOCK_REALTIME_RES, MONOTONIC_RES_NSEC); |
| 75 | BLANK(); | 77 | BLANK(); |
| 76 | /* idle data offsets */ | 78 | /* idle data offsets */ |
diff --git a/arch/s390/kernel/compat_signal.c b/arch/s390/kernel/compat_signal.c index 6e2442978409..95e7ba0fbb7e 100644 --- a/arch/s390/kernel/compat_signal.c +++ b/arch/s390/kernel/compat_signal.c | |||
| @@ -194,7 +194,7 @@ static int restore_sigregs32(struct pt_regs *regs,_sigregs32 __user *sregs) | |||
| 194 | return -EINVAL; | 194 | return -EINVAL; |
| 195 | 195 | ||
| 196 | /* Use regs->psw.mask instead of PSW_USER_BITS to preserve PER bit. */ | 196 | /* Use regs->psw.mask instead of PSW_USER_BITS to preserve PER bit. */ |
| 197 | regs->psw.mask = (regs->psw.mask & ~PSW_MASK_USER) | | 197 | regs->psw.mask = (regs->psw.mask & ~(PSW_MASK_USER | PSW_MASK_RI)) | |
| 198 | (__u64)(user_sregs.regs.psw.mask & PSW32_MASK_USER) << 32 | | 198 | (__u64)(user_sregs.regs.psw.mask & PSW32_MASK_USER) << 32 | |
| 199 | (__u64)(user_sregs.regs.psw.mask & PSW32_MASK_RI) << 32 | | 199 | (__u64)(user_sregs.regs.psw.mask & PSW32_MASK_RI) << 32 | |
| 200 | (__u64)(user_sregs.regs.psw.addr & PSW32_ADDR_AMODE); | 200 | (__u64)(user_sregs.regs.psw.addr & PSW32_ADDR_AMODE); |
diff --git a/arch/s390/kernel/pgm_check.S b/arch/s390/kernel/pgm_check.S index 4a460c44e17e..813ec7260878 100644 --- a/arch/s390/kernel/pgm_check.S +++ b/arch/s390/kernel/pgm_check.S | |||
| @@ -78,7 +78,7 @@ PGM_CHECK_DEFAULT /* 34 */ | |||
| 78 | PGM_CHECK_DEFAULT /* 35 */ | 78 | PGM_CHECK_DEFAULT /* 35 */ |
| 79 | PGM_CHECK_DEFAULT /* 36 */ | 79 | PGM_CHECK_DEFAULT /* 36 */ |
| 80 | PGM_CHECK_DEFAULT /* 37 */ | 80 | PGM_CHECK_DEFAULT /* 37 */ |
| 81 | PGM_CHECK_DEFAULT /* 38 */ | 81 | PGM_CHECK_64BIT(do_dat_exception) /* 38 */ |
| 82 | PGM_CHECK_64BIT(do_dat_exception) /* 39 */ | 82 | PGM_CHECK_64BIT(do_dat_exception) /* 39 */ |
| 83 | PGM_CHECK_64BIT(do_dat_exception) /* 3a */ | 83 | PGM_CHECK_64BIT(do_dat_exception) /* 3a */ |
| 84 | PGM_CHECK_64BIT(do_dat_exception) /* 3b */ | 84 | PGM_CHECK_64BIT(do_dat_exception) /* 3b */ |
diff --git a/arch/s390/kernel/signal.c b/arch/s390/kernel/signal.c index fb535874a246..d8fd508ccd1e 100644 --- a/arch/s390/kernel/signal.c +++ b/arch/s390/kernel/signal.c | |||
| @@ -94,7 +94,7 @@ static int restore_sigregs(struct pt_regs *regs, _sigregs __user *sregs) | |||
| 94 | return -EINVAL; | 94 | return -EINVAL; |
| 95 | 95 | ||
| 96 | /* Use regs->psw.mask instead of PSW_USER_BITS to preserve PER bit. */ | 96 | /* Use regs->psw.mask instead of PSW_USER_BITS to preserve PER bit. */ |
| 97 | regs->psw.mask = (regs->psw.mask & ~PSW_MASK_USER) | | 97 | regs->psw.mask = (regs->psw.mask & ~(PSW_MASK_USER | PSW_MASK_RI)) | |
| 98 | (user_sregs.regs.psw.mask & (PSW_MASK_USER | PSW_MASK_RI)); | 98 | (user_sregs.regs.psw.mask & (PSW_MASK_USER | PSW_MASK_RI)); |
| 99 | /* Check for invalid user address space control. */ | 99 | /* Check for invalid user address space control. */ |
| 100 | if ((regs->psw.mask & PSW_MASK_ASC) == PSW_ASC_HOME) | 100 | if ((regs->psw.mask & PSW_MASK_ASC) == PSW_ASC_HOME) |
diff --git a/arch/s390/kernel/time.c b/arch/s390/kernel/time.c index 064c3082ab33..dd95f1631621 100644 --- a/arch/s390/kernel/time.c +++ b/arch/s390/kernel/time.c | |||
| @@ -108,20 +108,10 @@ static void fixup_clock_comparator(unsigned long long delta) | |||
| 108 | set_clock_comparator(S390_lowcore.clock_comparator); | 108 | set_clock_comparator(S390_lowcore.clock_comparator); |
| 109 | } | 109 | } |
| 110 | 110 | ||
| 111 | static int s390_next_ktime(ktime_t expires, | 111 | static int s390_next_event(unsigned long delta, |
| 112 | struct clock_event_device *evt) | 112 | struct clock_event_device *evt) |
| 113 | { | 113 | { |
| 114 | struct timespec ts; | 114 | S390_lowcore.clock_comparator = get_tod_clock() + delta; |
| 115 | u64 nsecs; | ||
| 116 | |||
| 117 | ts.tv_sec = ts.tv_nsec = 0; | ||
| 118 | monotonic_to_bootbased(&ts); | ||
| 119 | nsecs = ktime_to_ns(ktime_add(timespec_to_ktime(ts), expires)); | ||
| 120 | do_div(nsecs, 125); | ||
| 121 | S390_lowcore.clock_comparator = sched_clock_base_cc + (nsecs << 9); | ||
| 122 | /* Program the maximum value if we have an overflow (== year 2042) */ | ||
| 123 | if (unlikely(S390_lowcore.clock_comparator < sched_clock_base_cc)) | ||
| 124 | S390_lowcore.clock_comparator = -1ULL; | ||
| 125 | set_clock_comparator(S390_lowcore.clock_comparator); | 115 | set_clock_comparator(S390_lowcore.clock_comparator); |
| 126 | return 0; | 116 | return 0; |
| 127 | } | 117 | } |
| @@ -146,15 +136,14 @@ void init_cpu_timer(void) | |||
| 146 | cpu = smp_processor_id(); | 136 | cpu = smp_processor_id(); |
| 147 | cd = &per_cpu(comparators, cpu); | 137 | cd = &per_cpu(comparators, cpu); |
| 148 | cd->name = "comparator"; | 138 | cd->name = "comparator"; |
| 149 | cd->features = CLOCK_EVT_FEAT_ONESHOT | | 139 | cd->features = CLOCK_EVT_FEAT_ONESHOT; |
| 150 | CLOCK_EVT_FEAT_KTIME; | ||
| 151 | cd->mult = 16777; | 140 | cd->mult = 16777; |
| 152 | cd->shift = 12; | 141 | cd->shift = 12; |
| 153 | cd->min_delta_ns = 1; | 142 | cd->min_delta_ns = 1; |
| 154 | cd->max_delta_ns = LONG_MAX; | 143 | cd->max_delta_ns = LONG_MAX; |
| 155 | cd->rating = 400; | 144 | cd->rating = 400; |
| 156 | cd->cpumask = cpumask_of(cpu); | 145 | cd->cpumask = cpumask_of(cpu); |
| 157 | cd->set_next_ktime = s390_next_ktime; | 146 | cd->set_next_event = s390_next_event; |
| 158 | cd->set_mode = s390_set_mode; | 147 | cd->set_mode = s390_set_mode; |
| 159 | 148 | ||
| 160 | clockevents_register_device(cd); | 149 | clockevents_register_device(cd); |
| @@ -221,21 +210,30 @@ struct clocksource * __init clocksource_default_clock(void) | |||
| 221 | return &clocksource_tod; | 210 | return &clocksource_tod; |
| 222 | } | 211 | } |
| 223 | 212 | ||
| 224 | void update_vsyscall_old(struct timespec *wall_time, struct timespec *wtm, | 213 | void update_vsyscall(struct timekeeper *tk) |
| 225 | struct clocksource *clock, u32 mult) | ||
| 226 | { | 214 | { |
| 227 | if (clock != &clocksource_tod) | 215 | u64 nsecps; |
| 216 | |||
| 217 | if (tk->clock != &clocksource_tod) | ||
| 228 | return; | 218 | return; |
| 229 | 219 | ||
| 230 | /* Make userspace gettimeofday spin until we're done. */ | 220 | /* Make userspace gettimeofday spin until we're done. */ |
| 231 | ++vdso_data->tb_update_count; | 221 | ++vdso_data->tb_update_count; |
| 232 | smp_wmb(); | 222 | smp_wmb(); |
| 233 | vdso_data->xtime_tod_stamp = clock->cycle_last; | 223 | vdso_data->xtime_tod_stamp = tk->clock->cycle_last; |
| 234 | vdso_data->xtime_clock_sec = wall_time->tv_sec; | 224 | vdso_data->xtime_clock_sec = tk->xtime_sec; |
| 235 | vdso_data->xtime_clock_nsec = wall_time->tv_nsec; | 225 | vdso_data->xtime_clock_nsec = tk->xtime_nsec; |
| 236 | vdso_data->wtom_clock_sec = wtm->tv_sec; | 226 | vdso_data->wtom_clock_sec = |
| 237 | vdso_data->wtom_clock_nsec = wtm->tv_nsec; | 227 | tk->xtime_sec + tk->wall_to_monotonic.tv_sec; |
| 238 | vdso_data->ntp_mult = mult; | 228 | vdso_data->wtom_clock_nsec = tk->xtime_nsec + |
| 229 | + (tk->wall_to_monotonic.tv_nsec << tk->shift); | ||
| 230 | nsecps = (u64) NSEC_PER_SEC << tk->shift; | ||
| 231 | while (vdso_data->wtom_clock_nsec >= nsecps) { | ||
| 232 | vdso_data->wtom_clock_nsec -= nsecps; | ||
| 233 | vdso_data->wtom_clock_sec++; | ||
| 234 | } | ||
| 235 | vdso_data->tk_mult = tk->mult; | ||
| 236 | vdso_data->tk_shift = tk->shift; | ||
| 239 | smp_wmb(); | 237 | smp_wmb(); |
| 240 | ++vdso_data->tb_update_count; | 238 | ++vdso_data->tb_update_count; |
| 241 | } | 239 | } |
diff --git a/arch/s390/kernel/vdso.c b/arch/s390/kernel/vdso.c index a84476f2a9bb..613649096783 100644 --- a/arch/s390/kernel/vdso.c +++ b/arch/s390/kernel/vdso.c | |||
| @@ -125,7 +125,7 @@ int vdso_alloc_per_cpu(struct _lowcore *lowcore) | |||
| 125 | psal[i] = 0x80000000; | 125 | psal[i] = 0x80000000; |
| 126 | 126 | ||
| 127 | lowcore->paste[4] = (u32)(addr_t) psal; | 127 | lowcore->paste[4] = (u32)(addr_t) psal; |
| 128 | psal[0] = 0x20000000; | 128 | psal[0] = 0x02000000; |
| 129 | psal[2] = (u32)(addr_t) aste; | 129 | psal[2] = (u32)(addr_t) aste; |
| 130 | *(unsigned long *) (aste + 2) = segment_table + | 130 | *(unsigned long *) (aste + 2) = segment_table + |
| 131 | _ASCE_TABLE_LENGTH + _ASCE_USER_BITS + _ASCE_TYPE_SEGMENT; | 131 | _ASCE_TABLE_LENGTH + _ASCE_USER_BITS + _ASCE_TYPE_SEGMENT; |
diff --git a/arch/s390/kernel/vdso32/clock_gettime.S b/arch/s390/kernel/vdso32/clock_gettime.S index b2224e0b974c..65fc3979c2f1 100644 --- a/arch/s390/kernel/vdso32/clock_gettime.S +++ b/arch/s390/kernel/vdso32/clock_gettime.S | |||
| @@ -38,25 +38,21 @@ __kernel_clock_gettime: | |||
| 38 | sl %r1,__VDSO_XTIME_STAMP+4(%r5) | 38 | sl %r1,__VDSO_XTIME_STAMP+4(%r5) |
| 39 | brc 3,2f | 39 | brc 3,2f |
| 40 | ahi %r0,-1 | 40 | ahi %r0,-1 |
| 41 | 2: ms %r0,__VDSO_NTP_MULT(%r5) /* cyc2ns(clock,cycle_delta) */ | 41 | 2: ms %r0,__VDSO_TK_MULT(%r5) /* * tk->mult */ |
| 42 | lr %r2,%r0 | 42 | lr %r2,%r0 |
| 43 | l %r0,__VDSO_NTP_MULT(%r5) | 43 | l %r0,__VDSO_TK_MULT(%r5) |
| 44 | ltr %r1,%r1 | 44 | ltr %r1,%r1 |
| 45 | mr %r0,%r0 | 45 | mr %r0,%r0 |
| 46 | jnm 3f | 46 | jnm 3f |
| 47 | a %r0,__VDSO_NTP_MULT(%r5) | 47 | a %r0,__VDSO_TK_MULT(%r5) |
| 48 | 3: alr %r0,%r2 | 48 | 3: alr %r0,%r2 |
| 49 | srdl %r0,12 | 49 | al %r0,__VDSO_WTOM_NSEC(%r5) |
| 50 | al %r0,__VDSO_XTIME_NSEC(%r5) /* + xtime */ | ||
| 51 | al %r1,__VDSO_XTIME_NSEC+4(%r5) | ||
| 52 | brc 12,4f | ||
| 53 | ahi %r0,1 | ||
| 54 | 4: l %r2,__VDSO_XTIME_SEC+4(%r5) | ||
| 55 | al %r0,__VDSO_WTOM_NSEC(%r5) /* + wall_to_monotonic */ | ||
| 56 | al %r1,__VDSO_WTOM_NSEC+4(%r5) | 50 | al %r1,__VDSO_WTOM_NSEC+4(%r5) |
| 57 | brc 12,5f | 51 | brc 12,5f |
| 58 | ahi %r0,1 | 52 | ahi %r0,1 |
| 59 | 5: al %r2,__VDSO_WTOM_SEC+4(%r5) | 53 | 5: l %r2,__VDSO_TK_SHIFT(%r5) /* Timekeeper shift */ |
| 54 | srdl %r0,0(%r2) /* >> tk->shift */ | ||
| 55 | l %r2,__VDSO_WTOM_SEC+4(%r5) | ||
| 60 | cl %r4,__VDSO_UPD_COUNT+4(%r5) /* check update counter */ | 56 | cl %r4,__VDSO_UPD_COUNT+4(%r5) /* check update counter */ |
| 61 | jne 1b | 57 | jne 1b |
| 62 | basr %r5,0 | 58 | basr %r5,0 |
| @@ -86,20 +82,21 @@ __kernel_clock_gettime: | |||
| 86 | sl %r1,__VDSO_XTIME_STAMP+4(%r5) | 82 | sl %r1,__VDSO_XTIME_STAMP+4(%r5) |
| 87 | brc 3,12f | 83 | brc 3,12f |
| 88 | ahi %r0,-1 | 84 | ahi %r0,-1 |
| 89 | 12: ms %r0,__VDSO_NTP_MULT(%r5) /* cyc2ns(clock,cycle_delta) */ | 85 | 12: ms %r0,__VDSO_TK_MULT(%r5) /* * tk->mult */ |
| 90 | lr %r2,%r0 | 86 | lr %r2,%r0 |
| 91 | l %r0,__VDSO_NTP_MULT(%r5) | 87 | l %r0,__VDSO_TK_MULT(%r5) |
| 92 | ltr %r1,%r1 | 88 | ltr %r1,%r1 |
| 93 | mr %r0,%r0 | 89 | mr %r0,%r0 |
| 94 | jnm 13f | 90 | jnm 13f |
| 95 | a %r0,__VDSO_NTP_MULT(%r5) | 91 | a %r0,__VDSO_TK_MULT(%r5) |
| 96 | 13: alr %r0,%r2 | 92 | 13: alr %r0,%r2 |
| 97 | srdl %r0,12 | 93 | al %r0,__VDSO_XTIME_NSEC(%r5) /* + tk->xtime_nsec */ |
| 98 | al %r0,__VDSO_XTIME_NSEC(%r5) /* + xtime */ | ||
| 99 | al %r1,__VDSO_XTIME_NSEC+4(%r5) | 94 | al %r1,__VDSO_XTIME_NSEC+4(%r5) |
| 100 | brc 12,14f | 95 | brc 12,14f |
| 101 | ahi %r0,1 | 96 | ahi %r0,1 |
| 102 | 14: l %r2,__VDSO_XTIME_SEC+4(%r5) | 97 | 14: l %r2,__VDSO_TK_SHIFT(%r5) /* Timekeeper shift */ |
| 98 | srdl %r0,0(%r2) /* >> tk->shift */ | ||
| 99 | l %r2,__VDSO_XTIME_SEC+4(%r5) | ||
| 103 | cl %r4,__VDSO_UPD_COUNT+4(%r5) /* check update counter */ | 100 | cl %r4,__VDSO_UPD_COUNT+4(%r5) /* check update counter */ |
| 104 | jne 11b | 101 | jne 11b |
| 105 | basr %r5,0 | 102 | basr %r5,0 |
diff --git a/arch/s390/kernel/vdso32/gettimeofday.S b/arch/s390/kernel/vdso32/gettimeofday.S index 2d3633175e3b..fd621a950f7c 100644 --- a/arch/s390/kernel/vdso32/gettimeofday.S +++ b/arch/s390/kernel/vdso32/gettimeofday.S | |||
| @@ -35,15 +35,14 @@ __kernel_gettimeofday: | |||
| 35 | sl %r1,__VDSO_XTIME_STAMP+4(%r5) | 35 | sl %r1,__VDSO_XTIME_STAMP+4(%r5) |
| 36 | brc 3,3f | 36 | brc 3,3f |
| 37 | ahi %r0,-1 | 37 | ahi %r0,-1 |
| 38 | 3: ms %r0,__VDSO_NTP_MULT(%r5) /* cyc2ns(clock,cycle_delta) */ | 38 | 3: ms %r0,__VDSO_TK_MULT(%r5) /* * tk->mult */ |
| 39 | st %r0,24(%r15) | 39 | st %r0,24(%r15) |
| 40 | l %r0,__VDSO_NTP_MULT(%r5) | 40 | l %r0,__VDSO_TK_MULT(%r5) |
| 41 | ltr %r1,%r1 | 41 | ltr %r1,%r1 |
| 42 | mr %r0,%r0 | 42 | mr %r0,%r0 |
| 43 | jnm 4f | 43 | jnm 4f |
| 44 | a %r0,__VDSO_NTP_MULT(%r5) | 44 | a %r0,__VDSO_TK_MULT(%r5) |
| 45 | 4: al %r0,24(%r15) | 45 | 4: al %r0,24(%r15) |
| 46 | srdl %r0,12 | ||
| 47 | al %r0,__VDSO_XTIME_NSEC(%r5) /* + xtime */ | 46 | al %r0,__VDSO_XTIME_NSEC(%r5) /* + xtime */ |
| 48 | al %r1,__VDSO_XTIME_NSEC+4(%r5) | 47 | al %r1,__VDSO_XTIME_NSEC+4(%r5) |
| 49 | brc 12,5f | 48 | brc 12,5f |
| @@ -51,6 +50,8 @@ __kernel_gettimeofday: | |||
| 51 | 5: mvc 24(4,%r15),__VDSO_XTIME_SEC+4(%r5) | 50 | 5: mvc 24(4,%r15),__VDSO_XTIME_SEC+4(%r5) |
| 52 | cl %r4,__VDSO_UPD_COUNT+4(%r5) /* check update counter */ | 51 | cl %r4,__VDSO_UPD_COUNT+4(%r5) /* check update counter */ |
| 53 | jne 1b | 52 | jne 1b |
| 53 | l %r4,__VDSO_TK_SHIFT(%r5) /* Timekeeper shift */ | ||
| 54 | srdl %r0,0(%r4) /* >> tk->shift */ | ||
| 54 | l %r4,24(%r15) /* get tv_sec from stack */ | 55 | l %r4,24(%r15) /* get tv_sec from stack */ |
| 55 | basr %r5,0 | 56 | basr %r5,0 |
| 56 | 6: ltr %r0,%r0 | 57 | 6: ltr %r0,%r0 |
diff --git a/arch/s390/kernel/vdso64/clock_getres.S b/arch/s390/kernel/vdso64/clock_getres.S index 176e1f75f9aa..34deba7c7ed1 100644 --- a/arch/s390/kernel/vdso64/clock_getres.S +++ b/arch/s390/kernel/vdso64/clock_getres.S | |||
| @@ -23,7 +23,9 @@ __kernel_clock_getres: | |||
| 23 | je 0f | 23 | je 0f |
| 24 | cghi %r2,__CLOCK_MONOTONIC | 24 | cghi %r2,__CLOCK_MONOTONIC |
| 25 | je 0f | 25 | je 0f |
| 26 | cghi %r2,-2 /* CLOCK_THREAD_CPUTIME_ID for this thread */ | 26 | cghi %r2,__CLOCK_THREAD_CPUTIME_ID |
| 27 | je 0f | ||
| 28 | cghi %r2,-2 /* Per-thread CPUCLOCK with PID=0, VIRT=1 */ | ||
| 27 | jne 2f | 29 | jne 2f |
| 28 | larl %r5,_vdso_data | 30 | larl %r5,_vdso_data |
| 29 | icm %r0,15,__LC_ECTG_OK(%r5) | 31 | icm %r0,15,__LC_ECTG_OK(%r5) |
diff --git a/arch/s390/kernel/vdso64/clock_gettime.S b/arch/s390/kernel/vdso64/clock_gettime.S index d46c95ed5f19..91940ed33a4a 100644 --- a/arch/s390/kernel/vdso64/clock_gettime.S +++ b/arch/s390/kernel/vdso64/clock_gettime.S | |||
| @@ -22,7 +22,9 @@ __kernel_clock_gettime: | |||
| 22 | larl %r5,_vdso_data | 22 | larl %r5,_vdso_data |
| 23 | cghi %r2,__CLOCK_REALTIME | 23 | cghi %r2,__CLOCK_REALTIME |
| 24 | je 4f | 24 | je 4f |
| 25 | cghi %r2,-2 /* CLOCK_THREAD_CPUTIME_ID for this thread */ | 25 | cghi %r2,__CLOCK_THREAD_CPUTIME_ID |
| 26 | je 9f | ||
| 27 | cghi %r2,-2 /* Per-thread CPUCLOCK with PID=0, VIRT=1 */ | ||
| 26 | je 9f | 28 | je 9f |
| 27 | cghi %r2,__CLOCK_MONOTONIC | 29 | cghi %r2,__CLOCK_MONOTONIC |
| 28 | jne 12f | 30 | jne 12f |
| @@ -34,14 +36,13 @@ __kernel_clock_gettime: | |||
| 34 | tmll %r4,0x0001 /* pending update ? loop */ | 36 | tmll %r4,0x0001 /* pending update ? loop */ |
| 35 | jnz 0b | 37 | jnz 0b |
| 36 | stck 48(%r15) /* Store TOD clock */ | 38 | stck 48(%r15) /* Store TOD clock */ |
| 39 | lgf %r2,__VDSO_TK_SHIFT(%r5) /* Timekeeper shift */ | ||
| 40 | lg %r0,__VDSO_WTOM_SEC(%r5) | ||
| 37 | lg %r1,48(%r15) | 41 | lg %r1,48(%r15) |
| 38 | sg %r1,__VDSO_XTIME_STAMP(%r5) /* TOD - cycle_last */ | 42 | sg %r1,__VDSO_XTIME_STAMP(%r5) /* TOD - cycle_last */ |
| 39 | msgf %r1,__VDSO_NTP_MULT(%r5) /* * NTP adjustment */ | 43 | msgf %r1,__VDSO_TK_MULT(%r5) /* * tk->mult */ |
| 40 | srlg %r1,%r1,12 /* cyc2ns(clock,cycle_delta) */ | 44 | alg %r1,__VDSO_WTOM_NSEC(%r5) |
| 41 | alg %r1,__VDSO_XTIME_NSEC(%r5) /* + xtime */ | 45 | srlg %r1,%r1,0(%r2) /* >> tk->shift */ |
| 42 | lg %r0,__VDSO_XTIME_SEC(%r5) | ||
| 43 | alg %r1,__VDSO_WTOM_NSEC(%r5) /* + wall_to_monotonic */ | ||
| 44 | alg %r0,__VDSO_WTOM_SEC(%r5) | ||
| 45 | clg %r4,__VDSO_UPD_COUNT(%r5) /* check update counter */ | 46 | clg %r4,__VDSO_UPD_COUNT(%r5) /* check update counter */ |
| 46 | jne 0b | 47 | jne 0b |
| 47 | larl %r5,13f | 48 | larl %r5,13f |
| @@ -62,12 +63,13 @@ __kernel_clock_gettime: | |||
| 62 | tmll %r4,0x0001 /* pending update ? loop */ | 63 | tmll %r4,0x0001 /* pending update ? loop */ |
| 63 | jnz 5b | 64 | jnz 5b |
| 64 | stck 48(%r15) /* Store TOD clock */ | 65 | stck 48(%r15) /* Store TOD clock */ |
| 66 | lgf %r2,__VDSO_TK_SHIFT(%r5) /* Timekeeper shift */ | ||
| 65 | lg %r1,48(%r15) | 67 | lg %r1,48(%r15) |
| 66 | sg %r1,__VDSO_XTIME_STAMP(%r5) /* TOD - cycle_last */ | 68 | sg %r1,__VDSO_XTIME_STAMP(%r5) /* TOD - cycle_last */ |
| 67 | msgf %r1,__VDSO_NTP_MULT(%r5) /* * NTP adjustment */ | 69 | msgf %r1,__VDSO_TK_MULT(%r5) /* * tk->mult */ |
| 68 | srlg %r1,%r1,12 /* cyc2ns(clock,cycle_delta) */ | 70 | alg %r1,__VDSO_XTIME_NSEC(%r5) /* + tk->xtime_nsec */ |
| 69 | alg %r1,__VDSO_XTIME_NSEC(%r5) /* + xtime */ | 71 | srlg %r1,%r1,0(%r2) /* >> tk->shift */ |
| 70 | lg %r0,__VDSO_XTIME_SEC(%r5) | 72 | lg %r0,__VDSO_XTIME_SEC(%r5) /* tk->xtime_sec */ |
| 71 | clg %r4,__VDSO_UPD_COUNT(%r5) /* check update counter */ | 73 | clg %r4,__VDSO_UPD_COUNT(%r5) /* check update counter */ |
| 72 | jne 5b | 74 | jne 5b |
| 73 | larl %r5,13f | 75 | larl %r5,13f |
diff --git a/arch/s390/kernel/vdso64/gettimeofday.S b/arch/s390/kernel/vdso64/gettimeofday.S index 36ee674722ec..d0860d1d0ccc 100644 --- a/arch/s390/kernel/vdso64/gettimeofday.S +++ b/arch/s390/kernel/vdso64/gettimeofday.S | |||
| @@ -31,12 +31,13 @@ __kernel_gettimeofday: | |||
| 31 | stck 48(%r15) /* Store TOD clock */ | 31 | stck 48(%r15) /* Store TOD clock */ |
| 32 | lg %r1,48(%r15) | 32 | lg %r1,48(%r15) |
| 33 | sg %r1,__VDSO_XTIME_STAMP(%r5) /* TOD - cycle_last */ | 33 | sg %r1,__VDSO_XTIME_STAMP(%r5) /* TOD - cycle_last */ |
| 34 | msgf %r1,__VDSO_NTP_MULT(%r5) /* * NTP adjustment */ | 34 | msgf %r1,__VDSO_TK_MULT(%r5) /* * tk->mult */ |
| 35 | srlg %r1,%r1,12 /* cyc2ns(clock,cycle_delta) */ | 35 | alg %r1,__VDSO_XTIME_NSEC(%r5) /* + tk->xtime_nsec */ |
| 36 | alg %r1,__VDSO_XTIME_NSEC(%r5) /* + xtime.tv_nsec */ | 36 | lg %r0,__VDSO_XTIME_SEC(%r5) /* tk->xtime_sec */ |
| 37 | lg %r0,__VDSO_XTIME_SEC(%r5) /* xtime.tv_sec */ | ||
| 38 | clg %r4,__VDSO_UPD_COUNT(%r5) /* check update counter */ | 37 | clg %r4,__VDSO_UPD_COUNT(%r5) /* check update counter */ |
| 39 | jne 0b | 38 | jne 0b |
| 39 | lgf %r5,__VDSO_TK_SHIFT(%r5) /* Timekeeper shift */ | ||
| 40 | srlg %r1,%r1,0(%r5) /* >> tk->shift */ | ||
| 40 | larl %r5,5f | 41 | larl %r5,5f |
| 41 | 2: clg %r1,0(%r5) | 42 | 2: clg %r1,0(%r5) |
| 42 | jl 3f | 43 | jl 3f |
