Skip to content

Commit

Permalink
runtime: load support code into kernel CPU
Browse files Browse the repository at this point in the history
sbourdeauducq committed Apr 3, 2015
1 parent c6d3750 commit 21a0919
Showing 7 changed files with 143 additions and 34 deletions.
18 changes: 15 additions & 3 deletions soc/runtime/Makefile
Original file line number Diff line number Diff line change
@@ -3,7 +3,7 @@ include $(MSCDIR)/software/common.mak
BOARD=papilio_pro
SERIAL=/dev/ttyUSB1

OBJECTS=isr.o elf_loader.o exception_jmp.o exceptions.o services.o comm_serial.o gpio.o rtio.o dds.o test_mode.o main.o
OBJECTS=isr.o elf_loader.o kernelcpu.o exception_jmp.o exceptions.o services.o comm_serial.o gpio.o rtio.o dds.o ksupport_data.o test_mode.o main.o

all: runtime.bin

@@ -12,7 +12,7 @@ all: runtime.bin

%.bin: %.elf
$(OBJCOPY) -O binary $< $@
chmod -x $@
@chmod -x $@

%.fbi: %.bin
$(MSCDIR)/mkmscimg.py -f -o $@ $<
@@ -28,7 +28,18 @@ runtime.elf: $(OBJECTS) libs
-L$(MSCDIR)/software/libbase \
-L$(MSCDIR)/software/libcompiler-rt \
-lbase -lcompiler-rt
chmod -x $@
@chmod -x $@

ksupport.elf: ksupport.o
$(LD) $(LDFLAGS) \
-T ksupport.ld \
-N -o $@ \
$(MSCDIR)/software/libbase/crt0-$(CPU).o \
ksupport.o
@chmod -x $@

ksupport_data.o: ksupport.bin
$(LD) -r -b binary -o $@ $<

main.o: main.c
$(compile-dep)
@@ -52,5 +63,6 @@ flash: runtime.fbi

clean:
$(RM) $(OBJECTS) $(OBJECTS:.o=.d) runtime.elf runtime.bin runtime.fbi .*~ *~
$(RM) ksupport.d ksupport.o ksupport.elf ksupport.bin

.PHONY: all main.o clean libs load
27 changes: 27 additions & 0 deletions soc/runtime/kernelcpu.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
#include <generated/csr.h>

#ifdef CSR_KERNEL_CPU_BASE

#include <stdio.h>
#include <string.h>
#include <system.h>

#include "kernelcpu.h"

extern char _binary_ksupport_bin_start;
extern char _binary_ksupport_bin_end;

void kernelcpu_start(void)
{
memcpy((void *)KERNELCPU_EXEC_ADDRESS, &_binary_ksupport_bin_start,
&_binary_ksupport_bin_end - &_binary_ksupport_bin_start);
flush_l2_cache();
kernel_cpu_reset_write(0);
}

void kernelcpu_stop(void)
{
kernel_cpu_reset_write(1);
}

#endif /* CSR_KERNEL_CPU_BASE */
14 changes: 14 additions & 0 deletions soc/runtime/kernelcpu.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
#ifndef __KERNELCPU_H
#define __KERNELCPU_H

#include <hw/common.h>

#define KERNELCPU_EXEC_ADDRESS 0x40020000
#define KERNELCPU_KMAIN_ADDRESS 0x40022000

#define KERNELCPU_MAILBOX MMPTR(0xd0000000)

void kernelcpu_start(void);
void kernelcpu_stop(void);

#endif /* __KERNELCPU_H */
16 changes: 16 additions & 0 deletions soc/runtime/ksupport.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
void exception_handler(unsigned long vect, unsigned long *sp);
void exception_handler(unsigned long vect, unsigned long *sp)
{
/* TODO: report hardware exception to comm CPU */
for(;;);
}

extern void kmain(void);

int main(void);
int main(void)
{
kmain();
/* TODO: report end of kernel to comm CPU */
return 0;
}
65 changes: 65 additions & 0 deletions soc/runtime/ksupport.ld
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
INCLUDE generated/output_format.ld
ENTRY(_start)

INCLUDE generated/regions.ld

/* First 128K of main memory are reserved for runtime code/data
* then comes kernel memory. First 8K of kernel memory are for support code.
*/
MEMORY {
ksupport : ORIGIN = 0x40020000, LENGTH = 0x2000
}

/* Then comes the payload. */
PROVIDE(kmain = ORIGIN(ksupport) + LENGTH(ksupport));

/* On biprocessor systems, kernel stack is at the end of main RAM,
* before the runtime stack. Leave 1M for runtime stack.
*/
PROVIDE(_fstack = 0x40000000 + LENGTH(main_ram) - 1024*1024 - 4);

SECTIONS
{
.text :
{
_ftext = .;
*(.text .stub .text.* .gnu.linkonce.t.*)
_etext = .;
} > ksupport

.rodata :
{
. = ALIGN(4);
_frodata = .;
*(.rodata .rodata.* .gnu.linkonce.r.*)
*(.rodata1)
_erodata = .;
} > ksupport

.data :
{
. = ALIGN(4);
_fdata = .;
*(.data .data.* .gnu.linkonce.d.*)
*(.data1)
_gp = ALIGN(16);
*(.sdata .sdata.* .gnu.linkonce.s.*)
_edata = .;
} > ksupport

.bss :
{
. = ALIGN(4);
_fbss = .;
*(.dynsbss)
*(.sbss .sbss.* .gnu.linkonce.sb.*)
*(.scommon)
*(.dynbss)
*(.bss .bss.* .gnu.linkonce.b.*)
*(COMMON)
. = ALIGN(4);
_ebss = .;
. = ALIGN(8);
_heapstart = .;
} > ksupport
}
9 changes: 6 additions & 3 deletions soc/runtime/main.c
Original file line number Diff line number Diff line change
@@ -10,18 +10,17 @@
#include "test_mode.h"
#include "comm.h"
#include "elf_loader.h"
#include "kernelcpu.h"
#include "exceptions.h"
#include "services.h"
#include "rtio.h"
#include "dds.h"


static struct symbol symtab[128];
static int _symtab_count;
static char _symtab_strings[128*16];
static char *_symtab_strptr;


static void symtab_init(void)
{
memset(symtab, 0, sizeof(symtab));
@@ -132,7 +131,11 @@ int main(void)
irq_setie(1);
uart_init();

puts("ARTIQ runtime built "__DATE__" "__TIME__"\n");
#ifdef CSR_KERNEL_CPU_BASE
puts("ARTIQ runtime built "__DATE__" "__TIME__" for biprocessor systems\n");
#else
puts("ARTIQ runtime built "__DATE__" "__TIME__" for uniprocessor systems\n");
#endif
blink_led();

if(check_test_mode()) {
28 changes: 0 additions & 28 deletions soc/runtime/test_mode.c
Original file line number Diff line number Diff line change
@@ -305,30 +305,6 @@ static char *get_token(char **str)
return d;
}

#ifdef CSR_KERNEL_CPU_BASE
static const unsigned int test_program[] = {
0x1860dead, // l.movhi r3,0xdead
0x1880d000, // l.movhi r4,0xd000
0xa863beef, // l.ori r3,r3,0xbeef
0xd4041800, // l.sw 0(r4),r3
0x00000000, // l.j +0
0x15000000, // l.nop
};

static void cputest(void)
{
int i;

kernel_cpu_reset_write(1);
MMPTR(0xd0000000) = 0;
memcpy((void *)0x41000000, test_program, sizeof(test_program));
flush_l2_cache();
kernel_cpu_reset_write(0);
for(i=0;i<10;i++)
printf("%08x\n", MMPTR(0xd0000000));
}
#endif

static void do_command(char *c)
{
char *token;
@@ -351,10 +327,6 @@ static void do_command(char *c)
else if(strcmp(token, "ddsftw") == 0) ddsftw(get_token(&c), get_token(&c));
else if(strcmp(token, "ddstest") == 0) ddstest(get_token(&c));

#ifdef CSR_KERNEL_CPU_BASE
else if(strcmp(token, "cputest") == 0) cputest();
#endif

else if(strcmp(token, "") != 0)
printf("Command not found\n");
}

0 comments on commit 21a0919

Please sign in to comment.