diff --git a/booter/booter.c b/booter/booter.c index 6e18facf6..1f46aca10 100644 --- a/booter/booter.c +++ b/booter/booter.c @@ -23,7 +23,6 @@ #include #include -#include #include #define VM_BEST_PRIO 0 @@ -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", ""); } @@ -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 @@ -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); @@ -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} }; @@ -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; @@ -1795,7 +1794,7 @@ 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; @@ -1803,55 +1802,55 @@ unsigned int process_line(int argc, char **argv, unsigned int idx) { } 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; diff --git a/kernel/thread/create/create.ref.c b/kernel/thread/create/create.ref.c index fa716d75b..be7e3afb1 100644 --- a/kernel/thread/create/create.ref.c +++ b/kernel/thread/create/create.ref.c @@ -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; diff --git a/kernel/traps/hwconfig/hwconfig.h b/kernel/traps/hwconfig/hwconfig.h index 10e8562ed..1515ca37f 100644 --- a/kernel/traps/hwconfig/hwconfig.h +++ b/kernel/traps/hwconfig/hwconfig.h @@ -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 diff --git a/kernel/traps/hwconfig/hwconfig.ref.c b/kernel/traps/hwconfig/hwconfig.ref.c index 665dd8d5a..56e85008b 100644 --- a/kernel/traps/hwconfig/hwconfig.ref.c +++ b/kernel/traps/hwconfig/hwconfig.ref.c @@ -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 { @@ -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; +} diff --git a/kernel/util/max/max.h b/kernel/util/max/max.h index 3a27fab04..dcbe1db6c 100644 --- a/kernel/util/max/max.h +++ b/kernel/util/max/max.h @@ -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) diff --git a/kernel/util/stmode/test/Makefile b/kernel/util/stmode/test/Makefile index 24ac02f64..8da090ae4 100644 --- a/kernel/util/stmode/test/Makefile +++ b/kernel/util/stmode/test/Makefile @@ -1,4 +1,3 @@ - INC_KERNEL=1 OBJS+=test.o @@ -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 diff --git a/kernel/util/stmode/test/test.c b/kernel/util/stmode/test/test.c index cd4160e9f..079cc993c 100644 --- a/kernel/util/stmode/test/test.c +++ b/kernel/util/stmode/test/test.c @@ -12,107 +12,9 @@ #include #include #include -#include #include -#include -#include -#include -#include #include -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"); diff --git a/libs/h2/common/h2_common_hwconfig.h b/libs/h2/common/h2_common_hwconfig.h index 3d193e3bd..0bb0d1bf6 100644 --- a/libs/h2/common/h2_common_hwconfig.h +++ b/libs/h2/common/h2_common_hwconfig.h @@ -40,9 +40,23 @@ typedef enum { HWCONFIG_GETVWCTRL, HWCONFIG_SETVWCTRL, HWCONFIG_GET_DPM_VOLTLMTMGMT_REG, - HWCONFIG_SET_DPM_VOLTLMTMGMT_REG, + HWCONFIG_SET_DPM_VOLTLMTMGMT_REG, HWCONFIG_HLXBITS, HWCONFIG_COPROCBITS, + HWCONFIG_GETCCR, + HWCONFIG_SETCCR, + HWCONFIG_GETSYSCFG, + HWCONFIG_SETSYSCFG, + HWCONFIG_GETLIVELOCK, + HWCONFIG_SETLIVELOCK, + HWCONFIG_GETTURKEY, + HWCONFIG_SETTURKEY, + HWCONFIG_GETDUCK, + HWCONFIG_SETDUCK, + HWCONFIG_GETCHICKEN, + HWCONFIG_SETCHICKEN, + HWCONFIG_GETRGDR, + HWCONFIG_SETRGDR, HWCONFIG_MAX } hwconfig_type_t; diff --git a/libs/h2/hwconfig/h2_hwconfig.h b/libs/h2/hwconfig/h2_hwconfig.h index 00e799dd2..b79db4363 100644 --- a/libs/h2/hwconfig/h2_hwconfig.h +++ b/libs/h2/hwconfig/h2_hwconfig.h @@ -318,6 +318,111 @@ Set DPM volt limits management register. */ int h2_hwconfig_dpm_voltlmtmgmt_set_reg(unsigned int offset, unsigned int val); +/** +Get CCR (Compute Code Register). +@returns register value +@dependencies None +*/ +unsigned int h2_hwconfig_ccr_get(void); + +/** +Set CCR (Compute Code Register). +@param[in] val Value to write +@returns 0 on success +@dependencies None +*/ +int h2_hwconfig_ccr_set(unsigned int val); + +/** +Get SYSCFG register. +@returns register value +@dependencies None +*/ +unsigned int h2_hwconfig_syscfg_get(void); + +/** +Set SYSCFG register. +@param[in] val Value to write +@returns 0 on success +@dependencies None +*/ +int h2_hwconfig_syscfg_set(unsigned int val); + +/** +Get livelock detection register (s35). +@returns register value +@dependencies None +*/ +unsigned int h2_hwconfig_livelock_get(void); + +/** +Set livelock detection register (s35). +@param[in] val Value to write +@returns 0 on success +@dependencies None +*/ +int h2_hwconfig_livelock_set(unsigned int val); + +/** +Get turkey register (s61). +@returns register value +@dependencies None +*/ +unsigned int h2_hwconfig_turkey_get(void); + +/** +Set turkey register (s61). +@param[in] val Value to write +@returns 0 on success +@dependencies None +*/ +int h2_hwconfig_turkey_set(unsigned int val); + +/** +Get duck register (s62). +@returns register value +@dependencies None +*/ +unsigned int h2_hwconfig_duck_get(void); + +/** +Set duck register (s62). +@param[in] val Value to write +@returns 0 on success +@dependencies None +*/ +int h2_hwconfig_duck_set(unsigned int val); + +/** +Get chicken register (s63). +@returns register value +@dependencies None +*/ +unsigned int h2_hwconfig_chicken_get(void); + +/** +Set chicken register (s63). +@param[in] val Value to write +@returns 0 on success +@dependencies None +*/ +int h2_hwconfig_chicken_set(unsigned int val); + +/** +Get RGDR register (s60). +@returns register value +@dependencies None +*/ +unsigned int h2_hwconfig_rgdr_get(void); + +/** +Set RGDR register (s60). +@param[in] val Value to write +@returns 0 on success +@dependencies None +*/ +int h2_hwconfig_rgdr_set(unsigned int val); + #endif /** @} */ diff --git a/libs/h2/hwconfig/h2_hwconfig_imp.ref.c b/libs/h2/hwconfig/h2_hwconfig_imp.ref.c index 600bc42e0..b9eca2a38 100644 --- a/libs/h2/hwconfig/h2_hwconfig_imp.ref.c +++ b/libs/h2/hwconfig/h2_hwconfig_imp.ref.c @@ -180,3 +180,73 @@ int h2_hwconfig_dpm_voltlmtmgmt_set_reg(unsigned int offset, unsigned int val) { return h2_hwconfig_trap(HWCONFIG_SET_DPM_VOLTLMTMGMT_REG, NULL, offset, val); } + +unsigned int h2_hwconfig_ccr_get(void) +{ + return h2_hwconfig_trap(HWCONFIG_GETCCR, NULL, 0, 0); +} + +int h2_hwconfig_ccr_set(unsigned int val) +{ + return h2_hwconfig_trap(HWCONFIG_SETCCR, NULL, val, 0); +} + +unsigned int h2_hwconfig_syscfg_get(void) +{ + return h2_hwconfig_trap(HWCONFIG_GETSYSCFG, NULL, 0, 0); +} + +int h2_hwconfig_syscfg_set(unsigned int val) +{ + return h2_hwconfig_trap(HWCONFIG_SETSYSCFG, NULL, val, 0); +} + +unsigned int h2_hwconfig_livelock_get(void) +{ + return h2_hwconfig_trap(HWCONFIG_GETLIVELOCK, NULL, 0, 0); +} + +int h2_hwconfig_livelock_set(unsigned int val) +{ + return h2_hwconfig_trap(HWCONFIG_SETLIVELOCK, NULL, val, 0); +} + +unsigned int h2_hwconfig_turkey_get(void) +{ + return h2_hwconfig_trap(HWCONFIG_GETTURKEY, NULL, 0, 0); +} + +int h2_hwconfig_turkey_set(unsigned int val) +{ + return h2_hwconfig_trap(HWCONFIG_SETTURKEY, NULL, val, 0); +} + +unsigned int h2_hwconfig_duck_get(void) +{ + return h2_hwconfig_trap(HWCONFIG_GETDUCK, NULL, 0, 0); +} + +int h2_hwconfig_duck_set(unsigned int val) +{ + return h2_hwconfig_trap(HWCONFIG_SETDUCK, NULL, val, 0); +} + +unsigned int h2_hwconfig_chicken_get(void) +{ + return h2_hwconfig_trap(HWCONFIG_GETCHICKEN, NULL, 0, 0); +} + +int h2_hwconfig_chicken_set(unsigned int val) +{ + return h2_hwconfig_trap(HWCONFIG_SETCHICKEN, NULL, val, 0); +} + +unsigned int h2_hwconfig_rgdr_get(void) +{ + return h2_hwconfig_trap(HWCONFIG_GETRGDR, NULL, 0, 0); +} + +int h2_hwconfig_rgdr_set(unsigned int val) +{ + return h2_hwconfig_trap(HWCONFIG_SETRGDR, NULL, val, 0); +} diff --git a/libs/h2_compat/error/test/simple/test.c b/libs/h2_compat/error/test/simple/test.c index 3665e6c8f..8f7d7cbb8 100644 --- a/libs/h2_compat/error/test/simple/test.c +++ b/libs/h2_compat/error/test/simple/test.c @@ -4,20 +4,21 @@ */ #include -#include #include /* FIXME: need to check that we actually dumped the right state. Also need to check h2_handle_errors(1), i.e. check that we call exit(). */ int main() { - unsigned int x; + unsigned int ssr; + asm volatile ("%0 = ssr \n" : "=r"(ssr)); + printf("ssr=0x%08x ssr_um=%d\n", ssr, (ssr >> 16) & 1); - // h2_handle_errors(0) should be set by default + // h2_handle_errors(0); - // do something bad - // *p++; - asm volatile ("%0 = ssr \n" : "=r"(x)); + // do something bad - trap1 with invalid number triggers H2K_vmtrap_bad -> H2K_vm_event + printf("about to do bad trap\n"); + asm volatile ("trap1(#7) \n"); /* Shouldn't reach here */ puts("FAIL\n");