/* Support */
|
/* Support */
|
|
|
#ifndef OR32
|
#ifndef OR32
|
#include <sys/time.h>
|
#include <sys/time.h>
|
#endif
|
#endif
|
|
|
#include "or1200.h"
|
#include "or1200.h"
|
#include "support.h"
|
#include "support.h"
|
#include "int.h"
|
#include "int.h"
|
|
|
#ifdef UART_PRINTF
|
#ifdef UART_PRINTF
|
#include "../drivers/uart.h"
|
#include <uart.h>
|
#endif
|
#endif
|
|
|
#if OR32
|
#if OR32
|
void int_main();
|
void int_main();
|
|
|
void ext_except()
|
void ext_except()
|
{
|
{
|
int_main();
|
int_main();
|
}
|
}
|
|
|
/* Start function, called by reset exception handler. */
|
/* Start function, called by reset exception handler. */
|
void reset ()
|
void reset ()
|
{
|
{
|
int i = main();
|
int i = main();
|
or32_exit (i);
|
or32_exit (i);
|
}
|
}
|
|
|
/* return value by making a syscall */
|
/* return value by making a syscall */
|
void or32_exit (int i)
|
void or32_exit (int i)
|
{
|
{
|
asm("l.add r3,r0,%0": : "r" (i));
|
asm("l.add r3,r0,%0": : "r" (i));
|
asm("l.nop %0": :"K" (NOP_EXIT));
|
asm("l.nop %0": :"K" (NOP_EXIT));
|
while (1);
|
while (1);
|
}
|
}
|
|
|
#ifdef UART_PRINTF
|
#ifdef UART_PRINTF
|
|
|
static int uart_init_done = 0;
|
static int uart_init_done = 0;
|
|
|
#define PRINTFBUFFER_SIZE 512
|
#define PRINTFBUFFER_SIZE 512
|
char PRINTFBUFFER[PRINTFBUFFER_SIZE]; // Declare a global printf buffer
|
char PRINTFBUFFER[PRINTFBUFFER_SIZE]; // Declare a global printf buffer
|
|
|
void minsoc_printf(const char *fmt, ...)
|
void minsoc_printf(const char *fmt, ...)
|
{
|
{
|
// init uart if not done already
|
// init uart if not done already
|
if (!uart_init_done)
|
if (!uart_init_done)
|
{
|
{
|
uart_init();
|
uart_init();
|
uart_init_done = 1;
|
uart_init_done = 1;
|
}
|
}
|
|
|
va_list args;
|
va_list args;
|
va_start(args, fmt);
|
va_start(args, fmt);
|
|
|
//int str_l = vsnprintf(PRINTFBUFFER, PRINTFBUFFER_SIZE, fmt, args);
|
//int str_l = vsnprintf(PRINTFBUFFER, PRINTFBUFFER_SIZE, fmt, args);
|
int str_l = vfnprintf(PRINTFBUFFER, PRINTFBUFFER_SIZE, fmt, args);
|
int str_l = vfnprintf(PRINTFBUFFER, PRINTFBUFFER_SIZE, fmt, args);
|
|
|
if (!str_l) return; // no length string - just return
|
if (!str_l) return; // no length string - just return
|
|
|
int c=0;
|
int c=0;
|
// now print each char via the UART
|
// now print each char via the UART
|
while (c < str_l)
|
while (c < str_l)
|
uart_putc(PRINTFBUFFER[c++]);
|
uart_putc(PRINTFBUFFER[c++]);
|
|
|
va_end(args);
|
va_end(args);
|
}
|
}
|
|
|
#else
|
#else
|
/* activate printf support in simulator */
|
/* activate printf support in simulator */
|
void minsoc_printf(const char *fmt, ...)
|
void minsoc_printf(const char *fmt, ...)
|
{
|
{
|
va_list args;
|
va_list args;
|
va_start(args, fmt);
|
va_start(args, fmt);
|
__asm__ __volatile__ (" l.addi\tr3,%1,0\n \
|
__asm__ __volatile__ (" l.addi\tr3,%1,0\n \
|
l.addi\tr4,%2,0\n \
|
l.addi\tr4,%2,0\n \
|
l.nop %0": :"K" (NOP_PRINTF), "r" (fmt), "r" (args));
|
l.nop %0": :"K" (NOP_PRINTF), "r" (fmt), "r" (args));
|
}
|
}
|
|
|
#endif
|
#endif
|
|
|
|
|
|
|
|
|
|
|
/* print long */
|
/* print long */
|
void report(unsigned long value)
|
void report(unsigned long value)
|
{
|
{
|
asm("l.addi\tr3,%0,0": :"r" (value));
|
asm("l.addi\tr3,%0,0": :"r" (value));
|
asm("l.nop %0": :"K" (NOP_REPORT));
|
asm("l.nop %0": :"K" (NOP_REPORT));
|
}
|
}
|
|
|
/* just to satisfy linker */
|
/* just to satisfy linker */
|
void __main()
|
void __main()
|
{
|
{
|
}
|
}
|
|
|
/* start_TIMER */
|
/* start_TIMER */
|
void start_timer(int x)
|
void start_timer(int x)
|
{
|
{
|
}
|
}
|
|
|
/* For writing into SPR. */
|
/* For writing into SPR. */
|
void mtspr(unsigned long spr, unsigned long value)
|
void mtspr(unsigned long spr, unsigned long value)
|
{
|
{
|
asm("l.mtspr\t\t%0,%1,0": : "r" (spr), "r" (value));
|
asm("l.mtspr\t\t%0,%1,0": : "r" (spr), "r" (value));
|
}
|
}
|
|
|
/* For reading SPR. */
|
/* For reading SPR. */
|
unsigned long mfspr(unsigned long spr)
|
unsigned long mfspr(unsigned long spr)
|
{
|
{
|
unsigned long value;
|
unsigned long value;
|
asm("l.mfspr\t\t%0,%1,0" : "=r" (value) : "r" (spr));
|
asm("l.mfspr\t\t%0,%1,0" : "=r" (value) : "r" (spr));
|
return value;
|
return value;
|
}
|
}
|
|
|
#else
|
#else
|
void report(unsigned long value)
|
void report(unsigned long value)
|
{
|
{
|
printf("report(0x%x);\n", (unsigned) value);
|
printf("report(0x%x);\n", (unsigned) value);
|
}
|
}
|
|
|
#endif
|
#endif
|
|
|