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

Subversion Repositories potato

[/] [potato/] [trunk/] [benchmarks/] [start.S] - Rev 16

Go to most recent revision | Compare with Previous | Blame | View Log

// The Potato Processor Benchmark Applications
// (c) Kristian Klomsten Skordal 2015 <kristian.skordal@wafflemail.net>
// Report bugs and issues on <http://opencores.org/project,potato,bugtracker>

// This file contains startup and initialization code for the Potato benchmark
// applications.

#include "platform.h"

.section .init

.global _start
_start:

// Copies the .data section into the data memory section:
.hidden copy_data
copy_data:
        la x1, __text_end       // Copy source address
        la x2, __data_begin     // Copy destination address
        la x3, __data_end       // Copy destination end address

        beq x2, x3, 2f          // Skip if there is no data to copy

1:
        lw x4, (x1)
        sw x4, (x2)
        addi x1, x1, 4
        addi x2, x2, 4

        bne x2, x3, 1b          // Repeat as long as there is more data to copy
2:

.hidden clear_bss
clear_bss:
        la x1, __bss_begin
        la x2, __bss_end
        beq x1, x2, 2f          // Skip if there is no .bss section

1:
        sw x0, (x1)
        addi x1, x1, 4
        bne x1, x2, 1b

2:

.hidden set_evec
set_evec:
        // Set up an exception handler:
        la x1, exception_handler_wrapper
        csrw evec, x1

.hidden call_main
call_main:
        la sp, __stack_top
        jal main
        csrw tohost, a0
1:
        j 1b

.section .text

.global exception_handler_wrapper
exception_handler_wrapper:
        // Save all registers that aren't saved by the IRQ handler function:
        addi sp, sp, -64
        sw ra, 0(sp)
        sw t0, 4(sp)
        sw t1, 8(sp)
        sw t2, 12(sp)
        sw t3, 16(sp)
        sw t4, 20(sp)
        sw t5, 24(sp)
        sw t6, 28(sp)
        sw a0, 32(sp)
        sw a1, 36(sp)
        sw a2, 40(sp)
        sw a3, 44(sp)
        sw a4, 48(sp)
        sw a5, 52(sp)
        sw a6, 56(sp)
        sw a7, 60(sp)

        csrr a0, cause
        csrr a1, epc
        jal exception_handler

        // Restore the current state:
        lw ra, 0(sp)
        lw t0, 4(sp)
        lw t1, 8(sp)
        lw t2, 12(sp)
        lw t3, 16(sp)
        lw t4, 20(sp)
        lw t5, 24(sp)
        lw t6, 28(sp)
        lw a0, 32(sp)
        lw a1, 36(sp)
        lw a2, 40(sp)
        lw a3, 44(sp)
        lw a4, 48(sp)
        lw a5, 52(sp)
        lw a6, 56(sp)
        lw a7, 60(sp)
        addi sp, sp, 64

        sret

Go to most recent revision | Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

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