@@ -37,12 +37,14 @@ class cpu::Impl
3737 uint64_t checkPeriodicEvents (uint64_t now);
3838 cpu_t *get86cpu () { return m_lc86cpu; }
3939 uint32_t getRamsize () { return m_ramsize; }
40+ uint8_t *getRamPtr () { return m_ram; }
4041
4142private:
4243 void updateIo (bool is_update);
4344 uint64_t checkPeriodicEvents ();
4445 static void cpu_logger (log_level lv, const unsigned count, const char *msg, ...);
4546
47+ uint8_t *m_ram;
4648 uint32_t m_ramsize;
4749 bool m_is_dbg_present;
4850 // connected devices
@@ -142,7 +144,8 @@ void cpu::Impl::init(const boot_params ¶ms, machine *machine)
142144 }
143145
144146 // Init lib86cpu
145- if (!LC86_SUCCESS (cpu_new (m_ramsize, m_lc86cpu))) {
147+ // The ram pointer must have a proper alignment to be imported in Vulkan. Here, we are using the same value used in parallel-rdp
148+ if (!LC86_SUCCESS (cpu_new (m_ramsize, m_lc86cpu, { nullptr , nullptr }, 64 * 1024 ))) {
146149 throw std::runtime_error (lv2str (highest, " Failed to create cpu instance" ));
147150 }
148151
@@ -166,13 +169,13 @@ void cpu::Impl::init(const boot_params ¶ms, machine *machine)
166169 updateIo (false );
167170
168171 // Load kernel exe into ram
169- uint8_t *ram = get_ram_ptr (m_lc86cpu);
172+ m_ram = get_ram_ptr (m_lc86cpu);
170173 uint32_t ImageAddress = peHeader->OptionalHeader .ImageBase - CONTIGUOUS_MEMORY_BASE; // =0x10000
171- std::memcpy (&ram [ImageAddress], dosHeader, peHeader->OptionalHeader .SizeOfHeaders );
174+ std::memcpy (&m_ram [ImageAddress], dosHeader, peHeader->OptionalHeader .SizeOfHeaders );
172175
173176 PIMAGE_SECTION_HEADER sections = reinterpret_cast <PIMAGE_SECTION_HEADER>(reinterpret_cast <uint8_t *>(peHeader) + sizeof (IMAGE_NT_HEADERS32));
174177 for (uint16_t i = 0 ; i < peHeader->FileHeader .NumberOfSections ; ++i) {
175- uint8_t *dest = &ram [ImageAddress + sections[i].VirtualAddress ];
178+ uint8_t *dest = &m_ram [ImageAddress + sections[i].VirtualAddress ];
176179 std::memcpy (dest, reinterpret_cast <uint8_t *>(dosHeader) + sections[i].PointerToRawData , sections[i].SizeOfRawData );
177180 if (sections[i].SizeOfRawData < sections[i].Misc .VirtualSize ) {
178181 std::memset (dest + sections[i].SizeOfRawData , 0 , sections[i].Misc .VirtualSize - sections[i].SizeOfRawData );
@@ -182,17 +185,17 @@ void cpu::Impl::init(const boot_params ¶ms, machine *machine)
182185 // Make sure that we run the latest version of the kernel
183186 // NOTE: this must happen after the kernel has been loaded in the guest virtual memory, because the export table is given with guest relative virtual addresses
184187 bool KernelVersionFound = false ;
185- PIMAGE_EXPORT_DIRECTORY ImageExportDirectory = (PIMAGE_EXPORT_DIRECTORY)(&ram [ImageAddress + peHeader->OptionalHeader .DataDirectory [IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress ]);
188+ PIMAGE_EXPORT_DIRECTORY ImageExportDirectory = (PIMAGE_EXPORT_DIRECTORY)(&m_ram [ImageAddress + peHeader->OptionalHeader .DataDirectory [IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress ]);
186189 uint32_t NumOfNames = ImageExportDirectory->NumberOfNames ;
187- uint32_t *ExportAddressTable = (uint32_t *)(&ram [ImageAddress + ImageExportDirectory->AddressOfFunctions ]);
188- uint16_t *NameOrdinalsPointer = (uint16_t *)(&ram [ImageAddress + ImageExportDirectory->AddressOfNameOrdinals ]);
189- uint32_t *ExportNamePointerTable = (uint32_t *)(&ram [ImageAddress + ImageExportDirectory->AddressOfNames ]);
190+ uint32_t *ExportAddressTable = (uint32_t *)(&m_ram [ImageAddress + ImageExportDirectory->AddressOfFunctions ]);
191+ uint16_t *NameOrdinalsPointer = (uint16_t *)(&m_ram [ImageAddress + ImageExportDirectory->AddressOfNameOrdinals ]);
192+ uint32_t *ExportNamePointerTable = (uint32_t *)(&m_ram [ImageAddress + ImageExportDirectory->AddressOfNames ]);
190193
191194 for (uint32_t i = 0 ; i < NumOfNames; i++) {
192- char *ExportName = (char *)(&ram [ImageAddress + ExportNamePointerTable[i]]);
195+ char *ExportName = (char *)(&m_ram [ImageAddress + ExportNamePointerTable[i]]);
193196 if (std::strcmp (" NboxkrnlVersion" , ExportName) == 0 ) {
194- uint32_t *NboxkrnlVersionAddress = (uint32_t *)(&ram [ImageAddress + ExportAddressTable[NameOrdinalsPointer[i]]]);
195- std::string FoundNboxkrnlVersion ((const char *)&ram [(*NboxkrnlVersionAddress) - CONTIGUOUS_MEMORY_BASE]);
197+ uint32_t *NboxkrnlVersionAddress = (uint32_t *)(&m_ram [ImageAddress + ExportAddressTable[NameOrdinalsPointer[i]]]);
198+ std::string FoundNboxkrnlVersion ((const char *)&m_ram [(*NboxkrnlVersionAddress) - CONTIGUOUS_MEMORY_BASE]);
196199 std::string ExpectedNboxkrnlVersion (_NBOXKRNL_HEAD_REF);
197200 auto pos = ExpectedNboxkrnlVersion.find_first_of (' \t ' );
198201 if (pos != std::string::npos) {
@@ -457,6 +460,11 @@ uint32_t cpu::getRamsize()
457460 return m_impl->getRamsize ();
458461}
459462
463+ uint8_t *cpu::getRamPtr ()
464+ {
465+ return m_impl->getRamPtr ();
466+ }
467+
460468uint64_t cpu::checkPeriodicEvents (uint64_t now)
461469{
462470 return m_impl->checkPeriodicEvents (now);
0 commit comments