Compare commits
	
		
			11 Commits
		
	
	
		
			b69fd19910
			...
			develop
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| fced281870 | |||
| 703fbf67b4 | |||
| 59d0a22738 | |||
| 3df19468e9 | |||
| bf0e4ec057 | |||
| 018e07ecee | |||
| fc37441911 | |||
| b5cee82f3e | |||
| 20161cc1af | |||
| 0843d92878 | |||
| a7b4e7b715 | 
							
								
								
									
										2
									
								
								env/common-gcc.mk
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								env/common-gcc.mk
									
									
									
									
										vendored
									
									
								
							| @@ -28,7 +28,7 @@ INCLUDES += -I$(PLATFORM_DIR) | ||||
| INCLUDES += -I$(BSP_BASE)/libwrap/sys/ | ||||
|  | ||||
| LDFLAGS += -march=$(RISCV_ARCH) -mabi=$(RISCV_ABI) | ||||
| LDFLAGS += -L$(ENV_DIR) | ||||
| LDFLAGS += -L$(ENV_DIR) -L$(PLATFORM_DIR) | ||||
| LD_SCRIPT += -T $(LINKER_SCRIPT) -Wl,--no-warn-rwx-segments -Wl,-Map=$(TARGET).map  -nostartfiles  | ||||
|  | ||||
| ifneq (,$(findstring specs=nano.specs,$(LDFLAGS), LD_SCRIPT)) | ||||
|   | ||||
							
								
								
									
										2
									
								
								env/iss/link.lds
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								env/iss/link.lds
									
									
									
									
										vendored
									
									
								
							| @@ -5,7 +5,7 @@ ENTRY( _start ) | ||||
| MEMORY | ||||
| { | ||||
|   flash (rxai!w) : ORIGIN = 0x00000000, LENGTH = 1M | ||||
|   ram (wxa!ri) :   ORIGIN = 0x10000000, LENGTH = 64K | ||||
|   ram (wxa!ri) :   ORIGIN = 0x20000000, LENGTH = 1M | ||||
| } | ||||
|  | ||||
| PHDRS | ||||
|   | ||||
							
								
								
									
										4
									
								
								env/moonlight/link.lds
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								env/moonlight/link.lds
									
									
									
									
										vendored
									
									
								
							| @@ -5,8 +5,8 @@ ENTRY( _start ) | ||||
| MEMORY | ||||
| { | ||||
|   rom   (rxai!w) : ORIGIN = 0xFFFFE000, LENGTH = 2k | ||||
|   flash (rxai!w) : ORIGIN = 0x30000000, LENGTH = 16M | ||||
|   ram   (wxa!ri) : ORIGIN = 0x10000000, LENGTH = 128K | ||||
|   flash (rxai!w) : ORIGIN = 0xE0000000, LENGTH = 16M | ||||
|   ram   (wxa!ri) : ORIGIN = 0xC0000000, LENGTH = 128K | ||||
|   dram  (wxa!ri) : ORIGIN = 0x00000000, LENGTH = 2048M | ||||
| } | ||||
|  | ||||
|   | ||||
							
								
								
									
										1
									
								
								env/riscv_vp/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								env/riscv_vp/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| /*.o | ||||
							
								
								
									
										21
									
								
								env/riscv_vp/bsp_read.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								env/riscv_vp/bsp_read.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | ||||
| #include "platform.h" | ||||
| #include <stdint.h> | ||||
| #include <stdio.h> | ||||
| #include <sys/types.h> | ||||
| #include <unistd.h> | ||||
|  | ||||
| ssize_t _bsp_read(int fd, void *ptr, size_t len) { | ||||
|   uint8_t *current = (uint8_t *)ptr; | ||||
|   ssize_t result = 0; | ||||
|   if (isatty(fd)) { | ||||
|     for (current = (uint8_t *)ptr; (current < ((uint8_t *)ptr) + len) && | ||||
|                                    (get_uart_rx_tx_reg_rx_avail(uart) > 0); | ||||
|          current++) { | ||||
|       *current = uart_read(uart); | ||||
|       result++; | ||||
|     } | ||||
|  | ||||
|     return result; | ||||
|   } | ||||
|   return EOF; | ||||
| } | ||||
							
								
								
									
										21
									
								
								env/riscv_vp/bsp_write.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								env/riscv_vp/bsp_write.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | ||||
| /* See LICENSE of license details. */ | ||||
|  | ||||
| #include "platform.h" | ||||
| #include <errno.h> | ||||
| #include <stdint.h> | ||||
| #include <sys/types.h> | ||||
| #include <unistd.h> | ||||
|  | ||||
| ssize_t _bsp_write(int fd, const void *ptr, size_t len) { | ||||
|   const uint8_t *current = (const uint8_t *)ptr; | ||||
|   if (isatty(fd)) { | ||||
|     for (size_t jj = 0; jj < len; jj++) { | ||||
|       uart_write(uart, current[jj]); | ||||
|       if (current[jj] == '\n') { | ||||
|         uart_write(uart, '\r'); | ||||
|       } | ||||
|     } | ||||
|     return len; | ||||
|   } | ||||
|   return 1; | ||||
| } | ||||
							
								
								
									
										177
									
								
								env/riscv_vp/flash.lds
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										177
									
								
								env/riscv_vp/flash.lds
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,177 @@ | ||||
| OUTPUT_ARCH( "riscv" ) | ||||
|  | ||||
| ENTRY( _start ) | ||||
|  | ||||
| INCLUDE memory_map.ld | ||||
|  | ||||
| PHDRS | ||||
| { | ||||
|   flash PT_LOAD; | ||||
|   ram_init PT_LOAD; | ||||
|   ram PT_NULL; | ||||
|   dram PT_NULL; | ||||
| } | ||||
|  | ||||
| SECTIONS | ||||
| { | ||||
|   __stack_size = DEFINED(__stack_size) ? __stack_size : 2K; | ||||
|  | ||||
|   .init ORIGIN(flash)        : | ||||
|   { | ||||
|     KEEP (*(SORT_NONE(.init))) | ||||
|   } >flash AT>flash :flash | ||||
|  | ||||
|   .text           : | ||||
|   { | ||||
|     *(.text.unlikely .text.unlikely.*) | ||||
|     *(.text.startup .text.startup.*) | ||||
|     *(.text .text.*) | ||||
|     *(.gnu.linkonce.t.*) | ||||
|   } >flash AT>flash :flash | ||||
|  | ||||
|   .fini           : | ||||
|   { | ||||
|     KEEP (*(SORT_NONE(.fini))) | ||||
|   } >flash AT>flash :flash | ||||
|  | ||||
|   PROVIDE (__etext = .); | ||||
|   PROVIDE (_etext = .); | ||||
|   PROVIDE (etext = .); | ||||
|  | ||||
|   .rodata         : | ||||
|   { | ||||
|     *(.rdata) | ||||
|     *(.rodata .rodata.*) | ||||
|     *(.gnu.linkonce.r.*) | ||||
|   } >flash AT>flash :flash | ||||
|  | ||||
|   . = ALIGN(4); | ||||
|  | ||||
|   .preinit_array  : | ||||
|   { | ||||
|     PROVIDE_HIDDEN (__preinit_array_start = .); | ||||
|     KEEP (*(.preinit_array)) | ||||
|     PROVIDE_HIDDEN (__preinit_array_end = .); | ||||
|   } >flash AT>flash :flash | ||||
|  | ||||
|   .init_array     : | ||||
|   { | ||||
|     PROVIDE_HIDDEN (__init_array_start = .); | ||||
|     KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) | ||||
|     KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) | ||||
|     PROVIDE_HIDDEN (__init_array_end = .); | ||||
|   } >flash AT>flash :flash | ||||
|  | ||||
|   .fini_array     : | ||||
|   { | ||||
|     PROVIDE_HIDDEN (__fini_array_start = .); | ||||
|     KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) | ||||
|     KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) | ||||
|     PROVIDE_HIDDEN (__fini_array_end = .); | ||||
|   } >flash AT>flash :flash | ||||
|  | ||||
|   .ctors          : | ||||
|   { | ||||
|     /* gcc uses crtbegin.o to find the start of | ||||
|        the constructors, so we make sure it is | ||||
|        first.  Because this is a wildcard, it | ||||
|        doesn't matter if the user does not | ||||
|        actually link against crtbegin.o; the | ||||
|        linker won't look for a file to match a | ||||
|        wildcard.  The wildcard also means that it | ||||
|        doesn't matter which directory crtbegin.o | ||||
|        is in.  */ | ||||
|     KEEP (*crtbegin.o(.ctors)) | ||||
|     KEEP (*crtbegin?.o(.ctors)) | ||||
|     /* We don't want to include the .ctor section from | ||||
|        the crtend.o file until after the sorted ctors. | ||||
|        The .ctor section from the crtend file contains the | ||||
|        end of ctors marker and it must be last */ | ||||
|     KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) | ||||
|     KEEP (*(SORT(.ctors.*))) | ||||
|     KEEP (*(.ctors)) | ||||
|   } >flash AT>flash :flash | ||||
|  | ||||
|   .dtors          : | ||||
|   { | ||||
|     KEEP (*crtbegin.o(.dtors)) | ||||
|     KEEP (*crtbegin?.o(.dtors)) | ||||
|     KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) | ||||
|     KEEP (*(SORT(.dtors.*))) | ||||
|     KEEP (*(.dtors)) | ||||
|   } >flash AT>flash :flash | ||||
|  | ||||
|   .dummy          : | ||||
|   { | ||||
| 	*(.comment.*) | ||||
|  | ||||
|   } | ||||
|   .lalign         : | ||||
|   { | ||||
|     . = ALIGN(4); | ||||
|     PROVIDE( _data_lma = . ); | ||||
|   } >flash AT>flash :flash | ||||
|  | ||||
|   .dalign         : | ||||
|   { | ||||
|     . = ALIGN(4); | ||||
|     PROVIDE( _data = . ); | ||||
|   } >ram AT>flash :ram_init | ||||
|  | ||||
|   .data          : | ||||
|   { | ||||
|     __DATA_BEGIN__ = .; | ||||
|     *(.data .data.*) | ||||
|     *(.gnu.linkonce.d.*) | ||||
|   } >ram AT>flash :ram_init | ||||
|  | ||||
|   .sdata          : | ||||
|   { | ||||
|     __SDATA_BEGIN__ = .; | ||||
|     *(.sdata .sdata.*) | ||||
|     *(.gnu.linkonce.s.*) | ||||
|   } >ram AT>flash :ram_init | ||||
|  | ||||
|   .srodata        : | ||||
|   { | ||||
|     *(.srodata.cst16) | ||||
|     *(.srodata.cst8) | ||||
|     *(.srodata.cst4) | ||||
|     *(.srodata.cst2) | ||||
|     *(.srodata .srodata.*) | ||||
|   } >ram AT>flash :ram_init | ||||
|  | ||||
|   . = ALIGN(4); | ||||
|   PROVIDE( _edata = . ); | ||||
|   PROVIDE( edata = . ); | ||||
|  | ||||
|   PROVIDE( _fbss = . ); | ||||
|   PROVIDE( __bss_start = . ); | ||||
|   .bss            : | ||||
|   { | ||||
|     *(.sbss*) | ||||
|     *(.gnu.linkonce.sb.*) | ||||
|     *(.bss .bss.*) | ||||
|     *(.gnu.linkonce.b.*) | ||||
|     *(COMMON) | ||||
|     . = ALIGN(4); | ||||
|   } >ram AT>ram :ram | ||||
|  | ||||
|   . = ALIGN(8); | ||||
|   __BSS_END__ = .; | ||||
|   __global_pointer$ = MIN(__SDATA_BEGIN__ + 0x800,  MAX(__DATA_BEGIN__ + 0x800, __BSS_END__ - 0x800)); | ||||
|   PROVIDE( _end = . ); | ||||
|   PROVIDE( end = . ); | ||||
|  | ||||
|   .stack ORIGIN(ram) + LENGTH(ram) - __stack_size : | ||||
|   { | ||||
|     PROVIDE( _heap_end = . ); | ||||
|     . = __stack_size; | ||||
|     PROVIDE( _sp = . ); | ||||
|   } >ram AT>ram :ram | ||||
|  | ||||
|  | ||||
|    | ||||
|   PROVIDE( tohost = . ); | ||||
|   PROVIDE( fromhost = . + 8 ); | ||||
| } | ||||
							
								
								
									
										138
									
								
								env/riscv_vp/init.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										138
									
								
								env/riscv_vp/init.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,138 @@ | ||||
| #include <stdint.h> | ||||
| #include <stdio.h> | ||||
| #include <unistd.h> | ||||
|  | ||||
| #include "platform.h" | ||||
| #include "encoding.h" | ||||
|  | ||||
|  | ||||
| extern int main(int argc, char** argv); | ||||
| extern void trap_entry(void); | ||||
| #define IRQ_M_SOFT   3 | ||||
| #define IRQ_M_TIMER  7 | ||||
| #define IRQ_M_EXT    11 | ||||
|  | ||||
| #define NUM_INTERRUPTS 16 | ||||
| #define MTIMER_NEXT_TICK_INC 1000 | ||||
|  | ||||
| void handle_m_ext_interrupt(void); | ||||
| void handle_m_time_interrupt(void); | ||||
| uint32_t handle_trap(uint32_t mcause, uint32_t mepc, uint32_t sp); | ||||
| void default_handler(void); | ||||
| void _init(void); | ||||
|  | ||||
| typedef void (*my_interrupt_function_ptr_t) (void); | ||||
| my_interrupt_function_ptr_t localISR[NUM_INTERRUPTS] __attribute__((aligned(64))); | ||||
|  | ||||
| static unsigned long mtime_lo(void) | ||||
| { | ||||
|     unsigned long ret; | ||||
|     __asm volatile("rdtime %0":"=r"(ret)); | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
|  | ||||
| #if __riscv_xlen==32 | ||||
|  | ||||
| static uint32_t mtime_hi(void) | ||||
| { | ||||
|     unsigned long ret; | ||||
|     __asm volatile("rdtimeh %0":"=r"(ret)); | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| uint64_t get_timer_value(void) | ||||
| { | ||||
|   while (1) { | ||||
|     uint32_t hi = mtime_hi(); | ||||
|     uint32_t lo = mtime_lo(); | ||||
|     if (hi == mtime_hi()) | ||||
|       return ((uint64_t)hi << 32) | lo; | ||||
|   } | ||||
| } | ||||
|  | ||||
| #elif __riscv_xlen==64 | ||||
|  | ||||
| uint64_t get_timer_value() | ||||
| { | ||||
|   return mtime_lo(); | ||||
| } | ||||
|  | ||||
| #endif | ||||
|  | ||||
| unsigned long get_timer_freq() | ||||
| { | ||||
|   return 32768; | ||||
| } | ||||
|  | ||||
| unsigned long get_cpu_freq() | ||||
| { | ||||
|   return 100000000; | ||||
| } | ||||
|  | ||||
| void init_pll(void){ | ||||
|     //TODO: implement initialization | ||||
| } | ||||
|  | ||||
| static void uart_init(size_t baud_rate) | ||||
| { | ||||
|   //TODO: implement initialization | ||||
| } | ||||
|  | ||||
| void __attribute__((weak)) handle_m_ext_interrupt(){ | ||||
| } | ||||
|  | ||||
| void __attribute__((weak)) handle_m_time_interrupt(){ | ||||
|   uint64_t time = get_aclint_mtime(aclint); | ||||
|   time+=MTIMER_NEXT_TICK_INC; | ||||
|   set_aclint_mtimecmp(aclint, time); | ||||
| } | ||||
|  | ||||
| void __attribute__((weak)) default_handler(void) { | ||||
|   puts("default handler\n"); | ||||
| } | ||||
|  | ||||
| void __attribute__((weak)) interrupt_handler(unsigned) { | ||||
|   puts("interrupt handler\n"); | ||||
| } | ||||
|  | ||||
| uint32_t handle_trap(uint32_t mcause, uint32_t mepc, uint32_t sp){ | ||||
|   if ((mcause & MCAUSE_INT)) { | ||||
|     if ((mcause & MCAUSE_CAUSE) == IRQ_M_EXT) { | ||||
|       handle_m_ext_interrupt(); | ||||
|     } else if (((mcause & MCAUSE_CAUSE) == IRQ_M_TIMER)){  | ||||
|       handle_m_time_interrupt(); | ||||
|     } else { | ||||
|       interrupt_handler(mcause& ~MCAUSE_INT); | ||||
|     } | ||||
|   } else { | ||||
|     write(1, "trap\n", 5); | ||||
|     _exit(1 + mcause); | ||||
|   } | ||||
|   return mepc; | ||||
| } | ||||
|  | ||||
| void _init() | ||||
| { | ||||
|    | ||||
| #ifndef NO_INIT | ||||
|   init_pll(); | ||||
|   uart_init(115200); | ||||
|   printf("core freq at %lu Hz\n", get_cpu_freq()); | ||||
|   write_csr(mtvec, &trap_entry); | ||||
|   if (read_csr(misa) & (1 << ('F' - 'A'))) { // if F extension is present | ||||
|     write_csr(mstatus, MSTATUS_FS); // allow FPU instructions without trapping | ||||
|     write_csr(fcsr, 0); // initialize rounding mode, undefined at reset | ||||
|   } | ||||
|   int i=0; | ||||
|   while(i<NUM_INTERRUPTS)  { | ||||
|     localISR[i++] = default_handler; | ||||
|   } | ||||
|  | ||||
| #endif | ||||
|    | ||||
| } | ||||
|  | ||||
| void _fini(void) | ||||
| { | ||||
| } | ||||
							
								
								
									
										7
									
								
								env/riscv_vp/memory_map.ld
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								env/riscv_vp/memory_map.ld
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| MEMORY | ||||
| { | ||||
|   ram   (wxa!ri) : ORIGIN = 0x00000000, LENGTH = 128K | ||||
|   rom   (rxai!w) : ORIGIN = 0x10080000, LENGTH = 8k | ||||
|   flash (rxai!w) : ORIGIN = 0x20000000, LENGTH = 16M | ||||
|   dram  (wxa!ri) : ORIGIN = 0x40000000, LENGTH = 2048M | ||||
| } | ||||
							
								
								
									
										48
									
								
								env/riscv_vp/platform.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								env/riscv_vp/platform.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,48 @@ | ||||
| // See LICENSE for license details. | ||||
|  | ||||
| #ifndef _ISS_PLATFORM_H | ||||
| #define _ISS_PLATFORM_H | ||||
|  | ||||
| #if __riscv_xlen == 32 | ||||
| #define MCAUSE_INT 0x80000000UL | ||||
| #define MCAUSE_CAUSE 0x000003FFUL | ||||
| #else | ||||
| #define MCAUSE_INT 0x8000000000000000UL | ||||
| #define MCAUSE_CAUSE 0x00000000000003FFUL | ||||
| #endif | ||||
|  | ||||
| #define APB_BUS | ||||
|  | ||||
| #include "minres/devices/aclint.h" | ||||
| #include "minres/devices/dma.h" | ||||
| #include "minres/devices/gen/sysctrl.h" | ||||
| #include "minres/devices/gpio.h" | ||||
| #include "minres/devices/i2s.h" | ||||
| #include "minres/devices/qspi.h" | ||||
| #include "minres/devices/timer.h" | ||||
| #include "minres/devices/uart.h" | ||||
|  | ||||
| #define PERIPH(TYPE, ADDR) ((volatile TYPE*)(ADDR)) | ||||
| // values from memory_map.ld | ||||
| #define XIP_START_LOC 0x20000000 | ||||
| #define RAM_START_LOC 0x00000000 | ||||
| #define APB_BASE 0x10000000 | ||||
|  | ||||
| #define gpio PERIPH(gpio_t, APB_BASE + 0x0000) | ||||
| #define uart PERIPH(uart_t, APB_BASE + 0x01000) | ||||
| #define timer PERIPH(timercounter_t, APB_BASE + 0x20000) | ||||
| #define aclint PERIPH(aclint_t, APB_BASE + 0x30000) | ||||
| #define sysctrl PERIPH(sysctrl_t, APB_BASE + 0x40000) | ||||
| #define qspi PERIPH(qspi_t, APB_BASE + 0x50000) | ||||
| #define i2s PERIPH(i2s_t, APB_BASE + 0x90000) | ||||
| #define dma PERIPH(dma_t, APB_BASE + 0xB0000) | ||||
|  | ||||
| // Misc | ||||
|  | ||||
| #include <stdint.h> | ||||
|  | ||||
| void init_pll(void); | ||||
| unsigned long get_cpu_freq(void); | ||||
| unsigned long get_timer_freq(void); | ||||
|  | ||||
| #endif /* _ISS_PLATFORM_H */ | ||||
							
								
								
									
										177
									
								
								env/riscv_vp/rom.lds
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										177
									
								
								env/riscv_vp/rom.lds
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,177 @@ | ||||
| OUTPUT_ARCH( "riscv" ) | ||||
|  | ||||
| ENTRY( _start ) | ||||
|  | ||||
| INCLUDE memory_map.ld | ||||
|  | ||||
| PHDRS | ||||
| { | ||||
|   rom PT_LOAD; | ||||
|   ram_init PT_LOAD; | ||||
|   ram PT_NULL; | ||||
|   dram PT_NULL; | ||||
| } | ||||
|  | ||||
| SECTIONS | ||||
| { | ||||
|   __stack_size = DEFINED(__stack_size) ? __stack_size : 2K; | ||||
|  | ||||
|   .init ORIGIN(rom)        : | ||||
|   { | ||||
|     KEEP (*(SORT_NONE(.init))) | ||||
|   } >rom AT>rom :rom | ||||
|  | ||||
|   .text           : | ||||
|   { | ||||
|     *(.text.unlikely .text.unlikely.*) | ||||
|     *(.text.startup .text.startup.*) | ||||
|     *(.text .text.*) | ||||
|     *(.gnu.linkonce.t.*) | ||||
|   } >rom AT>rom :rom | ||||
|  | ||||
|   .fini           : | ||||
|   { | ||||
|     KEEP (*(SORT_NONE(.fini))) | ||||
|   } >rom AT>rom :rom | ||||
|  | ||||
|   PROVIDE (__etext = .); | ||||
|   PROVIDE (_etext = .); | ||||
|   PROVIDE (etext = .); | ||||
|  | ||||
|   .rodata         : | ||||
|   { | ||||
|     *(.rdata) | ||||
|     *(.rodata .rodata.*) | ||||
|     *(.gnu.linkonce.r.*) | ||||
|   } >rom AT>rom :rom | ||||
|  | ||||
|   . = ALIGN(4); | ||||
|  | ||||
|   .preinit_array  : | ||||
|   { | ||||
|     PROVIDE_HIDDEN (__preinit_array_start = .); | ||||
|     KEEP (*(.preinit_array)) | ||||
|     PROVIDE_HIDDEN (__preinit_array_end = .); | ||||
|   } >rom AT>rom :rom | ||||
|  | ||||
|   .init_array     : | ||||
|   { | ||||
|     PROVIDE_HIDDEN (__init_array_start = .); | ||||
|     KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) | ||||
|     KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) | ||||
|     PROVIDE_HIDDEN (__init_array_end = .); | ||||
|   } >rom AT>rom :rom | ||||
|  | ||||
|   .fini_array     : | ||||
|   { | ||||
|     PROVIDE_HIDDEN (__fini_array_start = .); | ||||
|     KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) | ||||
|     KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) | ||||
|     PROVIDE_HIDDEN (__fini_array_end = .); | ||||
|   } >rom AT>rom :rom | ||||
|  | ||||
|   .ctors          : | ||||
|   { | ||||
|     /* gcc uses crtbegin.o to find the start of | ||||
|        the constructors, so we make sure it is | ||||
|        first.  Because this is a wildcard, it | ||||
|        doesn't matter if the user does not | ||||
|        actually link against crtbegin.o; the | ||||
|        linker won't look for a file to match a | ||||
|        wildcard.  The wildcard also means that it | ||||
|        doesn't matter which directory crtbegin.o | ||||
|        is in.  */ | ||||
|     KEEP (*crtbegin.o(.ctors)) | ||||
|     KEEP (*crtbegin?.o(.ctors)) | ||||
|     /* We don't want to include the .ctor section from | ||||
|        the crtend.o file until after the sorted ctors. | ||||
|        The .ctor section from the crtend file contains the | ||||
|        end of ctors marker and it must be last */ | ||||
|     KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) | ||||
|     KEEP (*(SORT(.ctors.*))) | ||||
|     KEEP (*(.ctors)) | ||||
|   } >rom AT>rom :rom | ||||
|  | ||||
|   .dtors          : | ||||
|   { | ||||
|     KEEP (*crtbegin.o(.dtors)) | ||||
|     KEEP (*crtbegin?.o(.dtors)) | ||||
|     KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) | ||||
|     KEEP (*(SORT(.dtors.*))) | ||||
|     KEEP (*(.dtors)) | ||||
|   } >rom AT>rom :rom | ||||
|  | ||||
|   .dummy          : | ||||
|   { | ||||
| 	*(.comment.*) | ||||
|  | ||||
|   } | ||||
|   .lalign         : | ||||
|   { | ||||
|     . = ALIGN(4); | ||||
|     PROVIDE( _data_lma = . ); | ||||
|   } >rom AT>rom :rom | ||||
|  | ||||
|   .dalign         : | ||||
|   { | ||||
|     . = ALIGN(4); | ||||
|     PROVIDE( _data = . ); | ||||
|   } >ram AT>rom :ram_init | ||||
|  | ||||
|   .data          : | ||||
|   { | ||||
|     __DATA_BEGIN__ = .; | ||||
|     *(.data .data.*) | ||||
|     *(.gnu.linkonce.d.*) | ||||
|   } >ram AT>rom :ram_init | ||||
|  | ||||
|   .sdata          : | ||||
|   { | ||||
|     __SDATA_BEGIN__ = .; | ||||
|     *(.sdata .sdata.*) | ||||
|     *(.gnu.linkonce.s.*) | ||||
|   } >ram AT>rom :ram_init | ||||
|  | ||||
|   .srodata        : | ||||
|   { | ||||
|     *(.srodata.cst16) | ||||
|     *(.srodata.cst8) | ||||
|     *(.srodata.cst4) | ||||
|     *(.srodata.cst2) | ||||
|     *(.srodata .srodata.*) | ||||
|   } >ram AT>rom :ram_init | ||||
|  | ||||
|   . = ALIGN(4); | ||||
|   PROVIDE( _edata = . ); | ||||
|   PROVIDE( edata = . ); | ||||
|  | ||||
|   PROVIDE( _fbss = . ); | ||||
|   PROVIDE( __bss_start = . ); | ||||
|   .bss            : | ||||
|   { | ||||
|     *(.sbss*) | ||||
|     *(.gnu.linkonce.sb.*) | ||||
|     *(.bss .bss.*) | ||||
|     *(.gnu.linkonce.b.*) | ||||
|     *(COMMON) | ||||
|     . = ALIGN(4); | ||||
|   } >ram AT>ram :ram | ||||
|  | ||||
|   . = ALIGN(8); | ||||
|   __BSS_END__ = .; | ||||
|   __global_pointer$ = MIN(__SDATA_BEGIN__ + 0x800,  MAX(__DATA_BEGIN__ + 0x800, __BSS_END__ - 0x800)); | ||||
|   PROVIDE( _end = . ); | ||||
|   PROVIDE( end = . ); | ||||
|  | ||||
|   .stack ORIGIN(ram) + LENGTH(ram) - __stack_size : | ||||
|   { | ||||
|     PROVIDE( _heap_end = . ); | ||||
|     . = __stack_size; | ||||
|     PROVIDE( _sp = . ); | ||||
|   } >ram AT>ram :ram | ||||
|  | ||||
|  | ||||
|    | ||||
|   PROVIDE( tohost = . ); | ||||
|   PROVIDE( fromhost = . + 8 ); | ||||
| } | ||||
| @@ -16,6 +16,7 @@ static uint64_t get_aclint_mtime(volatile aclint_t* reg){ | ||||
| } | ||||
|  | ||||
| static void set_aclint_mtimecmp(volatile aclint_t* reg, uint64_t value){ | ||||
|     set_aclint_mtimecmp0lo(reg, (uint32_t)0xFFFFFFFF); | ||||
|     set_aclint_mtimecmp0hi(reg, (uint32_t)(value >> 32)); | ||||
|     set_aclint_mtimecmp0lo(reg, (uint32_t)value); | ||||
| } | ||||
|   | ||||
| @@ -21,7 +21,7 @@ static inline void uart_write(volatile uart_t* reg, uint8_t data){ | ||||
|     set_uart_rx_tx_reg_data(reg, data); | ||||
| } | ||||
|  | ||||
| static inline inline uint8_t uart_read(volatile uart_t* reg){ | ||||
| static inline uint8_t uart_read(volatile uart_t* reg){ | ||||
|     uint32_t res = get_uart_rx_tx_reg_data(reg); | ||||
|     while((res&0x10000) == 0) res = get_uart_rx_tx_reg_data(reg); | ||||
|     return res; | ||||
|   | ||||
| @@ -4,10 +4,12 @@ | ||||
|  | ||||
| extern ssize_t _bsp_write(int, const void*, size_t); | ||||
|  | ||||
| int __wrap_puts(const char* s) { | ||||
|     const char* str = s; | ||||
|     while(*str) | ||||
|         str++; | ||||
|     return _bsp_write(STDOUT_FILENO, s, str - s); | ||||
| int __wrap_puts(const char* s) {     | ||||
|      if(!s) return -1; | ||||
|      const char* str = s; | ||||
|      while(*str)  | ||||
|           ++str; | ||||
|      *(char*)str='\n'; | ||||
|      return _bsp_write(STDOUT_FILENO, s, (str - s)+1);    | ||||
| } | ||||
| weak_under_alias(puts); | ||||
|     weak_under_alias(puts); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user