riscv: refactor assembly files to support RV64 and F extension
Этот коммит содержится в:
		
							родитель
							
								
									66b21b4c86
								
							
						
					
					
						коммит
						43a66b39cc
					
				
					 9 изменённых файлов: 163 добавлений и 147 удалений
				
			
		
							
								
								
									
										130
									
								
								src/device/riscv/handleinterrupt.S
									
										
									
									
									
										Обычный файл
									
								
							
							
						
						
									
										130
									
								
								src/device/riscv/handleinterrupt.S
									
										
									
									
									
										Обычный файл
									
								
							| 
						 | 
					@ -0,0 +1,130 @@
 | 
				
			||||||
 | 
					#ifdef F_EXTENSION
 | 
				
			||||||
 | 
					#define NREG 48
 | 
				
			||||||
 | 
					#define LFREG flw
 | 
				
			||||||
 | 
					#define SFREG fsw
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#define NREG 16
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef RV64
 | 
				
			||||||
 | 
					#define REGSIZE 8
 | 
				
			||||||
 | 
					#define SREG sd
 | 
				
			||||||
 | 
					#define LREG ld
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#define REGSIZE 4
 | 
				
			||||||
 | 
					#define SREG sw
 | 
				
			||||||
 | 
					#define LREG lw
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.section .text.handleInterruptASM
 | 
				
			||||||
 | 
					.global handleInterruptASM
 | 
				
			||||||
 | 
					.type handleInterruptASM,@function
 | 
				
			||||||
 | 
					handleInterruptASM:
 | 
				
			||||||
 | 
					    // Save and restore all registers, because the hardware only saves/restores
 | 
				
			||||||
 | 
					    // the pc.
 | 
				
			||||||
 | 
					    // Note: we have to do this in assembly because the "interrupt"="machine"
 | 
				
			||||||
 | 
					    // attribute is broken in LLVM: https://bugs.llvm.org/show_bug.cgi?id=42984
 | 
				
			||||||
 | 
					    addi    sp, sp, -NREG*REGSIZE
 | 
				
			||||||
 | 
					    SREG    ra, 0*REGSIZE(sp)
 | 
				
			||||||
 | 
					    SREG    t0, 1*REGSIZE(sp)
 | 
				
			||||||
 | 
					    SREG    t1, 2*REGSIZE(sp)
 | 
				
			||||||
 | 
					    SREG    t2, 3*REGSIZE(sp)
 | 
				
			||||||
 | 
					    SREG    a0, 4*REGSIZE(sp)
 | 
				
			||||||
 | 
					    SREG    a1, 5*REGSIZE(sp)
 | 
				
			||||||
 | 
					    SREG    a2, 6*REGSIZE(sp)
 | 
				
			||||||
 | 
					    SREG    a3, 7*REGSIZE(sp)
 | 
				
			||||||
 | 
					    SREG    a4, 8*REGSIZE(sp)
 | 
				
			||||||
 | 
					    SREG    a5, 9*REGSIZE(sp)
 | 
				
			||||||
 | 
					    SREG    a6, 10*REGSIZE(sp)
 | 
				
			||||||
 | 
					    SREG    a7, 11*REGSIZE(sp)
 | 
				
			||||||
 | 
					    SREG    t3, 12*REGSIZE(sp)
 | 
				
			||||||
 | 
					    SREG    t4, 13*REGSIZE(sp)
 | 
				
			||||||
 | 
					    SREG    t5, 14*REGSIZE(sp)
 | 
				
			||||||
 | 
					    SREG    t6, 15*REGSIZE(sp)
 | 
				
			||||||
 | 
					#ifdef F_EXTENSION
 | 
				
			||||||
 | 
					    SFREG   f0, (0  + 16)*REGSIZE(sp)
 | 
				
			||||||
 | 
					    SFREG   f1, (1  + 16)*REGSIZE(sp)
 | 
				
			||||||
 | 
					    SFREG   f2, (2  + 16)*REGSIZE(sp)
 | 
				
			||||||
 | 
					    SFREG   f3, (3  + 16)*REGSIZE(sp)
 | 
				
			||||||
 | 
					    SFREG   f4, (4  + 16)*REGSIZE(sp)
 | 
				
			||||||
 | 
					    SFREG   f5, (5  + 16)*REGSIZE(sp)
 | 
				
			||||||
 | 
					    SFREG   f6, (6  + 16)*REGSIZE(sp)
 | 
				
			||||||
 | 
					    SFREG   f7, (7  + 16)*REGSIZE(sp)
 | 
				
			||||||
 | 
					    SFREG   f8, (8  + 16)*REGSIZE(sp)
 | 
				
			||||||
 | 
					    SFREG   f9, (9  + 16)*REGSIZE(sp)
 | 
				
			||||||
 | 
					    SFREG   f10,(10 + 16)*REGSIZE(sp)
 | 
				
			||||||
 | 
					    SFREG   f11,(11 + 16)*REGSIZE(sp)
 | 
				
			||||||
 | 
					    SFREG   f12,(12 + 16)*REGSIZE(sp)
 | 
				
			||||||
 | 
					    SFREG   f13,(13 + 16)*REGSIZE(sp)
 | 
				
			||||||
 | 
					    SFREG   f14,(14 + 16)*REGSIZE(sp)
 | 
				
			||||||
 | 
					    SFREG   f15,(15 + 16)*REGSIZE(sp)
 | 
				
			||||||
 | 
					    SFREG   f16,(16 + 16)*REGSIZE(sp)
 | 
				
			||||||
 | 
					    SFREG   f17,(17 + 16)*REGSIZE(sp)
 | 
				
			||||||
 | 
					    SFREG   f18,(18 + 16)*REGSIZE(sp)
 | 
				
			||||||
 | 
					    SFREG   f19,(19 + 16)*REGSIZE(sp)
 | 
				
			||||||
 | 
					    SFREG   f20,(20 + 16)*REGSIZE(sp)
 | 
				
			||||||
 | 
					    SFREG   f21,(21 + 16)*REGSIZE(sp)
 | 
				
			||||||
 | 
					    SFREG   f22,(22 + 16)*REGSIZE(sp)
 | 
				
			||||||
 | 
					    SFREG   f23,(23 + 16)*REGSIZE(sp)
 | 
				
			||||||
 | 
					    SFREG   f24,(24 + 16)*REGSIZE(sp)
 | 
				
			||||||
 | 
					    SFREG   f25,(25 + 16)*REGSIZE(sp)
 | 
				
			||||||
 | 
					    SFREG   f26,(26 + 16)*REGSIZE(sp)
 | 
				
			||||||
 | 
					    SFREG   f27,(27 + 16)*REGSIZE(sp)
 | 
				
			||||||
 | 
					    SFREG   f28,(28 + 16)*REGSIZE(sp)
 | 
				
			||||||
 | 
					    SFREG   f29,(29 + 16)*REGSIZE(sp)
 | 
				
			||||||
 | 
					    SFREG   f30,(30 + 16)*REGSIZE(sp)
 | 
				
			||||||
 | 
					    SFREG   f31,(31 + 16)*REGSIZE(sp)
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					    call    handleInterrupt
 | 
				
			||||||
 | 
					#ifdef F_EXTENSION
 | 
				
			||||||
 | 
					    LFREG   f0, (31 + 16)*REGSIZE(sp)
 | 
				
			||||||
 | 
					    LFREG   f1, (30 + 16)*REGSIZE(sp)
 | 
				
			||||||
 | 
					    LFREG   f2, (29 + 16)*REGSIZE(sp)
 | 
				
			||||||
 | 
					    LFREG   f3, (28 + 16)*REGSIZE(sp)
 | 
				
			||||||
 | 
					    LFREG   f4, (27 + 16)*REGSIZE(sp)
 | 
				
			||||||
 | 
					    LFREG   f5, (26 + 16)*REGSIZE(sp)
 | 
				
			||||||
 | 
					    LFREG   f6, (25 + 16)*REGSIZE(sp)
 | 
				
			||||||
 | 
					    LFREG   f7, (24 + 16)*REGSIZE(sp)
 | 
				
			||||||
 | 
					    LFREG   f8, (23 + 16)*REGSIZE(sp)
 | 
				
			||||||
 | 
					    LFREG   f9, (22 + 16)*REGSIZE(sp)
 | 
				
			||||||
 | 
					    LFREG   f10,(21 + 16)*REGSIZE(sp)
 | 
				
			||||||
 | 
					    LFREG   f11,(20 + 16)*REGSIZE(sp)
 | 
				
			||||||
 | 
					    LFREG   f12,(19 + 16)*REGSIZE(sp)
 | 
				
			||||||
 | 
					    LFREG   f13,(18 + 16)*REGSIZE(sp)
 | 
				
			||||||
 | 
					    LFREG   f14,(17 + 16)*REGSIZE(sp)
 | 
				
			||||||
 | 
					    LFREG   f15,(16 + 16)*REGSIZE(sp)
 | 
				
			||||||
 | 
					    LFREG   f16,(15 + 16)*REGSIZE(sp)
 | 
				
			||||||
 | 
					    LFREG   f17,(14 + 16)*REGSIZE(sp)
 | 
				
			||||||
 | 
					    LFREG   f18,(13 + 16)*REGSIZE(sp)
 | 
				
			||||||
 | 
					    LFREG   f19,(12 + 16)*REGSIZE(sp)
 | 
				
			||||||
 | 
					    LFREG   f20,(11 + 16)*REGSIZE(sp)
 | 
				
			||||||
 | 
					    LFREG   f21,(10 + 16)*REGSIZE(sp)
 | 
				
			||||||
 | 
					    LFREG   f22,(9 + 16)*REGSIZE(sp)
 | 
				
			||||||
 | 
					    LFREG   f23,(8 + 16)*REGSIZE(sp)
 | 
				
			||||||
 | 
					    LFREG   f24,(7 + 16)*REGSIZE(sp)
 | 
				
			||||||
 | 
					    LFREG   f25,(6 + 16)*REGSIZE(sp)
 | 
				
			||||||
 | 
					    LFREG   f26,(5 + 16)*REGSIZE(sp)
 | 
				
			||||||
 | 
					    LFREG   f27,(4 + 16)*REGSIZE(sp)
 | 
				
			||||||
 | 
					    LFREG   f28,(3 + 16)*REGSIZE(sp)
 | 
				
			||||||
 | 
					    LFREG   f29,(2 + 16)*REGSIZE(sp)
 | 
				
			||||||
 | 
					    LFREG   f30,(1 + 16)*REGSIZE(sp)
 | 
				
			||||||
 | 
					    LFREG   f31,(0 + 16)*REGSIZE(sp)
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					    LREG    t6, 15*REGSIZE(sp)
 | 
				
			||||||
 | 
					    LREG    t5, 14*REGSIZE(sp)
 | 
				
			||||||
 | 
					    LREG    t4, 13*REGSIZE(sp)
 | 
				
			||||||
 | 
					    LREG    t3, 12*REGSIZE(sp)
 | 
				
			||||||
 | 
					    LREG    a7, 11*REGSIZE(sp)
 | 
				
			||||||
 | 
					    LREG    a6, 10*REGSIZE(sp)
 | 
				
			||||||
 | 
					    LREG    a5, 9*REGSIZE(sp)
 | 
				
			||||||
 | 
					    LREG    a4, 8*REGSIZE(sp)
 | 
				
			||||||
 | 
					    LREG    a3, 7*REGSIZE(sp)
 | 
				
			||||||
 | 
					    LREG    a2, 6*REGSIZE(sp)
 | 
				
			||||||
 | 
					    LREG    a1, 5*REGSIZE(sp)
 | 
				
			||||||
 | 
					    LREG    a0, 4*REGSIZE(sp)
 | 
				
			||||||
 | 
					    LREG    t2, 3*REGSIZE(sp)
 | 
				
			||||||
 | 
					    LREG    t1, 2*REGSIZE(sp)
 | 
				
			||||||
 | 
					    LREG    t0, 1*REGSIZE(sp)
 | 
				
			||||||
 | 
					    LREG    ra, 0*REGSIZE(sp)
 | 
				
			||||||
 | 
					    addi    sp, sp, NREG*REGSIZE
 | 
				
			||||||
 | 
					    mret
 | 
				
			||||||
| 
						 | 
					@ -1,44 +0,0 @@
 | 
				
			||||||
.section .text.handleInterruptASM
 | 
					 | 
				
			||||||
.global handleInterruptASM
 | 
					 | 
				
			||||||
.type handleInterruptASM,@function
 | 
					 | 
				
			||||||
handleInterruptASM:
 | 
					 | 
				
			||||||
    // Save and restore all registers, because the hardware only saves/restores
 | 
					 | 
				
			||||||
    // the pc.
 | 
					 | 
				
			||||||
    // Note: we have to do this in assembly because the "interrupt"="machine"
 | 
					 | 
				
			||||||
    // attribute is broken in LLVM: https://bugs.llvm.org/show_bug.cgi?id=42984
 | 
					 | 
				
			||||||
    addi    sp, sp, -64
 | 
					 | 
				
			||||||
    sw      ra, 60(sp)
 | 
					 | 
				
			||||||
    sw      t0, 56(sp)
 | 
					 | 
				
			||||||
    sw      t1, 52(sp)
 | 
					 | 
				
			||||||
    sw      t2, 48(sp)
 | 
					 | 
				
			||||||
    sw      a0, 44(sp)
 | 
					 | 
				
			||||||
    sw      a1, 40(sp)
 | 
					 | 
				
			||||||
    sw      a2, 36(sp)
 | 
					 | 
				
			||||||
    sw      a3, 32(sp)
 | 
					 | 
				
			||||||
    sw      a4, 28(sp)
 | 
					 | 
				
			||||||
    sw      a5, 24(sp)
 | 
					 | 
				
			||||||
    sw      a6, 20(sp)
 | 
					 | 
				
			||||||
    sw      a7, 16(sp)
 | 
					 | 
				
			||||||
    sw      t3, 12(sp)
 | 
					 | 
				
			||||||
    sw      t4, 8(sp)
 | 
					 | 
				
			||||||
    sw      t5, 4(sp)
 | 
					 | 
				
			||||||
    sw      t6, 0(sp)
 | 
					 | 
				
			||||||
    call    handleInterrupt
 | 
					 | 
				
			||||||
    lw      t6, 0(sp)
 | 
					 | 
				
			||||||
    lw      t5, 4(sp)
 | 
					 | 
				
			||||||
    lw      t4, 8(sp)
 | 
					 | 
				
			||||||
    lw      t3, 12(sp)
 | 
					 | 
				
			||||||
    lw      a7, 16(sp)
 | 
					 | 
				
			||||||
    lw      a6, 20(sp)
 | 
					 | 
				
			||||||
    lw      a5, 24(sp)
 | 
					 | 
				
			||||||
    lw      a4, 28(sp)
 | 
					 | 
				
			||||||
    lw      a3, 32(sp)
 | 
					 | 
				
			||||||
    lw      a2, 36(sp)
 | 
					 | 
				
			||||||
    lw      a1, 40(sp)
 | 
					 | 
				
			||||||
    lw      a0, 44(sp)
 | 
					 | 
				
			||||||
    lw      t2, 48(sp)
 | 
					 | 
				
			||||||
    lw      t1, 52(sp)
 | 
					 | 
				
			||||||
    lw      t0, 56(sp)
 | 
					 | 
				
			||||||
    lw      ra, 60(sp)
 | 
					 | 
				
			||||||
    addi    sp, sp, 64
 | 
					 | 
				
			||||||
    mret
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,44 +0,0 @@
 | 
				
			||||||
.section .text.handleInterruptASM
 | 
					 | 
				
			||||||
.global handleInterruptASM
 | 
					 | 
				
			||||||
.type handleInterruptASM,@function
 | 
					 | 
				
			||||||
handleInterruptASM:
 | 
					 | 
				
			||||||
    // Save and restore all registers, because the hardware only saves/restores
 | 
					 | 
				
			||||||
    // the pc.
 | 
					 | 
				
			||||||
    // Note: we have to do this in assembly because the "interrupt"="machine"
 | 
					 | 
				
			||||||
    // attribute is broken in LLVM: https://bugs.llvm.org/show_bug.cgi?id=42984
 | 
					 | 
				
			||||||
    addi    sp, sp, -128
 | 
					 | 
				
			||||||
    sd      ra, 120(sp)
 | 
					 | 
				
			||||||
    sd      t0, 112(sp)
 | 
					 | 
				
			||||||
    sd      t1, 104(sp)
 | 
					 | 
				
			||||||
    sd      t2, 96(sp)
 | 
					 | 
				
			||||||
    sd      a0, 88(sp)
 | 
					 | 
				
			||||||
    sd      a1, 80(sp)
 | 
					 | 
				
			||||||
    sd      a2, 72(sp)
 | 
					 | 
				
			||||||
    sd      a3, 64(sp)
 | 
					 | 
				
			||||||
    sd      a4, 56(sp)
 | 
					 | 
				
			||||||
    sd      a5, 48(sp)
 | 
					 | 
				
			||||||
    sd      a6, 40(sp)
 | 
					 | 
				
			||||||
    sd      a7, 32(sp)
 | 
					 | 
				
			||||||
    sd      t3, 24(sp)
 | 
					 | 
				
			||||||
    sd      t4, 16(sp)
 | 
					 | 
				
			||||||
    sd      t5, 8(sp)
 | 
					 | 
				
			||||||
    sd      t6, 0(sp)
 | 
					 | 
				
			||||||
    call    handleInterrupt
 | 
					 | 
				
			||||||
    ld      t6, 0(sp)
 | 
					 | 
				
			||||||
    ld      t5, 8(sp)
 | 
					 | 
				
			||||||
    ld      t4, 16(sp)
 | 
					 | 
				
			||||||
    ld      t3, 24(sp)
 | 
					 | 
				
			||||||
    ld      a7, 32(sp)
 | 
					 | 
				
			||||||
    ld      a6, 40(sp)
 | 
					 | 
				
			||||||
    ld      a5, 48(sp)
 | 
					 | 
				
			||||||
    ld      a4, 56(sp)
 | 
					 | 
				
			||||||
    ld      a3, 64(sp)
 | 
					 | 
				
			||||||
    ld      a2, 72(sp)
 | 
					 | 
				
			||||||
    ld      a1, 80(sp)
 | 
					 | 
				
			||||||
    ld      a0, 88(sp)
 | 
					 | 
				
			||||||
    ld      t2, 96(sp)
 | 
					 | 
				
			||||||
    ld      t1, 104(sp)
 | 
					 | 
				
			||||||
    ld      t0, 112(sp)
 | 
					 | 
				
			||||||
    ld      ra, 120(sp)
 | 
					 | 
				
			||||||
    addi    sp, sp, 128
 | 
					 | 
				
			||||||
    mret
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,32 +1,42 @@
 | 
				
			||||||
 | 
					#ifdef RV64
 | 
				
			||||||
 | 
					#define REGSIZE 8
 | 
				
			||||||
 | 
					#define SREG sd
 | 
				
			||||||
 | 
					#define LREG ld
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#define REGSIZE 4
 | 
				
			||||||
 | 
					#define SREG sw
 | 
				
			||||||
 | 
					#define LREG lw
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.section .text.tinygo_scanCurrentStack
 | 
					.section .text.tinygo_scanCurrentStack
 | 
				
			||||||
.global  tinygo_scanCurrentStack
 | 
					.global  tinygo_scanCurrentStack
 | 
				
			||||||
.type    tinygo_scanCurrentStack, %function
 | 
					.type    tinygo_scanCurrentStack, %function
 | 
				
			||||||
tinygo_scanCurrentStack:
 | 
					tinygo_scanCurrentStack:
 | 
				
			||||||
   // Push callee-saved registers onto the stack.
 | 
					   // Push callee-saved registers onto the stack.
 | 
				
			||||||
   addi sp, sp, -64
 | 
					   addi sp, sp, -13*REGSIZE
 | 
				
			||||||
   sw ra,  60(sp)
 | 
					   SREG ra,  0*REGSIZE(sp)
 | 
				
			||||||
   sw s11, 56(sp)
 | 
					   SREG s11, 1*REGSIZE(sp)
 | 
				
			||||||
   sw s10, 52(sp)
 | 
					   SREG s10, 2*REGSIZE(sp)
 | 
				
			||||||
   sw s9,  48(sp)
 | 
					   SREG s9,  3*REGSIZE(sp)
 | 
				
			||||||
   sw s8,  44(sp)
 | 
					   SREG s8,  4*REGSIZE(sp)
 | 
				
			||||||
   sw s7,  40(sp)
 | 
					   SREG s7,  5*REGSIZE(sp)
 | 
				
			||||||
   sw s6,  36(sp)
 | 
					   SREG s6,  6*REGSIZE(sp)
 | 
				
			||||||
   sw s5,  32(sp)
 | 
					   SREG s5,  7*REGSIZE(sp)
 | 
				
			||||||
   sw s4,  28(sp)
 | 
					   SREG s4,  8*REGSIZE(sp)
 | 
				
			||||||
   sw s3,  24(sp)
 | 
					   SREG s3,  9*REGSIZE(sp)
 | 
				
			||||||
   sw s2,  20(sp)
 | 
					   SREG s2,  10*REGSIZE(sp)
 | 
				
			||||||
   sw s1,  16(sp)
 | 
					   SREG s1,  11*REGSIZE(sp)
 | 
				
			||||||
   sw s0,  12(sp)
 | 
					   SREG s0,  12*REGSIZE(sp)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   // Scan the stack.
 | 
					   // Scan the stack.
 | 
				
			||||||
   mv a0, sp
 | 
					   mv a0, sp
 | 
				
			||||||
   call tinygo_scanstack
 | 
					   call tinygo_scanstack
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   // Restore return address.
 | 
					   // Restore return address.
 | 
				
			||||||
   lw ra, 60(sp)
 | 
					   LREG ra, 0(sp)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   // Restore stack state.
 | 
					   // Restore stack state.
 | 
				
			||||||
   addi sp, sp, 64
 | 
					   addi sp, sp, 13*REGSIZE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   // Return to the caller.
 | 
					   // Return to the caller.
 | 
				
			||||||
   ret
 | 
					   ret
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,32 +0,0 @@
 | 
				
			||||||
.section .text.tinygo_scanCurrentStack
 | 
					 | 
				
			||||||
.global  tinygo_scanCurrentStack
 | 
					 | 
				
			||||||
.type    tinygo_scanCurrentStack, %function
 | 
					 | 
				
			||||||
tinygo_scanCurrentStack:
 | 
					 | 
				
			||||||
   // Push callee-saved registers onto the stack.
 | 
					 | 
				
			||||||
   addi sp, sp, -104
 | 
					 | 
				
			||||||
   sd ra,  96(sp)
 | 
					 | 
				
			||||||
   sd s11, 88(sp)
 | 
					 | 
				
			||||||
   sd s10, 80(sp)
 | 
					 | 
				
			||||||
   sd s9,  72(sp)
 | 
					 | 
				
			||||||
   sd s8,  64(sp)
 | 
					 | 
				
			||||||
   sd s7,  56(sp)
 | 
					 | 
				
			||||||
   sd s6,  48(sp)
 | 
					 | 
				
			||||||
   sd s5,  40(sp)
 | 
					 | 
				
			||||||
   sd s4,  32(sp)
 | 
					 | 
				
			||||||
   sd s3,  24(sp)
 | 
					 | 
				
			||||||
   sd s2,  16(sp)
 | 
					 | 
				
			||||||
   sd s1,  8(sp)
 | 
					 | 
				
			||||||
   sd s0,  0(sp)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   // Scan the stack.
 | 
					 | 
				
			||||||
   mv a0, sp
 | 
					 | 
				
			||||||
   call tinygo_scanstack
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   // Restore return address.
 | 
					 | 
				
			||||||
   ld ra, 96(sp)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   // Restore stack state.
 | 
					 | 
				
			||||||
   addi sp, sp, 104
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   // Return to the caller.
 | 
					 | 
				
			||||||
   ret
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,5 +1,6 @@
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	"inherits": ["riscv64"],
 | 
						"inherits": ["riscv64"],
 | 
				
			||||||
	"features": ["+a", "+c", "+m", "+f", "+d"],
 | 
						"features": ["+a", "+c", "+m", "+f", "+d"],
 | 
				
			||||||
	"build-tags": ["k210", "kendryte"]
 | 
						"build-tags": ["k210", "kendryte"],
 | 
				
			||||||
 | 
						"cflags": ["-D=F_EXTENSION"]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -17,7 +17,9 @@
 | 
				
			||||||
		"--gc-sections"
 | 
							"--gc-sections"
 | 
				
			||||||
	],
 | 
						],
 | 
				
			||||||
	"extra-files": [
 | 
						"extra-files": [
 | 
				
			||||||
		"src/device/riscv/start.S"
 | 
							"src/device/riscv/start.S",
 | 
				
			||||||
 | 
							"src/runtime/scheduler_tinygoriscv.S",
 | 
				
			||||||
 | 
							"src/device/riscv/handleinterrupt.S"
 | 
				
			||||||
	],
 | 
						],
 | 
				
			||||||
	"gdb": "riscv64-unknown-elf-gdb"
 | 
						"gdb": "riscv64-unknown-elf-gdb"
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -9,9 +9,5 @@
 | 
				
			||||||
	],
 | 
						],
 | 
				
			||||||
	"ldflags": [
 | 
						"ldflags": [
 | 
				
			||||||
		"-melf32lriscv"
 | 
							"-melf32lriscv"
 | 
				
			||||||
	],
 | 
					 | 
				
			||||||
	"extra-files": [
 | 
					 | 
				
			||||||
		"src/runtime/scheduler_tinygoriscv.S",
 | 
					 | 
				
			||||||
		"src/device/riscv/handleinterrupt32.S"
 | 
					 | 
				
			||||||
	]
 | 
						]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,13 +5,10 @@
 | 
				
			||||||
	"cflags": [
 | 
						"cflags": [
 | 
				
			||||||
		"--target=riscv64--none",
 | 
							"--target=riscv64--none",
 | 
				
			||||||
		"-march=rv64gc",
 | 
							"-march=rv64gc",
 | 
				
			||||||
		"-mabi=lp64"
 | 
							"-mabi=lp64",
 | 
				
			||||||
 | 
							"-D=RV64"
 | 
				
			||||||
	],
 | 
						],
 | 
				
			||||||
	"ldflags": [
 | 
						"ldflags": [
 | 
				
			||||||
		"-melf64lriscv"
 | 
							"-melf64lriscv"
 | 
				
			||||||
	],
 | 
					 | 
				
			||||||
	"extra-files": [
 | 
					 | 
				
			||||||
		"src/runtime/scheduler_tinygoriscv64.S",
 | 
					 | 
				
			||||||
		"src/device/riscv/handleinterrupt64.S"
 | 
					 | 
				
			||||||
	]
 | 
						]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Загрузка…
	
	Создание таблицы
		
		Сослаться в новой задаче