Skip to content
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
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
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 @@ -800,3 +814,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;
}
1 change: 1 addition & 0 deletions kernel/util/max/max.h
Original file line number Diff line number Diff line change
Expand Up @@ -240,6 +240,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
4 changes: 0 additions & 4 deletions kernel/util/stmode/test/Makefile
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@

INC_KERNEL=1

OBJS+=test.o
Expand All @@ -8,6 +7,3 @@ EXTRA_CFLAGS += -ffixed-r28
EXTRA_ASFLAGS += -ffixed-r28

include Makefile.inc

# allow local override of H2K_thread_create_no_squash to inherit caller privilege
LDFLAGS += -Wl,--allow-multiple-definition
98 changes: 0 additions & 98 deletions kernel/util/stmode/test/test.c
Original file line number Diff line number Diff line change
Expand Up @@ -12,107 +12,9 @@
#include <h2.h>
#include <context.h>
#include <globals.h>
#include <readylist.h>
#include <thread.h>
#include <check_sanity.h>
#include <asid.h>
#include <vm.h>
#include <id.h>
#include <hwconfig.h>

void H2K_interrupt_restore();

/* Local override of H2K_thread_create_no_squash: identical to the kernel version
except ssr_guest/ssr_um are inherited from me instead of hardcoded to 1.
This is needed because this test runs in monitor space (no BOOT/booter), so pages
are supervisor-execute-only. Created threads must run at the same privilege as
main (ssr_um=0, ssr_guest=1) to be able to execute them without cause-0x11. */
IN_SECTION(".text.misc.create") s32_t H2K_thread_create_no_squash(u32_t pc, u32_t sp, u32_t arg1, u32_t prio, H2K_vmblock_t *vmblock, H2K_thread_context *me)
{
H2K_thread_context *tmp;
u32_t bestprio;
u32_t trapmask;
u32_t ptb;
u32_t extra;
translation_type type;
s32_t asid;
void *guest_evb;
H2K_offset_t identity_offset = {
.pages = 0,
.cccc = 7,
.size = 6,
.xwru = 0xf,
};

bestprio = vmblock->bestprio;
trapmask = vmblock->trapmask;

if (vmblock->num_cpus == 0) {
guest_evb = NULL;
type = H2K_ASID_TRANS_TYPE_OFFSET;
ptb = identity_offset.raw;
extra = 0;
} else {
guest_evb = me->gevb;
ptb = H2K_gp->asid_table[me->ssr_asid].ptb;
type = H2K_gp->asid_table[me->ssr_asid].fields.type;
extra = H2K_gp->asid_table[me->ssr_asid].fields.extra;
}

if (prio > MAX_PRIO) return -1;
if (prio < bestprio) return -1;
if ((sp & 7) != 0) return -1;
if ((pc & 3) != 0) return -1;

BKL_LOCK(&H2K_bkl);
if (vmblock->free_threads == NULL) {
BKL_UNLOCK(&H2K_bkl);
return -1;
}
tmp = vmblock->free_threads;
vmblock->free_threads = vmblock->free_threads->next;
tmp->base_prio = tmp->prio = (u8_t)prio;
tmp->gp = H2K_get_gp();
tmp->usr = me->usr;
tmp->ssr = me->ssr;
#if ARCHV >= 73
tmp->vwctrl = me->vwctrl;
#endif
tmp->elr = pc;
tmp->r29 = sp;
tmp->r0100 = arg1;
tmp->ccr = H2K_get_ccr();
tmp->trapmask = trapmask;
tmp->tlbidxmask = vmblock->tlbidxmask;
tmp->continuation = H2K_interrupt_restore;
tmp->vmstatus = 0x0;
tmp->gevb = guest_evb;

asid = H2K_asid_table_inc(ptb, type, H2K_ASID_TLB_INVALIDATE_FALSE, extra, vmblock);
if (asid == -1) {
vmblock->free_threads = tmp;
BKL_UNLOCK(&H2K_bkl);
return -1;
}

/* inherit caller's privilege instead of hardcoding ssr_um=1/ssr_guest=1 */
tmp->ssr_guest = me->ssr_guest;
tmp->ssr_um = me->ssr_um;
tmp->ssr_asid = (u8_t)asid;
#ifdef HAVE_EXTENSIONS
tmp->ssr_xa = EXT_NO_EXT;
tmp->ssr_xe = 0;
tmp->ssr_xe2 = 0;
tmp->ccr_xe3 = 0;
#endif

vmblock->num_cpus++;
tmp->vmblock = vmblock;

H2K_ready_append(tmp);
return (s32_t)H2K_check_sanity_unlock(H2K_id_from_context(tmp).raw);
}

void FAIL(const char *str)
{
puts("FAIL");
Expand Down
Loading
Loading