location independent kernel loading support/fixes

This commit is contained in:
Blaise Tine 2024-04-17 01:00:38 -07:00
parent 69fdb4bd04
commit 8fa28bfca1
30 changed files with 248 additions and 84 deletions

View file

@ -21,7 +21,7 @@ CP = $(RISCV_TOOLCHAIN_PATH)/bin/$(RISCV_PREFIX)-objcopy
CFLAGS += -O3 -Wstack-usage=1024 -ffreestanding -nostartfiles -fdata-sections -ffunction-sections
CFLAGS += -I$(VORTEX_RT_PATH)/include -I$(VORTEX_HOME)/hw
LDFLAGS += -lm -Wl,-Bstatic,-T,$(VORTEX_RT_PATH)/linker/vx_link$(XLEN).ld,--defsym=STARTUP_ADDR=0x80000000
LDFLAGS += -lm -Wl,-Bstatic,-T,$(VORTEX_RT_PATH)/scripts/link$(XLEN).ld,--defsym=STARTUP_ADDR=0x80000000
PROJECT = kernel
@ -30,19 +30,19 @@ SRCS = $(SRC_DIR)/main.c $(SRC_DIR)/start.S
all: $(PROJECT).elf $(PROJECT).hex $(PROJECT).bin $(PROJECT).dump $(PROJECT).bin.coe
$(PROJECT).dump: $(PROJECT).elf
$(DP) -D $(PROJECT).elf > $(PROJECT).dump
$(DP) -D $< > $@
$(PROJECT).hex: $(PROJECT).elf
$(CP) -O ihex $(PROJECT).elf $(PROJECT).hex
$(CP) -O ihex $< $@
$(PROJECT).bin: $(PROJECT).elf
$(CP) -O binary $(PROJECT).elf $(PROJECT).bin
$(CP) -O binary $< $@
$(PROJECT).bin.coe: $(PROJECT).bin
$(BIN2COE_PATH)/bin2coe $(PROJECT).bin --out=$(PROJECT).bin.coe --binary=$(PROJECT).bin --data=$(PROJECT).dat --binaddr=8192 --depth=16384 --wordsize=64
$(BIN2COE_PATH)/bin2coe $< --out=$@ --binary=$(PROJECT).bin --data=$(PROJECT).dat --binaddr=8192 --depth=16384 --wordsize=64
$(PROJECT).elf: $(SRCS)
$(CC) $(CFLAGS) $(SRCS) $(LDFLAGS) -o $(PROJECT).elf
$(CC) $(CFLAGS) $^ $(LDFLAGS) -o $@
.depend: $(SRCS)
$(CC) $(CFLAGS) -MM $^ > .depend;

84
kernel/scripts/elf2vxbin.py Executable file
View file

@ -0,0 +1,84 @@
#!/usr/bin/env python
# Copyright 2019-2023
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import os
import subprocess
import struct
import sys
import re
def get_vma_size(elf_file):
try:
cmd = ['readelf', '-l', elf_file]
process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
output, errors = process.communicate()
if process.returncode != 0:
print "Error running objdump:", errors.strip()
sys.exit(-1)
min_vma = 2**64 - 1
max_vma = 0
regex = re.compile(r'\s*LOAD\s+(\w+)\s+(\w+)\s+(\w+)\s+(\w+)\s+(\w+)')
for line in output.splitlines():
match = regex.match(line)
if match:
vma = int(match.group(2), 16)
size = int(match.group(5), 16)
end_vma = vma + size
min_vma = min(min_vma, vma)
max_vma = max(max_vma, end_vma)
vma_size = max_vma - min_vma
#print("vma={0:x}, size={1}, min_vma={2:x}, max_vma={3:x}, vma_size={4}".format(vma, size, min_vma, max_vma, vma_size))
total_vma_span = max_vma - min_vma
return total_vma_span # Return the calculated size
except Exception as e:
print "Failed to calculate vma size due to an error:", str(e)
sys.exit(-1)
def create_vxbin_binary(input_elf, output_bin, objcopy_path):
vma_size = get_vma_size(input_elf)
# Create a binary data from the ELF file using objcopy
temp_bin_path = '/tmp/temp_kernel.bin'
subprocess.check_call([objcopy_path, '-O', 'binary', input_elf, temp_bin_path])
# Read the binary file to determine its size
with open(temp_bin_path, 'rb') as temp_file:
binary_data = temp_file.read()
# Pack size into 64-bit unsigned integer
total_size_bytes = struct.pack('<Q', vma_size)
# Write the total size and binary data to the final output file
with open(output_bin, 'wb') as bin_file:
bin_file.write(total_size_bytes)
bin_file.write(binary_data)
# Remove the temporary binary file
os.remove(temp_bin_path)
print("Binary created successfully: {}, vma_size={}".format(output_bin, vma_size))
if __name__ == '__main__':
if len(sys.argv) != 3:
print("Usage: elf2vxbin.py <input>.elf <output>.vxbin")
sys.exit(-1)
objcopy_path = os.getenv('OBJCOPY', 'objcopy') # Default to 'objcopy' if not set
create_vxbin_binary(sys.argv[1], sys.argv[2], objcopy_path)

View file

@ -121,35 +121,33 @@ void __libc_fini_array (void) {
#define FEXIT_COUNT 64
static struct fl {
struct fl *next;
typedef struct {
void (*f[FEXIT_COUNT])(void *);
void *a[FEXIT_COUNT];
} fexit_builtin, *head_builtin;
} fexit_list_t;
static int fexit_slot;
static fexit_list_t g_fexit_list;
static int g_num_fexits;
void __funcs_on_exit() {
void (*func)(void *), *arg;
for (; head_builtin; head_builtin=head_builtin->next, fexit_slot=FEXIT_COUNT) while(fexit_slot-->0) {
func = head_builtin->f[fexit_slot];
arg = head_builtin->a[fexit_slot];
func(arg);
}
fexit_list_t* fexit_list = &g_fexit_list;
for (int i = 0; i < g_num_fexits; ++i) {
func = fexit_list->f[i];
arg = fexit_list->a[i];
func(arg);
}
}
void __cxa_finalize(void *dso) {}
int __cxa_atexit(void (*func)(void *), void *arg, void *dso) {
// Defer initialization of head so it can be in BSS
if (!head_builtin) head_builtin = &fexit_builtin;
// fail if function list is full
if (fexit_slot == FEXIT_COUNT)
if (g_num_fexits == FEXIT_COUNT)
return -1;
// Append function to the list.
head_builtin->f[fexit_slot] = func;
head_builtin->a[fexit_slot] = arg;
++fexit_slot;
fexit_list_t* fexit_list = &g_fexit_list;
fexit_list->f[g_num_fexits] = func;
fexit_list->a[g_num_fexits] = arg;
++g_num_fexits;
return 0;
}

View file

@ -27,7 +27,7 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -v --gcc-toolchain=${TOOLDIR}/riscv-gnu-
set(CMAKE_SYSROOT "${TOOLDIR}/riscv-gnu-toolchain/riscv32-unknown-elf")
# Linker flags
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fuse-ld=lld -nostartfiles -Wl,-Bstatic,--gc-sections,-T,${VORTEX_HOME}/kernel/linker/vx_link32.ld,--defsym=STARTUP_ADDR=${STARTUP_ADDR} ${VORTEX_BUILD}/kernel/libvortexrt.a")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fuse-ld=lld -nostartfiles -Wl,-Bstatic,--gc-sections,-T,${VORTEX_HOME}/kernel/scripts/link32.ld,--defsym=STARTUP_ADDR=${STARTUP_ADDR} ${VORTEX_BUILD}/kernel/libvortexrt.a")
# Don't run the linker on compiler check
#set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)

View file

@ -158,7 +158,7 @@ public:
// found the corresponding block?
if (nullptr == usedBlock) {
printf("error: invalid address to release: 0x%lx\n", addr);
printf("warning: release address not found: 0x%lx\n", addr);
return -1;
}

View file

@ -137,6 +137,62 @@ int dcr_initialize(vx_device_h hdevice) {
///////////////////////////////////////////////////////////////////////////////
extern int vx_upload_kernel_bytes(vx_device_h hdevice, const void* content, uint64_t size, uint64_t* addr) {
if (NULL == content || size <= 8 || NULL == addr)
return -1;
auto bytes = reinterpret_cast<const uint8_t*>(content);
uint64_t _addr;
#ifdef NDEBUG
auto runtime_size = *reinterpret_cast<const uint64_t*>(bytes);
RT_CHECK(vx_mem_alloc(hdevice, runtime_size, &_addr), {
return _ret;
});
#else
uint32_t startup_addr0, startup_addr1;
RT_CHECK(vx_dcr_read(hdevice, VX_DCR_BASE_STARTUP_ADDR0, &startup_addr0), {
return _ret;
});
RT_CHECK(vx_dcr_read(hdevice, VX_DCR_BASE_STARTUP_ADDR1, &startup_addr1), {
return _ret;
});
_addr = (uint64_t(startup_addr1) << 32) | startup_addr0;
#endif
RT_CHECK(vx_copy_to_dev(hdevice, _addr, bytes + 8, size - 8), {
vx_mem_free(hdevice, _addr);
return _ret;
});
*addr = _addr;
return 0;
}
extern int vx_upload_kernel_file(vx_device_h hdevice, const char* filename, uint64_t* addr) {
std::ifstream ifs(filename);
if (!ifs) {
std::cout << "error: " << filename << " not found" << std::endl;
return -1;
}
// read file content
ifs.seekg(0, ifs.end);
auto size = ifs.tellg();
std::vector<char> content(size);
ifs.seekg(0, ifs.beg);
ifs.read(content.data(), size);
// upload buffer
RT_CHECK(vx_upload_kernel_bytes(hdevice, content.data(), size, addr), {
return _ret;
});
return 0;
}
extern int vx_upload_bytes(vx_device_h hdevice, const void* content, uint64_t size, uint64_t* addr) {
if (NULL == content || 0 == size || NULL == addr)
return -1;
@ -283,8 +339,8 @@ extern int vx_dump_perf(vx_device_h hdevice, FILE* stream) {
};
for (unsigned core_id = 0; core_id < num_cores; ++core_id) {
uint64_t mpm_mem_addr = IO_CSR_ADDR + core_id * staging_buf.size();
RT_CHECK(vx_copy_from_dev(hdevice, staging_buf.data(), mpm_mem_addr, staging_buf.size()), {
uint64_t mpm_mem_addr = IO_CSR_ADDR + core_id * staging_buf.size() * sizeof(uint64_t);
RT_CHECK(vx_copy_from_dev(hdevice, staging_buf.data(), mpm_mem_addr, staging_buf.size() * sizeof(uint64_t)), {
return _ret;
});
@ -568,7 +624,7 @@ extern int vx_perf_counter(vx_device_h hdevice, int counter, int core_id, uint64
return -1;
}
std::vector<uint64_t> staging_buf(64);
std::vector<uint64_t> staging_buf(32);
uint64_t _value = 0;
@ -579,8 +635,8 @@ extern int vx_perf_counter(vx_device_h hdevice, int counter, int core_id, uint64
}
for (i = 0; i < num_cores; ++i) {
uint64_t mpm_mem_addr = IO_CSR_ADDR + i * staging_buf.size();
RT_CHECK(vx_copy_from_dev(hdevice, staging_buf.data(), mpm_mem_addr, staging_buf.size()), {
uint64_t mpm_mem_addr = IO_CSR_ADDR + i * staging_buf.size() * sizeof(uint64_t);
RT_CHECK(vx_copy_from_dev(hdevice, staging_buf.data(), mpm_mem_addr, staging_buf.size() * sizeof(uint64_t)), {
return _ret;
});

View file

@ -95,6 +95,12 @@ int vx_dcr_write(vx_device_h hdevice, uint32_t addr, uint32_t value);
////////////////////////////// UTILITY FUNCTIONS //////////////////////////////
// upload bytes to device
int vx_upload_kernel_bytes(vx_device_h hdevice, const void* content, uint64_t size, uint64_t* addr);
// upload file to device
int vx_upload_kernel_file(vx_device_h hdevice, const char* filename, uint64_t* addr);
// upload bytes to device
int vx_upload_bytes(vx_device_h hdevice, const void* content, uint64_t size, uint64_t* addr);

View file

@ -360,6 +360,8 @@ extern int vx_mem_alloc(vx_device_h hdevice, uint64_t size, uint64_t* dev_addr)
|| 0 == size)
return -1;
DBGPRINT("MEM_ALLOC: size=%ld\n", size);
auto device = ((vx_device*)hdevice);
return device->global_mem->allocate(size, dev_addr);
}
@ -371,6 +373,8 @@ extern int vx_mem_free(vx_device_h hdevice, uint64_t dev_addr) {
if (0 == dev_addr)
return 0;
DBGPRINT("MEM_FREE: dev_addr=0x%lx\n", dev_addr);
auto device = ((vx_device*)hdevice);
return device->global_mem->release(dev_addr);
}
@ -378,6 +382,8 @@ extern int vx_mem_free(vx_device_h hdevice, uint64_t dev_addr) {
extern int vx_mem_info(vx_device_h hdevice, uint64_t* mem_free, uint64_t* mem_used) {
if (nullptr == hdevice)
return -1;
DBGPRINT("%s\n", "MEM_INFO");
auto device = ((vx_device*)hdevice);
if (mem_free)
@ -445,7 +451,7 @@ extern int vx_copy_from_dev(vx_device_h hdevice, void* host_ptr, uint64_t dev_ad
auto device = (vx_device*)hdevice;
auto& api = device->api;
DBGPRINT("COPY_FROM_DEV: dev_addr=0x%lx, host_addr=0x%lx, size=%ld\n", dev_addr, (uintptr_t)host_ptr, asize);
DBGPRINT("COPY_FROM_DEV: dev_addr=0x%lx, host_addr=0x%lx, size=%ld\n", dev_addr, (uintptr_t)host_ptr, size);
if (device->ensure_staging(size) != 0)
return -1;

View file

@ -259,6 +259,8 @@ extern int vx_mem_alloc(vx_device_h hdevice, uint64_t size, uint64_t* dev_addr)
|| 0 == size)
return -1;
DBGPRINT("MEM_ALLOC: size=%ld\n", size);
vx_device *device = ((vx_device*)hdevice);
return device->mem_alloc(size, dev_addr);
}
@ -270,6 +272,8 @@ extern int vx_mem_free(vx_device_h hdevice, uint64_t dev_addr) {
if (0 == dev_addr)
return 0;
DBGPRINT("MEM_FREE: dev_addr=0x%lx\n", dev_addr);
vx_device *device = ((vx_device*)hdevice);
return device->mem_free(dev_addr);
}
@ -278,6 +282,8 @@ extern int vx_mem_info(vx_device_h hdevice, uint64_t* mem_free, uint64_t* mem_us
if (nullptr == hdevice)
return -1;
DBGPRINT("%s\n", "MEM_INFO");
auto device = ((vx_device*)hdevice);
return device->mem_info(mem_free, mem_used);
}

View file

@ -261,6 +261,8 @@ extern int vx_mem_alloc(vx_device_h hdevice, uint64_t size, uint64_t* dev_addr)
|| 0 == size)
return -1;
DBGPRINT("MEM_ALLOC: size=%ld\n", size);
vx_device *device = ((vx_device*)hdevice);
return device->mem_alloc(size, dev_addr);
}
@ -272,6 +274,8 @@ extern int vx_mem_free(vx_device_h hdevice, uint64_t dev_addr) {
if (0 == dev_addr)
return 0;
DBGPRINT("MEM_FREE: dev_addr=0x%lx\n", dev_addr);
vx_device *device = ((vx_device*)hdevice);
return device->mem_free(dev_addr);
}
@ -280,6 +284,8 @@ extern int vx_mem_info(vx_device_h hdevice, uint64_t* mem_free, uint64_t* mem_us
if (nullptr == hdevice)
return -1;
DBGPRINT("%s\n", "MEM_INFO");
auto device = ((vx_device*)hdevice);
return device->mem_info(mem_free, mem_used);
}

View file

@ -733,6 +733,8 @@ extern int vx_mem_alloc(vx_device_h hdevice, uint64_t size, uint64_t* dev_addr)
|| 0 == size)
return -1;
DBGPRINT("MEM_ALLOC: size=%ld\n", size);
auto device = ((vx_device*)hdevice);
return device->mem_alloc(size, dev_addr);
}
@ -744,6 +746,8 @@ extern int vx_mem_free(vx_device_h hdevice, uint64_t dev_addr) {
if (0 == dev_addr)
return 0;
DBGPRINT("MEM_FREE: dev_addr=0x%lx\n", dev_addr);
auto device = (vx_device*)hdevice;
return device->mem_free(dev_addr);
}
@ -752,6 +756,8 @@ extern int vx_mem_info(vx_device_h hdevice, uint64_t* mem_free, uint64_t* mem_us
if (nullptr == hdevice)
return -1;
DBGPRINT("%s\n", "MEM_INFO");
auto device = (vx_device*)hdevice;
return device->mem_info(mem_free, mem_used);
}
@ -787,7 +793,7 @@ extern int vx_copy_from_dev(vx_device_h hdevice, void* host_ptr, uint64_t dev_ad
auto device = (vx_device*)hdevice;
DBGPRINT("COPY_FROM_DEV: dev_addr=0x%lx, host_addr=0x%lx, size=%ld\n", dev_addr, (uintptr_t)host_ptr, asize);
DBGPRINT("COPY_FROM_DEV: dev_addr=0x%lx, host_addr=0x%lx, size=%ld\n", dev_addr, (uintptr_t)host_ptr, size);
// check alignment
if (!is_aligned(dev_addr, CACHE_BLOCK_SIZE))

View file

@ -32,18 +32,18 @@ CFLAGS += -DXLEN_$(XLEN) -DNDEBUG
LIBC_LIB += -L$(LIBC_VORTEX)/lib -lm -lc -lgcc
LDFLAGS += -Wl,-Bstatic,--gc-sections,-T,$(VORTEX_KN_PATH)/linker/vx_link$(XLEN).ld,--defsym=STARTUP_ADDR=0x80000000 $(ROOT_DIR)/kernel/libvortexrt.a $(LIBC_LIB)
LDFLAGS += -Wl,-Bstatic,--gc-sections,-T,$(VORTEX_KN_PATH)/scripts/link$(XLEN).ld,--defsym=STARTUP_ADDR=0x80000000 $(ROOT_DIR)/kernel/libvortexrt.a $(LIBC_LIB)
all: $(PROJECT).elf $(PROJECT).bin $(PROJECT).dump
$(PROJECT).dump: $(PROJECT).elf
$(DP) -D $(PROJECT).elf > $(PROJECT).dump
$(DP) -D $< > $@
$(PROJECT).bin: $(PROJECT).elf
$(CP) -O binary $(PROJECT).elf $(PROJECT).bin
$(CP) -O binary $< $@
$(PROJECT).elf: $(SRCS)
$(CC) $(CFLAGS) $(SRCS) $(LDFLAGS) -o $(PROJECT).elf
$(CC) $(CFLAGS) $^ $(LDFLAGS) -o $@
run-rtlsim: $(PROJECT).bin
$(ROOT_DIR)/sim/rtlsim/rtlsim $(PROJECT).bin

View file

@ -29,7 +29,7 @@ VX_CFLAGS += -mllvm -disable-loop-idiom-all # disable memset/memcpy loop idiom
#VX_CFLAGS += -mllvm -vortex-branch-divergence=0
#VX_CFLAGS += -mllvm -print-after-all
VX_LDFLAGS += -Wl,-Bstatic,--gc-sections,-T$(VORTEX_KN_PATH)/linker/vx_link$(XLEN).ld,--defsym=STARTUP_ADDR=$(STARTUP_ADDR) $(ROOT_DIR)/kernel/libvortexrt.a $(LIBC_LIB)
VX_LDFLAGS += -Wl,-Bstatic,--gc-sections,-T$(VORTEX_KN_PATH)/scripts/link$(XLEN).ld,--defsym=STARTUP_ADDR=$(STARTUP_ADDR) $(ROOT_DIR)/kernel/libvortexrt.a $(LIBC_LIB)
CXXFLAGS += -std=c++11 -Wall -Wextra -Wfatal-errors
CXXFLAGS += -Wno-deprecated-declarations -Wno-unused-parameter -Wno-narrowing
@ -62,10 +62,10 @@ OBJS_HOST := $(addsuffix .host.o, $(notdir $(SRCS)))
all: $(PROJECT) kernel.pocl
kernel.cl: $(SRC_DIR)/kernel.cl
cp $(SRC_DIR)/kernel.cl $@
cp $< $@
kernel.pocl: $(SRC_DIR)/kernel.cl
LD_LIBRARY_PATH=$(LLVM_POCL)/lib:$(POCL_CC_PATH)/lib:$(LLVM_VORTEX)/lib:$(LD_LIBRARY_PATH) LLVM_PREFIX=$(LLVM_VORTEX) POCL_DEBUG=all POCL_KERNEL_CACHE=0 POCL_VORTEX_CFLAGS="$(VX_CFLAGS)" POCL_VORTEX_LDFLAGS="$(VX_LDFLAGS)" $(POCL_CC_PATH)/bin/poclcc -o kernel.pocl $^
LD_LIBRARY_PATH=$(LLVM_POCL)/lib:$(POCL_CC_PATH)/lib:$(LLVM_VORTEX)/lib:$(LD_LIBRARY_PATH) LLVM_PREFIX=$(LLVM_VORTEX) POCL_DEBUG=all POCL_KERNEL_CACHE=0 POCL_VORTEX_BINTOOL="OBJCOPY=$(LLVM_VORTEX)/bin/llvm-objcopy $(VORTEX_HOME)/kernel/scripts/elf2vxbin.py" POCL_VORTEX_CFLAGS="$(VX_CFLAGS)" POCL_VORTEX_LDFLAGS="$(VX_LDFLAGS)" $(POCL_CC_PATH)/bin/poclcc -o $@ $<
%.cc.o: $(SRC_DIR)/%.cc
$(CXX) $(CXXFLAGS) -c $< -o $@

View file

@ -13,7 +13,7 @@ OPTS ?= -n256
include ../common.mk
VX_LDFLAGS = -Wl,-Bstatic,--gc-sections,-T,$(VORTEX_KN_PATH)/linker/vx_link$(XLEN).ld,--defsym=STARTUP_ADDR=$(STARTUP_ADDR)
VX_LDFLAGS = -Wl,-Bstatic,--gc-sections,-T,$(VORTEX_KN_PATH)/scripts/link$(XLEN).ld,--defsym=STARTUP_ADDR=$(STARTUP_ADDR)
VX_CC = $(RISCV_TOOLCHAIN_PATH)/bin/$(RISCV_PREFIX)-gcc
VX_CXX = $(RISCV_TOOLCHAIN_PATH)/bin/$(RISCV_PREFIX)-g++

View file

@ -20,7 +20,7 @@
///////////////////////////////////////////////////////////////////////////////
const char* kernel_file = "kernel.bin";
const char* kernel_file = "kernel.vxbin";
int test = -1;
uint32_t count = 0;
@ -138,7 +138,7 @@ int run_kernel_test(const kernel_arg_t& kernel_arg) {
// upload program
std::cout << "upload program" << std::endl;
RT_CHECK(vx_upload_file(device, kernel_file, &kernel_prog_addr));
RT_CHECK(vx_upload_kernel_file(device, kernel_file, &kernel_prog_addr));
// upload kernel argument
std::cout << "upload kernel argument" << std::endl;

View file

@ -41,7 +41,7 @@ VX_CFLAGS += -DNDEBUG
VX_LIBS += -L$(LIBC_VORTEX)/lib -lm -lc -lgcc
VX_LDFLAGS += -Wl,-Bstatic,--gc-sections,-T,$(VORTEX_KN_PATH)/linker/vx_link$(XLEN).ld,--defsym=STARTUP_ADDR=$(STARTUP_ADDR) $(ROOT_DIR)/kernel/libvortexrt.a $(VX_LIBS)
VX_LDFLAGS += -Wl,-Bstatic,--gc-sections,-T,$(VORTEX_KN_PATH)/scripts/link$(XLEN).ld,--defsym=STARTUP_ADDR=$(STARTUP_ADDR) $(ROOT_DIR)/kernel/libvortexrt.a $(VX_LIBS)
CXXFLAGS += -std=c++11 -Wall -Wextra -pedantic -Wfatal-errors
CXXFLAGS += -I$(VORTEX_RT_PATH)/include -I$(ROOT_DIR)/hw
@ -67,30 +67,30 @@ endif
endif
endif
all: $(PROJECT) kernel.bin kernel.dump
all: $(PROJECT) kernel.vxbin kernel.dump
kernel.dump: kernel.elf
$(VX_DP) -D kernel.elf > kernel.dump
$(VX_DP) -D $< > $@
kernel.bin: kernel.elf
$(VX_CP) -O binary kernel.elf kernel.bin
kernel.vxbin: kernel.elf
OBJCOPY=$(VX_CP) $(VORTEX_HOME)/kernel/scripts/elf2vxbin.py $< $@
kernel.elf: $(VX_SRCS)
$(VX_CXX) $(VX_CFLAGS) $(VX_SRCS) $(VX_LDFLAGS) -o kernel.elf
$(VX_CXX) $(VX_CFLAGS) $^ $(VX_LDFLAGS) -o kernel.elf
$(PROJECT): $(SRCS)
$(CXX) $(CXXFLAGS) $^ $(LDFLAGS) -o $@
run-simx: $(PROJECT) kernel.bin
run-simx: $(PROJECT) kernel.vxbin
LD_LIBRARY_PATH=$(ROOT_DIR)/runtime/simx:$(LD_LIBRARY_PATH) ./$(PROJECT) $(OPTS)
run-opae: $(PROJECT) kernel.bin
run-opae: $(PROJECT) kernel.vxbin
SCOPE_JSON_PATH=$(ROOT_DIR)/runtime/opae/scope.json OPAE_DRV_PATHS=$(OPAE_DRV_PATHS) LD_LIBRARY_PATH=$(ROOT_DIR)/runtime/opae:$(LD_LIBRARY_PATH) ./$(PROJECT) $(OPTS)
run-rtlsim: $(PROJECT) kernel.bin
run-rtlsim: $(PROJECT) kernel.vxbin
LD_LIBRARY_PATH=$(ROOT_DIR)/runtime/rtlsim:$(LD_LIBRARY_PATH) ./$(PROJECT) $(OPTS)
run-xrt: $(PROJECT) kernel.bin
run-xrt: $(PROJECT) kernel.vxbin
ifeq ($(TARGET), hw)
XRT_INI_PATH=$(XRT_SYN_DIR)/xrt.ini EMCONFIG_PATH=$(FPGA_BIN_DIR) XRT_DEVICE_INDEX=$(XRT_DEVICE_INDEX) XRT_XCLBIN_PATH=$(FPGA_BIN_DIR)/vortex_afu.xclbin LD_LIBRARY_PATH=$(XILINX_XRT)/lib:$(ROOT_DIR)/runtime/xrt:$(LD_LIBRARY_PATH) ./$(PROJECT) $(OPTS)
else

View file

@ -90,7 +90,7 @@ static void convolution_cpu(TYPE *O, TYPE *I, TYPE *W, int32_t width, int32_t he
}
}
const char* kernel_file = "kernel.bin";
const char* kernel_file = "kernel.vxbin";
int size = 32;
bool use_lmem = false;
@ -223,7 +223,7 @@ int main(int argc, char *argv[]) {
// upload program
std::cout << "upload program" << std::endl;
RT_CHECK(vx_upload_file(device, kernel_file, &kernel_prog_addr));
RT_CHECK(vx_upload_kernel_file(device, kernel_file, &kernel_prog_addr));
// upload kernel argument
std::cout << "upload kernel argument" << std::endl;

View file

@ -69,7 +69,7 @@ public:
}
};
const char* kernel_file = "kernel.bin";
const char* kernel_file = "kernel.vxbin";
uint32_t count = 16;
vx_device_h device = nullptr;
@ -173,7 +173,7 @@ int main(int argc, char *argv[]) {
// upload program
std::cout << "upload program" << std::endl;
RT_CHECK(vx_upload_file(device, kernel_file, &kernel_prog_addr));
RT_CHECK(vx_upload_kernel_file(device, kernel_file, &kernel_prog_addr));
// upload kernel argument
std::cout << "upload kernel argument" << std::endl;

View file

@ -18,7 +18,7 @@
///////////////////////////////////////////////////////////////////////////////
const char* kernel_file = "kernel.bin";
const char* kernel_file = "kernel.vxbin";
uint32_t count = 0;
vx_device_h device = nullptr;
@ -189,7 +189,7 @@ int main(int argc, char *argv[]) {
// upload program
std::cout << "upload program" << std::endl;
RT_CHECK(vx_upload_file(device, kernel_file, &kernel_prog_addr));
RT_CHECK(vx_upload_kernel_file(device, kernel_file, &kernel_prog_addr));
// upload kernel argument
std::cout << "upload kernel argument" << std::endl;

View file

@ -11,7 +11,7 @@
///////////////////////////////////////////////////////////////////////////////
TestSuite* testSuite = nullptr;
const char* kernel_file = "kernel.bin";
const char* kernel_file = "kernel.vxbin";
int count = 1;
std::unordered_set<std::string> selected;
std::unordered_set<std::string> excluded;
@ -139,7 +139,7 @@ int main(int argc, char *argv[]) {
// upload program
std::cout << "upload kernel" << std::endl;
RT_CHECK(vx_upload_file(device, kernel_file, &kernel_prog_addr));
RT_CHECK(vx_upload_kernel_file(device, kernel_file, &kernel_prog_addr));
// execute tests
int errors = 0;

View file

@ -17,7 +17,7 @@
///////////////////////////////////////////////////////////////////////////////
const char* kernel_file = "kernel.bin";
const char* kernel_file = "kernel.vxbin";
uint32_t count = 0;
vx_device_h device = nullptr;
@ -122,7 +122,7 @@ int main(int argc, char *argv[]) {
// upload program
std::cout << "upload program" << std::endl;
RT_CHECK(vx_upload_file(device, kernel_file, &kernel_prog_addr));
RT_CHECK(vx_upload_kernel_file(device, kernel_file, &kernel_prog_addr));
// upload kernel argument
std::cout << "upload kernel argument" << std::endl;

View file

@ -20,7 +20,7 @@
///////////////////////////////////////////////////////////////////////////////
const char* kernel_file = "kernel.bin";
const char* kernel_file = "kernel.vxbin";
uint32_t count = 0;
static uint64_t io_base_addr = IO_CSR_ADDR + IO_CSR_SIZE;
@ -157,7 +157,7 @@ int main(int argc, char *argv[]) {
// upload program
std::cout << "upload program" << std::endl;
RT_CHECK(vx_upload_file(device, kernel_file, &kernel_prog_addr));
RT_CHECK(vx_upload_kernel_file(device, kernel_file, &kernel_prog_addr));
// upload kernel argument
std::cout << "upload kernel argument" << std::endl;

View file

@ -69,7 +69,7 @@ public:
}
};
const char* kernel_file = "kernel.bin";
const char* kernel_file = "kernel.vxbin";
uint32_t count = 16;
vx_device_h device = nullptr;
@ -173,7 +173,7 @@ int main(int argc, char *argv[]) {
// upload program
std::cout << "upload program" << std::endl;
RT_CHECK(vx_upload_file(device, kernel_file, &kernel_prog_addr));
RT_CHECK(vx_upload_kernel_file(device, kernel_file, &kernel_prog_addr));
// upload kernel argument
std::cout << "upload kernel argument" << std::endl;

View file

@ -65,7 +65,7 @@ inline bool almost_equal(float a, float b) {
///////////////////////////////////////////////////////////////////////////////
const char* kernel_file = "kernel.bin";
const char* kernel_file = "kernel.vxbin";
uint32_t count = 0;
vx_device_h device = nullptr;
@ -193,7 +193,7 @@ int main(int argc, char *argv[]) {
// upload program
std::cout << "upload program" << std::endl;
RT_CHECK(vx_upload_file(device, kernel_file, &kernel_prog_addr));
RT_CHECK(vx_upload_kernel_file(device, kernel_file, &kernel_prog_addr));
// upload kernel argument
std::cout << "upload kernel argument" << std::endl;

View file

@ -17,7 +17,7 @@
///////////////////////////////////////////////////////////////////////////////
const char* kernel_file = "kernel.bin";
const char* kernel_file = "kernel.vxbin";
uint32_t count = 4;
vx_device_h device = nullptr;
@ -108,7 +108,7 @@ int main(int argc, char *argv[]) {
// upload program
std::cout << "upload program" << std::endl;
RT_CHECK(vx_upload_file(device, kernel_file, &kernel_prog_addr));
RT_CHECK(vx_upload_kernel_file(device, kernel_file, &kernel_prog_addr));
// upload kernel argument
std::cout << "upload kernel argument" << std::endl;

View file

@ -81,7 +81,7 @@ static void matmul_cpu(TYPE* out, const TYPE* A, const TYPE* B, uint32_t width,
}
}
const char* kernel_file = "kernel.bin";
const char* kernel_file = "kernel.vxbin";
uint32_t size = 32;
vx_device_h device = nullptr;
@ -182,7 +182,7 @@ int main(int argc, char *argv[]) {
// upload program
std::cout << "upload program" << std::endl;
RT_CHECK(vx_upload_file(device, kernel_file, &kernel_prog_addr));
RT_CHECK(vx_upload_kernel_file(device, kernel_file, &kernel_prog_addr));
// upload kernel argument
std::cout << "upload kernel argument" << std::endl;

View file

@ -17,7 +17,7 @@
///////////////////////////////////////////////////////////////////////////////
const char* kernel_file = "kernel.bin";
const char* kernel_file = "kernel.vxbin";
uint32_t count = 0;
vx_device_h device = nullptr;
@ -133,7 +133,7 @@ int main(int argc, char *argv[]) {
// upload program
std::cout << "upload program" << std::endl;
RT_CHECK(vx_upload_file(device, kernel_file, &kernel_prog_addr));
RT_CHECK(vx_upload_kernel_file(device, kernel_file, &kernel_prog_addr));
// upload kernel argument
std::cout << "upload kernel argument" << std::endl;

View file

@ -69,7 +69,7 @@ public:
}
};
const char* kernel_file = "kernel.bin";
const char* kernel_file = "kernel.vxbin";
uint32_t size = 16;
vx_device_h device = nullptr;
@ -156,20 +156,16 @@ int main(int argc, char *argv[]) {
}
// upload source buffer0
{
std::cout << "upload source buffer0" << std::endl;
RT_CHECK(vx_copy_to_dev(device, kernel_arg.src0_addr, h_src0.data(), buf_size));
}
std::cout << "upload source buffer0" << std::endl;
RT_CHECK(vx_copy_to_dev(device, kernel_arg.src0_addr, h_src0.data(), buf_size));
// upload source buffer1
{
std::cout << "upload source buffer1" << std::endl;
RT_CHECK(vx_copy_to_dev(device, kernel_arg.src1_addr, h_src1.data(), buf_size));
}
std::cout << "upload source buffer1" << std::endl;
RT_CHECK(vx_copy_to_dev(device, kernel_arg.src1_addr, h_src1.data(), buf_size));
// upload program
std::cout << "upload program" << std::endl;
RT_CHECK(vx_upload_file(device, kernel_file, &kernel_prog_addr));
RT_CHECK(vx_upload_kernel_file(device, kernel_file, &kernel_prog_addr));
// upload kernel argument
std::cout << "upload kernel argument" << std::endl;