mirror of https://github.com/OpenIPC/firmware.git
				
				
				
			
		
			
				
	
	
		
			194 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Diff
		
	
	
			
		
		
	
	
			194 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Diff
		
	
	
| diff -drupN a/tools/pm-sleep/start.S b/tools/pm-sleep/start.S
 | |
| --- a/tools/pm-sleep/start.S	1970-01-01 03:00:00.000000000 +0300
 | |
| +++ b/tools/pm-sleep/start.S	2022-06-09 05:02:37.000000000 +0300
 | |
| @@ -0,0 +1,189 @@
 | |
| +#define zero	$0	/* wired zero */
 | |
| +#define AT	$1	/* assembler temp  - uppercase because of ".set at" */
 | |
| +#define v0	$2	/* return value */
 | |
| +#define v1	$3
 | |
| +#define a0	$4	/* argument registers */
 | |
| +#define a1	$5
 | |
| +#define a2	$6
 | |
| +#define a3	$7
 | |
| +#define t0	$8	/* caller saved */
 | |
| +#define t1	$9
 | |
| +#define t2	$10
 | |
| +#define t3	$11
 | |
| +#define t4	$12
 | |
| +#define t5	$13
 | |
| +#define t6	$14
 | |
| +#define t7	$15
 | |
| +#define s0	$16	/* callee saved */
 | |
| +#define s1	$17
 | |
| +#define s2	$18
 | |
| +#define s3	$19
 | |
| +#define s4	$20
 | |
| +#define s5	$21
 | |
| +#define s6	$22
 | |
| +#define s7	$23
 | |
| +#define t8	$24	/* caller saved */
 | |
| +#define t9	$25
 | |
| +#define jp	$25	/* PIC jump register */
 | |
| +#define k0	$26	/* kernel scratch */
 | |
| +#define k1	$27
 | |
| +#define gp	$28	/* global pointer */
 | |
| +#define sp	$29	/* stack pointer */
 | |
| +#define fp	$30	/* frame pointer */
 | |
| +#define s8	$30	/* same like fp! */
 | |
| +#define ra	$31	/* return address */
 | |
| +
 | |
| +	.set noreorder
 | |
| +	.section _start_section
 | |
| +	.text
 | |
| +	.globl _start
 | |
| +	.ent _start
 | |
| +_start:
 | |
| +	//--------  a0 <- load address
 | |
| +	//-------   -T 0
 | |
| +	addu     sp,sp,-12
 | |
| +	sw 	gp,0(sp)
 | |
| +	sw	ra,4(sp)
 | |
| +	sw  	t9,8(sp)
 | |
| +	/* Initialize $gp */
 | |
| +	bal	1f
 | |
| +	nop
 | |
| +	.word	_gp
 | |
| +	.word	__rel_dyn_end
 | |
| +	.word	__rel_dyn_start
 | |
| +	.word	__image_copy_end
 | |
| +	.word	_GLOBAL_OFFSET_TABLE_
 | |
| +	.word	num_got_entries
 | |
| +
 | |
| +1:
 | |
| +	lw	gp, 0(ra)
 | |
| +	addu     gp,gp,a0
 | |
| +	//----------------------------------------------------------------------
 | |
| +	lw	t3, 20(ra)		# t3 <-- num_got_entries
 | |
| +	lw	t4, 16(ra)		# t4 <-- _GLOBAL_OFFSET_TABLE_
 | |
| +	addu	t4, a0,t4		# t4 now holds relocated _G_O_T_
 | |
| +	addi	t4, t4, 8		# skipping first two entries
 | |
| +	li	t2, 2
 | |
| +1:
 | |
| +	lw	t1, 0(t4)
 | |
| +	addu	t1, a0
 | |
| +	sw	t1, 0(t4)
 | |
| +2:
 | |
| +	addi	t2, 1
 | |
| +	blt	t2, t3, 1b
 | |
| +	addi	t4, 4
 | |
| +	//----------------------------------------------------------------------
 | |
| +	lw	t2, 4(ra)   // <-  __rel_dyn_end
 | |
| +	lw	t1, 8(ra)   // <- __rel_dyn_start
 | |
| +
 | |
| +	addu    t2,t2,a0
 | |
| +	addu    t1,t1,a0
 | |
| +
 | |
| +	b	2f			# skip first reserved entry
 | |
| +	addi	t1, 8
 | |
| +
 | |
| +1:
 | |
| +	lw	t3, -4(t1)		# t3 <-- relocation info
 | |
| +
 | |
| +	sub	t3, 3
 | |
| +	bnez	t3, 2f			# skip non R_MIPS_REL32 entries
 | |
| +	 nop
 | |
| +
 | |
| +	lw	t3, -8(t1)		# t3 <-- location to fix up in FLASH
 | |
| +	addu	t3, a0			# t3 <-- location to fix up in RAM
 | |
| +
 | |
| +	lw	t4, 0(t3)		# t4 <-- original pointer
 | |
| +	addu	t4, a0			# t4 <-- adjusted pointer
 | |
| +	sw	t4, 0(t3)
 | |
| +
 | |
| +2:
 | |
| +	blt	t1, t2, 1b
 | |
| +	addi	t1, 8			# each rel.dyn entry is 8 bytes
 | |
| +
 | |
| +
 | |
| +	la	t1, __bss_start		# t1 <-- __bss_start
 | |
| +	la	t2, __bss_end		# t2 <-- __bss_end
 | |
| +1:
 | |
| +	sw	zero, 0(t1)
 | |
| +	blt	t1, t2, 1b
 | |
| +	addi	t1, 4
 | |
| +
 | |
| +	la      t0,extern_func
 | |
| +	sw	a1,0(t0)
 | |
| +
 | |
| +	move    t3,a0
 | |
| +	la  	t0,p_slp_param
 | |
| +	sw	t3,0(t0)
 | |
| +	la	t2,sleep_pm_enter
 | |
| +	sw      t2,0(t3)
 | |
| +
 | |
| +	addu    t3,t3,4
 | |
| +	la	t2,0xffffffff
 | |
| +	addi    t1,t3,0x40
 | |
| +1:
 | |
| +	sw	t2,0(t3)
 | |
| +	addu    t3,t3,4
 | |
| +	bne	t1,t3,1b
 | |
| +	nop
 | |
| +
 | |
| +	lw	gp,0(sp)
 | |
| +	lw	ra,4(sp)
 | |
| +	lw      t9,8(sp)
 | |
| +	addu     sp,sp,12
 | |
| +	jr     ra
 | |
| +	nop
 | |
| +	.end _start
 | |
| +
 | |
| +	.space  256
 | |
| +	.globl	sleep_pm_enter
 | |
| +sleep_pm_enter:
 | |
| +	.ent	sleep_pm_enter
 | |
| +	.type   sleep_pm_enter,@function
 | |
| +	.set    noreorder
 | |
| +	bal   1f
 | |
| +	nop
 | |
| +1:
 | |
| +	addu   t9,ra,4
 | |
| +	.cpload t9
 | |
| +	addiu    sp,ra,-4
 | |
| +	la	t9,core_sleep_enter
 | |
| +	jr	t9
 | |
| +	nop
 | |
| +	.end sleep_pm_enter
 | |
| +
 | |
| +sleep_pm_exit:
 | |
| +	.globl	sleep_pm_exit
 | |
| +	.ent	sleep_pm_exit
 | |
| +	.set    noreorder
 | |
| +	bal   1f
 | |
| +	nop
 | |
| +1:
 | |
| +	addu   t9,ra,4
 | |
| +	.cpload t9
 | |
| +	//set sp
 | |
| +	addiu    sp,ra,-16
 | |
| +	la	t9,core_sleep_restore
 | |
| +	jr      t9
 | |
| +	nop
 | |
| +	.end sleep_pm_exit
 | |
| +
 | |
| +call_function:
 | |
| +	.globl	call_function
 | |
| +	.ent	call_function
 | |
| +	.set    noreorder
 | |
| +	addu    sp,sp,-16
 | |
| +	sw	gp,0(sp)
 | |
| +	sw	ra,4(sp)
 | |
| +	sw	t9,8(sp)
 | |
| +	move t9,a0
 | |
| +	move a0,a1
 | |
| +
 | |
| +	jalr    t9
 | |
| +	nop
 | |
| +	lw	gp,0(sp)
 | |
| +	lw 	ra,4(sp)
 | |
| +	lw	t9,8(sp)
 | |
| +	addu    sp,sp,16
 | |
| +	jr	ra
 | |
| +	nop
 | |
| +	.end call_function
 |