Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add pulp-offload-intf.c to stimulate and test CVA6-PULP cluster interference #255

Closed
wants to merge 5 commits into from
Closed
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion carfield.mk
Original file line number Diff line number Diff line change
Expand Up @@ -316,7 +316,7 @@ pulpd-sw-init: $(PULPD_ROOT) $(PULPD_ROOT)/pulp-runtime $(PULPD_ROOT)/regression
$(PULPD_ROOT)/pulp-runtime: $(PULPD_ROOT)
$(MAKE) -C $(PULPD_ROOT) pulp-runtime
$(PULPD_ROOT)/regression-tests: $(PULPD_ROOT)
$(MAKE) -C $(PULPD_ROOT) regression-tests
git clone [email protected]:pulp-platform/regression_tests.git -b lv/car-wce $@
yvantor marked this conversation as resolved.
Show resolved Hide resolved

# For independent boot of an island, we allow to compile the binary standalone.
.PHONY: safed-sw-build
Expand Down
5 changes: 4 additions & 1 deletion sw/sw.mk
Original file line number Diff line number Diff line change
Expand Up @@ -61,9 +61,11 @@ CAR_ELFLOAD_BLOCKING_SAFED_SRC_C := $(CAR_SW_DIR)/tests/bare-metal/hostd/safed_o
CAR_ELFLOAD_BLOCKING_SAFED_PATH := $(basename $(CAR_ELFLOAD_BLOCKING_SAFED_SRC_C))
CAR_ELFLOAD_PULPD_SRC_C := $(CAR_SW_DIR)/tests/bare-metal/hostd/pulp-offload.c
CAR_ELFLOAD_PULPD_PATH := $(basename $(CAR_ELFLOAD_PULPD_SRC_C))
CAR_ELFLOAD_PULPD_INTF_SRC_C := $(CAR_SW_DIR)/tests/bare-metal/hostd/pulp-offload-intf.c
CAR_ELFLOAD_PULPD_INTF_PATH := $(basename $(CAR_ELFLOAD_PULPD_INTF_SRC_C))
Copy link
Contributor

@yvantor yvantor Mar 1, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do you think that doing:

CAR_ELFLOAD_PULPD_SRC_C += $(CAR_SW_DIR)/tests/bare-metal/hostd/pulp-offload-intf.c

Would work the same or might break? So we don't have to add dedicated variables for each new test we add (not sure it would work though).

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ditto, we can append to the genric source variable CAR_ELFLOAD_PULPD_SRC_C

Copy link
Collaborator Author

@luca-valente luca-valente Mar 20, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think it would work. CAR_ELFLOAD_PULPD_SRC_C (i.e. $(CAR_SW_DIR)/tests/bare-metal/hostd/pulp-offload.c) is used as an argument of offload_tests_template. We would need to add a second for loop there to check all the source files and execute the command $(CHS_SW_CC) $(CAR_SW_INCLUDES) $(CHS_SW_CCFLAGS) -c $(3) -o $(4).$(basename $(notdir $(header))).car.o; 2 times, with $(3) being pulp-offload.c and pulp-offload-intf.c in the second iteration. Without adding the for loop, we would pass two files with two main to the cc compiler and it would break.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, I agree. @alex96295 what do you think?


CAR_SW_TEST_SRCS_S = $(wildcard $(CAR_SW_DIR)/tests/bare-metal/hostd/*.S)
CAR_SW_TEST_SRCS_C = $(filter-out $(CAR_ELFLOAD_BLOCKING_SAFED_SRC_C) $(CAR_ELFLOAD_PULPD_SRC_C), $(wildcard $(CAR_SW_DIR)/tests/bare-metal/hostd/*.c))
CAR_SW_TEST_SRCS_C = $(filter-out $(CAR_ELFLOAD_BLOCKING_SAFED_SRC_C) $(CAR_ELFLOAD_PULPD_SRC_C) $(CAR_ELFLOAD_PULPD_INTF_SRC_C), $(wildcard $(CAR_SW_DIR)/tests/bare-metal/hostd/*.c))
yvantor marked this conversation as resolved.
Show resolved Hide resolved

CAR_SW_TEST_DRAM_DUMP = $(CAR_SW_TEST_SRCS_S:.S=.car.dram.dump) $(CAR_SW_TEST_SRCS_C:.c=.car.dram.dump)
CAR_SW_TEST_DRAM_SLM = $(CAR_SW_TEST_SRCS_S:.S=.car.dram.slm) $(CAR_SW_TEST_SRCS_C:.c=.car.dram.slm)
Expand Down Expand Up @@ -104,6 +106,7 @@ include $(CAR_SW_DIR)/tests/bare-metal/pulpd/sw.mk

car-pulpd-sw-offload-tests:
$(call offload_tests_template,$(PULPD_HEADER_TARGETS),pulpd,$(CAR_ELFLOAD_PULPD_SRC_C),$(CAR_ELFLOAD_PULPD_PATH))
$(call offload_tests_template,$(PULPD_HEADER_TARGETS),pulpd,$(CAR_ELFLOAD_PULPD_INTF_SRC_C),$(CAR_ELFLOAD_PULPD_INTF_PATH))
yvantor marked this conversation as resolved.
Show resolved Hide resolved

# Litmus tests
LITMUS_REPO := https://github.com/pulp-platform/CHERI-Litmus.git
Expand Down
120 changes: 120 additions & 0 deletions sw/tests/bare-metal/hostd/pulp-offload-intf.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
// Copyright 2023 ETH Zurich and University of Bologna.
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0
//
// Luca Valente <[email protected]>
//
// Bare-metal offload test for the PULP cluster with interference

#include <stdio.h>
#include <stdint.h>

#include "car_memory_map.h"
#include "car_util.h"
#include "dif/clint.h"
#include "dif/uart.h"
#include "params.h"
#include "regs/cheshire.h"
#include "csr.h"
#include "util.h"
#include "payload.h"
#include "printf.h"

#define LCL

long int buffer[128];

void read_from_cache(int l1_way_size, int stride) {
asm volatile("": : :"memory");
for(volatile int j = 0; j < l1_way_size; j++)
{
* ( ( volatile long int * ) &buffer[j] );
}
asm volatile("": : :"memory");
for(volatile int j = 0; j < l1_way_size; j++)
{
* ( ( volatile long int * ) &buffer[j*stride]);
}
asm volatile("": : :"memory");
}

long unsigned sweep(int stride)
{

int l1_way_size = 4 * 1024 / 8;
int working_set = l1_way_size * stride * 8;

volatile long unsigned cycle_start;

for(int i = 0; i < 10; i++)
{
if(i==1)
{
cycle_start = get_mcycle();
}
read_from_cache(l1_way_size, stride);
}

volatile long unsigned cycles = get_mcycle() - cycle_start;

#ifdef VERBOSE
printf("%3dKB , %6d \r\n",
working_set / 1024, (int)cycles);
#endif

return cycles;
}

int main(void)
{
// Set the LLC as LLC
axi_llc_reg32_all_cache(&__base_llc);
writew(0x18,CAR_HYPERBUS_CFG_BASE_ADDR+0x18);
volatile uint32_t pulp_ret_val = 0;
// Init the HW
// PULP Island
#ifdef LCL
car_enable_domain(CAR_PULP_RST);
char str[] = "Cluster boot.\r\n";
uint32_t rtc_freq = *reg32(&__base_regs, CHESHIRE_RTC_FREQ_REG_OFFSET);
uint64_t reset_freq = clint_get_core_freq(rtc_freq, 2500);

load_binary();

volatile uint32_t pulp_boot_default = 0x78008080;
yvantor marked this conversation as resolved.
Show resolved Hide resolved

pulp_cluster_set_bootaddress(pulp_boot_default);

uart_init(&__base_uart, reset_freq, 115200);
uart_write_str(&__base_uart, str, sizeof(str));
uart_write_flush(&__base_uart);

pulp_cluster_start();
#endif

#ifdef VERBOSE
printf("Buffer: %x\n", buffer);
#endif

volatile long unsigned cycles[5];
int j=0;
for( int i = 4; i<128; i=i*2){
cycles[j] = sweep(i);
j++;
}

#ifdef LCL
pulp_cluster_wait_eoc();

pulp_ret_val = pulp_cluster_get_return();
#endif


for(int i=0;i<5;i++)
printf("%d\r\n",cycles[i]);

printf("Done\n");

return pulp_ret_val;

}
Loading