Skip to content
Open
Show file tree
Hide file tree
Changes from all 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
51 changes: 25 additions & 26 deletions booter/booter.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@
#include <fcntl.h>
#include <unistd.h>

#include <hw.h>
#include <syscall_defs.h>

#define VM_BEST_PRIO 0
Expand Down Expand Up @@ -797,7 +796,7 @@ void clade_setup(unsigned int idx, long offset) {

h2_hwconfig_clade_set_reg(CLADE_REG_REGION, region_hi);
clade_region = region_hi;
H2K_set_syscfg(h2_info(INFO_SYSCFG) | SYSCFG_CLADEN); // enable clade
h2_hwconfig_syscfg_set(h2_info(INFO_SYSCFG) | SYSCFG_CLADEN); // enable clade
} else if (region_hi != clade_region) { // has to be identical for all concurrent clade guests
FAIL("\tCLADE region address mismatch", "");
}
Expand Down Expand Up @@ -1157,10 +1156,10 @@ void boot_vm(unsigned int idx) {
BOOTER_PRINTF("Boot VM index %d, ID %d\n", idx, vm_params[idx].id);

if (~0L != vm_params[idx].ccr) {
regval = H2K_get_ccr();
regval = h2_hwconfig_ccr_get();
BOOTER_PRINTF("\told value for ccr: 0x%08x\n",regval);
H2K_set_ccr(vm_params[idx].ccr);
regval = H2K_get_ccr();
h2_hwconfig_ccr_set(vm_params[idx].ccr);
regval = h2_hwconfig_ccr_get();
BOOTER_PRINTF("\tnew value for ccr: 0x%08x\n",regval);
}
#if ARCHV >= 73 // FIXME: Make this 79 if there is a separate build
Expand Down Expand Up @@ -1389,7 +1388,7 @@ void run(unsigned int idx) {
}
} while (!done);

H2K_set_syscfg(h2_info(INFO_SYSCFG) & ~SYSCFG_CLADEN); // disable clade
h2_hwconfig_syscfg_set(h2_info(INFO_SYSCFG) & ~SYSCFG_CLADEN); // disable clade
pd_num = 0; // reset
h2_galloc_reset(&tcm_alloc, 0);

Expand Down Expand Up @@ -1692,9 +1691,9 @@ typedef struct {
} syscfg_field;

syscfg_field syscfg[] = {
{"BQ", SYSCFG_BQ_BIT, SYSCFG_BQ_LEN, H2K_set_syscfg},
{"DMT", SYSCFG_DMT_BIT, SYSCFG_DMT_LEN, H2K_set_syscfg},
{"CLADEN", SYSCFG_CLADEN_BIT, SYSCFG_CLADEN_LEN, H2K_set_syscfg},
{"BQ", SYSCFG_BQ_BIT, SYSCFG_BQ_LEN, (void (*)(unsigned int))h2_hwconfig_syscfg_set},
{"DMT", SYSCFG_DMT_BIT, SYSCFG_DMT_LEN, (void (*)(unsigned int))h2_hwconfig_syscfg_set},
{"CLADEN", SYSCFG_CLADEN_BIT, SYSCFG_CLADEN_LEN, (void (*)(unsigned int))h2_hwconfig_syscfg_set},
{"L2WB", SYSCFG_L2WB_BIT, SYSCFG_L2WB_LEN, set_l2wb},
{NULL, 0, 0}
};
Expand Down Expand Up @@ -1784,7 +1783,7 @@ unsigned int process_line(int argc, char **argv, unsigned int idx) {
regval = h2_info(INFO_SYSCFG);
BOOTER_PRINTF("Old value for syscfg: 0x%08x\n",regval);
regval = strtoul(argv[1],NULL,0);
H2K_set_syscfg(regval);
h2_hwconfig_syscfg_set(regval);
regval = h2_info(INFO_SYSCFG);
BOOTER_PRINTF("New value for syscfg: 0x%08x\n",regval);
argc -= 2; argv += 2;
Expand All @@ -1795,63 +1794,63 @@ unsigned int process_line(int argc, char **argv, unsigned int idx) {
regval = h2_info(INFO_LIVELOCK);
BOOTER_PRINTF("Old value for livelock: 0x%08x\n",regval);
regval = strtoul(argv[1],NULL,0);
H2K_set_livelock(regval);
h2_hwconfig_livelock_set(regval);
regval = h2_info(INFO_LIVELOCK);
BOOTER_PRINTF("New value for livelock: 0x%08x\n",regval);
argc -= 2; argv += 2;
continue;

} else if (0 == strcmp(argv[0],"--turkey")) {
if (argc < 2) die_usage();
regval = H2K_get_turkey();
regval = h2_hwconfig_turkey_get();
BOOTER_PRINTF("Old value for turkey: 0x%08x\n",regval);
regval = strtoul(argv[1],NULL,0);
H2K_set_turkey(regval);
regval = H2K_get_turkey();
h2_hwconfig_turkey_set(regval);
regval = h2_hwconfig_turkey_get();
BOOTER_PRINTF("New value for turkey: 0x%08x\n",regval);
argc -= 2; argv += 2;
continue;

} else if (0 == strcmp(argv[0],"--turkey")) {
if (argc < 2) die_usage();
regval = H2K_get_turkey();
regval = h2_hwconfig_turkey_get();
printf("Old value for turkey: 0x%08x\n",regval);
regval = strtoul(argv[1],NULL,0);
H2K_set_turkey(regval);
regval = H2K_get_turkey();
h2_hwconfig_turkey_set(regval);
regval = h2_hwconfig_turkey_get();
printf("New value for turkey: 0x%08x\n",regval);
argc -= 2; argv += 2;
continue;

} else if (0 == strcmp(argv[0],"--duck")) {
if (argc < 2) die_usage();
regval = H2K_get_duck();
regval = h2_hwconfig_duck_get();
BOOTER_PRINTF("Old value for duck: 0x%08x\n",regval);
regval = strtoul(argv[1],NULL,0);
H2K_set_duck(regval);
regval = H2K_get_duck();
h2_hwconfig_duck_set(regval);
regval = h2_hwconfig_duck_get();
BOOTER_PRINTF("New value for duck: 0x%08x\n",regval);
argc -= 2; argv += 2;
continue;

} else if (0 == strcmp(argv[0],"--chicken")) {
if (argc < 2) die_usage();
regval = H2K_get_chicken();
regval = h2_hwconfig_chicken_get();
BOOTER_PRINTF("Old value for chicken: 0x%08x\n",regval);
regval = strtoul(argv[1],NULL,0);
H2K_set_chicken(regval);
regval = H2K_get_chicken();
h2_hwconfig_chicken_set(regval);
regval = h2_hwconfig_chicken_get();
BOOTER_PRINTF("New value for chicken: 0x%08x\n",regval);
argc -= 2; argv += 2;
continue;

} else if (0 == strcmp(argv[0],"--rgdr")) {
if (argc < 2) die_usage();
regval = H2K_get_rgdr();
regval = h2_hwconfig_rgdr_get();
BOOTER_PRINTF("Old value for rgdr: 0x%08x\n",regval);
regval = strtoul(argv[1],NULL,0);
H2K_set_rgdr(regval);
regval = H2K_get_rgdr();
h2_hwconfig_rgdr_set(regval);
regval = h2_hwconfig_rgdr_get();
BOOTER_PRINTF("New value for rgdr: 0x%08x\n",regval);
argc -= 2; argv += 2;
continue;
Expand Down
7 changes: 2 additions & 5 deletions kernel/event/error/test/test.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
#include <c_std.h>
#include <context.h>
#include <max.h>
#include <hw.h>

#include <stdlib.h>
#include <stdio.h>
Expand Down Expand Up @@ -106,11 +107,7 @@ void TH_call_error()
int main()
{
h2_init(NULL);
#if ARCHV <= 3
asm (" %0 = sgp\n" : "=r"(me));
#else
asm (" %0 = sgp0\n" : "=r"(me));
#endif
me = H2K_get_sgp();
/*
* Put ourselves in guest mode, but don't have an EVB registered.
* We expect this to call thread_fatal
Expand Down
17 changes: 5 additions & 12 deletions kernel/event/fastint/test/test.c
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
#include <setjmp.h>
#include <max.h>
#include <globals.h>
#include <hw.h>

H2K_thread_context *TH_me;
u32_t TH_intno;
Expand Down Expand Up @@ -59,12 +60,8 @@ int TH_good_interrupt(u32_t intno)
if ((u32_t)(sp_check - ((u32_t)(&H2K_fastint_contexts[0]))) > ((u32_t)FASTINT_CONTEXT_SIZE)) {
FAIL("Not fastint context sp");
}
#if ARCHV <= 3
asm ( " %0 = sgp " : "=r"(sgp_check));
#else
asm ( " %0 = sgp0 " : "=r"(sgp_check));
#endif
if ((u32_t)(sgp_check) != ((u32_t)(&H2K_fastint_contexts[0]))) {
sgp_check = (u32_t)H2K_get_sgp();
if (sgp_check != ((u32_t)(&H2K_fastint_contexts[0]))) {
FAIL("Not fastint context sgp");
}
return 0;
Expand All @@ -79,12 +76,8 @@ int TH_good_interrupt_ackl2(u32_t intno)
if ((u32_t)(sp_check - ((u32_t)(&H2K_fastint_contexts[0]))) > ((u32_t)FASTINT_CONTEXT_SIZE)) {
FAIL("Not fastint context sp");
}
#if ARCHV <= 3
asm ( " %0 = sgp " : "=r"(sgp_check));
#else
asm ( " %0 = sgp0 " : "=r"(sgp_check));
#endif
if ((u32_t)(sgp_check) != ((u32_t)(&H2K_fastint_contexts[0]))) {
sgp_check = (u32_t)H2K_get_sgp();
if (sgp_check != ((u32_t)(&H2K_fastint_contexts[0]))) {
FAIL("Not fastint context sgp");
}
return 1;
Expand Down
2 changes: 1 addition & 1 deletion kernel/thread/create/create.ref.c
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ IN_SECTION(".text.misc.create") s32_t H2K_thread_create_no_squash(u32_t pc, u32_
}

tmp->ssr_guest = 1; // start in guest mode
tmp->ssr_um = 1;
tmp->ssr_um = me->ssr_um; // inherit caller's user mode bit
tmp->ssr_asid = (u8_t)asid;
#ifdef HAVE_EXTENSIONS
tmp->ssr_xa = EXT_NO_EXT;
Expand Down
5 changes: 2 additions & 3 deletions kernel/thread/state/state.ref.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
#include <state.h>
#include <asm_offsets.h>
#include <vmblock.h>
#include <hw.h>

IN_SECTION(".text.core.state") u64_t H2K_thread_state(H2K_id_t id, u32_t offset, H2K_thread_context *me) {
u64_t val;
Expand All @@ -15,9 +16,7 @@ IN_SECTION(".text.core.state") u64_t H2K_thread_state(H2K_id_t id, u32_t offset,

// Special case, return SGP0 register
if (offset == CONTEXT_PSEUDO_SGP0) {
void *sgp;
asm (" %0 = sgp0" : "=r"(sgp));
return (u64_t)sgp;
return (u64_t)H2K_get_sgp();
}

// Special case, return IMASK register
Expand Down
14 changes: 14 additions & 0 deletions kernel/traps/hwconfig/hwconfig.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,20 @@ u32_t H2K_trap_hwconfig_getvwctrl(u32_t unused, void *unusedp, u32_t unused2, u3
u32_t H2K_trap_hwconfig_setvwctrl(u32_t unused, void *unusedp, u32_t val, u32_t unused3, H2K_thread_context *me) IN_SECTION(".text.config.hwconfig");
u32_t H2K_trap_hwconfig_get_dpm_voltlimitmgmt_reg(u32_t unused, void *unusedp, u32_t offset, u32_t unused3, H2K_thread_context *me)IN_SECTION(".text.config.hwconfig");
u32_t H2K_trap_hwconfig_set_dpm_voltlimitmgmt_reg(u32_t unused, void *unusedp, u32_t offset, u32_t val, H2K_thread_context *me)IN_SECTION(".text.config.hwconfig");
u32_t H2K_trap_hwconfig_getccr(u32_t unused, void *unusedp, u32_t unused2, u32_t unused3, H2K_thread_context *me) IN_SECTION(".text.config.hwconfig");
u32_t H2K_trap_hwconfig_setccr(u32_t unused, void *unusedp, u32_t val, u32_t unused3, H2K_thread_context *me) IN_SECTION(".text.config.hwconfig");
u32_t H2K_trap_hwconfig_getsyscfg(u32_t unused, void *unusedp, u32_t unused2, u32_t unused3, H2K_thread_context *me) IN_SECTION(".text.config.hwconfig");
u32_t H2K_trap_hwconfig_setsyscfg(u32_t unused, void *unusedp, u32_t val, u32_t unused3, H2K_thread_context *me) IN_SECTION(".text.config.hwconfig");
u32_t H2K_trap_hwconfig_getlivelock(u32_t unused, void *unusedp, u32_t unused2, u32_t unused3, H2K_thread_context *me) IN_SECTION(".text.config.hwconfig");
u32_t H2K_trap_hwconfig_setlivelock(u32_t unused, void *unusedp, u32_t val, u32_t unused3, H2K_thread_context *me) IN_SECTION(".text.config.hwconfig");
u32_t H2K_trap_hwconfig_getturkey(u32_t unused, void *unusedp, u32_t unused2, u32_t unused3, H2K_thread_context *me) IN_SECTION(".text.config.hwconfig");
u32_t H2K_trap_hwconfig_setturkey(u32_t unused, void *unusedp, u32_t val, u32_t unused3, H2K_thread_context *me) IN_SECTION(".text.config.hwconfig");
u32_t H2K_trap_hwconfig_getduck(u32_t unused, void *unusedp, u32_t unused2, u32_t unused3, H2K_thread_context *me) IN_SECTION(".text.config.hwconfig");
u32_t H2K_trap_hwconfig_setduck(u32_t unused, void *unusedp, u32_t val, u32_t unused3, H2K_thread_context *me) IN_SECTION(".text.config.hwconfig");
u32_t H2K_trap_hwconfig_getchicken(u32_t unused, void *unusedp, u32_t unused2, u32_t unused3, H2K_thread_context *me) IN_SECTION(".text.config.hwconfig");
u32_t H2K_trap_hwconfig_setchicken(u32_t unused, void *unusedp, u32_t val, u32_t unused3, H2K_thread_context *me) IN_SECTION(".text.config.hwconfig");
u32_t H2K_trap_hwconfig_getrgdr(u32_t unused, void *unusedp, u32_t unused2, u32_t unused3, H2K_thread_context *me) IN_SECTION(".text.config.hwconfig");
u32_t H2K_trap_hwconfig_setrgdr(u32_t unused, void *unusedp, u32_t val, u32_t unused3, H2K_thread_context *me) IN_SECTION(".text.config.hwconfig");

#endif

79 changes: 78 additions & 1 deletion kernel/traps/hwconfig/hwconfig.ref.c
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,21 @@ static const configptr_t H2K_hwconfigtab[HWCONFIG_MAX] IN_SECTION(".data.config.
H2K_trap_hwconfig_get_dpm_voltlimitmgmt_reg,
H2K_trap_hwconfig_set_dpm_voltlimitmgmt_reg,
H2K_trap_hwconfig_hlxbits,
H2K_trap_hwconfig_coproc_bits
H2K_trap_hwconfig_coproc_bits,
H2K_trap_hwconfig_getccr,
H2K_trap_hwconfig_setccr,
H2K_trap_hwconfig_getsyscfg,
H2K_trap_hwconfig_setsyscfg,
H2K_trap_hwconfig_getlivelock,
H2K_trap_hwconfig_setlivelock,
H2K_trap_hwconfig_getturkey,
H2K_trap_hwconfig_setturkey,
H2K_trap_hwconfig_getduck,
H2K_trap_hwconfig_setduck,
H2K_trap_hwconfig_getchicken,
H2K_trap_hwconfig_setchicken,
H2K_trap_hwconfig_getrgdr,
H2K_trap_hwconfig_setrgdr,
};

typedef struct {
Expand Down Expand Up @@ -801,3 +815,66 @@ u32_t H2K_trap_hwconfig_set_dpm_voltlimitmgmt_reg(u32_t unused, void *unusedp, u
return 0;
}
}

u32_t H2K_trap_hwconfig_getccr(u32_t unused, void *unusedp, u32_t unused2, u32_t unused3, H2K_thread_context *me) {
return H2K_get_ccr();
}

u32_t H2K_trap_hwconfig_setccr(u32_t unused, void *unusedp, u32_t val, u32_t unused3, H2K_thread_context *me) {
H2K_set_ccr(val);
return 0;
}

u32_t H2K_trap_hwconfig_getsyscfg(u32_t unused, void *unusedp, u32_t unused2, u32_t unused3, H2K_thread_context *me) {
return H2K_get_syscfg();
}

u32_t H2K_trap_hwconfig_setsyscfg(u32_t unused, void *unusedp, u32_t val, u32_t unused3, H2K_thread_context *me) {
H2K_set_syscfg(val);
return 0;
}

u32_t H2K_trap_hwconfig_getlivelock(u32_t unused, void *unusedp, u32_t unused2, u32_t unused3, H2K_thread_context *me) {
return H2K_get_livelock();
}

u32_t H2K_trap_hwconfig_setlivelock(u32_t unused, void *unusedp, u32_t val, u32_t unused3, H2K_thread_context *me) {
H2K_set_livelock(val);
return 0;
}

u32_t H2K_trap_hwconfig_getturkey(u32_t unused, void *unusedp, u32_t unused2, u32_t unused3, H2K_thread_context *me) {
return H2K_get_turkey();
}

u32_t H2K_trap_hwconfig_setturkey(u32_t unused, void *unusedp, u32_t val, u32_t unused3, H2K_thread_context *me) {
H2K_set_turkey(val);
return 0;
}

u32_t H2K_trap_hwconfig_getduck(u32_t unused, void *unusedp, u32_t unused2, u32_t unused3, H2K_thread_context *me) {
return H2K_get_duck();
}

u32_t H2K_trap_hwconfig_setduck(u32_t unused, void *unusedp, u32_t val, u32_t unused3, H2K_thread_context *me) {
H2K_set_duck(val);
return 0;
}

u32_t H2K_trap_hwconfig_getchicken(u32_t unused, void *unusedp, u32_t unused2, u32_t unused3, H2K_thread_context *me) {
return H2K_get_chicken();
}

u32_t H2K_trap_hwconfig_setchicken(u32_t unused, void *unusedp, u32_t val, u32_t unused3, H2K_thread_context *me) {
H2K_set_chicken(val);
return 0;
}

u32_t H2K_trap_hwconfig_getrgdr(u32_t unused, void *unusedp, u32_t unused2, u32_t unused3, H2K_thread_context *me) {
return H2K_get_rgdr();
}

u32_t H2K_trap_hwconfig_setrgdr(u32_t unused, void *unusedp, u32_t val, u32_t unused3, H2K_thread_context *me) {
H2K_set_rgdr(val);
return 0;
}
11 changes: 11 additions & 0 deletions kernel/util/hw/hw.h
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,17 @@ static inline u32_t H2K_get_ssr()
return ret;
}

static inline H2K_thread_context *H2K_get_sgp()
{
H2K_thread_context *me;
#if ARCHV <= 3
asm volatile (" %0 = sgp\n" : "=r"(me));
#else
asm volatile (" %0 = sgp0\n" : "=r"(me));
#endif
return me;
}

static inline void H2K_set_ssr(u32_t val)
{
asm volatile (" ssr = %0 // set ssr" : : "r"(val));
Expand Down
5 changes: 5 additions & 0 deletions kernel/util/max/max.h
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,10 @@

#define MAX_ASIDS (1<<(ASID_BITS))

#define MODECTL_E_MASK 0x0000ffff
#define MODECTL_W_BITS 16
#define MODECTL_W_MASK 0xffff0000

/* QDSP6SS_PRIV_BASE is the subsystem base value read from cfg_table, but we
map QDSP6SS_PUB_BASE to Q6_SS_BASE_VA so we can get at the public registers.
FIXME? Is the QDSP6SS_PUB_PRIV_OFFSET the same for all subsystems? */
Expand Down Expand Up @@ -233,6 +237,7 @@
#define H2K_PAGESIZE (1 << ((PAGE_BITS) + ((H2K_KERNEL_PGSIZE) * 2)))

#define SSR_IE_BIT 18
#define SSR_UM_BIT 16

#if ARCHV <= 3
#define RESCHED_INT_INTMASK (0x80000000 >> RESCHED_INT)
Expand Down
1 change: 0 additions & 1 deletion kernel/util/spinlock/test/test.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
#include <stdio.h>
#include <stdlib.h>
#include <spinlock.h>
#include <hexagon_standalone.h>

void FAIL(const char *str)
{
Expand Down
6 changes: 4 additions & 2 deletions kernel/util/stmode/test/Makefile
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
STANDALONE=1
INC_KERNEL=1

OBJS+=test.o
EXEC=test.elf

EXTRA_CFLAGS += -ffixed-r28
EXTRA_ASFLAGS += -ffixed-r28

include Makefile.inc
OSLIB=
Loading
Loading