All of lore.kernel.org
 help / color / mirror / Atom feed
From: Hugang <hugang@soulinfo.com>
To: ncunningham@clear.net.nz, linux-kernel@vger.kernel.org,
	debian-powerpc@lists.debian.org
Subject: Help port swsusp to ppc.
Date: Mon, 19 Jan 2004 10:52:37 +0800	[thread overview]
Message-ID: <20040119105237.62a43f65@localhost> (raw)

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

Hello guys:

I'm try to porting Software Suspend to PowerPC. But I'm not family with
PowerPC assemble languae. So need someone to help me write the save
process state function in assemble language.

1: Download i386 suspend patch for 2.6.1 from swsusp.sf.net
 you need two patch 
 software-suspend-core-2.0-rc4-whole.bz2
 software-suspend-linux-2.6.1-rev1-whole.bz2
2: first you need apply linux-2.6.1 to 2.6.1 clean kernel
   then apply core-2.0-rc4 to current patched kernel
3: then apply ppc-swsusp.patch to patched kernel
4: do make menuconfig
 CONFIG_SOFTWARE_SUSPEND2=y
 CONFIG_SOFTWARE_SUSPEND_DEBUG=y
 CONFIG_SOFTWARE_SUSPEND_GZIP_COMPRESSION=y
 CONFIG_SOFTWARE_SUSPEND_KEEP_IMAGE=y
 CONFIG_SOFTWARE_SUSPEND_LZF_COMPRESSION=y
 CONFIG_SOFTWARE_SUSPEND_SWAPWRITER=y
5: test with swsusp enable kernel.
 in yaboot prompt:
 /vmlinux.swsusp root=/dev/hda13 resume2=swap:/dev/hda10 init=/bin/sh
 
 /dev/hda13 is the root device name
 /dev/hda10 is swap device name
 
6: run suspend script to do software suspend, now the machine will power
 off.

7: power on machin, in yaboot prompt:
  /vmlinux.swsusp root=/dev/hda13 resume2=swap:/dev/hda10 init=/bin/sh

But for now the save and restore processor state is not finish, the
resume will oops.

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

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

Index: include/asm-ppc/suspend.h
===================================================================
--- include/asm-ppc/suspend.h	(revision 0)
+++ include/asm-ppc/suspend.h	(revision 0)
@@ -0,0 +1,6 @@
+#ifndef _PPC_SUSPEND_H
+#define _PPC_SUSPEND_H
+
+/* Nothing */
+
+#endif
Index: arch/ppc/Kconfig
===================================================================
--- arch/ppc/Kconfig	(revision 192)
+++ 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
Index: arch/ppc/kernel/swsusp2-asm.S
===================================================================
--- arch/ppc/kernel/swsusp2-asm.S	(revision 0)
+++ arch/ppc/kernel/swsusp2-asm.S	(revision 0)
@@ -0,0 +1,523 @@
+	.file	"swsusp2.c"
+gcc2_compiled.:
+	.section	".rodata"
+	.align 2
+.LC0:
+	.string	"/scm/svn/dell/pub/linux-kernel/2.6/tags/linux-2.6.1-swsusp2/include/linux/cpumask.h"
+	.align 2
+.LC1:
+	.string	"next_online_cpu"
+	.align 2
+.LC2:
+	.string	"/scm/svn/dell/pub/linux-kernel/2.6/tags/linux-2.6.1-swsusp2/include/linux/module.h"
+	.align 2
+.LC3:
+	.string	"__module_get"
+	.align 2
+.LC4:
+	.string	"/scm/svn/dell/pub/linux-kernel/2.6/tags/linux-2.6.1-swsusp2/include/linux/dcache.h"
+	.align 2
+.LC5:
+	.string	"dget"
+	.align 2
+.LC6:
+	.string	"/scm/svn/dell/pub/linux-kernel/2.6/tags/linux-2.6.1-swsusp2/include/linux/mm.h"
+	.align 2
+.LC7:
+	.string	"put_page"
+	.align 2
+.LC8:
+	.string	"/scm/svn/dell/pub/linux-kernel/2.6/tags/linux-2.6.1-swsusp2/include/linux/highmem.h"
+	.align 2
+.LC9:
+	.string	"memclear_highpage_flush"
+	.align 2
+.LC10:
+	.string	"/scm/svn/dell/pub/linux-kernel/2.6/tags/linux-2.6.1-swsusp2/include/linux/blkdev.h"
+	.align 2
+.LC11:
+	.string	"blkdev_dequeue_request"
+	.align 2
+.LC12:
+	.string	"/scm/svn/dell/pub/linux-kernel/2.6/tags/linux-2.6.1-swsusp2/include/linux/skbuff.h"
+	.align 2
+.LC13:
+	.string	"__skb_put"
+	.align 2
+.LC14:
+	.string	"skb_put"
+	.align 2
+.LC15:
+	.string	"__skb_pull"
+	.align 2
+.LC16:
+	.string	"/scm/svn/dell/pub/linux-kernel/2.6/tags/linux-2.6.1-swsusp2/include/linux/netdevice.h"
+	.align 2
+.LC17:
+	.string	"netif_rx_complete"
+	.align 2
+.LC18:
+	.string	"__netif_rx_complete"
+	.align 2
+.LC19:
+	.string	"BUG: dst underflow %d: %p\n"
+	.align 2
+.LC20:
+	.string	"/scm/svn/dell/pub/linux-kernel/2.6/tags/linux-2.6.1-swsusp2/include/net/sock.h"
+	.align 2
+.LC21:
+	.string	"sk_del_node_init"
+	.align 2
+.LC22:
+	.string	"sk_set_owner"
+	.align 2
+.LC23:
+	.string	"kiocb_to_siocb"
+	.align 2
+.LC24:
+	.string	"/scm/svn/dell/pub/linux-kernel/2.6/tags/linux-2.6.1-swsusp2/include/linux/kernel_stat.h"
+	.align 2
+.LC25:
+	.string	"kstat_irqs"
+	.align 2
+.LC26:
+	.string	"/scm/svn/dell/pub/linux-kernel/2.6/tags/linux-2.6.1-swsusp2/include/linux/raid/md_k.h"
+	.align 2
+.LC27:
+	.string	"pers_to_level"
+	.section	".data.nosave","aw"
+	.align 2
+	.type	 loop,@object
+	.size	 loop,4
+loop:
+	.long 0
+	.align 2
+	.type	 state1,@object
+	.size	 state1,4
+state1:
+	.long 0
+	.align 2
+	.type	 state2,@object
+	.size	 state2,4
+state2:
+	.long 0
+	.align 2
+	.type	 state3,@object
+	.size	 state3,4
+state3:
+	.long 0
+	.align 2
+	.type	 c_loops_per_jiffy_ref,@object
+	.size	 c_loops_per_jiffy_ref,4
+c_loops_per_jiffy_ref:
+	.long 0
+	.align 2
+	.type	 cpu_khz_ref,@object
+	.size	 cpu_khz_ref,4
+cpu_khz_ref:
+	.long 0
+	.section	".text"
+	.align 2
+	.globl do_swsusp_lowlevel
+	.type	 do_swsusp_lowlevel,@function
+do_swsusp_lowlevel:
+	stwu 1,-48(1)
+	mflr 0
+	stmw 23,12(1)
+	stw 0,52(1)
+	cmpwi 0,3,0
+	bc 4,2,.L3612
+	bl do_swsusp2_suspend_1
+	//bl ppc_save_reg
+	/* bl save_processor_state
+	bl save_stack */
+	bl do_swsusp2_suspend_2
+	b .L3611
+.L3612:
+	lis	2,swapper_pg_dir@ha	   
+	addi 2,2,swapper_pg_dir@l
+	bl do_swsusp2_resume_1
+	lis 9,swsusp_action@ha
+	lwz 0,swsusp_action@l(9)
+	lis 11,swsusp_debug_state@ha
+	lis 9,state1@ha
+	stw 0,state1@l(9)
+	lwz 8,swsusp_debug_state@l(11)
+	lis 10,console_printk@ha
+	lis 9,state2@ha
+	lis 11,pagedir_resume@ha
+	stw 8,state2@l(9)
+	la 11,pagedir_resume@l(11)
+	lwz 0,console_printk@l(10)
+	lwz 5,12(11)
+	lis 9,state3@ha
+	stw 0,state3@l(9)
+	lwz 10,0(5)
+	lwz 4,56(11)
+	lis 9,origoffset@ha
+	stw 10,origoffset@l(9)
+	lwz 0,0(4)
+	lis 11,copyoffset@ha
+	stw 0,copyoffset@l(11)
+	lwz 10,origoffset@l(9)
+	lwz 8,copyoffset@l(11)
+	slwi 9,10,2
+	slwi 11,8,2
+	add 9,9,10
+	add 11,11,8
+	lis 0,0xcccc
+	ori 0,0,52429
+	slwi 9,9,3
+	slwi 11,11,3
+	mullw 11,11,0
+	mullw 9,9,0
+	slwi 11,11,9
+	slwi 9,9,9
+	cmpwi 0,5,0
+	addis 9,9,0xc000
+	addis 11,11,0xc000
+	lis 7,origrange@ha
+	lis 6,copyrange@ha
+	lis 10,origpage@ha
+	lis 8,copypage@ha
+	lis 24,origrange@ha
+	lis 25,copyrange@ha
+	lis 12,origoffset@ha
+	lis 3,copyoffset@ha
+	stw 9,origpage@l(10)
+	stw 11,copypage@l(8)
+	stw 5,origrange@l(7)
+	stw 4,copyrange@l(6)
+	bc 12,2,.L3631
+	lis 4,0xcccc
+	lis 28,loop@ha
+	lis 26,origoffset@ha
+	lis 29,origrange@ha
+	lis 30,origpage@ha
+	ori 4,4,52429
+	lis 27,copyoffset@ha
+	lis 31,copypage@ha
+.L3617:
+	li 0,0
+	stw 0,loop@l(28)
+	lwz 9,loop@l(28)
+	cmplwi 0,9,1023
+	bc 12,1,.L3622
+	lis 7,loop@ha
+	lis 5,origpage@ha
+	lis 6,copypage@ha
+.L3620:
+	lwz 8,loop@l(7)
+	lwz 9,loop@l(7)
+	lwz 11,copypage@l(6)
+	slwi 9,9,2
+	lwzx 0,9,11
+	lwz 10,origpage@l(5)
+	slwi 8,8,2
+	stwx 0,8,10
+	lwz 9,loop@l(7)
+	addi 9,9,1
+	stw 9,loop@l(7)
+	lwz 0,loop@l(7)
+	cmplwi 0,0,1023
+	bc 4,1,.L3620
+.L3622:
+	lwz 11,origrange@l(29)
+	lwz 9,origoffset@l(26)
+	lwz 0,4(11)
+	cmplw 0,9,0
+	bc 4,0,.L3623
+	lwz 9,origoffset@l(12)
+	lwz 11,origpage@l(30)
+	addi 9,9,1
+	addi 11,11,4096
+	stw 9,origoffset@l(12)
+	stw 11,origpage@l(30)
+	b .L3624
+.L3623:
+	lwz 9,8(11)
+	cmpwi 0,9,0
+	stw 9,origrange@l(24)
+	bc 12,2,.L3624
+	lwz 9,0(9)
+	stw 9,origoffset@l(12)
+	lwz 0,origoffset@l(12)
+	slwi 9,0,2
+	add 9,9,0
+	slwi 9,9,3
+	mullw 9,9,4
+	slwi 9,9,9
+	addis 9,9,0xc000
+	stw 9,origpage@l(30)
+.L3624:
+	lis 9,copyrange@ha
+	lwz 9,copyrange@l(9)
+	lwz 11,copyoffset@l(27)
+	lwz 0,4(9)
+	cmplw 0,11,0
+	bc 4,0,.L3627
+	lwz 9,copyoffset@l(3)
+	lwz 11,copypage@l(31)
+	addi 9,9,1
+	addi 11,11,4096
+	stw 9,copyoffset@l(3)
+	stw 11,copypage@l(31)
+	b .L3615
+.L3627:
+	lwz 9,8(9)
+	cmpwi 0,9,0
+	stw 9,copyrange@l(25)
+	bc 12,2,.L3615
+	lwz 9,0(9)
+	stw 9,copyoffset@l(3)
+	lwz 0,copyoffset@l(3)
+	slwi 9,0,2
+	add 9,9,0
+	slwi 9,9,3
+	mullw 9,9,4
+	slwi 9,9,9
+	addis 9,9,0xc000
+	stw 9,copypage@l(31)
+.L3615:
+	lwz 0,origrange@l(29)
+	cmpwi 0,0,0
+	bc 4,2,.L3617
+.L3631:
+	lis 9,state1@ha
+	lwz 7,state1@l(9)
+	lis 11,state2@ha
+	lwz 8,state2@l(11)
+	lis 9,state3@ha
+	lwz 0,state3@l(9)
+	lis 11,swsusp_action@ha
+	lis 9,swsusp_debug_state@ha
+	lis 10,console_printk@ha
+	stw 7,swsusp_action@l(11)
+	stw 8,swsusp_debug_state@l(9)
+	stw 0,console_printk@l(10)
+	/* bl restore_stack
+	bl restore_processor_state */
+	//bl ppc_restore_reg
+	bl do_swsusp2_resume_2
+.L3611:
+	lwz 0,52(1)
+	mtlr 0
+	lmw 23,12(1)
+	la 1,48(1)
+	blr
+.Lfe1:
+	.size	 do_swsusp_lowlevel,.Lfe1-do_swsusp_lowlevel
+	.section	".data.nosave"
+	.align 2
+	.type	 origrange,@object
+	.size	 origrange,4
+origrange:
+	.space	4
+	.align 2
+	.type	 copyrange,@object
+	.size	 copyrange,4
+copyrange:
+	.space	4
+	.align 2
+	.type	 origoffset,@object
+	.size	 origoffset,4
+origoffset:
+	.space	4
+	.align 2
+	.type	 copyoffset,@object
+	.size	 copyoffset,4
+copyoffset:
+	.space	4
+	.align 2
+	.type	 origpage,@object
+	.size	 origpage,4
+origpage:
+	.space	4
+	.align 2
+	.type	 copypage,@object
+	.size	 copypage,4
+copypage:
+	.space	4
+	.align 2
+	.type	 orig_min_free,@object
+	.size	 orig_min_free,4
+orig_min_free:
+	.space	4
+	.section	".text"
+	.align 2
+	.globl do_swsusp2_copyback
+	.type	 do_swsusp2_copyback,@function
+do_swsusp2_copyback:
+	stwu 1,-48(1)
+	stmw 23,12(1)
+	lis 9,swsusp_action@ha
+	lwz 0,swsusp_action@l(9)
+	lis 11,swsusp_debug_state@ha
+	lis 9,state1@ha
+	stw 0,state1@l(9)
+	lwz 8,swsusp_debug_state@l(11)
+	lis 10,console_printk@ha
+	lis 9,state2@ha
+	lis 11,pagedir_resume@ha
+	stw 8,state2@l(9)
+	la 11,pagedir_resume@l(11)
+	lwz 0,console_printk@l(10)
+	lwz 5,12(11)
+	lis 9,state3@ha
+	stw 0,state3@l(9)
+	lwz 10,0(5)
+	lwz 4,56(11)
+	lis 9,origoffset@ha
+	stw 10,origoffset@l(9)
+	lwz 0,0(4)
+	lis 11,copyoffset@ha
+	stw 0,copyoffset@l(11)
+	lwz 10,origoffset@l(9)
+	lwz 8,copyoffset@l(11)
+	slwi 9,10,2
+	slwi 11,8,2
+	add 9,9,10
+	add 11,11,8
+	lis 0,0xcccc
+	ori 0,0,52429
+	slwi 9,9,3
+	slwi 11,11,3
+	mullw 11,11,0
+	mullw 9,9,0
+	slwi 11,11,9
+	slwi 9,9,9
+	cmpwi 0,5,0
+	addis 9,9,0xc000
+	addis 11,11,0xc000
+	lis 7,origrange@ha
+	lis 6,copyrange@ha
+	lis 10,origpage@ha
+	lis 8,copypage@ha
+	stw 9,origpage@l(10)
+	stw 11,copypage@l(8)
+	stw 5,origrange@l(7)
+	stw 4,copyrange@l(6)
+	lis 24,origrange@ha
+	lis 25,copyrange@ha
+	lis 12,origoffset@ha
+	lis 3,copyoffset@ha
+	bc 12,2,.L3594
+	lis 4,0xcccc
+	lis 28,loop@ha
+	lis 26,origoffset@ha
+	lis 29,origrange@ha
+	lis 30,origpage@ha
+	ori 4,4,52429
+	lis 27,copyoffset@ha
+	lis 31,copypage@ha
+.L3595:
+	li 0,0
+	stw 0,loop@l(28)
+	lwz 9,loop@l(28)
+	cmplwi 0,9,1023
+	bc 12,1,.L3597
+	lis 7,loop@ha
+	lis 5,origpage@ha
+	lis 6,copypage@ha
+.L3599:
+	lwz 8,loop@l(7)
+	lwz 9,loop@l(7)
+	lwz 11,copypage@l(6)
+	slwi 9,9,2
+	lwzx 0,9,11
+	lwz 10,origpage@l(5)
+	slwi 8,8,2
+	stwx 0,8,10
+	lwz 9,loop@l(7)
+	addi 9,9,1
+	stw 9,loop@l(7)
+	lwz 0,loop@l(7)
+	cmplwi 0,0,1023
+	bc 4,1,.L3599
+.L3597:
+	lwz 11,origrange@l(29)
+	lwz 9,origoffset@l(26)
+	lwz 0,4(11)
+	cmplw 0,9,0
+	bc 4,0,.L3601
+	lwz 9,origoffset@l(12)
+	lwz 11,origpage@l(30)
+	addi 9,9,1
+	addi 11,11,4096
+	stw 9,origoffset@l(12)
+	stw 11,origpage@l(30)
+	b .L3602
+.L3601:
+	lwz 9,8(11)
+	cmpwi 0,9,0
+	stw 9,origrange@l(24)
+	bc 12,2,.L3602
+	lwz 9,0(9)
+	stw 9,origoffset@l(12)
+	lwz 0,origoffset@l(12)
+	slwi 9,0,2
+	add 9,9,0
+	slwi 9,9,3
+	mullw 9,9,4
+	slwi 9,9,9
+	addis 9,9,0xc000
+	stw 9,origpage@l(30)
+.L3602:
+	lis 9,copyrange@ha
+	lwz 9,copyrange@l(9)
+	lwz 11,copyoffset@l(27)
+	lwz 0,4(9)
+	cmplw 0,11,0
+	bc 4,0,.L3605
+	lwz 9,copyoffset@l(3)
+	lwz 11,copypage@l(31)
+	addi 9,9,1
+	addi 11,11,4096
+	stw 9,copyoffset@l(3)
+	stw 11,copypage@l(31)
+	b .L3593
+.L3605:
+	lwz 9,8(9)
+	cmpwi 0,9,0
+	stw 9,copyrange@l(25)
+	bc 12,2,.L3593
+	lwz 9,0(9)
+	stw 9,copyoffset@l(3)
+	lwz 0,copyoffset@l(3)
+	slwi 9,0,2
+	add 9,9,0
+	slwi 9,9,3
+	mullw 9,9,4
+	slwi 9,9,9
+	addis 9,9,0xc000
+	stw 9,copypage@l(31)
+.L3593:
+	lwz 0,origrange@l(29)
+	cmpwi 0,0,0
+	bc 4,2,.L3595
+.L3594:
+	lis 9,state1@ha
+	lwz 7,state1@l(9)
+	lis 11,state2@ha
+	lwz 8,state2@l(11)
+	lis 9,state3@ha
+	lwz 0,state3@l(9)
+	lis 11,swsusp_action@ha
+	lis 9,swsusp_debug_state@ha
+	lis 10,console_printk@ha
+	stw 7,swsusp_action@l(11)
+	stw 8,swsusp_debug_state@l(9)
+	stw 0,console_printk@l(10)
+	lmw 23,12(1)
+	la 1,48(1)
+	blr
+.Lfe2:
+	.size	 do_swsusp2_copyback,.Lfe2-do_swsusp2_copyback
+	.align 2
+	.globl flush_tlb_all
+	.type	 flush_tlb_all,@function
+flush_tlb_all:
+	blr
+.Lfe3:
+	.size	 flush_tlb_all,.Lfe3-flush_tlb_all
+	.ident	"GCC: (GNU) 2.95.4 20011002 (Debian prerelease)"
Index: arch/ppc/kernel/Makefile
===================================================================
--- arch/ppc/kernel/Makefile	(revision 192)
+++ arch/ppc/kernel/Makefile	(working copy)
@@ -34,3 +34,5 @@
 obj-$(CONFIG_8xx)		+= softemu8xx.o
 endif
 
+obj-$(CONFIG_SOFTWARE_SUSPEND2) += swsusp2-asm.o
+obj-$(CONFIG_SOFTWARE_SUSPEND2) += ppc_reg.o
Index: arch/ppc/kernel/ppc_reg.S
===================================================================
--- arch/ppc/kernel/ppc_reg.S	(revision 0)
+++ arch/ppc/kernel/ppc_reg.S	(revision 0)
@@ -0,0 +1,250 @@
+/*
+ * This file contains sleep low-level functions for PowerBook G3.
+ *    Copyright (C) 1999 Benjamin Herrenschmidt (benh@kernel.crashing.org)
+ *    and Paul Mackerras (paulus@samba.org).
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version
+ * 2 of the License, or (at your option) any later version.
+ *
+ */
+
+#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>
+
+#define MAGIC	0x4c617273	/* 'Lars' */
+
+/*
+ * 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
+
+/* This gets called by via-pmu.c late during the sleep process.
+ * The PMU was already send the sleep command and will shut us down
+ * soon. We need to save all that is needed and setup the wakeup
+ * vector that will be called by the ROM on wakeup
+ */
+_GLOBAL(ppc_save_reg)
+	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)
+
+	/* 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)
+
+	/* Backup various CPU config stuffs */
+	bl	__save_cpu_setup
+
+	/* Store a pointer to our backup storage into
+	 * a kernel global
+	 */
+	lis r3,sleep_storage@ha
+	addi r3,r3,sleep_storage@l
+	stw r5,0(r3)
+	
+_GLOBAL(ppc_restore_reg)
+	/* Recover sleep storage */
+	lis	r3,sleep_storage@ha
+	addi	r3,r3,sleep_storage@l
+	tophys(r3,r3)
+	lwz	r1,0(r3)
+	
+	/* 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)
+
+#if 0
+	/* 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	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
+
+	/* 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
+
+turn_on_mmu:
+	mflr	r4
+	tovirt(r4,r4)
+	mtsrr0	r4
+	mtsrr1	r3
+	sync
+	isync
+	rfi
+#endif
+	.section .data
+sleep_storage:
+	.long 0
Index: arch/ppc/kernel/vmlinux.lds.S
===================================================================
--- arch/ppc/kernel/vmlinux.lds.S	(revision 192)
+++ 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: arch/ppc/kernel/swsusp2.c
===================================================================
--- arch/ppc/kernel/swsusp2.c	(revision 0)
+++ arch/ppc/kernel/swsusp2.c	(revision 0)
@@ -0,0 +1,153 @@
+ /*
+  * 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>
+  */
+#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.
+ */
+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;
+}
+
+extern void save_process_state();
+extern void restore_process_state();
+extern void save_stack();
+extern void restore_stack();
+
+void do_swsusp_lowlevel(int resume)
+{
+	if (!resume) {
+		do_swsusp2_suspend_1();
+		save_processor_state();
+		save_stack();
+		do_swsusp2_suspend_2();
+		return;
+	}
+	__asm__ __volatile__("lis %%r2, %0":"=m"(swapper_pg_dir));	
+//	__asm__ __volatile__("addi %%r2, %%r2, %0":"memory"(swapper_pg_dir));
+	do_swsusp2_resume_1();
+	do_swsusp2_copyback();
+	restore_stack();
+	restore_processor_state();
+	do_swsusp2_resume_2();
+	return;
+}
+
+void flush_tlb_all()
+{
+}
Index: kernel/power/swsusp2.c
===================================================================
--- kernel/power/swsusp2.c	(revision 192)
+++ kernel/power/swsusp2.c	(working copy)
@@ -54,7 +54,9 @@
 
 #include <linux/suspend-common.h>
 #include <linux/suspend-version-specific.h>
+#ifdef  CONFIG_X86
 #include <asm/i387.h> /* for kernel_fpu_end */
+#endif
 #ifdef	CONFIG_KDB
 #include <linux/kdb.h>
 #endif	/* CONFIG_KDB */
@@ -327,7 +329,9 @@
 	preempt_enable();
 #endif
 
+#ifdef CONFIG_X86
 	kernel_fpu_end();
+#endif
 
 	PRINTPREEMPTCOUNT("Prior to resuming drivers.");
 
@@ -486,10 +490,10 @@
 #endif
 
 	PRINTPREEMPTCOUNT("In resume_2 after copy back.");
-
+#ifdef CONFIG_X86
 	kernel_fpu_end();
-
 	PRINTPREEMPTCOUNT("In resume_2 after fpu end.");
+#endif
 	
 #ifdef CONFIG_PREEMPT
 	preempt_enable();

[-- Attachment #3: suspend --]
[-- Type: application/octet-stream, Size: 318 bytes --]

#!/bin/sh

swapon -a
sync
sync


for i in `lsmod | awk '{print $1}'`
do
	rmmod $i
done

mount -t proc none /proc
mount /sys

echo -n "disk" > /sys/power/state
echo -n "6" > /proc/swsusp/default_console_level
echo -n "1" > /proc/swsusp/slow
echo -n "1" > /proc/swsusp/debug_sections
echo -n "1" > /proc/swsusp/activate

             reply	other threads:[~2004-01-19  2:54 UTC|newest]

Thread overview: 80+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-01-19  2:52 Hugang [this message]
2004-01-19  3:04 ` Help port swsusp to ppc 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
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=20040119105237.62a43f65@localhost \
    --to=hugang@soulinfo.com \
    --cc=debian-powerpc@lists.debian.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=ncunningham@clear.net.nz \
    /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.