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
|