diff options
Diffstat (limited to 'arch/s390')
-rw-r--r-- | arch/s390/Kconfig | 2 | ||||
-rw-r--r-- | arch/s390/include/asm/Kbuild | 1 | ||||
-rw-r--r-- | arch/s390/include/asm/cputime.h | 1 | ||||
-rw-r--r-- | arch/s390/include/asm/page.h | 3 | ||||
-rw-r--r-- | arch/s390/include/asm/signal.h | 2 | ||||
-rw-r--r-- | arch/s390/include/asm/unistd.h | 4 | ||||
-rw-r--r-- | arch/s390/kernel/compat_wrapper.S | 2 | ||||
-rw-r--r-- | arch/s390/kernel/entry.S | 32 | ||||
-rw-r--r-- | arch/s390/kernel/entry.h | 4 | ||||
-rw-r--r-- | arch/s390/kernel/entry64.S | 26 | ||||
-rw-r--r-- | arch/s390/kernel/process.c | 53 | ||||
-rw-r--r-- | arch/s390/kernel/vtime.c | 13 | ||||
-rw-r--r-- | arch/s390/kvm/kvm-s390.c | 4 |
13 files changed, 43 insertions, 104 deletions
diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig index d385f396dfee..3cbb8757704e 100644 --- a/arch/s390/Kconfig +++ b/arch/s390/Kconfig | |||
@@ -138,8 +138,10 @@ config S390 | |||
138 | select KTIME_SCALAR if 32BIT | 138 | select KTIME_SCALAR if 32BIT |
139 | select HAVE_ARCH_SECCOMP_FILTER | 139 | select HAVE_ARCH_SECCOMP_FILTER |
140 | select GENERIC_KERNEL_THREAD | 140 | select GENERIC_KERNEL_THREAD |
141 | select GENERIC_KERNEL_EXECVE | ||
141 | select HAVE_MOD_ARCH_SPECIFIC | 142 | select HAVE_MOD_ARCH_SPECIFIC |
142 | select MODULES_USE_ELF_RELA | 143 | select MODULES_USE_ELF_RELA |
144 | select CLONE_BACKWARDS2 | ||
143 | 145 | ||
144 | config SCHED_OMIT_FRAME_POINTER | 146 | config SCHED_OMIT_FRAME_POINTER |
145 | def_bool y | 147 | def_bool y |
diff --git a/arch/s390/include/asm/Kbuild b/arch/s390/include/asm/Kbuild index 0633dc6d254d..f313f9cbcf44 100644 --- a/arch/s390/include/asm/Kbuild +++ b/arch/s390/include/asm/Kbuild | |||
@@ -1,3 +1,4 @@ | |||
1 | 1 | ||
2 | 2 | ||
3 | generic-y += clkdev.h | 3 | generic-y += clkdev.h |
4 | generic-y += trace_clock.h | ||
diff --git a/arch/s390/include/asm/cputime.h b/arch/s390/include/asm/cputime.h index 023d5ae24482..d2ff41370c0c 100644 --- a/arch/s390/include/asm/cputime.h +++ b/arch/s390/include/asm/cputime.h | |||
@@ -14,6 +14,7 @@ | |||
14 | 14 | ||
15 | 15 | ||
16 | #define __ARCH_HAS_VTIME_ACCOUNT | 16 | #define __ARCH_HAS_VTIME_ACCOUNT |
17 | #define __ARCH_HAS_VTIME_TASK_SWITCH | ||
17 | 18 | ||
18 | /* We want to use full resolution of the CPU timer: 2**-12 micro-seconds. */ | 19 | /* We want to use full resolution of the CPU timer: 2**-12 micro-seconds. */ |
19 | 20 | ||
diff --git a/arch/s390/include/asm/page.h b/arch/s390/include/asm/page.h index 6d5367060a56..39faa4ac9660 100644 --- a/arch/s390/include/asm/page.h +++ b/arch/s390/include/asm/page.h | |||
@@ -158,6 +158,9 @@ static inline int page_reset_referenced(unsigned long addr) | |||
158 | * race against modification of the referenced bit. This function | 158 | * race against modification of the referenced bit. This function |
159 | * should therefore only be called if it is not mapped in any | 159 | * should therefore only be called if it is not mapped in any |
160 | * address space. | 160 | * address space. |
161 | * | ||
162 | * Note that the bit gets set whenever page content is changed. That means | ||
163 | * also when the page is modified by DMA or from inside the kernel. | ||
161 | */ | 164 | */ |
162 | #define __HAVE_ARCH_PAGE_TEST_AND_CLEAR_DIRTY | 165 | #define __HAVE_ARCH_PAGE_TEST_AND_CLEAR_DIRTY |
163 | static inline int page_test_and_clear_dirty(unsigned long pfn, int mapped) | 166 | static inline int page_test_and_clear_dirty(unsigned long pfn, int mapped) |
diff --git a/arch/s390/include/asm/signal.h b/arch/s390/include/asm/signal.h index bffdbdd5b3d7..db7ddfaf5b79 100644 --- a/arch/s390/include/asm/signal.h +++ b/arch/s390/include/asm/signal.h | |||
@@ -39,6 +39,4 @@ struct k_sigaction { | |||
39 | struct sigaction sa; | 39 | struct sigaction sa; |
40 | }; | 40 | }; |
41 | 41 | ||
42 | #define ptrace_signal_deliver(regs, cookie) do { } while (0) | ||
43 | |||
44 | #endif | 42 | #endif |
diff --git a/arch/s390/include/asm/unistd.h b/arch/s390/include/asm/unistd.h index bbbae41fa9a5..086bb8eaf6ab 100644 --- a/arch/s390/include/asm/unistd.h +++ b/arch/s390/include/asm/unistd.h | |||
@@ -54,7 +54,9 @@ | |||
54 | # define __ARCH_WANT_COMPAT_SYS_RT_SIGSUSPEND | 54 | # define __ARCH_WANT_COMPAT_SYS_RT_SIGSUSPEND |
55 | # endif | 55 | # endif |
56 | #define __ARCH_WANT_SYS_EXECVE | 56 | #define __ARCH_WANT_SYS_EXECVE |
57 | #define __ARCH_WANT_KERNEL_EXECVE | 57 | #define __ARCH_WANT_SYS_FORK |
58 | #define __ARCH_WANT_SYS_VFORK | ||
59 | #define __ARCH_WANT_SYS_CLONE | ||
58 | 60 | ||
59 | /* | 61 | /* |
60 | * "Conditional" syscalls | 62 | * "Conditional" syscalls |
diff --git a/arch/s390/kernel/compat_wrapper.S b/arch/s390/kernel/compat_wrapper.S index ad79b846535c..827e094a2f49 100644 --- a/arch/s390/kernel/compat_wrapper.S +++ b/arch/s390/kernel/compat_wrapper.S | |||
@@ -28,7 +28,7 @@ ENTRY(sys32_open_wrapper) | |||
28 | llgtr %r2,%r2 # const char * | 28 | llgtr %r2,%r2 # const char * |
29 | lgfr %r3,%r3 # int | 29 | lgfr %r3,%r3 # int |
30 | lgfr %r4,%r4 # int | 30 | lgfr %r4,%r4 # int |
31 | jg sys_open # branch to system call | 31 | jg compat_sys_open # branch to system call |
32 | 32 | ||
33 | ENTRY(sys32_close_wrapper) | 33 | ENTRY(sys32_close_wrapper) |
34 | llgfr %r2,%r2 # unsigned int | 34 | llgfr %r2,%r2 # unsigned int |
diff --git a/arch/s390/kernel/entry.S b/arch/s390/kernel/entry.S index ef46f66bc0d6..aa8f2ba6289b 100644 --- a/arch/s390/kernel/entry.S +++ b/arch/s390/kernel/entry.S | |||
@@ -330,40 +330,18 @@ ENTRY(ret_from_fork) | |||
330 | la %r11,STACK_FRAME_OVERHEAD(%r15) | 330 | la %r11,STACK_FRAME_OVERHEAD(%r15) |
331 | l %r12,__LC_THREAD_INFO | 331 | l %r12,__LC_THREAD_INFO |
332 | l %r13,__LC_SVC_NEW_PSW+4 | 332 | l %r13,__LC_SVC_NEW_PSW+4 |
333 | tm __PT_PSW+1(%r11),0x01 # forking a kernel thread ? | ||
334 | je 1f | ||
335 | l %r1,BASED(.Lschedule_tail) | 333 | l %r1,BASED(.Lschedule_tail) |
336 | basr %r14,%r1 # call schedule_tail | 334 | basr %r14,%r1 # call schedule_tail |
337 | TRACE_IRQS_ON | 335 | TRACE_IRQS_ON |
338 | ssm __LC_SVC_NEW_PSW # reenable interrupts | 336 | ssm __LC_SVC_NEW_PSW # reenable interrupts |
339 | j sysc_tracenogo | 337 | tm __PT_PSW+1(%r11),0x01 # forking a kernel thread ? |
340 | 338 | jne sysc_tracenogo | |
341 | 1: # it's a kernel thread | 339 | # it's a kernel thread |
342 | st %r15,__PT_R15(%r11) # store stack pointer for new kthread | 340 | lm %r9,%r10,__PT_R9(%r11) # load gprs |
343 | l %r1,BASED(.Lschedule_tail) | ||
344 | basr %r14,%r1 # call schedule_tail | ||
345 | TRACE_IRQS_ON | ||
346 | ssm __LC_SVC_NEW_PSW # reenable interrupts | ||
347 | lm %r9,%r11,__PT_R9(%r11) # load gprs | ||
348 | ENTRY(kernel_thread_starter) | 341 | ENTRY(kernel_thread_starter) |
349 | la %r2,0(%r10) | 342 | la %r2,0(%r10) |
350 | basr %r14,%r9 | 343 | basr %r14,%r9 |
351 | la %r2,0 | 344 | j sysc_tracenogo |
352 | br %r11 # do_exit | ||
353 | |||
354 | # | ||
355 | # kernel_execve function needs to deal with pt_regs that is not | ||
356 | # at the usual place | ||
357 | # | ||
358 | ENTRY(ret_from_kernel_execve) | ||
359 | ssm __LC_PGM_NEW_PSW # disable I/O and ext. interrupts | ||
360 | lr %r15,%r2 | ||
361 | lr %r11,%r2 | ||
362 | ahi %r15,-STACK_FRAME_OVERHEAD | ||
363 | xc __SF_BACKCHAIN(4,%r15),__SF_BACKCHAIN(%r15) | ||
364 | l %r12,__LC_THREAD_INFO | ||
365 | ssm __LC_SVC_NEW_PSW # reenable interrupts | ||
366 | j sysc_return | ||
367 | 345 | ||
368 | /* | 346 | /* |
369 | * Program check handler routine | 347 | * Program check handler routine |
diff --git a/arch/s390/kernel/entry.h b/arch/s390/kernel/entry.h index d0d3f69a7346..d8251b98f17a 100644 --- a/arch/s390/kernel/entry.h +++ b/arch/s390/kernel/entry.h | |||
@@ -54,10 +54,6 @@ long sys_s390_fadvise64(int fd, u32 offset_high, u32 offset_low, | |||
54 | long sys_s390_fadvise64_64(struct fadvise64_64_args __user *args); | 54 | long sys_s390_fadvise64_64(struct fadvise64_64_args __user *args); |
55 | long sys_s390_fallocate(int fd, int mode, loff_t offset, u32 len_high, | 55 | long sys_s390_fallocate(int fd, int mode, loff_t offset, u32 len_high, |
56 | u32 len_low); | 56 | u32 len_low); |
57 | long sys_fork(void); | ||
58 | long sys_clone(unsigned long newsp, unsigned long clone_flags, | ||
59 | int __user *parent_tidptr, int __user *child_tidptr); | ||
60 | long sys_vfork(void); | ||
61 | long sys_sigsuspend(int history0, int history1, old_sigset_t mask); | 57 | long sys_sigsuspend(int history0, int history1, old_sigset_t mask); |
62 | long sys_sigaction(int sig, const struct old_sigaction __user *act, | 58 | long sys_sigaction(int sig, const struct old_sigaction __user *act, |
63 | struct old_sigaction __user *oact); | 59 | struct old_sigaction __user *oact); |
diff --git a/arch/s390/kernel/entry64.S b/arch/s390/kernel/entry64.S index 07d8de353984..499e95e90f38 100644 --- a/arch/s390/kernel/entry64.S +++ b/arch/s390/kernel/entry64.S | |||
@@ -352,33 +352,17 @@ sysc_tracenogo: | |||
352 | ENTRY(ret_from_fork) | 352 | ENTRY(ret_from_fork) |
353 | la %r11,STACK_FRAME_OVERHEAD(%r15) | 353 | la %r11,STACK_FRAME_OVERHEAD(%r15) |
354 | lg %r12,__LC_THREAD_INFO | 354 | lg %r12,__LC_THREAD_INFO |
355 | tm __PT_PSW+1(%r11),0x01 # forking a kernel thread ? | ||
356 | je 1f | ||
357 | brasl %r14,schedule_tail | 355 | brasl %r14,schedule_tail |
358 | TRACE_IRQS_ON | 356 | TRACE_IRQS_ON |
359 | ssm __LC_SVC_NEW_PSW # reenable interrupts | 357 | ssm __LC_SVC_NEW_PSW # reenable interrupts |
360 | j sysc_tracenogo | 358 | tm __PT_PSW+1(%r11),0x01 # forking a kernel thread ? |
361 | 1: # it's a kernel thread | 359 | jne sysc_tracenogo |
362 | stg %r15,__PT_R15(%r11) # store stack pointer for new kthread | 360 | # it's a kernel thread |
363 | brasl %r14,schedule_tail | 361 | lmg %r9,%r10,__PT_R9(%r11) # load gprs |
364 | TRACE_IRQS_ON | ||
365 | ssm __LC_SVC_NEW_PSW # reenable interrupts | ||
366 | lmg %r9,%r11,__PT_R9(%r11) # load gprs | ||
367 | ENTRY(kernel_thread_starter) | 362 | ENTRY(kernel_thread_starter) |
368 | la %r2,0(%r10) | 363 | la %r2,0(%r10) |
369 | basr %r14,%r9 | 364 | basr %r14,%r9 |
370 | la %r2,0 | 365 | j sysc_tracenogo |
371 | br %r11 # do_exit | ||
372 | |||
373 | ENTRY(ret_from_kernel_execve) | ||
374 | ssm __LC_PGM_NEW_PSW # disable I/O and ext. interrupts | ||
375 | lgr %r15,%r2 | ||
376 | lgr %r11,%r2 | ||
377 | aghi %r15,-STACK_FRAME_OVERHEAD | ||
378 | xc __SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15) | ||
379 | lg %r12,__LC_THREAD_INFO | ||
380 | ssm __LC_SVC_NEW_PSW # reenable interrupts | ||
381 | j sysc_return | ||
382 | 366 | ||
383 | /* | 367 | /* |
384 | * Program check handler routine | 368 | * Program check handler routine |
diff --git a/arch/s390/kernel/process.c b/arch/s390/kernel/process.c index cd31ad457a9b..536d64579d9a 100644 --- a/arch/s390/kernel/process.c +++ b/arch/s390/kernel/process.c | |||
@@ -117,8 +117,7 @@ void release_thread(struct task_struct *dead_task) | |||
117 | } | 117 | } |
118 | 118 | ||
119 | int copy_thread(unsigned long clone_flags, unsigned long new_stackp, | 119 | int copy_thread(unsigned long clone_flags, unsigned long new_stackp, |
120 | unsigned long arg, | 120 | unsigned long arg, struct task_struct *p) |
121 | struct task_struct *p, struct pt_regs *regs) | ||
122 | { | 121 | { |
123 | struct thread_info *ti; | 122 | struct thread_info *ti; |
124 | struct fake_frame | 123 | struct fake_frame |
@@ -150,7 +149,7 @@ int copy_thread(unsigned long clone_flags, unsigned long new_stackp, | |||
150 | frame->sf.gprs[9] = (unsigned long) frame; | 149 | frame->sf.gprs[9] = (unsigned long) frame; |
151 | 150 | ||
152 | /* Store access registers to kernel stack of new process. */ | 151 | /* Store access registers to kernel stack of new process. */ |
153 | if (unlikely(!regs)) { | 152 | if (unlikely(p->flags & PF_KTHREAD)) { |
154 | /* kernel thread */ | 153 | /* kernel thread */ |
155 | memset(&frame->childregs, 0, sizeof(struct pt_regs)); | 154 | memset(&frame->childregs, 0, sizeof(struct pt_regs)); |
156 | frame->childregs.psw.mask = psw_kernel_bits | PSW_MASK_DAT | | 155 | frame->childregs.psw.mask = psw_kernel_bits | PSW_MASK_DAT | |
@@ -164,9 +163,10 @@ int copy_thread(unsigned long clone_flags, unsigned long new_stackp, | |||
164 | 163 | ||
165 | return 0; | 164 | return 0; |
166 | } | 165 | } |
167 | frame->childregs = *regs; | 166 | frame->childregs = *current_pt_regs(); |
168 | frame->childregs.gprs[2] = 0; /* child returns 0 on fork. */ | 167 | frame->childregs.gprs[2] = 0; /* child returns 0 on fork. */ |
169 | frame->childregs.gprs[15] = new_stackp; | 168 | if (new_stackp) |
169 | frame->childregs.gprs[15] = new_stackp; | ||
170 | 170 | ||
171 | /* Don't copy runtime instrumentation info */ | 171 | /* Don't copy runtime instrumentation info */ |
172 | p->thread.ri_cb = NULL; | 172 | p->thread.ri_cb = NULL; |
@@ -183,57 +183,24 @@ int copy_thread(unsigned long clone_flags, unsigned long new_stackp, | |||
183 | sizeof(s390_fp_regs)); | 183 | sizeof(s390_fp_regs)); |
184 | /* Set a new TLS ? */ | 184 | /* Set a new TLS ? */ |
185 | if (clone_flags & CLONE_SETTLS) | 185 | if (clone_flags & CLONE_SETTLS) |
186 | p->thread.acrs[0] = regs->gprs[6]; | 186 | p->thread.acrs[0] = frame->childregs.gprs[6]; |
187 | #else /* CONFIG_64BIT */ | 187 | #else /* CONFIG_64BIT */ |
188 | /* Save the fpu registers to new thread structure. */ | 188 | /* Save the fpu registers to new thread structure. */ |
189 | save_fp_regs(&p->thread.fp_regs); | 189 | save_fp_regs(&p->thread.fp_regs); |
190 | /* Set a new TLS ? */ | 190 | /* Set a new TLS ? */ |
191 | if (clone_flags & CLONE_SETTLS) { | 191 | if (clone_flags & CLONE_SETTLS) { |
192 | unsigned long tls = frame->childregs.gprs[6]; | ||
192 | if (is_compat_task()) { | 193 | if (is_compat_task()) { |
193 | p->thread.acrs[0] = (unsigned int) regs->gprs[6]; | 194 | p->thread.acrs[0] = (unsigned int)tls; |
194 | } else { | 195 | } else { |
195 | p->thread.acrs[0] = (unsigned int)(regs->gprs[6] >> 32); | 196 | p->thread.acrs[0] = (unsigned int)(tls >> 32); |
196 | p->thread.acrs[1] = (unsigned int) regs->gprs[6]; | 197 | p->thread.acrs[1] = (unsigned int)tls; |
197 | } | 198 | } |
198 | } | 199 | } |
199 | #endif /* CONFIG_64BIT */ | 200 | #endif /* CONFIG_64BIT */ |
200 | return 0; | 201 | return 0; |
201 | } | 202 | } |
202 | 203 | ||
203 | SYSCALL_DEFINE0(fork) | ||
204 | { | ||
205 | struct pt_regs *regs = task_pt_regs(current); | ||
206 | return do_fork(SIGCHLD, regs->gprs[15], regs, 0, NULL, NULL); | ||
207 | } | ||
208 | |||
209 | SYSCALL_DEFINE4(clone, unsigned long, newsp, unsigned long, clone_flags, | ||
210 | int __user *, parent_tidptr, int __user *, child_tidptr) | ||
211 | { | ||
212 | struct pt_regs *regs = task_pt_regs(current); | ||
213 | |||
214 | if (!newsp) | ||
215 | newsp = regs->gprs[15]; | ||
216 | return do_fork(clone_flags, newsp, regs, 0, | ||
217 | parent_tidptr, child_tidptr); | ||
218 | } | ||
219 | |||
220 | /* | ||
221 | * This is trivial, and on the face of it looks like it | ||
222 | * could equally well be done in user mode. | ||
223 | * | ||
224 | * Not so, for quite unobvious reasons - register pressure. | ||
225 | * In user mode vfork() cannot have a stack frame, and if | ||
226 | * done by calling the "clone()" system call directly, you | ||
227 | * do not have enough call-clobbered registers to hold all | ||
228 | * the information you need. | ||
229 | */ | ||
230 | SYSCALL_DEFINE0(vfork) | ||
231 | { | ||
232 | struct pt_regs *regs = task_pt_regs(current); | ||
233 | return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, | ||
234 | regs->gprs[15], regs, 0, NULL, NULL); | ||
235 | } | ||
236 | |||
237 | asmlinkage void execve_tail(void) | 204 | asmlinkage void execve_tail(void) |
238 | { | 205 | { |
239 | current->thread.fp_regs.fpc = 0; | 206 | current->thread.fp_regs.fpc = 0; |
diff --git a/arch/s390/kernel/vtime.c b/arch/s390/kernel/vtime.c index 790334427895..e84b8b68444a 100644 --- a/arch/s390/kernel/vtime.c +++ b/arch/s390/kernel/vtime.c | |||
@@ -112,7 +112,12 @@ void vtime_task_switch(struct task_struct *prev) | |||
112 | S390_lowcore.system_timer = ti->system_timer; | 112 | S390_lowcore.system_timer = ti->system_timer; |
113 | } | 113 | } |
114 | 114 | ||
115 | void account_process_tick(struct task_struct *tsk, int user_tick) | 115 | /* |
116 | * In s390, accounting pending user time also implies | ||
117 | * accounting system time in order to correctly compute | ||
118 | * the stolen time accounting. | ||
119 | */ | ||
120 | void vtime_account_user(struct task_struct *tsk) | ||
116 | { | 121 | { |
117 | if (do_account_vtime(tsk, HARDIRQ_OFFSET)) | 122 | if (do_account_vtime(tsk, HARDIRQ_OFFSET)) |
118 | virt_timer_expire(); | 123 | virt_timer_expire(); |
@@ -127,6 +132,8 @@ void vtime_account(struct task_struct *tsk) | |||
127 | struct thread_info *ti = task_thread_info(tsk); | 132 | struct thread_info *ti = task_thread_info(tsk); |
128 | u64 timer, system; | 133 | u64 timer, system; |
129 | 134 | ||
135 | WARN_ON_ONCE(!irqs_disabled()); | ||
136 | |||
130 | timer = S390_lowcore.last_update_timer; | 137 | timer = S390_lowcore.last_update_timer; |
131 | S390_lowcore.last_update_timer = get_vtimer(); | 138 | S390_lowcore.last_update_timer = get_vtimer(); |
132 | S390_lowcore.system_timer += timer - S390_lowcore.last_update_timer; | 139 | S390_lowcore.system_timer += timer - S390_lowcore.last_update_timer; |
@@ -140,6 +147,10 @@ void vtime_account(struct task_struct *tsk) | |||
140 | } | 147 | } |
141 | EXPORT_SYMBOL_GPL(vtime_account); | 148 | EXPORT_SYMBOL_GPL(vtime_account); |
142 | 149 | ||
150 | void vtime_account_system(struct task_struct *tsk) | ||
151 | __attribute__((alias("vtime_account"))); | ||
152 | EXPORT_SYMBOL_GPL(vtime_account_system); | ||
153 | |||
143 | void __kprobes vtime_stop_cpu(void) | 154 | void __kprobes vtime_stop_cpu(void) |
144 | { | 155 | { |
145 | struct s390_idle_data *idle = &__get_cpu_var(s390_idle); | 156 | struct s390_idle_data *idle = &__get_cpu_var(s390_idle); |
diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c index ecced9d18986..d91a95568002 100644 --- a/arch/s390/kvm/kvm-s390.c +++ b/arch/s390/kvm/kvm-s390.c | |||
@@ -608,9 +608,7 @@ static int __vcpu_run(struct kvm_vcpu *vcpu) | |||
608 | kvm_s390_deliver_pending_interrupts(vcpu); | 608 | kvm_s390_deliver_pending_interrupts(vcpu); |
609 | 609 | ||
610 | vcpu->arch.sie_block->icptcode = 0; | 610 | vcpu->arch.sie_block->icptcode = 0; |
611 | local_irq_disable(); | ||
612 | kvm_guest_enter(); | 611 | kvm_guest_enter(); |
613 | local_irq_enable(); | ||
614 | VCPU_EVENT(vcpu, 6, "entering sie flags %x", | 612 | VCPU_EVENT(vcpu, 6, "entering sie flags %x", |
615 | atomic_read(&vcpu->arch.sie_block->cpuflags)); | 613 | atomic_read(&vcpu->arch.sie_block->cpuflags)); |
616 | trace_kvm_s390_sie_enter(vcpu, | 614 | trace_kvm_s390_sie_enter(vcpu, |
@@ -629,9 +627,7 @@ static int __vcpu_run(struct kvm_vcpu *vcpu) | |||
629 | VCPU_EVENT(vcpu, 6, "exit sie icptcode %d", | 627 | VCPU_EVENT(vcpu, 6, "exit sie icptcode %d", |
630 | vcpu->arch.sie_block->icptcode); | 628 | vcpu->arch.sie_block->icptcode); |
631 | trace_kvm_s390_sie_exit(vcpu, vcpu->arch.sie_block->icptcode); | 629 | trace_kvm_s390_sie_exit(vcpu, vcpu->arch.sie_block->icptcode); |
632 | local_irq_disable(); | ||
633 | kvm_guest_exit(); | 630 | kvm_guest_exit(); |
634 | local_irq_enable(); | ||
635 | 631 | ||
636 | memcpy(&vcpu->run->s.regs.gprs[14], &vcpu->arch.sie_block->gg14, 16); | 632 | memcpy(&vcpu->run->s.regs.gprs[14], &vcpu->arch.sie_block->gg14, 16); |
637 | return rc; | 633 | return rc; |