Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 760dcc6e authored by Linus Torvalds's avatar Linus Torvalds
Browse files

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
parents 4897f101 8d406c6d
Loading
Loading
Loading
Loading
+2 −2
Original line number Original line Diff line number Diff line
@@ -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;


+4 −3
Original line number Original line Diff line number Diff line
@@ -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);
+9 −2
Original line number Original line Diff line number Diff line
@@ -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 */
+24 −12
Original line number Original line Diff line number Diff line
@@ -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();
}
}
+9 −26
Original line number Original line Diff line number Diff line
@@ -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


Loading