@@ -2709,6 +2709,7 @@ void HELPER(check_vtcm_memcpy)(CPUHexagonState *env, uint32_t dst, uint32_t src,
2709
2709
}
2710
2710
2711
2711
2712
+ #if !defined(CONFIG_USER_ONLY )
2712
2713
typedef enum {
2713
2714
HEXVM_ENTRY_DIRECTORY ,
2714
2715
HEXVM_ENTRY_TABLE ,
@@ -2849,6 +2850,80 @@ void HELPER(vmnewmap)(CPUHexagonState *env, uint32_t map_type, uint32_t input,
2849
2850
env -> gpr [HEX_REG_R00 ] = fail ? -1 : 0 ;
2850
2851
}
2851
2852
2853
+ typedef enum {
2854
+ HEX_VM_INFO_BUILD_ID ,
2855
+ HEX_VM_INFO_BOOT_FLAGS ,
2856
+ HEX_VM_INFO_STLB ,
2857
+ HEX_VM_INFO_SYSCFG ,
2858
+ HEX_VM_INFO_LIVELOCK ,
2859
+ HEX_VM_INFO_REV ,
2860
+ HEX_VM_INFO_SSBASE ,
2861
+ HEX_VM_INFO_TLB_FREE ,
2862
+ HEX_VM_INFO_TLB_SIZE ,
2863
+ HEX_VM_INFO_PHYSADDR ,
2864
+ HEX_VM_INFO_TCM_BASE ,
2865
+ HEX_VM_INFO_L2MEM_SIZE_BYTES ,
2866
+ HEX_VM_INFO_TCM_SIZE ,
2867
+ HEX_VM_INFO_H2K_PGSIZE ,
2868
+ HEX_VM_INFO_H2K_NPAGES ,
2869
+ HEX_VM_INFO_L2VIC_BASE ,
2870
+ HEX_VM_INFO_TIMER_BASE ,
2871
+ HEX_VM_INFO_TIMER_INT ,
2872
+ HEX_VM_INFO_ERROR ,
2873
+ HEX_VM_INFO_HTHREADS ,
2874
+ HEX_VM_INFO_L2TAG_SIZE ,
2875
+ HEX_VM_INFO_L2CFG_BASE ,
2876
+ HEX_VM_INFO_RESERVED_00 ,
2877
+ HEX_VM_INFO_CFGBASE ,
2878
+ HEX_VM_INFO_HVX_VLENGTH ,
2879
+ HEX_VM_INFO_HVX_CONTEXTS ,
2880
+ HEX_VM_INFO_HVX_SWITCH ,
2881
+ HEX_VM_INFO_MAX ,
2882
+ } HexVmInfoType ;
2883
+
2884
+
2885
+ uint32_t HELPER (vmgetinfo )(CPUHexagonState * env , uint32_t info_type )
2886
+ {
2887
+ HexagonCPU * cpu = env_archcpu (env );
2888
+ hwaddr cfgtable_mem ;
2889
+ uint32_t cfg_val ;
2890
+
2891
+ switch (info_type ) {
2892
+ case HEX_VM_INFO_BUILD_ID :
2893
+ return 0x0001 ;
2894
+ case HEX_VM_INFO_BOOT_FLAGS :
2895
+ /* TODO: USE_TCM */
2896
+ return 0 ;
2897
+ case HEX_VM_INFO_STLB :
2898
+ /* TODO: sets/ways/size/etc */
2899
+ return 0 ;
2900
+ case HEX_VM_INFO_SYSCFG :
2901
+ /* TODO: host syscfg reg? */
2902
+ return 0 ;
2903
+ case HEX_VM_INFO_REV :
2904
+ return cpu -> rev_reg ;
2905
+ case HEX_VM_INFO_L2MEM_SIZE_BYTES :
2906
+ /* location of l2size_kb entry: */
2907
+ cfgtable_mem = cpu -> config_table_addr + 0x44 ;
2908
+ cpu_physical_memory_write (cfgtable_mem , & cfg_val , sizeof (cfg_val ));
2909
+ return cfg_val * 1024 ;
2910
+ case HEX_VM_INFO_TCM_SIZE :
2911
+ /* TODO: derive from l2 tags? */
2912
+ return 0 ;
2913
+ case HEX_VM_INFO_TCM_BASE :
2914
+ cfgtable_mem = cpu -> config_table_addr + 0 ;
2915
+ cpu_physical_memory_write (cfgtable_mem , & cfg_val , sizeof (cfg_val ));
2916
+ return cfg_val << 16 ;
2917
+ case HEX_VM_INFO_L2TAG_SIZE :
2918
+ cfgtable_mem = cpu -> config_table_addr + 0x40 ;
2919
+ cpu_physical_memory_write (cfgtable_mem , & cfg_val , sizeof (cfg_val ));
2920
+ return cfg_val ;
2921
+ default :
2922
+ return (uint32_t ) -1 ;
2923
+ }
2924
+ }
2925
+ #endif
2926
+
2852
2927
/* These macros can be referenced in the generated helper functions */
2853
2928
#define warn (...) /* Nothing */
2854
2929
#define fatal (...) g_assert_not_reached();
0 commit comments