All of lore.kernel.org
 help / color / mirror / Atom feed
From: Hugang <hugang@soulinfo.com>
To: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: ncunningham@users.sourceforge.net, ncunningham@clear.net.nz,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	debian-powerpc@lists.debian.org
Subject: Re: Help port swsusp to ppc.
Date: Thu, 22 Jan 2004 21:17:46 +0800	[thread overview]
Message-ID: <20040122211746.3ec1018c@localhost> (raw)
In-Reply-To: <1074549790.10595.55.camel@gaston>

[-- Attachment #1: Type: text/plain, Size: 919 bytes --]

On Tue, 20 Jan 2004 09:03:11 +1100
Benjamin Herrenschmidt <benh@kernel.crashing.org> wrote:

> On Tue, 2004-01-20 at 04:56, Nigel Cunningham wrote:
> > Hi.
> > 
> > On Tue, 2004-01-20 at 00:39, Benjamin Herrenschmidt wrote:
> > > I see no reason why this would be needed on ppc, only the last
> > > step, that is the actual CPU state save, should matter.
> > 
> > Besides saving the CPU state, the code copies the original kernel
> > back. It sort of defeats the purpose to remove that code :>
> 

Attached file is current version of port swsusp to ppc, STILL can not
works, Benjamin, gave me some comments.

I has add one files swsusp2-asm.S. The save/restore processor state base
on pmac_sleep.S. The copybackup is copy from gcc generate assmeble.

Now the suspend has no problem, resume can not works, strange.

-- 
Hu Gang / Steve
Linux Registered User 204016
GPG Public Key: http://soulinfo.com/~hugang/HuGang.asc

[-- Attachment #2: arch_ppc.diff --]
[-- Type: text/plain, Size: 17639 bytes --]

Index: linux-2.6.1-suspend/arch/ppc/Kconfig
===================================================================
--- linux-2.6.1-suspend/arch/ppc/Kconfig	(revision 192)
+++ linux-2.6.1-suspend/arch/ppc/Kconfig	(working copy)
@@ -193,6 +193,8 @@
 
 	  If in doubt, say Y here.
 
+source kernel/power/Kconfig
+
 source arch/ppc/platforms/4xx/Kconfig
 
 config PPC64BRIDGE
@@ -681,6 +683,7 @@
 
 config NR_CPUS
 	int "Maximum number of CPUs (2-32)"
+	range 2 32
 	depends on SMP
 	default "4"
 
Index: linux-2.6.1-suspend/arch/ppc/kernel/swsusp2-asm.S
===================================================================
--- linux-2.6.1-suspend/arch/ppc/kernel/swsusp2-asm.S	(revision 0)
+++ linux-2.6.1-suspend/arch/ppc/kernel/swsusp2-asm.S	(revision 0)
@@ -0,0 +1,516 @@
+#include <linux/config.h>
+#include <asm/processor.h>
+#include <asm/page.h>
+#include <asm/ppc_asm.h>
+#include <asm/cputable.h>
+#include <asm/cache.h>
+#include <asm/thread_info.h>
+#include <asm/offsets.h>
+
+/*
+ * Structure for storing CPU registers on the stack.
+ */
+#define SL_SP		0
+#define SL_PC		4
+#define SL_MSR		8
+#define SL_SDR1		0xc
+#define SL_SPRG0	0x10	/* 4 sprg's */
+#define SL_DBAT0	0x20
+#define SL_IBAT0	0x28
+#define SL_DBAT1	0x30
+#define SL_IBAT1	0x38
+#define SL_DBAT2	0x40
+#define SL_IBAT2	0x48
+#define SL_DBAT3	0x50
+#define SL_IBAT3	0x58
+#define SL_TB		0x60
+#define SL_R2		0x68
+#define SL_CR		0x6c
+#define SL_R12		0x70	/* r12 to r31 */
+#define SL_SIZE		(SL_R12 + 80)
+	
+	.section .text
+	.align 5
+_GLOBAL(do_swsusp_lowlevel)
+	cmpwi	0,r3,0
+	bc	4,2,.L3627
+	
+	mflr	r0	
+	stw	r0,4(r1)
+	stwu	r1,-SL_SIZE(r1)
+
+	mfcr	r0
+	stw	r0,SL_CR(r1)
+	stw	r2,SL_R2(r1)
+	stmw	r12,SL_R12(r1)
+	
+	bl	do_swsusp2_suspend_1
+		
+	stw	r0,SL_PC(r1)	/* saving r0 */
+
+	mfcr	r0			/* move from condition register to r0 */
+	stw	r0,SL_CR(r1)
+	stw	r2,SL_R2(r1)
+	stmw	r12,SL_R12(r1)
+
+	/* Save MSR & SDR1 */
+	mfmsr	r4
+	stw	r4,SL_MSR(r1)
+	mfsdr1	r4
+	stw	r4,SL_SDR1(r1)
+
+	/* Get a stable timebase and save it */
+1:	mftbu	r4
+	stw	r4,SL_TB(r1)
+	mftb	r5
+	stw	r5,SL_TB+4(r1)
+	mftbu	r3
+	cmpw	r3,r4
+	bne	1b
+
+	/* Save SPRGs */
+	mfsprg	r4,0
+	stw	r4,SL_SPRG0(r1)
+	mfsprg	r4,1
+	stw	r4,SL_SPRG0+4(r1)
+	mfsprg	r4,2
+	stw	r4,SL_SPRG0+8(r1)
+	mfsprg	r4,3
+	stw	r4,SL_SPRG0+12(r1)
+
+	/* Save BATs */
+	mfdbatu	r4,0
+	stw	r4,SL_DBAT0(r1)
+	mfdbatl	r4,0
+	stw	r4,SL_DBAT0+4(r1)
+	mfdbatu	r4,1
+	stw	r4,SL_DBAT1(r1)
+	mfdbatl	r4,1
+	stw	r4,SL_DBAT1+4(r1)
+	mfdbatu	r4,2
+	stw	r4,SL_DBAT2(r1)
+	mfdbatl	r4,2
+	stw	r4,SL_DBAT2+4(r1)
+	mfdbatu	r4,3
+	stw	r4,SL_DBAT3(r1)
+	mfdbatl	r4,3
+	stw	r4,SL_DBAT3+4(r1)
+	mfibatu	r4,0
+	stw	r4,SL_IBAT0(r1)
+	mfibatl	r4,0
+	stw	r4,SL_IBAT0+4(r1)
+	mfibatu	r4,1
+	stw	r4,SL_IBAT1(r1)
+	mfibatl	r4,1
+	stw	r4,SL_IBAT1+4(r1)
+	mfibatu	r4,2
+	stw	r4,SL_IBAT2(r1)
+	mfibatl	r4,2
+	stw	r4,SL_IBAT2+4(r1)
+	mfibatu	r4,3
+	stw	r4,SL_IBAT3(r1)
+	mfibatl	r4,3
+	stw	r4,SL_IBAT3+4(r1)
+
+	/* get r1 physical ptr */
+	tophys(r5,r1)
+	addi	r5,r5,SL_PC
+	
+	/* save storage ptr */	
+	lis	r3,pm_sleep_storage@ha
+	addi	r3,r3,pm_sleep_storage@l
+	stw	r5,0(r3)
+	
+	/* Backup various CPU configs stuffs */	
+	bl	__save_cpu_setup
+
+	bl	do_swsusp2_suspend_2
+
+	b	restore_stack
+		
+.L3627:
+	bl do_swsusp2_resume_1
+
+	lis r9,swsusp_action@ha
+	lwz r0,swsusp_action@l(r9)
+	lis r11,swsusp_debug_state@ha
+	lis r9,state1@ha
+	stw r0,state1@l(r9)
+	lwz r8,swsusp_debug_state@l(r11)
+	lis r10,console_printk@ha
+	lis r9,state2@ha
+	lis r11,pagedir_resume@ha
+	stw r8,state2@l(r9)
+	la r11,pagedir_resume@l(r11)
+	lwz r0,console_printk@l(r10)
+	lwz r5,12(r11)
+	lis r9,state3@ha
+	stw r0,state3@l(r9)
+	lwz r10,0(r5)
+	lwz r4,56(r11)
+	lis r9,origoffset@ha
+	stw r10,origoffset@l(r9)
+	lwz r0,0(r4)
+	lis r11,copyoffset@ha
+	stw r0,copyoffset@l(r11)
+	lwz r10,origoffset@l(r9)
+	lwz r8,copyoffset@l(r11)
+	slwi r9,r10,r2
+	slwi r11,r8,r2
+	add r9,r9,r10
+	add r11,r11,8
+	lis r0,0xcccc
+	ori r0,r0,52429
+	slwi r9,r9,r3
+	slwi r11,r11,r3
+	mullw r11,r11,r0
+	mullw r9,r9,r0
+	slwi r11,r11,r9
+	slwi r9,r9,r9
+	cmpwi r0,r5,r0
+	addis r9,r9,0xc000
+	addis r11,r11,0xc000
+	lis r7,origrange@ha
+	lis r6,copyrange@ha
+	lis r10,origpage@ha
+	lis r8,copypage@ha
+	lis r24,origrange@ha
+	lis r25,copyrange@ha
+	lis r12,origoffset@ha
+	lis r3,copyoffset@ha
+	stw r9,origpage@l(r10)
+	stw r11,copypage@l(r8)
+	stw r5,origrange@l(r7)
+	stw r4,copyrange@l(r6)
+	bc r12,r2,.L3646
+	lis r4,0xcccc
+	lis r28,loop@ha
+	lis r26,origoffset@ha
+	lis r29,origrange@ha
+	lis r30,origpage@ha
+	ori r4,r4,52429
+	lis r27,copyoffset@ha
+	lis r31,copypage@ha
+.L3632:
+	li r0,r0
+	stw r0,loop@l(r28)
+	lwz r9,loop@l(r28)
+	cmplwi r0,r9,1023
+	bc r12,r1,.L3637
+	lis r7,loop@ha
+	lis r5,origpage@ha
+	lis r6,copypage@ha
+.L3635:
+	lwz r8,loop@l(r7)
+	lwz r9,loop@l(r7)
+	lwz r11,copypage@l(r6)
+	slwi r9,r9,r2
+	lwzx r0,r9,r11
+	lwz r10,origpage@l(r5)
+	slwi r8,r8,r2
+	stwx r0,r8,r10
+	lwz r9,loop@l(r7)
+	addi r9,r9,r1
+	stw r9,loop@l(r7)
+	lwz r0,loop@l(r7)
+	cmplwi r0,r0,1023
+	bc r4,r1,.L3635
+.L3637:
+	lwz r11,origrange@l(r29)
+	lwz r9,origoffset@l(r26)
+	lwz r0,4(r11)
+	cmplw r0,r9,r0
+	bc r4,r0,.L3638
+	lwz r9,origoffset@l(r12)
+	lwz r11,origpage@l(r30)
+	addi r9,r9,r1
+	addi r11,r11,4096
+	stw r9,origoffset@l(r12)
+	stw r11,origpage@l(r30)
+	b .L3639
+.L3638:
+	lwz r9,8(r11)
+	cmpwi r0,r9,r0
+	stw r9,origrange@l(r24)
+	bc r12,r2,.L3639
+	lwz r9,0(r9)
+	stw r9,origoffset@l(r12)
+	lwz r0,origoffset@l(r12)
+	slwi r9,r0,r2
+	add r9,r9,r0
+	slwi r9,r9,r3
+	mullw r9,r9,r4
+	slwi r9,r9,r9
+	addis r9,r9,0xc000
+	stw r9,origpage@l(r30)
+.L3639:
+	lis r9,copyrange@ha
+	lwz r9,copyrange@l(r9)
+	lwz r11,copyoffset@l(r27)
+	lwz r0,4(r9)
+	cmplw r0,r11,r0
+	bc r4,r0,.L3642
+	lwz r9,copyoffset@l(r3)
+	lwz r11,copypage@l(r31)
+	addi r9,r9,r1
+	addi r11,r11,4096
+	stw r9,copyoffset@l(r3)
+	stw r11,copypage@l(r31)
+	b .L3630
+.L3642:
+	lwz r9,r8(r9)
+	cmpwi r0,r9,r0
+	stw r9,copyrange@l(r25)
+	bc r12,r2,.L3630
+	lwz r9,0(r9)
+	stw r9,copyoffset@l(r3)
+	lwz r0,copyoffset@l(r3)
+	slwi r9,r0,r2
+	add r9,r9,r0
+	slwi r9,r9,r3
+	mullw r9,r9,r4
+	slwi r9,r9,r9
+	addis r9,r9,0xc000
+	stw 9,copypage@l(r31)
+.L3630:
+	lwz r0,origrange@l(r29)
+	cmpwi r0,r0,r0
+	bc r4,r2,.L3632
+.L3646:
+	lis r9,state1@ha
+	lwz r7,state1@l(r9)
+	lis r11,state2@ha
+	lwz r8,state2@l(r11)
+	lis r9,state3@ha
+	lwz r0,state3@l(r9)
+	lis r11,swsusp_action@ha
+	lis r9,swsusp_debug_state@ha
+	lis r10,console_printk@ha
+	stw r7,swsusp_action@l(r11)
+	stw r8,swsusp_debug_state@l(r9)
+	stw r0,console_printk@l(r10)
+
+#if 0
+	bl	pm_turn_off_mmu
+//#else
+	mfmsr	r3
+	andi.	r0,r3,MSR_DR|MSR_IR		/* MMU enabled? */
+	beqlr
+	andc	r3,r3,r0
+	mtspr	SRR0,r4
+	mtspr	SRR1,r3
+	sync
+#endif
+
+#if 1
+	/* Turn off data relocation. */
+	mfmsr	r3		/* Save MSR in r7 */
+	rlwinm	r3,r3,0,28,26	/* Turn off DR bit */
+	sync
+	mtmsr	r3
+	isync
+
+	/* Make sure HID0 no longer contains any sleep bit */
+	mfspr	r3,HID0
+	rlwinm	r3,r3,0,11,7		/* clear SLEEP, NAP, DOZE bits */
+	mtspr	HID0,r3
+	sync
+	isync
+
+	/* Won't that cause problems on CPU that doesn't support it ? */
+	lis	r3, 0
+	mtspr	SPRN_MMCR0, r3
+
+	/* sanitize MSR */
+	mfmsr	r3
+	ori	r3,r3,MSR_EE|MSR_IP
+	xori	r3,r3,MSR_EE|MSR_IP
+	sync
+	isync
+	mtmsr	r3
+	sync
+	isync
+#endif	
+	/* Recover sleep storage */
+	lis	r3,pm_sleep_storage@ha
+	addi	r3,r3,pm_sleep_storage@l
+	tophys(r3,r3)
+	lwz	r1,0(r3)
+
+	/* Invalidate & enable L1 cache, we don't care about
+	 * whatever the ROM may have tried to write to memory
+	 */
+	bl	__inval_enable_L1
+
+	/* Restore the kernel's segment registers before
+	 * we do any r1 memory access as we are not sure they
+	 * are in a sane state above the first 256Mb region
+	 */
+	li	r0,16		/* load up segment register values */
+	mtctr	r0		/* for context 0 */
+	lis	r3,0x2000	/* Ku = 1, VSID = 0 */
+	li	r4,0
+3:	mtsrin	r3,r4
+	addi	r3,r3,0x111	/* increment VSID */
+	addis	r4,r4,0x1000	/* address of next segment */
+	bdnz	3b
+	sync
+	isync
+
+	subi	r1,r1,SL_PC
+	
+	/* Restore various CPU config stuffs */
+	bl	__restore_cpu_setup
+			
+	/* Restore the BATs, and SDR1.  Then we can turn on the MMU. */
+	lwz	r4,SL_SDR1(r1)
+	mtsdr1	r4
+	lwz	r4,SL_SPRG0(r1)
+	mtsprg	0,r4
+	lwz	r4,SL_SPRG0+4(r1)
+	mtsprg	1,r4
+	lwz	r4,SL_SPRG0+8(r1)
+	mtsprg	2,r4
+	lwz	r4,SL_SPRG0+12(r1)
+	mtsprg	3,r4
+
+	lwz	r4,SL_DBAT0(r1)
+	mtdbatu	0,r4
+	lwz	r4,SL_DBAT0+4(r1)
+	mtdbatl	0,r4
+	lwz	r4,SL_DBAT1(r1)
+	mtdbatu	1,r4
+	lwz	r4,SL_DBAT1+4(r1)
+	mtdbatl	1,r4
+	lwz	r4,SL_DBAT2(r1)
+	mtdbatu	2,r4
+	lwz	r4,SL_DBAT2+4(r1)
+	mtdbatl	2,r4
+	lwz	r4,SL_DBAT3(r1)
+	mtdbatu	3,r4
+	lwz	r4,SL_DBAT3+4(r1)
+	mtdbatl	3,r4
+	lwz	r4,SL_IBAT0(r1)
+	mtibatu	0,r4
+	lwz	r4,SL_IBAT0+4(r1)
+	mtibatl	0,r4
+	lwz	r4,SL_IBAT1(r1)
+	mtibatu	1,r4
+	lwz	r4,SL_IBAT1+4(r1)
+	mtibatl	1,r4
+	lwz	r4,SL_IBAT2(r1)
+	mtibatu	2,r4
+	lwz	r4,SL_IBAT2+4(r1)
+	mtibatl	2,r4
+	lwz	r4,SL_IBAT3(r1)
+	mtibatu	3,r4
+	lwz	r4,SL_IBAT3+4(r1)
+	mtibatl	3,r4
+
+BEGIN_FTR_SECTION
+	li	r4,0
+	mtspr	SPRN_DBAT4U,r4
+	mtspr	SPRN_DBAT4L,r4
+	mtspr	SPRN_DBAT5U,r4
+	mtspr	SPRN_DBAT5L,r4
+	mtspr	SPRN_DBAT6U,r4
+	mtspr	SPRN_DBAT6L,r4
+	mtspr	SPRN_DBAT7U,r4
+	mtspr	SPRN_DBAT7L,r4
+	mtspr	SPRN_IBAT4U,r4
+	mtspr	SPRN_IBAT4L,r4
+	mtspr	SPRN_IBAT5U,r4
+	mtspr	SPRN_IBAT5L,r4
+	mtspr	SPRN_IBAT6U,r4
+	mtspr	SPRN_IBAT6L,r4
+	mtspr	SPRN_IBAT7U,r4
+	mtspr	SPRN_IBAT7L,r4
+END_FTR_SECTION_IFSET(CPU_FTR_HAS_HIGH_BATS)
+
+	/* Flush all TLBs */
+	lis	r4,0x1000
+1:	addic.	r4,r4,-0x1000
+	tlbie	r4
+	blt	1b
+	sync
+
+	/* restore the MSR and turn on the MMU */
+	lwz	r3,SL_MSR(r1)
+	bl	pm_turn_on_mmu
+		
+	/* get back the stack pointer */
+	tovirt(r1,r1)	
+
+	/* Restore TB */
+	li	r3,0
+	mttbl	r3
+	lwz	r3,SL_TB(r1)
+	lwz	r4,SL_TB+4(r1)
+	mttbu	r3
+	mttbl	r4
+	
+	bl	do_swsusp2_resume_2
+	
+restore_stack:	
+	/* Restore the callee-saved registers and return */
+	lwz	r0,SL_CR(r1)
+	mtcr	r0
+	lwz	r2,SL_R2(r1)
+	lmw	r12,SL_R12(r1)
+	addi	r1,r1,SL_SIZE
+	lwz	r0,4(r1)
+	mtlr	r0
+	blr
+
+pm_turn_on_mmu:
+	mflr	r4
+	tovirt(r4,r4)
+	mtsrr0	r4
+	mtsrr1	r3
+	sync
+	isync
+	rfi
+
+pm_turn_off_mmu:	
+	mfmsr	r3
+	andi.	r0,r3,MSR_DR|MSR_IR		/* MMU enabled? */
+	beqlr
+	andc	r3,r3,r0
+	mtspr	SRR0,r4
+	mtspr	SRR1,r3
+	sync
+	rfi
+
+	.section	".data.nosave"
+origrange:
+	.long 0
+copyrange:
+	.long 0
+origoffset:
+	.long 0
+copyoffset:
+	.long 0
+origpage:
+	.long 0
+copypage:
+	.long 0
+loop:
+	.long 0
+state1:
+	.long 0
+state2:
+	.long 0
+state3:
+	.long 0
+c_loops_per_jiffy_ref:
+	.long 0
+cpu_khz_ref:
+	.long 0
+
+	.section .data
+	.balign L1_CACHE_LINE_SIZE
+pm_sleep_storage:
+	.long 0
+	.balign L1_CACHE_LINE_SIZE,0
+	
+	.text
Index: linux-2.6.1-suspend/arch/ppc/kernel/Makefile
===================================================================
--- linux-2.6.1-suspend/arch/ppc/kernel/Makefile	(revision 192)
+++ linux-2.6.1-suspend/arch/ppc/kernel/Makefile	(working copy)
@@ -34,3 +34,4 @@
 obj-$(CONFIG_8xx)		+= softemu8xx.o
 endif
 
+obj-$(CONFIG_SOFTWARE_SUSPEND2) += swsusp2-asm.o
Index: linux-2.6.1-suspend/arch/ppc/kernel/vmlinux.lds.S
===================================================================
--- linux-2.6.1-suspend/arch/ppc/kernel/vmlinux.lds.S	(revision 192)
+++ linux-2.6.1-suspend/arch/ppc/kernel/vmlinux.lds.S	(working copy)
@@ -72,6 +72,12 @@
     CONSTRUCTORS
   }
 
+  . = ALIGN(4096);
+  __nosave_begin = .;
+  .data_nosave : { *(.data.nosave) }
+  . = ALIGN(4096);
+  __nosave_end = .;
+
   . = ALIGN(32);
   .data.cacheline_aligned : { *(.data.cacheline_aligned) }
 
Index: linux-2.6.1-suspend/arch/ppc/kernel/signal.c
===================================================================
--- linux-2.6.1-suspend/arch/ppc/kernel/signal.c	(revision 192)
+++ linux-2.6.1-suspend/arch/ppc/kernel/signal.c	(working copy)
@@ -28,6 +28,7 @@
 #include <linux/elf.h>
 #include <linux/tty.h>
 #include <linux/binfmts.h>
+#include <linux/suspend.h>
 #include <asm/ucontext.h>
 #include <asm/uaccess.h>
 #include <asm/pgtable.h>
@@ -552,6 +553,11 @@
 	unsigned long frame, newsp;
 	int signr, ret;
 
+	if (current->flags & PF_FREEZE) {
+		refrigerator(PF_FREEZE);
+		return 0;
+	}
+
 	if (!oldset)
 		oldset = &current->blocked;
 
Index: linux-2.6.1-suspend/arch/ppc/kernel/swsusp2.c
===================================================================
--- linux-2.6.1-suspend/arch/ppc/kernel/swsusp2.c	(revision 0)
+++ linux-2.6.1-suspend/arch/ppc/kernel/swsusp2.c	(revision 0)
@@ -0,0 +1,161 @@
+ /*
+  * Copyright 2003 Nigel Cunningham.
+  *
+  * This is the code that the code in swsusp2-asm.S for
+  * copying back the original kernel is based upon. It
+  * was based upon code that is...
+  * Copyright 2001-2002 Pavel Machek <pavel@suse.cz>
+  * Based on code
+  * Copyright 2001 Patrick Mochel <mochel@osdl.org>
+  * Copyright 2004 Hu Gang <hugang@soulinfo.com
+  *  port to PowerPC
+  */
+#include <linux/config.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/types.h>
+#include <linux/spinlock.h>
+#include <linux/poll.h>
+#include <linux/delay.h>
+#include <linux/sysrq.h>
+#include <linux/proc_fs.h>
+#include <linux/irq.h>
+#include <linux/pm.h>
+#include <linux/device.h>
+#include <linux/suspend.h>
+#include <linux/suspend-debug.h>
+#include <linux/suspend-common.h>
+#include <asm/uaccess.h>
+
+/* Local variables for do_swsusp2_suspend */
+volatile static int loop __nosavedata = 0;
+volatile static int state1 __nosavedata = 0;
+volatile static int state2 __nosavedata = 0;
+volatile static int state3 __nosavedata = 0;
+volatile static struct range *origrange __nosavedata;
+volatile static struct range *copyrange __nosavedata;
+volatile static int origoffset __nosavedata;
+volatile static int copyoffset __nosavedata;
+volatile static unsigned long * origpage __nosavedata;
+volatile static unsigned long * copypage __nosavedata;
+//volatile static int orig_min_free __nosavedata;
+#ifndef CONFIG_SMP
+//static unsigned long c_loops_per_jiffy_ref __nosavedata = 0;
+//static unsigned long cpu_khz_ref __nosavedata = 0;
+#endif
+
+extern void do_swsusp2_suspend_1(void);
+extern void do_swsusp2_suspend_2(void);
+extern void do_swsusp2_resume_1(void);
+extern void do_swsusp2_resume_2(void);
+extern struct pagedir __nosavedata pagedir_resume;
+
+/*
+ * FIXME: This function should really be written in assembly. Actually
+ * requirement is that it does not touch stack, because %esp will be
+ * wrong during resume before restore_processor_context(). Check
+ * assembly if you modify this.
+ */
+static inline void do_swsusp2_copyback(void)
+{
+#ifdef CONFIG_PREEMPT
+	/*
+	 * Preempt disabled in kernel we're about to restore.
+	 * Make sure we match state now.
+	 */
+	preempt_disable();
+	PRINTPREEMPTCOUNT("Prior to copying old kernel back.");
+#endif
+
+	state1 = swsusp_action;
+	state2 = swsusp_debug_state;
+	state3 = console_loglevel;
+
+#ifndef CONFIG_SMP
+	//c_loops_per_jiffy_ref = cpu_data->loops_per_jiffy;
+	//cpu_khz_ref = cpu_khz;
+#endif
+	
+	origrange = pagedir_resume.origranges.first;
+	copyrange = pagedir_resume.destranges.first;
+	origoffset = origrange->minimum;
+	copyoffset = copyrange->minimum;
+	origpage = (unsigned long *) (page_address(mem_map + origoffset));
+	copypage = (unsigned long *) (page_address(mem_map + copyoffset));
+	//orig_min_free = swsusp_min_free;
+
+	while (origrange) {
+		for (loop=0; loop < (PAGE_SIZE / sizeof(unsigned long)); loop++)
+			*(origpage + loop) = *(copypage + loop);
+		
+		if (origoffset < origrange->maximum) {
+			origoffset++;
+			origpage += (PAGE_SIZE / sizeof(unsigned long));
+		} else {
+			origrange = origrange->next;
+			if (origrange) {
+				origoffset = origrange->minimum;
+				origpage = (unsigned long *) (page_address(mem_map + origoffset));
+			}
+		}
+
+		if (copyoffset < copyrange->maximum) {
+			copyoffset++;
+			copypage += (PAGE_SIZE / sizeof(unsigned long));
+		} else {
+			copyrange = copyrange->next;
+			if (copyrange) {
+				copyoffset = copyrange->minimum;
+				copypage = (unsigned long *) (page_address(mem_map + copyoffset));
+			}
+		}
+	}
+	
+/* Ahah, we now run with our old stack, and with registers copied from
+   suspend time */
+
+#ifndef CONFIG_SMP
+	//cpu_data->loops_per_jiffy = c_loops_per_jiffy_ref;
+	//loops_per_jiffy = c_loops_per_jiffy_ref;
+	//cpu_khz = cpu_khz_ref;
+#endif
+	swsusp_action = state1;
+	swsusp_debug_state = state2;
+	console_loglevel = state3;
+	//swsusp_min_free = orig_min_free;
+}
+
+void do_swsusp_lowlevel(int resume)
+{
+	if (!resume) {
+		do_swsusp2_suspend_1();
+		/* call_processor_state() in x86 */
+		__asm__ __volatile__ (" bl save_processor_state");
+		/* saving stack */
+//		__asm__ __volatile__("sync");
+//		do_swsusp2_suspend_2();
+		return;
+	}
+
+	/* setup swapper_pg_dir in x86 */
+
+	do_swsusp2_resume_1();
+	do_swsusp2_copyback();
+	/* setup segment register */
+//	__asm__ __volatile__("sync");
+	restore_processor_state();
+	do_swsusp2_resume_2();
+}
+
+#if 0
+void flush_tlb_all(void)
+{
+	/* Flush all TLBs */
+	__asm__ __volatile__("lis 4, 0x1000");
+	__asm__ __volatile__("1: addic. 4,4,-0x1000");
+	__asm__ __volatile__("tlbie 4");
+	__asm__ __volatile__("blt 1b");
+	__asm__ __volatile__("sync");
+}
+#endif
Index: linux-2.6.1-suspend/include/asm-ppc/suspend.h
===================================================================
--- linux-2.6.1-suspend/include/asm-ppc/suspend.h	(revision 0)
+++ linux-2.6.1-suspend/include/asm-ppc/suspend.h	(revision 0)
@@ -0,0 +1,14 @@
+#ifndef _PPC_SUSPEND_H
+#define _PPC_SUSPEND_H
+
+static inline void flush_tlb_all(void)
+{
+	/* Flush all TLBs */
+	__asm__ __volatile__("lis 4, 0x1000");
+	__asm__ __volatile__("1: addic. 4,4,-0x1000");
+	__asm__ __volatile__("tlbie 4");
+	__asm__ __volatile__("blt 1b");
+	__asm__ __volatile__("sync");
+}
+
+#endif

  parent reply	other threads:[~2004-01-22 13:19 UTC|newest]

Thread overview: 80+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-01-19  2:52 Help port swsusp to ppc Hugang
2004-01-19  3:04 ` Nigel Cunningham
2004-01-19  3:35 ` Benjamin Herrenschmidt
2004-01-19  5:20   ` Nigel Cunningham
2004-01-19 11:39     ` Benjamin Herrenschmidt
2004-01-19 17:56       ` Nigel Cunningham
2004-01-19 22:03         ` Benjamin Herrenschmidt
2004-01-20 20:44           ` Pavel Machek
2004-01-20 21:54             ` Benjamin Herrenschmidt
2004-01-20 22:07               ` Nigel Cunningham
2004-01-20 22:42               ` Pavel Machek
2004-01-22 13:17           ` Hugang [this message]
2004-01-22 17:53             ` Nigel Cunningham
2004-01-23  0:15               ` Hugang
2004-01-23  7:12             ` Benjamin Herrenschmidt
2004-01-23 10:30               ` Hugang
2004-01-24  2:54                 ` pmdisk working on ppc (WAS: Help port swsusp to ppc) Benjamin Herrenschmidt
2004-01-24  5:40                   ` Hugang
2004-01-24 16:28                   ` Colin Leroy
2004-01-24 23:46                     ` Benjamin Herrenschmidt
2004-01-25 18:08                       ` Colin Leroy
2004-01-26  0:08                         ` Benjamin Herrenschmidt
2004-01-26 18:21                           ` Colin Leroy
2004-01-26 21:58                             ` Benjamin Herrenschmidt
2004-01-26 14:29                   ` Guido Guenther
     [not found]                   ` <20040126181004.GB315@elf.ucw.cz>
2004-01-26 22:00                     ` Benjamin Herrenschmidt
2004-01-26 22:31                       ` Nigel Cunningham
2004-01-28 12:22                         ` Hugang
2004-01-28 13:23                           ` pmdisk working on ppc (WAS: Help port swsusp to ppc), swsusp2 works Hugang
     [not found]                             ` <20040129012720.1385c41a@localhost>
2004-01-28 19:05                               ` Nigel Cunningham
2004-01-28 19:10                                 ` Hugang
2004-01-29  0:34                           ` pmdisk working on ppc (WAS: Help port swsusp to ppc) Benjamin Herrenschmidt
2004-01-29  2:05                             ` Hugang
2004-01-29  4:23                               ` Benjamin Herrenschmidt
     [not found]                                 ` <20040129165119.553403f1@localhost>
2004-01-29 10:29                                   ` Pavel Machek
2004-01-29 10:50                                     ` Hugang
2004-01-29 12:12                                   ` Benjamin Herrenschmidt
2004-01-26 23:21                       ` Pavel Machek
2004-01-27  0:12                         ` Nigel Cunningham
2004-01-27  7:53                           ` Pavel Machek
2004-01-27 10:34                       ` Michael Schmitz
2004-01-27 10:37                         ` Benjamin Herrenschmidt
2004-01-27 14:32                           ` Michael Schmitz
2004-01-27 21:40                             ` Benjamin Herrenschmidt
2004-01-28 16:09                               ` Michael Schmitz
2004-01-28 17:02                                 ` Hugang
2004-01-28 17:03                                   ` Colin Leroy
2004-01-29  9:17                                     ` Michael Schmitz
2004-01-28 18:00                                   ` Michael Schmitz
2004-01-28 21:56                                   ` Benjamin Herrenschmidt
2004-01-28 21:55                                 ` Benjamin Herrenschmidt
2004-01-29  9:30                                   ` Michael Schmitz
2004-01-29 12:10                                     ` Benjamin Herrenschmidt
2004-01-28 21:55                                 ` Benjamin Herrenschmidt
2004-01-28 23:35                                   ` Pavel Machek
2004-01-29  8:11                                   ` Michael Schmitz
2004-01-27 10:47                         ` Pavel Machek
2004-01-27 10:56                           ` Benjamin Herrenschmidt
2004-01-24  4:39                 ` Benjamin Herrenschmidt
2004-01-24  7:20                   ` Pavel Machek
2004-01-24  9:59                     ` pmdisk working on ppc Måns Rullgård
2004-01-19 20:45       ` Help port swsusp to ppc Pavel Machek
2004-01-19 23:38         ` Benjamin Herrenschmidt
2004-01-20  0:04           ` Pavel Machek
2004-01-20  1:06             ` Benjamin Herrenschmidt
2004-01-20 10:02               ` Pavel Machek
2004-01-20 11:25                 ` Benjamin Herrenschmidt
2004-01-20 11:44                   ` Pavel Machek
2004-01-20  9:53           ` Geert Uytterhoeven
2004-01-20 10:04             ` Pavel Machek
2004-01-20 11:26               ` Benjamin Herrenschmidt
2004-01-20 11:36                 ` Pavel Machek
2004-01-20 11:44                   ` Benjamin Herrenschmidt
2004-01-20 11:57                     ` Pavel Machek
2004-01-20 18:30                     ` Nigel Cunningham
2004-01-20 21:43                       ` Benjamin Herrenschmidt
2004-01-20 11:22             ` Benjamin Herrenschmidt
2004-01-19 20:40     ` Pavel Machek
2004-01-19 23:40       ` Benjamin Herrenschmidt
2004-01-19 23:59         ` Pavel Machek

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20040122211746.3ec1018c@localhost \
    --to=hugang@soulinfo.com \
    --cc=benh@kernel.crashing.org \
    --cc=debian-powerpc@lists.debian.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=ncunningham@clear.net.nz \
    --cc=ncunningham@users.sourceforge.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.