OpenCores
URL https://opencores.org/ocsvn/potato/potato/trunk

Subversion Repositories potato

[/] [potato/] [trunk/] [benchmarks/] [start.S] - Diff between revs 20 and 58

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 20 Rev 58
// The Potato Processor Benchmark Applications
// The Potato Processor Benchmark Applications
// (c) Kristian Klomsten Skordal 2015 
// (c) Kristian Klomsten Skordal 2015 
// Report bugs and issues on 
// Report bugs and issues on 
// This file contains startup and initialization code for the Potato benchmark
// This file contains startup and initialization code for the Potato benchmark
// applications.
// applications.
#include "platform.h"
#include "platform.h"
#include "potato.h"
#include "potato.h"
.section .init
.section .init
 
 
 
.align 6
 
tvec_user: // User mode is not supported by Potato
 
        j tvec_machine
 
.align 6
 
tvec_supervisor: // Supervisor mode is not supported by Potato
 
        j tvec_machine
 
.align 6
 
tvec_hypervisor: // Hypervisor mode is not supported by Potato
 
        j tvec_machine
 
.align 6
 
tvec_machine:
 
        j exception_handler_wrapper
 
 
 
.align 6
.global _start
.global _start
_start:
_start:
// Copies the .data section into the data memory section:
// Copies the .data section into the data memory section:
.hidden copy_data
.hidden copy_data
copy_data:
copy_data:
        la x1, __text_end       // Copy source address
        la x1, __text_end       // Copy source address
        la x2, __data_begin     // Copy destination address
        la x2, __data_begin     // Copy destination address
        la x3, __data_end       // Copy destination end address
        la x3, __data_end       // Copy destination end address
        beq x2, x3, 2f          // Skip if there is no data to copy
        beq x2, x3, 2f          // Skip if there is no data to copy
1:
1:
        lw x4, (x1)
        lw x4, (x1)
        sw x4, (x2)
        sw x4, (x2)
        addi x1, x1, 4
        addi x1, x1, 4
        addi x2, x2, 4
        addi x2, x2, 4
        bne x2, x3, 1b          // Repeat as long as there is more data to copy
        bne x2, x3, 1b          // Repeat as long as there is more data to copy
2:
2:
.hidden clear_bss
.hidden clear_bss
clear_bss:
clear_bss:
        la x1, __bss_begin
        la x1, __bss_begin
        la x2, __bss_end
        la x2, __bss_end
        beq x1, x2, 2f          // Skip if there is no .bss section
        beq x1, x2, 2f          // Skip if there is no .bss section
1:
1:
        sw x0, (x1)
        sw x0, (x1)
        addi x1, x1, 4
        addi x1, x1, 4
        bne x1, x2, 1b
        bne x1, x2, 1b
2:
2:
 
 
.hidden set_evec
 
set_evec:
 
        // Set up an exception handler:
 
        la x1, exception_handler_wrapper
 
        csrw evec, x1
 
 
 
.hidden call_main
.hidden call_main
call_main:
call_main:
        la sp, __stack_top
        la sp, __stack_top
        jal main
        jal main
        csrw tohost, a0
        csrw mtohost, a0
1:
1:
        j 1b
        j 1b
.section .text
.section .text
.global exception_handler_wrapper
.global exception_handler_wrapper
exception_handler_wrapper:
exception_handler_wrapper:
        // Save all registers (even those that are saved by the IRQ handler
        // Save all registers (even those that are saved by the IRQ handler
        // function, to aid in debugging):
        // function, to aid in debugging):
        addi sp, sp, -124
        addi sp, sp, -124
        sw x1, 0(sp)
        sw x1, 0(sp)
        sw x2, 4(sp)
        sw x2, 4(sp)
        sw x3, 8(sp)
        sw x3, 8(sp)
        sw x4, 12(sp)
        sw x4, 12(sp)
        sw x5, 16(sp)
        sw x5, 16(sp)
        sw x6, 20(sp)
        sw x6, 20(sp)
        sw x7, 24(sp)
        sw x7, 24(sp)
        sw x8, 28(sp)
        sw x8, 28(sp)
        sw x9, 32(sp)
        sw x9, 32(sp)
        sw x10, 36(sp)
        sw x10, 36(sp)
        sw x11, 40(sp)
        sw x11, 40(sp)
        sw x12, 44(sp)
        sw x12, 44(sp)
        sw x13, 48(sp)
        sw x13, 48(sp)
        sw x14, 52(sp)
        sw x14, 52(sp)
        sw x15, 56(sp)
        sw x15, 56(sp)
        sw x16, 60(sp)
        sw x16, 60(sp)
        sw x17, 64(sp)
        sw x17, 64(sp)
        sw x18, 68(sp)
        sw x18, 68(sp)
        sw x19, 72(sp)
        sw x19, 72(sp)
        sw x20, 76(sp)
        sw x20, 76(sp)
        sw x21, 80(sp)
        sw x21, 80(sp)
        sw x22, 84(sp)
        sw x22, 84(sp)
        sw x23, 88(sp)
        sw x23, 88(sp)
        sw x24, 92(sp)
        sw x24, 92(sp)
        sw x25, 96(sp)
        sw x25, 96(sp)
        sw x26, 100(sp)
        sw x26, 100(sp)
        sw x27, 104(sp)
        sw x27, 104(sp)
        sw x28, 108(sp)
        sw x28, 108(sp)
        sw x29, 112(sp)
        sw x29, 112(sp)
        sw x30, 116(sp)
        sw x30, 116(sp)
        sw x31, 120(sp)
        sw x31, 120(sp)
 
 
        csrr a0, cause
        csrr a0, mcause
        csrr a1, epc
        csrr a1, mepc
        mv a2, sp
        mv a2, sp
        jal exception_handler
        jal exception_handler
.hidden exception_return
.hidden exception_return
exception_return:
exception_return:
        // Restore all registers:
        // Restore all registers:
        lw x1, 0(sp)
        lw x1, 0(sp)
        lw x2, 4(sp)
        lw x2, 4(sp)
        lw x3, 8(sp)
        lw x3, 8(sp)
        lw x4, 12(sp)
        lw x4, 12(sp)
        lw x5, 16(sp)
        lw x5, 16(sp)
        lw x6, 20(sp)
        lw x6, 20(sp)
        lw x7, 24(sp)
        lw x7, 24(sp)
        lw x8, 28(sp)
        lw x8, 28(sp)
        lw x9, 32(sp)
        lw x9, 32(sp)
        lw x10, 36(sp)
        lw x10, 36(sp)
        lw x11, 40(sp)
        lw x11, 40(sp)
        lw x12, 44(sp)
        lw x12, 44(sp)
        lw x13, 48(sp)
        lw x13, 48(sp)
        lw x14, 52(sp)
        lw x14, 52(sp)
        lw x15, 56(sp)
        lw x15, 56(sp)
        lw x16, 60(sp)
        lw x16, 60(sp)
        lw x17, 64(sp)
        lw x17, 64(sp)
        lw x18, 68(sp)
        lw x18, 68(sp)
        lw x19, 72(sp)
        lw x19, 72(sp)
        lw x20, 76(sp)
        lw x20, 76(sp)
        lw x21, 80(sp)
        lw x21, 80(sp)
        lw x22, 84(sp)
        lw x22, 84(sp)
        lw x23, 88(sp)
        lw x23, 88(sp)
        lw x24, 92(sp)
        lw x24, 92(sp)
        lw x25, 96(sp)
        lw x25, 96(sp)
        lw x26, 100(sp)
        lw x26, 100(sp)
        lw x27, 104(sp)
        lw x27, 104(sp)
        lw x28, 108(sp)
        lw x28, 108(sp)
        lw x29, 112(sp)
        lw x29, 112(sp)
        lw x30, 116(sp)
        lw x30, 116(sp)
        lw x31, 120(sp)
        lw x31, 120(sp)
        addi sp, sp, 124
        addi sp, sp, 124
 
 
        sret
        eret
 
 
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.