1.memory map header file
Z:\x155\qnx-base-902\hqx-spf-0-1_902-qnx\qnx_ap\target\hypervisor\host\create_images.sh
if [ ${ext_name} == '_la' ] || [ ${ext_name} == '_lv' ] || [ ${ext_name} == '_qnx' ]; then
cat ./fdt_config/public/amss/memory_host_map_common.h ./fdt_config/public/amss/memory_host_map-${SOC_NAME}_sgvm.h > ./fdt_config/public/amss/memory_host_map-${SOC_NAME}.h
cp ./fdt_config/public/amss/memory_host_map-${SOC_NAME}.h ./${OUT_DIR}/memory_host_map-${SOC_NAME}.h
elif [ ${ext_name} == '_fdn' ] || [ ${ext_name} == '_multi' ]; then
cat ./fdt_config/public/amss/memory_host_map_common.h ./fdt_config/public/amss/memory_host_map-${SOC_NAME}${ext_name}.h > ./fdt_config/public/amss/memory_host_map-${SOC_NAME}.h
cp ./fdt_config/public/amss/memory_host_map-${SOC_NAME}.h ./${OUT_DIR}/memory_host_map-${SOC_NAME}${ext_name}.h
fi
根据脚本使用了memory_host_map-6155_sgvm.h 和 memory_host_map_common.h 组合成一个文件memory_host_map-6155.h
文件路径:
Z:\x155\qnx-base-902\hqx-spf-0-1_902-qnx\qnx_ap\target\hypervisor\host\out_6155\memory_host_map-6155.h
Z:\x155\qnx-base-902\hqx-spf-0-1_902-qnx\qnx_ap\target\hypervisor\host\fdt_config\public\amss\memory_host_map-6155_sgvm.h
Z:\x155\qnx-base-902\hqx-spf-0-1_902-qnx\qnx_ap\target\hypervisor\host\fdt_config\public\amss\memory_host_map_common.h
2.memory assign
对于6155, 在文件Z:\x155\qnx-base-902\hqx-spf-0-1_902-qnx\qnx_ap\target\hypervisor\host\fdt_config\dtb\sdm-host.dts 中标明了分配的内存
#ifdef __HOST__
/ {
model = "Qualcomm Technologies, Inc. MSM 8996";
compatible = "qcom,msm8996";
reserved-memory {
#address-cells = <2>;
#size-cells = <1>;
#define ul
RSV_MEM(__GVM_PMEM_START__,__GVM_PMEM_SIZE__,gvm_pmem);
RSV_MEM(__GVM_SYSRAM2_START__,__GVM_SYSRAM2_SIZE__,gvm_sysram2);
RSV_MEM(__GVM_SYSRAM1_START__,__GVM_SYSRAM1_SIZE__,gvm_sysram1);
RSV_MEM(__GVM_ION_AUDIO_MEM_START__,__GVM_ION_AUDIO_MEM_SIZE__,gvm_ion_audio_mem);
RSV_MEM(__DMA_POOL_START__,__DMA_POOL_SIZE__,dma);
RSV_MEM(__SMMU_S1_PT_START__,__SMMU_S1_PT_SIZE__,smmu_s1_pt);
RSV_MEM(__MM_DMA_POOL_START__, __MM_DMA_POOL_SIZE__, mm_dma);
#undef ul
};
RSV_MEM() 标明了起始地址, 大小,以及内存区域的名字,大小和起始地址再在memory_host_map-6155.h 中有定义
最终会生成文件\host\fdt_config\dtb\host.dts ,然后生成为host.dtb
可以通过pidin syspage=asinfo 在板子上查看所有的内存页的情况
以地址 0x100000000 (4 GB) 为界限, qnx把内存分为 /memory/below4G/ram 和 /memory/ram 2大部分
对于分配内存块, 只允许分配在上面2块内存区域中的一块, 不允许内存地址跨上面2块区域, 也就是说内存分配, 起始地址+size < 4G 或者 起始地址>=4G
qcom_gvms {
qcom_gvm1 {
#if defined(__GUEST_TYPE_LA__) || defined(__GUEST_TYPE_MULTI__) || defined (__GUEST_TYPE_FDN__)
compatible = "qcom,gvm__IVI_VMID__";
vmid = <__IVI_VMID__>;
vm_name = "la";
secpol_type = "gvm_host_la_t";
vm_restart_mode_manual = <0>;
vm_client_timeout = <2>;
vm_config = "/vm/images/linux-la.config";
vm_starts_by_default = <1>;
#endif
memory-regions =
"gvm_sysram1" ,
"gvm_sysram2" ,
"gvm_ion_audio_mem" ,
"gvm_pmem";
};
};
memory-regions 定义了分配给gvm的内存区域,
3.memory passthrough
上面只是指定了内存大小,分配了内存给gvm, 然后需要在文件Z:\x155\qnx-base-902\hqx-spf-0-1_902-qnx\qnx_ap\target\hypervisor\host\build_files\system.build.tmpl 中把这些内存passthrough 给android
#ifdef __GUEST_TYPE_LA__
# DDR for LA
pass loc mem:$asinfo_start{gvm_sysram1\},$asinfo_length{gvm_sysram1\},rwcxm
pass loc mem:$asinfo_start{gvm_sysram2\},$asinfo_length{gvm_sysram2\},rwcxm
#pass loc mem:$asinfo_start{gvm_ion_audio_mem\},$asinfo_length{gvm_ion_audio_mem\},rwcxm
#else
pass loc mem:$asinfo_start{highmem.0\},$asinfo_length{highmem.0\},rwcxm
pass loc mem:$asinfo_start{android_sysram2\},$asinfo_length{android_sysram2\},rwcxm
pass loc mem:$asinfo_start{android_ion_audio_mem\},$asinfo_length{android_ion_audio_mem\},rwcxm
#endif
pass loc mem:$asinfo_start{gvm_pmem\},$asinfo_length{gvm_pmem\},rwcm
4.qcpe rule
qcpe 中指定了可以访问这些内存区域
#if defined(__GUEST_TYPE_LA__) || defined(__GUEST_TYPE_MULTI__) || defined (__GUEST_TYPE_FDN__)
<vm id='2' smmu_trap="true">
<hv_range_ref id="gvm_pmem" perm="RWX" tz_bridge="true" assignable="true" /> <!-- Host DMA -->
<hv_range_ref id="gvm_sysram1" perm="RWX" tz_bridge="true" assignable="true" /> <!-- Android guest memory -->
<hv_range_ref id="gvm_sysram2" perm="RWX" tz_bridge="true" assignable="true" /> <!-- Android guest memory -->
#ifdef __GUEST_TYPE_LA__
<range id="pciemsi" ipa='0x17a00000' pa='0x17a00000' size='0x1000' perm="RWX"/>
#endif
</vm>
#endif
<dma_domains>
<!-- Host domain is based on vmid="HOST" mem config -->
<dma_domain id="VM_HOST">
<!-- Default mapping in SMMU S2 page table for VM_HOST domain -->
<vm_ref id="HOST" />
</dma_domain>
#if defined(__GUEST_TYPE_LA__) || defined(__GUEST_TYPE_MULTI__) || defined (__GUEST_TYPE_FDN__)
<dma_domain id="VM_GVM2">
<!-- Default mapping in SMMU S2 page table for VM_GVM2 domain -->
<vm_ref id="2" />
</dma_domain>
#endif
ref to :80-pm231-1_a_qnx_hypervisor_customization_guide.pdf
0XA0000000
-----------
UEFI 8MB
-----------
0X9F800000
-----------
QSEECOM 20MB
-----------
0X9E400000
-----------
APSS 109MB
-----------
0X97700000
-----------
PIL_REGION 192 MB
-----------
0x8B700000
-----------
APSS/piMEM EXT 28MB
-----------
0X89B00000
-----------
PIMEM Valut 56MB
-----------
0X86300000
-----------
TZ_STAT 1MB
-----------
0X86200000
-----------
SMEM 2MB
-----------
0X86000000
-----------
Flexsku/APSS 8KB
-----------
0X85FFE000
-----------
secdata/APSS 4KB
-----------
0X85FFD000
-----------
APSS 756KB
-----------
0X85f40000
-----------
AOP CMD DB 128KB
-----------
0x85F20000
-----------
AOP Image 128kb
-----------
0x85F00000
-----------
MPSS_EFS/XBL(BOOT)2MB
-----------
0x85D00000
-----------
HYP 6MB
-----------
0x85700000
-----------
APSS 87MB
-----------
0x80000000