mirror of
https://github.com/ptitSeb/box86.git
synced 2026-11-08 02:08:33 -10:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ec278bd784 | ||
|
|
f1559b066c | ||
|
|
c9d20f60c8 | ||
|
|
512f0a6c92 | ||
|
|
1c280bd8a0 | ||
|
|
20432122de | ||
|
|
e754df0fb1 | ||
|
|
b9d565f444 | ||
|
|
58f1b5d1e3 | ||
|
|
f921c0cdbe | ||
|
|
1e749beb2e | ||
|
|
4caece4c0c | ||
|
|
d6b76922e7 | ||
|
|
69a021454a | ||
|
|
336dc5b676 | ||
|
|
450347f099 | ||
|
|
30c72e23bd | ||
|
|
ce0b4d1884 | ||
|
|
72d934b34c | ||
|
|
4e8d4a2bff | ||
|
|
c993aacd04 | ||
|
|
a7855d3bcb | ||
|
|
7b8a6aa91d | ||
|
|
c65c514882 | ||
|
|
62bc6bb1f3 | ||
|
|
0504c042f4 | ||
|
|
54c806c576 | ||
|
|
55e08ab0be | ||
|
|
e717b959c6 | ||
|
|
f97763cacd | ||
|
|
fc43e4c22b | ||
|
|
b01829b7d6 | ||
|
|
d1fcdee8a8 | ||
|
|
56b23e0668 | ||
|
|
d927dae7e7 | ||
|
|
a49c286214 | ||
|
|
80e092ae44 | ||
|
|
05017f46d2 | ||
|
|
0caa80f9f1 | ||
|
|
66a91b8580 | ||
|
|
bcd36a3152 | ||
|
|
6aba6364c4 | ||
|
|
0cf5179d7f | ||
|
|
3c9823198c | ||
|
|
664956aaa0 | ||
|
|
9811f140ce | ||
|
|
26ddd6e9ef | ||
|
|
c5bccdf300 | ||
|
|
4b20581753 | ||
|
|
a4f38779eb | ||
|
|
27c21f6979 | ||
|
|
e14d8abb61 | ||
|
|
54ed80f68a | ||
|
|
a187c7ccd3 | ||
|
|
f6a5322cf3 | ||
|
|
5da8235b18 | ||
|
|
21e9a43d21 | ||
|
|
dcc0355113 | ||
|
|
666b5a6ce6 | ||
|
|
fcbebfa8c8 | ||
|
|
9354744f68 | ||
|
|
fc0b51f3b8 | ||
|
|
cd88702516 | ||
|
|
223fa8ea17 | ||
|
|
d3d971d449 | ||
|
|
2e589f42fe | ||
|
|
96a34a2a40 | ||
|
|
69f0c979d4 | ||
|
|
ff702c0318 | ||
|
|
968fc3fcfe | ||
|
|
4abaa3d835 | ||
|
|
121c67655b |
No files matched your search
@@ -14,7 +14,7 @@ on:
|
||||
- GENERIC_ARM
|
||||
- A64
|
||||
- GAMESHELL
|
||||
- ODROID
|
||||
- ODROIDXU4
|
||||
- PANDORA
|
||||
- PHYTIUM
|
||||
- PYRA
|
||||
|
||||
@@ -27,7 +27,7 @@ jobs:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
platform: [I386, OTHER_ARM, PANDORA, PYRA, GAMESHELL, RPI4, RPI4ARM64, ODROID, RK3399, RK3288, A64, SD845, SD888, ADLINK, PHYTIUM, ANDROID]
|
||||
platform: [I386, OTHER_ARM, PANDORA, PYRA, GAMESHELL, RPI4, RPI4ARM64, ODROIDXU4, RK3399, RK3288, A64, SD845, SD888, ADLINK, PHYTIUM, ANDROID]
|
||||
type: [Release, Trace]
|
||||
os: [ubuntu-latest]
|
||||
|
||||
|
||||
+48
-27
@@ -11,16 +11,17 @@ option(GOA_CLONE "Set to ON if targeting GO Advance clones, like RG351p/v, Gamef
|
||||
option(RK3288 "Set to ON if targeting an Rockchip RK3288 based device" ${RK3288})
|
||||
option(RK3399 "Set to ON if targeting an Rockchip RK3399 based device" ${RK3399})
|
||||
option(RK3588 "Set to ON if targeting an Rockchip RK3588 / RK3588S based device" ${RK3588})
|
||||
option(ODROIDN2 "Set to ON if targeting an Odroid-N2 device" ${ODROIDN2})
|
||||
option(ODROIDN2 "Set to ON if targeting an ODROID-N2 device" ${ODROIDN2})
|
||||
option(TEGRAX1 "Set to ON if targeting an Tegra X1 (ARM64) based device" ${TEGRAX1})
|
||||
option(TEGRAX1ARM32 "Set to ON if targeting an Tegra X1 (ARM32) based device" ${TEGRAX1ARM32})
|
||||
option(TEGRA_T194 "Set to ON if targeting an Tegra Xavier based device" ${TEGRA_T194})
|
||||
option(TEGRA_T234 "Set to ON if targeting an Tegra Orin based device" ${TEGRA_T234})
|
||||
option(PHYTIUM "Set to ON if targeting an Phytium (D2000 or FT2000/4) based device" ${PHYTIUM})
|
||||
option(GAMESHELL "Set to ON if targeting a GameShell device" ${GAMESHELL})
|
||||
option(ODROID "Set to ON if targeting an ODroid device" ${ODROID})
|
||||
option(ODROIDXU4 "Set to ON if targeting an ODROID-XU4 device" ${ODROIDXU4})
|
||||
option(POWER9 "Set to ON if targeting a POWER9 processor" ${POWER9})
|
||||
option(SD845 "Set to ON if targeting a Snapragon 845 based device" ${SD845})
|
||||
option(SD865 "Set to ON if targeting a Snapragon 865 based device" ${SD865})
|
||||
option(SD888 "Set to ON if targeting a Snapragon 888 based device" ${SD888})
|
||||
option(ADLINK "Set to ON if targeting an ADLink AmpereAltra based device" ${ADLINK})
|
||||
option(A64 "Set to ON if targeting an Allwinner A64 based device" ${A64})
|
||||
@@ -37,7 +38,7 @@ option(NOGIT "Set to ON if not building from a git clone repo (like when buildin
|
||||
option(NO_LIB_INSTALL "Set ON to not install a few x86 libs that are used by many program" ${NO_LIB_INSTALL})
|
||||
option(NO_CONF_INSTALL "Set ON to not install config files" ${NO_CONF_INSTALL})
|
||||
|
||||
if(PANDORA OR PYRA OR RPI2 OR RPI3 OR RPI4 OR GAMESHELL OR ODROID OR GOA_CLONE OR RK3288 OR RK3399 OR ODROIDN2 OR TEGRAX1 OR TEGRAX1ARM32 OR TEGRA_T194 OR TEGRA_T234 OR RPI3ARM64 OR RPI4ARM64 OR PHYTIUM OR SD845 OR SD888 OR ADLINK OR A64 OR LX2160A OR ARM64 OR RK3588)
|
||||
if(PANDORA OR PYRA OR RPI2 OR RPI3 OR RPI4 OR GAMESHELL OR ODROIDXU4 OR GOA_CLONE OR RK3288 OR RK3399 OR ODROIDN2 OR TEGRAX1 OR TEGRAX1ARM32 OR TEGRA_T194 OR TEGRA_T234 OR RPI3ARM64 OR RPI4ARM64 OR PHYTIUM OR SD845 OR SD865 OR SD888 OR ADLINK OR A64 OR LX2160A OR ARM64 OR RK3588)
|
||||
set(LD80BITS OFF CACHE BOOL "")
|
||||
set(NOALIGN OFF CACHE BOOL "")
|
||||
set(ARM_DYNAREC ON CACHE BOOL "")
|
||||
@@ -76,23 +77,29 @@ else()
|
||||
endif()
|
||||
|
||||
cmake_host_system_information(RESULT CMAKE_HOST_SYSTEM_PROCESSOR QUERY OS_PLATFORM)
|
||||
string(COMPARE EQUAL "${CMAKE_HOST_SYSTEM_PROCESSOR}" "i686" _x86)
|
||||
string(COMPARE EQUAL "${CMAKE_HOST_SYSTEM_PROCESSOR}" "x86_64" _x86_64)
|
||||
string(COMPARE EQUAL "${CMAKE_HOST_SYSTEM_PROCESSOR}" "aarch64" _aarch64)
|
||||
string(COMPARE EQUAL "${CMAKE_HOST_SYSTEM_PROCESSOR}" "armhf" _armhf)
|
||||
string(COMPARE EQUAL "${CMAKE_HOST_SYSTEM_PROCESSOR}" "arm" _arm)
|
||||
string(COMPARE EQUAL "${CMAKE_HOST_SYSTEM_PROCESSOR}" "armv8l" _armv8l)
|
||||
|
||||
if(_aarch64 AND (RK3399 OR ODROIDN2 OR TEGRAX1 OR TEGRA_T194 OR TEGRA_T234 OR RPI3ARM64 OR RPI4ARM64 OR PHYTIUM OR SD845 OR SD888 OR ADLINK OR A64 OR LX2160A OR RK3588 OR ARM64))
|
||||
set(CMAKE_C_COMPILER arm-linux-gnueabihf-gcc)
|
||||
#set(CMAKE_ASM_COMPILER arm-linux-gnueabihf-as) #will use gcc in fact
|
||||
set(CMAKE_C_COMPILER_TARGET arm-linux-gnueabihf)
|
||||
if("${CMAKE_HOST_SYSTEM_PROCESSOR}" STREQUAL "aarch64" AND (RK3399 OR ODROIDN2 OR TEGRAX1 OR TEGRA_T194 OR TEGRA_T234 OR RPI3ARM64 OR RPI4ARM64 OR PHYTIUM OR SD845 OR SD888 OR ADLINK OR A64 OR LX2160A OR RK3588 OR ARM64))
|
||||
set(COMPILER_TRIPLE arm-linux-gnueabihf-gcc)
|
||||
find_program(COMPILER_FOUND ${COMPILER_TRIPLE})
|
||||
|
||||
if(COMPILER_FOUND)
|
||||
set(CMAKE_C_COMPILER ${COMPILER_FOUND})
|
||||
else()
|
||||
message(STATUS "Cross compiler ${COMPILER_TRIPLE} not found, using CC or -DCMAKE_C_COMPILER")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
project(box86 C ASM)
|
||||
|
||||
enable_testing()
|
||||
|
||||
string(COMPARE EQUAL "${CMAKE_SYSTEM_PROCESSOR}" "i686" _x86)
|
||||
string(COMPARE EQUAL "${CMAKE_SYSTEM_PROCESSOR}" "x86_64" _x86_64)
|
||||
string(COMPARE EQUAL "${CMAKE_SYSTEM_PROCESSOR}" "aarch64" _aarch64)
|
||||
string(COMPARE EQUAL "${CMAKE_SYSTEM_PROCESSOR}" "armhf" _armhf)
|
||||
string(COMPARE EQUAL "${CMAKE_SYSTEM_PROCESSOR}" "arm" _arm)
|
||||
string(COMPARE EQUAL "${CMAKE_SYSTEM_PROCESSOR}" "armv8l" _armv8l)
|
||||
|
||||
set(default_build_type "RelwithDebInfo")
|
||||
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
|
||||
message(STATUS "Setting build type to '${default_build_type}' as none was specified.")
|
||||
@@ -137,10 +144,10 @@ elseif(RPI4ARM64)
|
||||
add_definitions(-DRPI4ARM64)
|
||||
add_definitions(-marm -march=armv8-a+crc -mtune=cortex-a72 -mfpu=neon-fp-armv8 -mfloat-abi=hard)
|
||||
set(CMAKE_ASM_FLAGS "-marm -march=armv8-a+crc -mtune=cortex-a72 -mfpu=neon-fp-armv8 -mfloat-abi=hard")
|
||||
elseif(ODROID)
|
||||
add_definitions(-DODROID)
|
||||
add_definitions(-mcpu=cortex-a9 -mfpu=neon-vfpv4 -mfloat-abi=hard -marm)
|
||||
set(CMAKE_ASM_FLAGS "-marm -mcpu=cortex-a9 -mfpu=neon-vfpv4 -mfloat-abi=hard")
|
||||
elseif(ODROIDXU4)
|
||||
add_definitions(-DODROIDXU4)
|
||||
add_definitions(-marm -mcpu=cortex-a15.cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=hard)
|
||||
set(CMAKE_ASM_FLAGS "-marm -mcpu=cortex-a15.cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=hard")
|
||||
elseif(RK3288)
|
||||
add_definitions(-DRK3288)
|
||||
add_definitions(-mcpu=cortex-a17 -mfpu=neon -mfloat-abi=hard -marm)
|
||||
@@ -149,6 +156,11 @@ elseif(SD845)
|
||||
add_definitions(-DSD845)
|
||||
add_definitions(-marm -march=armv8.2-a+simd+crypto -mtune=cortex-a75.cortex-a55 -mfpu=neon-fp-armv8 -mfloat-abi=hard)
|
||||
set(CMAKE_ASM_FLAGS "-marm -march=armv8.2-a+simd+crypto -mtune=cortex-a75.cortex-a55 -mfpu=neon-fp-armv8 -mfloat-abi=hard")
|
||||
elseif(SD865)
|
||||
add_definitions(-DSD865)
|
||||
#note that cortex-a77.cortex-a55 is not supported, so fall back to a76 instead
|
||||
add_definitions(-marm -march=armv8.2-a+simd+crypto -mtune=cortex-a76.cortex-a55 -mfpu=neon-fp-armv8 -mfloat-abi=hard)
|
||||
set(CMAKE_ASM_FLAGS "-marm -march=armv8.2-a+simd+crypto -mtune=cortex-a76.cortex-a55 -mfpu=neon-fp-armv8 -mfloat-abi=hard")
|
||||
elseif(SD888)
|
||||
add_definitions(-DSD888)
|
||||
add_definitions(-marm -march=armv8.4-a+simd+crypto -mfpu=neon-fp-armv8 -mfloat-abi=hard)
|
||||
@@ -238,6 +250,12 @@ else()
|
||||
set(BOX86 box86)
|
||||
endif()
|
||||
|
||||
try_compile(HAVE_ST_INO ${CMAKE_BINARY_DIR}/compile_tests ${CMAKE_SOURCE_DIR}/tests/test_st_ino.c)
|
||||
|
||||
if(HAVE_ST_INO)
|
||||
message("stat64 has __st_info field")
|
||||
add_definitions(-DHAVE_ST_INO)
|
||||
endif()
|
||||
|
||||
set(BOX86_ELF_ADDRESS "0x62800000")
|
||||
|
||||
@@ -345,6 +363,8 @@ set(ELFLOADER_SRC
|
||||
"${BOX86_ROOT}/src/libtools/auxval.c"
|
||||
"${BOX86_ROOT}/src/libtools/myalign.c"
|
||||
"${BOX86_ROOT}/src/libtools/myalign64.c"
|
||||
"${BOX86_ROOT}/src/libtools/myalignsys64.c"
|
||||
"${BOX86_ROOT}/src/libtools/stat64_helper.c"
|
||||
"${BOX86_ROOT}/src/libtools/myfts.c"
|
||||
"${BOX86_ROOT}/src/libtools/sdl1rwops.c"
|
||||
"${BOX86_ROOT}/src/libtools/sdl2rwops.c"
|
||||
@@ -788,20 +808,21 @@ if(NOT _x86 AND NOT _x86_64)
|
||||
install(FILES ${CMAKE_SOURCE_DIR}/system/box86.box86rc DESTINATION ${TERMUX_PATH}/usr/etc/)
|
||||
endif()
|
||||
endif()
|
||||
set(INSTALL_PATH "/usr/lib/box86-i386-linux-gnu/")
|
||||
if(NOT NO_LIB_INSTALL)
|
||||
if(NOT TERMUX)
|
||||
install(FILES ${CMAKE_SOURCE_DIR}/x86lib/libstdc++.so.6 DESTINATION /usr/lib/i386-linux-gnu/)
|
||||
install(FILES ${CMAKE_SOURCE_DIR}/x86lib/libstdc++.so.5 DESTINATION /usr/lib/i386-linux-gnu/)
|
||||
install(FILES ${CMAKE_SOURCE_DIR}/x86lib/libgcc_s.so.1 DESTINATION /usr/lib/i386-linux-gnu/)
|
||||
install(FILES ${CMAKE_SOURCE_DIR}/x86lib/libpng12.so.0 DESTINATION /usr/lib/i386-linux-gnu/)
|
||||
install(FILES ${CMAKE_SOURCE_DIR}/x86lib/libunwind.so.8 DESTINATION /usr/lib/i386-linux-gnu/)
|
||||
install(FILES ${CMAKE_SOURCE_DIR}/x86lib/libstdc++.so.6 DESTINATION ${INSTALL_PATH})
|
||||
install(FILES ${CMAKE_SOURCE_DIR}/x86lib/libstdc++.so.5 DESTINATION ${INSTALL_PATH})
|
||||
install(FILES ${CMAKE_SOURCE_DIR}/x86lib/libgcc_s.so.1 DESTINATION ${INSTALL_PATH})
|
||||
install(FILES ${CMAKE_SOURCE_DIR}/x86lib/libpng12.so.0 DESTINATION ${INSTALL_PATH})
|
||||
install(FILES ${CMAKE_SOURCE_DIR}/x86lib/libunwind.so.8 DESTINATION ${INSTALL_PATH})
|
||||
else()
|
||||
|
||||
install(FILES ${CMAKE_SOURCE_DIR}/x86lib/libstdc++.so.6 DESTINATION ${TERMUX_PATH}/usr/lib/i386-linux-gnu/)
|
||||
install(FILES ${CMAKE_SOURCE_DIR}/x86lib/libstdc++.so.5 DESTINATION ${TERMUX_PATH}/usr/lib/i386-linux-gnu/)
|
||||
install(FILES ${CMAKE_SOURCE_DIR}/x86lib/libgcc_s.so.1 DESTINATION ${TERMUX_PATH}/usr/lib/i386-linux-gnu/)
|
||||
install(FILES ${CMAKE_SOURCE_DIR}/x86lib/libpng12.so.0 DESTINATION ${TERMUX_PATH}/usr/lib/i386-linux-gnu/)
|
||||
install(FILES ${CMAKE_SOURCE_DIR}/x86lib/libunwind.so.8 DESTINATION ${TERMUX_PATH}/usr/lib/i386-linux-gnu/)
|
||||
install(FILES ${CMAKE_SOURCE_DIR}/x86lib/libstdc++.so.6 DESTINATION ${TERMUX_PATH}${INSTALL_PATH})
|
||||
install(FILES ${CMAKE_SOURCE_DIR}/x86lib/libstdc++.so.5 DESTINATION ${TERMUX_PATH}${INSTALL_PATH})
|
||||
install(FILES ${CMAKE_SOURCE_DIR}/x86lib/libgcc_s.so.1 DESTINATION ${TERMUX_PATH}${INSTALL_PATH})
|
||||
install(FILES ${CMAKE_SOURCE_DIR}/x86lib/libpng12.so.0 DESTINATION ${TERMUX_PATH}${INSTALL_PATH})
|
||||
install(FILES ${CMAKE_SOURCE_DIR}/x86lib/libunwind.so.8 DESTINATION ${TERMUX_PATH}${INSTALL_PATH})
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
@@ -1,3 +1,17 @@
|
||||
v0.3.8
|
||||
======
|
||||
* Some optimisation of x86 P flags handling
|
||||
* Some x87 fixes and improvments
|
||||
* Added some of the tim64 wrapped functions to libc and friends
|
||||
* Changed the installation folder of x86 libs to avoid conflict with linux distro
|
||||
* Some fixes to internal memory tracking
|
||||
* Some more Vulkan extensions wrapped
|
||||
* Better handling of BOX86_MAXCPU
|
||||
* Some changes and improvments on Signal handling
|
||||
* More wrapped functions, and fix to some existing ones
|
||||
* A few more syscall, and fix to some existing ones
|
||||
* New build profile for SD865
|
||||
|
||||
v0.3.6
|
||||
======
|
||||
* Wrapping: More libs and function wrapping (gtk3, vulkan...)
|
||||
|
||||
+57
-15
@@ -1,18 +1,21 @@
|
||||
Compiling/Installing
|
||||
----
|
||||
|
||||
#### Debian-based Linux
|
||||
You can use [@Itai-Nelken](https://github.com/Itai-Nelken)'s apt repository to install precompiled box86 debs, updated weekly.
|
||||
If you don't want to compile box86 yourself and prefer to use third-party pre-build version, go to the [end of the document](#pre-build-packages) for alternatives.
|
||||
|
||||
```
|
||||
sudo wget https://itai-nelken.github.io/weekly-box86-debs/debian/box86.list -O /etc/apt/sources.list.d/box86.list
|
||||
wget -qO- https://itai-nelken.github.io/weekly-box86-debs/debian/KEY.gpg | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/box86-debs-archive-keyring.gpg
|
||||
sudo apt update && sudo apt install box86 -y
|
||||
You can also generate your own debian package using the [instructions below](https://github.com/ptitSeb/box86/blob/master/docs/COMPILE.md#debian-packaging).
|
||||
|
||||
Important note, if you are using a 64bits OS, you need to have multi-arch enabled, with armhf support, for box86 to works. On Debian/Ubuntu/Armbian OS, you need to do:
|
||||
|
||||
```bash
|
||||
sudo dpkg --add-architecture armhf && sudo apt-get update
|
||||
sudo apt-get install libc6:armhf -y
|
||||
```
|
||||
|
||||
**Note:** On a 64bit OS, install the `box86:armhf` package.
|
||||
And of course you will need to install much more library to be able to run software and games (like X11, mesa, SDL, pulseaudio...)
|
||||
|
||||
Alternatively, you can generate your own package using the [instructions below](https://github.com/ptitSeb/box86/blob/master/docs/COMPILE.md#debian-packaging).
|
||||
## Per-platform compiling instructions
|
||||
----
|
||||
|
||||
#### for Pandora
|
||||
|
||||
@@ -60,9 +63,9 @@ sudo make install
|
||||
sudo systemctl restart systemd-binfmt
|
||||
```
|
||||
|
||||
#### for ODROID
|
||||
#### for ODROID-XU3/XU4/MC1/HC1/HC2
|
||||
|
||||
`mkdir build; cd build; cmake .. -DODROID=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo; make -j3`
|
||||
`mkdir build; cd build; cmake .. -DODROIDXU4=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo; make -j3`
|
||||
|
||||
#### for RK3399
|
||||
|
||||
@@ -80,11 +83,11 @@ As most RK3588 devices run an AARCH64 OS, you'll need an `armhf` multiarch envir
|
||||
|
||||
Also, on armbian, you may need to install `libc6-dev-armhf-cross` or you may have an issue with `crt1.o` and a few other files not included with box86.
|
||||
|
||||
#### for ODROID N2/N2+
|
||||
#### for ODROID-N2/N2+
|
||||
|
||||
`mkdir build; cd build; cmake .. -DODROIDN2=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo; make -j3`
|
||||
|
||||
As most ODROID N2/N2+ devices run an AARCH64 OS, you'll need an `armhf` multiarch environment, and an armhf gcc: On debian, install it with `sudo apt install gcc-arm-linux-gnueabihf`.
|
||||
As most ODROID-N2/N2+ devices run an AARCH64 OS, you'll need an `armhf` multiarch environment, and an armhf gcc: On debian, install it with `sudo apt install gcc-arm-linux-gnueabihf`.
|
||||
|
||||
Also, on armbian, you may need to install `libc6-dev-armhf-cross` or you may have an issue with `crt1.o` and a few other files not included with box86.
|
||||
|
||||
@@ -172,7 +175,7 @@ Dynarec is only available on the ARM architecture (for the meantime anyways). Ac
|
||||
|
||||
You will most likely need `-marm` in compilation flags (Many compilers default to the Thumb instruction set and Dynarec does not support this).
|
||||
|
||||
###### *Note: If you get error building that "target CPU does not support ARM mode", then try to pick a hardware profile (like ODROID for armv7 or PI4 for armv8).*
|
||||
###### *Note: If you get error building that "target CPU does not support ARM mode", then try to pick a hardware profile (like ODROIDXU4 for armv7 or PI4 for armv8).*
|
||||
|
||||
##### 64bit OS with Dynarec
|
||||
|
||||
@@ -185,7 +188,7 @@ If you are not building from a git clone (for example, downloading a release sou
|
||||
|
||||
----
|
||||
|
||||
Testing
|
||||
## Testing
|
||||
----
|
||||
A few tests are included with box86.
|
||||
|
||||
@@ -201,7 +204,46 @@ NVIDIA doesn't provide armhf libraries for their GPU drivers at this time. There
|
||||
|
||||
----
|
||||
|
||||
Debian Packaging
|
||||
## Debian Packaging
|
||||
----
|
||||
Box86 can also be packaged into a .deb file ***using the source code zip from the releases page*** with `DEB_BUILD_OPTIONS=nostrip dpkg-buildpackage -us -uc -nc`. Configure any additional cmake options you might want in `debian/rules`.
|
||||
|
||||
## Pre-build packages
|
||||
----
|
||||
#### Debian-based Linux
|
||||
You can use the [Pi-Apps-Coders apt repository](https://github.com/Pi-Apps-Coders/box86-debs) to install precompiled box86 debs, updated every 24 hours.
|
||||
|
||||
```
|
||||
# check if .list file already exists
|
||||
if [ -f /etc/apt/sources.list.d/box86.list ]; then
|
||||
sudo rm -f /etc/apt/sources.list.d/box86.list || exit 1
|
||||
fi
|
||||
# check if .sources file already exists
|
||||
if [ -f /etc/apt/sources.list.d/box86.sources ]; then
|
||||
sudo rm -f /etc/apt/sources.list.d/box86.sources || exit 1
|
||||
fi
|
||||
# download gpg key from specified url
|
||||
if [ -f /usr/share/keyrings/box86-archive-keyring.gpg ]; then
|
||||
sudo rm -f /usr/share/keyrings/box86-archive-keyring.gpg
|
||||
fi
|
||||
sudo mkdir -p /usr/share/keyrings
|
||||
wget -qO- "https://pi-apps-coders.github.io/box86-debs/KEY.gpg" | sudo gpg --dearmor -o /usr/share/keyrings/box86-archive-keyring.gpg
|
||||
# create .sources file
|
||||
echo "Types: deb
|
||||
URIs: https://Pi-Apps-Coders.github.io/box86-debs/debian
|
||||
Suites: ./
|
||||
Signed-By: /usr/share/keyrings/box86-archive-keyring.gpg" | sudo tee /etc/apt/sources.list.d/box86.sources >/dev/null
|
||||
```
|
||||
|
||||
On a 32bit OS, run the following additional commands
|
||||
```
|
||||
sudo apt update
|
||||
sudo apt install box86-generic-arm -y
|
||||
```
|
||||
|
||||
On a 64bit OS, run the following additional commands
|
||||
```
|
||||
sudo dpkg --add-architecture armhf
|
||||
sudo apt update
|
||||
sudo apt install box86-generic-arm:armhf -y
|
||||
```
|
||||
+2
-7
@@ -2,7 +2,7 @@
|
||||
|
||||
Емулятор простіра користувача x86_64 із родзинкою
|
||||
|
||||
[Дивитись журнал змін](https://github.com/ptitSeb/box86/blob/master/docs/CHANGELOG.md) | [中文](https://github.com/ptitSeb/box86/blob/master/docs/README_CN.md) | [Українська](https://github.com/ptitSeb/box86/blob/master/docs/README_UK.md) | [Повідомити про помилку](https://github.com/ptitSeb/box86/issues/new)
|
||||
[Дивитись журнал змін](https://github.com/ptitSeb/box86/blob/master/docs/CHANGELOG.md) | [中文](https://github.com/ptitSeb/box86/blob/master/docs/README_CN.md) | [English](https://github.com/ptitSeb/box86/blob/master/docs/README.md) | [Повідомити про помилку](https://github.com/ptitSeb/box86/issues/new)
|
||||
|
||||
     
|
||||
|
||||
@@ -104,12 +104,7 @@ Linux версія Steam тепер може працювати з Box86, але
|
||||
- Якщо у вас виникли проблеми зі встановленням Steam, ви можете знайти `install_steam.sh` у кореневій папці сховища box86. Цей простий скрипт завантажить і встановить Steam у вашу домашню папку, а потім створить ярлик steam у `/usr/local/bin` (для цього він запитає дозвіл sudo). Просто використовуйте `steam` для запуску після встановлення. Зауважте, що інсталяція, яка знаходиться в папці Home, працюватиме лише для одного користувача. Не використовуйте цей скрипт, якщо вам потрібна багатокористувацька інсталяція.
|
||||
- Щоб уникнути повідомлення «libc.so.6 відсутній», ви можете використовувати `STEAMOS=1` і `STEAM_RUNTIME=1` як змінні середовища (воно автоматично з’являється, якщо ви використовували сценарій `install_steam.sh`)
|
||||
|
||||
Щоб вимкнути `steamwebhelper`, коли Box64 встановлений і працює, створіть (або відредагуйте) `~/.box64rc` і додайте у ньому:
|
||||
```
|
||||
[steamwebhelper]
|
||||
BOX64_EXIT=1
|
||||
```
|
||||
І тоді `steamwebhelper` буде вимкнено. Прокоментуйте `#` ці 2 рядки, щоб увімкнути його знову.
|
||||
Якщо у вас виникла проблема із запуском Steam (не запускається `steamwebhelper`), вам потрібно запустити Steam за допомогою `-cef-disable-gpu` або `-cef-disable-gpu-compositor`.
|
||||
|
||||
----
|
||||
|
||||
|
||||
+11
-1
@@ -30,7 +30,7 @@ Disables Box86 printing its version and build
|
||||
|
||||
#### BOX86_LD_LIBRARY_PATH *
|
||||
Path to look for x86 libraries. Default is current folder and `lib` in current folder.
|
||||
Also, `/usr/lib/i386-linux-gnu` and `/lib/i386-linux-gnu` are added if they exist.
|
||||
Also, `/usr/lib/i386-linux-gnu`, `/lib/i386-linux-gnu`, and `/usr/lib/box86-i386-linux-gnu` are added if they exist.
|
||||
|
||||
#### BOX86_PATH *
|
||||
Path to look for x86 executable. Default is current folder and `bin` in current folder.
|
||||
@@ -206,6 +206,11 @@ Handling of x87 80bits long double
|
||||
* 0 : Try to handle 80bits long double as precise as possible (Default)
|
||||
* 1 : Handle them as double
|
||||
|
||||
#### BOX86_MAXCPU
|
||||
Maximum CPU Core exposed
|
||||
* 0 : Don't cap the number of cpu core exposed (Default)
|
||||
* XXX : Cap the maximum CPU Core exposed to XXX (usefull with wine64 or GridAutosport for example)
|
||||
|
||||
#### BOX86_LIBCEF *
|
||||
Detect libcef and apply malloc_hack settings
|
||||
* 0 : Don't detect libcef
|
||||
@@ -270,6 +275,11 @@ Disables the load of vulkan libraries.
|
||||
* 0 : Load vulkan libraries if found.
|
||||
* 1 : Disables the load of vulkan libraries, both the native and the i386 version (can be useful on Pi4, where the vulkan driver is not quite there yet.)
|
||||
|
||||
#### BOX86_NOCRASHHANDLER *
|
||||
Diables crashhandler.so
|
||||
* 0 : Regular process for crashhandler.so (Default)
|
||||
* 1 : Do not load crashhandler.so, even if present
|
||||
|
||||
#### BOX86_FUTEX_WAITV *
|
||||
Use of the new fuext_waitc syscall
|
||||
* 0 : Do not try to use it, return unsupported (Default for BAD_SIGNAL build)
|
||||
|
||||
+3
-3
@@ -18,11 +18,11 @@ mv ./usr/* ../
|
||||
cd ../ && rm -rf ./tmp/
|
||||
|
||||
# create run script
|
||||
echo "#!/bin/bash
|
||||
echo '#!/bin/bash
|
||||
export STEAMOS=1
|
||||
export STEAM_RUNTIME=1
|
||||
export DBUS_FATAL_WARNINGS=0
|
||||
~/steam/bin/steam $@" > steam
|
||||
~/steam/bin/steam $@' > steam
|
||||
|
||||
# make script executable and move
|
||||
chmod +x steam
|
||||
@@ -35,7 +35,7 @@ if [ ${MACHINE_TYPE} == 'aarch64' ] && [ -f '/etc/debian_version' ]; then
|
||||
sudo dpkg --add-architecture armhf # enable installation of armhf libraries
|
||||
sudo apt update # update package lists with the newly added arch
|
||||
# install the libraries that Steam requires
|
||||
sudo apt install libc6:armhf libsdl2-2.0-0:armhf libsdl2-image-2.0-0:armhf libsdl2-mixer-2.0-0:armhf libsdl2-ttf-2.0-0:armhf libopenal1:armhf libpng16-16:armhf libfontconfig1:armhf libxcomposite1:armhf libbz2-1.0:armhf libxtst6:armhf libsm6:armhf libice6:armhf libgl1:armhf libxinerama1:armhf libxdamage1:armhf
|
||||
sudo apt install libc6:armhf libsdl2-2.0-0:armhf libsdl2-image-2.0-0:armhf libsdl2-mixer-2.0-0:armhf libsdl2-ttf-2.0-0:armhf libopenal1:armhf libpng16-16:armhf libfontconfig1:armhf libxcomposite1:armhf libbz2-1.0:armhf libxtst6:armhf libsm6:armhf libice6:armhf libgl1:armhf libxinerama1:armhf libxdamage1:armhf libibus-1.0-5
|
||||
# this one is not there all the time, so just try it...
|
||||
sudo apt install libncurses5:armhf
|
||||
|
||||
|
||||
@@ -13,6 +13,7 @@ provides=("${pkgname%-git}" "${pkgname%-rk3xxx-git}-git" "${pkgname%-rk3xxx-git}
|
||||
conflicts=("${pkgname%-git}" "${pkgname%-rk3xxx-git}-git" "${pkgname%-rk3xxx-git}")
|
||||
source=('git+https://github.com/ptitSeb/box86')
|
||||
md5sums=('SKIP')
|
||||
_rkmodel=`tr -d '\0' < /proc/device-tree/compatible`
|
||||
|
||||
pkgver() {
|
||||
cd "$srcdir/${pkgname%-rk3xxx-git}"
|
||||
@@ -22,7 +23,7 @@ pkgver() {
|
||||
prepare() {
|
||||
cd "${srcdir}/${pkgname%-rk3xxx-git}"
|
||||
# Check for RockChip version number
|
||||
if [[ ${_rkmodel} =~ "rk3288"]]; then
|
||||
if [[ ${_rkmodel} =~ "rk3288" ]]; then
|
||||
_rksuffix=3288
|
||||
elif [[ ${_rkmodel} =~ "rk3399" ]]; then
|
||||
_rksuffix=3399
|
||||
|
||||
+1
-1
@@ -72,7 +72,7 @@ def main(root, ver, __debug_forceAllDebugging=False):
|
||||
|
||||
# Get all actual instructions
|
||||
# Ignore white lines and lines beginning with either !, ; or #
|
||||
insts = list(filter(lambda l: not re.match("^\s*$", l) and not re.match("^([!;#])", l), insts.split('\n')))
|
||||
insts = list(filter(lambda l: not re.match("^\\s*$", l) and not re.match("^([!;#])", l), insts.split('\n')))
|
||||
|
||||
try:
|
||||
# Do not open with `with` to be able to open it in writing mode
|
||||
|
||||
+1
-1
@@ -3,6 +3,6 @@
|
||||
|
||||
#define BOX86_MAJOR 0
|
||||
#define BOX86_MINOR 3
|
||||
#define BOX86_REVISION 6
|
||||
#define BOX86_REVISION 8
|
||||
|
||||
#endif //__BOX86_VERSION_H_
|
||||
@@ -914,6 +914,7 @@ void updateProtection(uintptr_t addr, uintptr_t size, uint32_t prot)
|
||||
uintptr_t bend;
|
||||
uint32_t oprot;
|
||||
rb_get_end(memprot, cur, &oprot, &bend);
|
||||
if(bend>end) bend = end;
|
||||
uint32_t dyn=(oprot&PROT_DYN);
|
||||
if(!(dyn&PROT_NEVERPROT)) {
|
||||
if(dyn && (prot&PROT_WRITE)) { // need to remove the write protection from this block
|
||||
@@ -956,6 +957,7 @@ void setProtection_mmap(uintptr_t addr, size_t size, uint32_t prot)
|
||||
else {
|
||||
mutex_lock(&mutex_prot);
|
||||
rb_set(mapallmem, addr, addr+size, 1);
|
||||
rb_unset(memprot, addr, addr+size);
|
||||
mutex_unlock(&mutex_prot);
|
||||
}
|
||||
}
|
||||
@@ -969,6 +971,7 @@ void setProtection_elf(uintptr_t addr, size_t size, uint32_t prot)
|
||||
else {
|
||||
mutex_lock(&mutex_prot);
|
||||
rb_set(mapallmem, addr, addr+size, 1);
|
||||
rb_unset(memprot, addr, addr+size);
|
||||
mutex_unlock(&mutex_prot);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -471,8 +471,10 @@ ARM_ cond 0 0 0 1 1 1 1 0 Rn Rd (1) (1) (1) (1) 1 0 0 1 Rt STREXH<c> <Rd>, <Rt>,
|
||||
ARM_ cond 0 0 0 1 1 1 1 1 Rn Rt (1) (1) (1) (1) 1 0 0 1 (1) (1) (1) (1) LDREXH<c> <Rt>, [<Rn>]
|
||||
ARM_ cond 0 0 1 0 0 0 0 S Rn Rd imm12 AND{S}<c> <Rd>, <Rn>, #<const>
|
||||
ARM_ cond 0 0 1 0 0 0 1 S Rn Rd imm12 EOR{S}<c> <Rd>, <Rn>, #<const>
|
||||
ARM_ cond 0 0 1 0 0 1 0 0 1 1 1 1 Rd imm12 ADR<c> <Rd>, #-<const>
|
||||
ARM_ cond 0 0 1 0 0 1 0 S Rn Rd imm12 SUB{S}<c> <Rd>, <Rn>, #<const>
|
||||
ARM_ cond 0 0 1 0 0 1 1 S Rn Rd imm12 RSB{S}<c> <Rd>, <Rn>, #<const>
|
||||
ARM_ cond 0 0 1 0 1 0 0 0 1 1 1 1 Rd imm12 ADR<c> <Rd>, #<const>
|
||||
ARM_ cond 0 0 1 0 1 0 0 S Rn Rd imm12 ADD{S}<c> <Rd>, <Rn>, #<const>
|
||||
ARM_ cond 0 0 1 0 1 0 1 S Rn Rd imm12 ADC{S}<c> <Rd>, <Rn>, #<const>
|
||||
ARM_ cond 0 0 1 0 1 1 0 S Rn Rd imm12 SBC{S}<c> <Rd>, <Rn>, #<const>
|
||||
|
||||
+12
-12
@@ -3944,18 +3944,6 @@ const char* arm_print(uint32_t opcode) {
|
||||
uint8_t shift = ((opcode >> 4) & 0xFF);
|
||||
|
||||
sprintf(ret, "TEQ%s %s, %s%s", cond, regname[rn], regname[rm], print_shift(shift, 1));
|
||||
} else if ((opcode&0b00001111111111110000000000000000) == 0b00000010100011110000000000000000) {
|
||||
const char* cond = conds[(opcode >> 28) & 0xF];
|
||||
int rd = (opcode >> 16) & 0xF;
|
||||
uint32_t imm12 = opcode&0b111111111111;
|
||||
|
||||
sprintf(ret, "ADR %s, #0x%x", regname[rd], imm12);
|
||||
} else if ((opcode&0b00001111111111110000000000000000) == 0b00000010010011110000000000000000) {
|
||||
const char* cond = conds[(opcode >> 28) & 0xF];
|
||||
int rd = (opcode >> 16) & 0xF;
|
||||
uint32_t imm12 = opcode&0b111111111111;
|
||||
|
||||
sprintf(ret, "ADR %s, #-0x%x", regname[rd], imm12);
|
||||
} else if ((opcode & 0x0FF000F0) == 0x01400090) {
|
||||
const char* cond = conds[(opcode >> 28) & 0xF];
|
||||
int rt = (opcode >> 12) & 0xF;
|
||||
@@ -4209,6 +4197,12 @@ const char* arm_print(uint32_t opcode) {
|
||||
uint16_t imm12 = ((opcode >> 0) & 0xFFF);
|
||||
|
||||
sprintf(ret, "EOR%s%s %s, %s, #0x%x", (s ? "S" : ""), cond, regname[rd], regname[rn], print_modified_imm_ARM(imm12));
|
||||
} else if ((opcode & 0x0FFF0000) == 0x024F0000) {
|
||||
const char* cond = conds[(opcode >> 28) & 0xF];
|
||||
int rd = (opcode >> 12) & 0xF;
|
||||
uint16_t imm12 = ((opcode >> 0) & 0xFFF);
|
||||
|
||||
sprintf(ret, "ADR%s %s, #-0x%x", cond, regname[rd], print_modified_imm_ARM(imm12));
|
||||
} else if ((opcode & 0x0FE00000) == 0x02400000) {
|
||||
int s = (opcode >> 20) & 1;
|
||||
const char* cond = conds[(opcode >> 28) & 0xF];
|
||||
@@ -4225,6 +4219,12 @@ const char* arm_print(uint32_t opcode) {
|
||||
uint16_t imm12 = ((opcode >> 0) & 0xFFF);
|
||||
|
||||
sprintf(ret, "RSB%s%s %s, %s, #0x%x", (s ? "S" : ""), cond, regname[rd], regname[rn], print_modified_imm_ARM(imm12));
|
||||
} else if ((opcode & 0x0FFF0000) == 0x028F0000) {
|
||||
const char* cond = conds[(opcode >> 28) & 0xF];
|
||||
int rd = (opcode >> 12) & 0xF;
|
||||
uint16_t imm12 = ((opcode >> 0) & 0xFFF);
|
||||
|
||||
sprintf(ret, "ADR%s %s, #0x%x", cond, regname[rd], print_modified_imm_ARM(imm12));
|
||||
} else if ((opcode & 0x0FE00000) == 0x02800000) {
|
||||
int s = (opcode >> 20) & 1;
|
||||
const char* cond = conds[(opcode >> 28) & 0xF];
|
||||
|
||||
@@ -1667,6 +1667,7 @@ uintptr_t dynarec00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst,
|
||||
|
||||
case 0xCC:
|
||||
SETFLAGS(X_ALL, SF_SET_NODF); // Hack, set all flags (to an unknown state...)
|
||||
NOTEST(x1, x14);
|
||||
if(PK(0)=='S' && PK(1)=='C') {
|
||||
addr+=2;
|
||||
BARRIER(BARRIER_FLOAT);
|
||||
@@ -1674,7 +1675,6 @@ uintptr_t dynarec00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst,
|
||||
if((PK(0)==0) && (PK(1)==0) && (PK(2)==0) && (PK(3)==0))
|
||||
{
|
||||
addr+=4;
|
||||
SKIPTEST(x14);
|
||||
MESSAGE(LOG_DEBUG, "Exit x86 Emu\n");
|
||||
MOV32(x14, ip+1+2);
|
||||
SMEND();
|
||||
@@ -1685,7 +1685,6 @@ uintptr_t dynarec00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst,
|
||||
*need_epilog = 1;
|
||||
} else {
|
||||
MESSAGE(LOG_DUMP, "Native Call to %s\n", GetNativeName(GetNativeFnc(ip)));
|
||||
SKIPTEST(x14);
|
||||
SMEND();
|
||||
x87_forget(dyn, ninst, x3, x14, 0);
|
||||
if((box86_log<2) && !cycle_log) { // call the wrapper directly
|
||||
@@ -1735,7 +1734,7 @@ uintptr_t dynarec00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst,
|
||||
break;
|
||||
case 0xCD:
|
||||
SETFLAGS(X_ALL, SF_SET_NODF); // Hack, set all flags (to an unknown state...)
|
||||
SKIPTEST(x14);
|
||||
SKIPTEST(x1, x14);
|
||||
SMEND();
|
||||
u8 = F8;
|
||||
if(u8==0x80) {
|
||||
@@ -2258,26 +2257,26 @@ uintptr_t dynarec00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst,
|
||||
case 1:
|
||||
//SETFLAGS(X_ALL, SF_SET_NODF); // Hack to set flags to "dont'care" state
|
||||
MESSAGE(LOG_DUMP, "Hack for Call 0\n");
|
||||
SKIPTEST(x14);
|
||||
SKIPTEST(x1, x14);
|
||||
MOV32(xEIP, addr);
|
||||
PUSH1(xEIP);
|
||||
break;
|
||||
case 2:
|
||||
//SETFLAGS(X_ALL, SF_SET_NODF); // Hack to set flags to "dont'care" state
|
||||
MESSAGE(LOG_DUMP, "Hack for Call x86.get_pc_thunk.reg\n");
|
||||
SKIPTEST(x14);
|
||||
SKIPTEST(x1, x14);
|
||||
u8 = PK(i32+1);
|
||||
gd = xEAX+((u8&0x38)>>3);
|
||||
MOV32(gd, addr);
|
||||
break;
|
||||
case 3:
|
||||
SETFLAGS(X_ALL, SF_SET_NODF); // Hack to set flags to "dont'care" state
|
||||
SKIPTEST(x1, x14);
|
||||
BARRIER(BARRIER_FULL);
|
||||
BARRIER_NEXT(BARRIER_FULL);
|
||||
MOV32(x2, addr);
|
||||
PUSH1(x2);
|
||||
MESSAGE(LOG_DUMP, "Native Call to %s (retn=%d)\n", GetNativeName(GetNativeFnc(dyn->insts[ninst].natcall-1)), dyn->insts[ninst].retn);
|
||||
SKIPTEST(x14);
|
||||
// calling a native function
|
||||
if(isRetX87Wrapper(*(wrapper_t*)(dyn->insts[ninst].natcall+2))) {
|
||||
// return value will be on the stack, so the stack depth needs to be updated
|
||||
|
||||
@@ -95,7 +95,7 @@ uintptr_t dynarec0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst,
|
||||
addr = fakeed(dyn, addr, ninst, nextop);
|
||||
SETFLAGS(X_ALL, SF_SET_NODF); // Hack to set flags in "don't care" state
|
||||
//CALL(arm_ud, -1, 0);
|
||||
SKIPTEST(x14);
|
||||
SKIPTEST(x1, x14);
|
||||
UDF(0);
|
||||
break;
|
||||
case 0xE0:
|
||||
@@ -149,7 +149,7 @@ uintptr_t dynarec0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst,
|
||||
INST_NAME("UD2");
|
||||
SETFLAGS(X_ALL, SF_SET_NODF); // Hack to set flags in "don't care" state
|
||||
//CALL(arm_ud, -1, 0);
|
||||
SKIPTEST(x14);
|
||||
SKIPTEST(x1, x14);
|
||||
UDF(0);
|
||||
break;
|
||||
|
||||
@@ -475,13 +475,13 @@ uintptr_t dynarec0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst,
|
||||
VMOVD(d1, v0);
|
||||
}
|
||||
VCMP_F32(d1*2, s0);
|
||||
FCOMI(x1, x2);
|
||||
FCOMI(x1, x2, 0, 0, d1*2, s0, 1);
|
||||
break;
|
||||
|
||||
case 0x31:
|
||||
INST_NAME("RDTSC");
|
||||
MESSAGE(LOG_DUMP, "Need Optimization\n");
|
||||
SKIPTEST(x14);
|
||||
SKIPTEST(x1, x14);
|
||||
CALL(ReadTSC, xEAX, 0); // will return the u64 in x1:xEAX
|
||||
MOV_REG(xEDX, x1);
|
||||
break;
|
||||
@@ -717,7 +717,7 @@ uintptr_t dynarec0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst,
|
||||
break;
|
||||
case 0x51:
|
||||
INST_NAME("SQRTPS Gx, Ex");
|
||||
SKIPTEST(x1);
|
||||
SKIPTEST(x1, x14);
|
||||
nextop = F8;
|
||||
GETEX(q0, 0);
|
||||
gd = (nextop&0x38)>>3;
|
||||
@@ -786,7 +786,7 @@ uintptr_t dynarec0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst,
|
||||
break;
|
||||
case 0x52:
|
||||
INST_NAME("RSQRTPS Gx, Ex");
|
||||
SKIPTEST(x1);
|
||||
SKIPTEST(x1, x14);
|
||||
nextop = F8;
|
||||
GETEX(q0, 0);
|
||||
gd = (nextop&0x38)>>3;
|
||||
@@ -809,7 +809,7 @@ uintptr_t dynarec0F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst,
|
||||
break;
|
||||
case 0x53:
|
||||
INST_NAME("RCPPS Gx, Ex");
|
||||
SKIPTEST(x1);
|
||||
SKIPTEST(x1, x14);
|
||||
nextop = F8;
|
||||
GETEX(q0, 0);
|
||||
gd = (nextop&0x38)>>3;
|
||||
|
||||
@@ -282,7 +282,7 @@ uintptr_t dynarec660F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nins
|
||||
v0 = sse_get_reg(dyn, ninst, x1, gd, 0);
|
||||
GETEX(q0, 0);
|
||||
VCMP_F64(v0, q0);
|
||||
FCOMI(x1, x2);
|
||||
FCOMI(x1, x2, 0, 0, v0, q0, 0);
|
||||
break;
|
||||
|
||||
case 0x38: // SSSE3 opcodes
|
||||
|
||||
@@ -100,7 +100,7 @@ uintptr_t dynarecD8(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst,
|
||||
} else {
|
||||
VCMP_F64(v1, v2);
|
||||
}
|
||||
FCOM(x1, x2);
|
||||
FCOM(x1, x2, x3, x14, v1, v2, ST_IS_F(0));
|
||||
break;
|
||||
case 0xD8:
|
||||
case 0xD9:
|
||||
@@ -118,7 +118,7 @@ uintptr_t dynarecD8(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst,
|
||||
} else {
|
||||
VCMP_F64(v1, v2);
|
||||
}
|
||||
FCOM(x1, x2);
|
||||
FCOM(x1, x2, x3, x14, v1, v2, ST_IS_F(0));
|
||||
X87_POP_OR_FAIL(dyn, ninst, x3);
|
||||
break;
|
||||
case 0xE0:
|
||||
@@ -275,7 +275,7 @@ uintptr_t dynarecD8(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst,
|
||||
VCVT_F64_F32(d1, s0);
|
||||
VCMP_F64(v1, d1);
|
||||
}
|
||||
FCOM(x1, x2);
|
||||
FCOM(x1, x2, x3, x14, v1, ST_IS_F(0)?s0:d1, ST_IS_F(0));
|
||||
break;
|
||||
case 3:
|
||||
INST_NAME("FCOMP ST0, float[ED]");
|
||||
@@ -296,7 +296,7 @@ uintptr_t dynarecD8(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst,
|
||||
VCVT_F64_F32(d1, s0);
|
||||
VCMP_F64(v1, d1);
|
||||
}
|
||||
FCOM(x1, x2);
|
||||
FCOM(x1, x2, x3, x14, v1, ST_IS_F(0)?s0:d1, ST_IS_F(0));
|
||||
X87_POP_OR_FAIL(dyn, ninst, x3);
|
||||
break;
|
||||
case 4:
|
||||
|
||||
@@ -126,7 +126,7 @@ uintptr_t dynarecD9(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst,
|
||||
} else {
|
||||
VCMP_F64_0(v1);
|
||||
}
|
||||
FCOM(x1, x2); // same flags...
|
||||
FCOM(x1, x2, 0, 0, v1, 0, ST_IS_F(0)); // same flags...
|
||||
break;
|
||||
case 0xE5:
|
||||
INST_NAME("FXAM");
|
||||
@@ -138,6 +138,31 @@ uintptr_t dynarecD9(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst,
|
||||
MOV32(x14, 0b100000100000000);
|
||||
B_MARK3(c__);
|
||||
} else { // not in cache, so check Empty status and load it
|
||||
// load tag
|
||||
LDRH_IMM8(x3, xEmu, offsetof(x86emu_t, fpu_tags));
|
||||
if(i2) {
|
||||
if(i2<0) {
|
||||
MOV_REG_LSL_IMM5(x3, x3, -i2*2);
|
||||
} else {
|
||||
MOV32(x14, 0xffff);
|
||||
ORR_REG_LSL_IMM5(x3, x3, x14, 16);
|
||||
MOV_REG_LSR_IMM5(x3, x3, i2*2);
|
||||
}
|
||||
}
|
||||
TSTS_IMM8(x3, 0b11);
|
||||
MOVW(x14, 0b100000100000000); // empty
|
||||
B_MARK3(cNE);
|
||||
// check stack TODO: this test should not be needed, something is wrong with tag handling
|
||||
LDR_IMM9(x3, xEmu, offsetof(x86emu_t, fpu_stack));
|
||||
if(i2) {
|
||||
if(i2<0) {
|
||||
ADD_IMM8(x3, x3, -i2);
|
||||
} else {
|
||||
SUB_IMM8(x3, x3, i2);
|
||||
}
|
||||
}
|
||||
CMPS_IMM8(x3, 0);
|
||||
B_MARK3(cLE);
|
||||
// x14 will be the actual top
|
||||
LDR_IMM9(x14, xEmu, offsetof(x86emu_t, top));
|
||||
i2 = -dyn->n.x87stack;
|
||||
@@ -149,11 +174,6 @@ uintptr_t dynarecD9(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst,
|
||||
}
|
||||
AND_IMM8(x14, x14, 7); // (emu->top + i)&7
|
||||
}
|
||||
// load tag
|
||||
LDRH_IMM8(x3, xEmu, offsetof(x86emu_t, fpu_tags));
|
||||
TSTS_IMM8(x3, 0b11);
|
||||
MOVW_COND(cNE, x14, 0b100000100000000);
|
||||
B_MARK3(cNE);
|
||||
ADD_REG_LSL_IMM5(x1, xEmu, x14, 3);
|
||||
LDRD_IMM8(x2, x1, offsetof(x86emu_t, x87)); // load r2/r3 with ST0 anyway, for sign extraction
|
||||
}
|
||||
|
||||
@@ -128,7 +128,7 @@ uintptr_t dynarecDA(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst,
|
||||
} else {
|
||||
VCMP_F64(v1, v2);
|
||||
}
|
||||
FCOM(x1, x2);
|
||||
FCOM(x1, x2, x3, x14, v1, v2, ST_IS_F(0));
|
||||
X87_POP_OR_FAIL(dyn, ninst, x3);
|
||||
X87_POP_OR_FAIL(dyn, ninst, x3);
|
||||
break;
|
||||
@@ -185,7 +185,7 @@ uintptr_t dynarecDA(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst,
|
||||
VMOVtoV(s0, ed);
|
||||
VCVT_F64_S32(d0, s0);
|
||||
VCMP_F64(v1, d0);
|
||||
FCOM(x1, x2);
|
||||
FCOM(x1, x2, x3, x14, v1, d0, 0);
|
||||
break;
|
||||
case 3:
|
||||
INST_NAME("FICOMP ST0, Ed");
|
||||
@@ -196,7 +196,7 @@ uintptr_t dynarecDA(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst,
|
||||
VMOVtoV(s0, ed);
|
||||
VCVT_F64_S32(d0, s0);
|
||||
VCMP_F64(v1, d0);
|
||||
FCOM(x1, x2);
|
||||
FCOM(x1, x2, x3, x14, v1, d0, 0);
|
||||
X87_POP_OR_FAIL(dyn, ninst, x3);
|
||||
break;
|
||||
case 4:
|
||||
|
||||
@@ -149,7 +149,7 @@ uintptr_t dynarecDB(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst,
|
||||
} else {
|
||||
VCMP_F64(v1, v2);
|
||||
}
|
||||
FCOMI(x1, x2);
|
||||
FCOMI(x1, x2, x3, x14, v1, v2, ST_IS_F(0));
|
||||
break;
|
||||
case 0xF0:
|
||||
case 0xF1:
|
||||
@@ -168,7 +168,7 @@ uintptr_t dynarecDB(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst,
|
||||
} else {
|
||||
VCMP_F64(v1, v2);
|
||||
}
|
||||
FCOMI(x1, x2);
|
||||
FCOMI(x1, x2, x3, x14, v1, v2, ST_IS_F(0));
|
||||
break;
|
||||
|
||||
case 0xE0:
|
||||
|
||||
@@ -96,7 +96,7 @@ uintptr_t dynarecDC(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst,
|
||||
} else {
|
||||
VCMP_F64(v1, v2);
|
||||
}
|
||||
FCOM(x1, x2);
|
||||
FCOM(x1, x2, x3, x14, v1, v2, ST_IS_F(0));
|
||||
break;
|
||||
case 0xD8:
|
||||
case 0xD9:
|
||||
@@ -114,7 +114,7 @@ uintptr_t dynarecDC(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst,
|
||||
} else {
|
||||
VCMP_F64(v1, v2);
|
||||
}
|
||||
FCOM(x1, x2);
|
||||
FCOM(x1, x2, x3, x14, v1, v2, ST_IS_F(0));
|
||||
X87_POP_OR_FAIL(dyn, ninst, x3);
|
||||
break;
|
||||
case 0xE0:
|
||||
@@ -258,7 +258,7 @@ uintptr_t dynarecDC(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst,
|
||||
VMOVtoV_D(d1, x2, x3);
|
||||
}
|
||||
VCMP_F64(v1, d1);
|
||||
FCOM(x1, x2);
|
||||
FCOM(x1, x2, x3, x14, v1, d1, 0);
|
||||
break;
|
||||
case 3:
|
||||
INST_NAME("FCOMP ST0, double[ED]");
|
||||
@@ -275,7 +275,7 @@ uintptr_t dynarecDC(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst,
|
||||
VMOVtoV_D(d1, x2, x3);
|
||||
}
|
||||
VCMP_F64(v1, d1);
|
||||
FCOM(x1, x2);
|
||||
FCOM(x1, x2, x3, x14, v1, d1, 0);
|
||||
X87_POP_OR_FAIL(dyn, ninst, x3);
|
||||
break;
|
||||
case 4:
|
||||
|
||||
@@ -51,7 +51,7 @@ uintptr_t dynarecDD(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst,
|
||||
MESSAGE(LOG_DUMP, "Hack for FFREE ST0 / FINCSTP\n");
|
||||
X87_POP_OR_FAIL(dyn, ninst, x1);
|
||||
addr+=2;
|
||||
SKIPTEST(x1);
|
||||
SKIPTEST(x1, x14);
|
||||
} else
|
||||
x87_free(dyn, ninst, x1, x2, x3, nextop&7);
|
||||
#else
|
||||
@@ -111,7 +111,7 @@ uintptr_t dynarecDD(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst,
|
||||
} else {
|
||||
VCMP_F64(v1, v2);
|
||||
}
|
||||
FCOM(x1, x2);
|
||||
FCOM(x1, x2, x3, x14, v1, v2, ST_IS_F(0));
|
||||
break;
|
||||
case 0xE8:
|
||||
case 0xE9:
|
||||
@@ -129,7 +129,7 @@ uintptr_t dynarecDD(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst,
|
||||
} else {
|
||||
VCMP_F64(v1, v2);
|
||||
}
|
||||
FCOM(x1, x2);
|
||||
FCOM(x1, x2, x3, x14, v1, v2, ST_IS_F(0));
|
||||
X87_POP_OR_FAIL(dyn, ninst, x3);
|
||||
break;
|
||||
|
||||
|
||||
@@ -94,7 +94,7 @@ uintptr_t dynarecDE(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst,
|
||||
} else {
|
||||
VCMP_F64(v1, v2);
|
||||
}
|
||||
FCOM(x1, x2);
|
||||
FCOM(x1, x2, x3, x14, v1, v2, ST_IS_F(0));
|
||||
X87_POP_OR_FAIL(dyn, ninst, x3);
|
||||
break;
|
||||
|
||||
@@ -107,7 +107,7 @@ uintptr_t dynarecDE(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst,
|
||||
} else {
|
||||
VCMP_F64(v1, v2);
|
||||
}
|
||||
FCOM(x1, x2);
|
||||
FCOM(x1, x2, x3, x14, v1, v2, ST_IS_F(0));
|
||||
X87_POP_OR_FAIL(dyn, ninst, x3);
|
||||
X87_POP_OR_FAIL(dyn, ninst, x3);
|
||||
break;
|
||||
|
||||
@@ -90,7 +90,7 @@ uintptr_t dynarecDF(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst,
|
||||
} else {
|
||||
VCMP_F64(v1, v2);
|
||||
}
|
||||
FCOMI(x1, x2);
|
||||
FCOMI(x1, x2, x3, x14, v1, v2, ST_IS_F(0));
|
||||
X87_POP_OR_FAIL(dyn, ninst, x3);
|
||||
break;
|
||||
case 0xF0:
|
||||
@@ -111,7 +111,7 @@ uintptr_t dynarecDF(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int ninst,
|
||||
} else {
|
||||
VCMP_F64(v1, v2);
|
||||
}
|
||||
FCOMI(x1, x2);
|
||||
FCOMI(x1, x2, x3, x14, v1, v2, ST_IS_F(0));
|
||||
X87_POP_OR_FAIL(dyn, ninst, x3);
|
||||
break;
|
||||
|
||||
|
||||
@@ -53,7 +53,7 @@ void emit_or32(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4)
|
||||
BFI(xFlags, s3, F_SF, 1);
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -96,7 +96,7 @@ void emit_or32c(dynarec_arm_t* dyn, int ninst, int s1, int32_t c, int s3, int s4
|
||||
BFI(xFlags, s3, F_SF, 1);
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -130,7 +130,7 @@ void emit_xor32(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4)
|
||||
BFI(xFlags, s3, F_SF, 1);
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -173,7 +173,7 @@ void emit_xor32c(dynarec_arm_t* dyn, int ninst, int s1, int32_t c, int s3, int s
|
||||
BFI(xFlags, s3, F_SF, 1);
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -207,7 +207,7 @@ void emit_and32(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4)
|
||||
BFI(xFlags, s3, F_SF, 1);
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -258,7 +258,7 @@ void emit_and32c(dynarec_arm_t* dyn, int ninst, int s1, int32_t c, int s3, int s
|
||||
BFI(xFlags, s3, F_SF, 1);
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -292,7 +292,7 @@ void emit_or8(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4)
|
||||
BFI(xFlags, s3, F_SF, 1);
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -326,7 +326,7 @@ void emit_or8c(dynarec_arm_t* dyn, int ninst, int s1, int32_t c, int s3, int s4)
|
||||
BFI(xFlags, s3, F_SF, 1);
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -360,7 +360,7 @@ void emit_xor8(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4)
|
||||
BFI(xFlags, s3, F_SF, 1);
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -394,7 +394,7 @@ void emit_xor8c(dynarec_arm_t* dyn, int ninst, int s1, int32_t c, int s3, int s4
|
||||
BFI(xFlags, s3, F_SF, 1);
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -428,7 +428,7 @@ void emit_and8(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4)
|
||||
BFI(xFlags, s3, F_SF, 1);
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -462,7 +462,7 @@ void emit_and8c(dynarec_arm_t* dyn, int ninst, int s1, int32_t c, int s3, int s4
|
||||
BFI(xFlags, s3, F_SF, 1);
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -497,7 +497,7 @@ void emit_or16(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4)
|
||||
BFI(xFlags, s3, F_SF, 1);
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -540,7 +540,7 @@ void emit_or16c(dynarec_arm_t* dyn, int ninst, int s1, int32_t c, int s3, int s4
|
||||
BFI(xFlags, s3, F_SF, 1);
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -574,7 +574,7 @@ void emit_xor16(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4)
|
||||
BFI(xFlags, s3, F_SF, 1);
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -617,7 +617,7 @@ void emit_xor16c(dynarec_arm_t* dyn, int ninst, int s1, int32_t c, int s3, int s
|
||||
BFI(xFlags, s3, F_SF, 1);
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -651,7 +651,7 @@ void emit_and16(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4)
|
||||
BFI(xFlags, s3, F_SF, 1);
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -694,6 +694,6 @@ void emit_and16c(dynarec_arm_t* dyn, int ninst, int s1, int32_t c, int s3, int s
|
||||
BFI(xFlags, s3, F_SF, 1);
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
}
|
||||
@@ -69,7 +69,7 @@ void emit_add32(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4)
|
||||
BFI(xFlags, s3, F_SF, 1);
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -151,7 +151,7 @@ void emit_add32c(dynarec_arm_t* dyn, int ninst, int s1, int32_t c, int s3, int s
|
||||
BFI(xFlags, s3, F_SF, 1);
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -203,7 +203,7 @@ void emit_sub32(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4)
|
||||
BFI(xFlags, s3, F_SF, 1);
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -288,7 +288,7 @@ void emit_sub32c(dynarec_arm_t* dyn, int ninst, int s1, int32_t c, int s3, int s
|
||||
BFI(xFlags, s3, F_SF, 1);
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -338,7 +338,7 @@ void emit_add8(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4, in
|
||||
BFI(xFlags, s3, F_SF, 1);
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
IFX(X_AF|X_OF|X_PF){if(save_s4) {POP(xSP, 1<<s4);}}
|
||||
}
|
||||
@@ -390,7 +390,7 @@ void emit_add8c(dynarec_arm_t* dyn, int ninst, int s1, int c, int s3, int s4)
|
||||
BFI(xFlags, s3, F_SF, 1);
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -442,7 +442,7 @@ void emit_sub8(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4, in
|
||||
BFI(xFlags, s3, F_SF, 1);
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
IFX(X_AF|X_OF|X_CF|X_PF){if(save_s4) {POP(xSP, 1<<s4);}}
|
||||
}
|
||||
@@ -495,7 +495,7 @@ void emit_sub8c(dynarec_arm_t* dyn, int ninst, int s1, int c, int s3, int s4)
|
||||
BFI(xFlags, s3, F_SF, 1);
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -547,7 +547,7 @@ void emit_add16(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4, i
|
||||
BFI(xFlags, s3, F_SF, 1);
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
IFX(X_AF|X_OF|X_PF){if(save_s4) {POP(xSP, 1<<s4);}}
|
||||
}
|
||||
@@ -615,7 +615,7 @@ void emit_add16c(dynarec_arm_t* dyn, int ninst, int s1, int c, int s3, int s4)
|
||||
BFI(xFlags, s3, F_SF, 1);
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -668,7 +668,7 @@ void emit_sub16(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4, i
|
||||
BFI(xFlags, s3, F_SF, 1);
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
IFX(X_AF|X_OF|X_CF|X_PF){if(save_s4) {POP(xSP, 1<<s4);}}
|
||||
}
|
||||
@@ -734,7 +734,7 @@ void emit_sub16c(dynarec_arm_t* dyn, int ninst, int s1, int c, int s3, int s4)
|
||||
BFI(xFlags, s3, F_SF, 1);
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -778,7 +778,7 @@ void emit_inc32(dynarec_arm_t* dyn, int ninst, int s1, int s3, int s4)
|
||||
BFI(xFlags, s3, F_SF, 1);
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -823,7 +823,7 @@ void emit_inc8(dynarec_arm_t* dyn, int ninst, int s1, int s3, int s4)
|
||||
BFI(xFlags, s3, F_SF, 1);
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -870,7 +870,7 @@ void emit_inc16(dynarec_arm_t* dyn, int ninst, int s1, int s3, int s4)
|
||||
BFI(xFlags, s3, F_SF, 1);
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -915,7 +915,7 @@ void emit_dec32(dynarec_arm_t* dyn, int ninst, int s1, int s3, int s4)
|
||||
BFI(xFlags, s3, F_SF, 1);
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -960,7 +960,7 @@ void emit_dec8(dynarec_arm_t* dyn, int ninst, int s1, int s3, int s4)
|
||||
BFI(xFlags, s3, F_SF, 1);
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1006,7 +1006,7 @@ void emit_dec16(dynarec_arm_t* dyn, int ninst, int s1, int s3, int s4)
|
||||
BFI(xFlags, s3, F_SF, 1);
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1057,7 +1057,7 @@ void emit_adc32(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4)
|
||||
BFI(xFlags, s3, F_SF, 1);
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1127,7 +1127,7 @@ void emit_adc32c(dynarec_arm_t* dyn, int ninst, int s1, int32_t c, int s3, int s
|
||||
BFI(xFlags, s3, F_SF, 1);
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1179,7 +1179,7 @@ void emit_adc8(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4, in
|
||||
BFI(xFlags, s3, F_SF, 1);
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
IFX(X_AF|X_OF|X_PF){if(save_s4) {POP(xSP, 1<<s4);}}
|
||||
}
|
||||
@@ -1232,7 +1232,7 @@ void emit_adc8c(dynarec_arm_t* dyn, int ninst, int s1, int c, int s3, int s4)
|
||||
BFI(xFlags, s3, F_SF, 1);
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1285,7 +1285,7 @@ void emit_adc16(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4, i
|
||||
BFI(xFlags, s3, F_SF, 1);
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
IFX(X_AF|X_OF|X_PF){if(save_s4) {POP(xSP, 1<<s4);}}
|
||||
}
|
||||
@@ -1353,7 +1353,7 @@ void emit_adc16c(dynarec_arm_t* dyn, int ninst, int s1, int c, int s3, int s4)
|
||||
BFI(xFlags, s3, F_SF, 1);
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1407,7 +1407,7 @@ void emit_sbb32(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4)
|
||||
BFI(xFlags, s3, F_SF, 1);
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1479,7 +1479,7 @@ void emit_sbb32c(dynarec_arm_t* dyn, int ninst, int s1, int32_t c, int s3, int s
|
||||
BFI(xFlags, s3, F_SF, 1);
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1533,7 +1533,7 @@ void emit_sbb8(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4, in
|
||||
BFI(xFlags, s3, F_SF, 1);
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
IFX(X_AF|X_OF|X_CF|X_PF){if(save_s4) {POP(xSP, 1<<s4);}}
|
||||
}
|
||||
@@ -1587,7 +1587,7 @@ void emit_sbb8c(dynarec_arm_t* dyn, int ninst, int s1, int c, int s3, int s4)
|
||||
BFI(xFlags, s3, F_SF, 1);
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1642,7 +1642,7 @@ void emit_sbb16(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4, i
|
||||
BFI(xFlags, s3, F_SF, 1);
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
IFX(X_AF|X_OF|X_CF|X_PF){if(save_s4) {POP(xSP, 1<<s4);}}
|
||||
}
|
||||
@@ -1710,7 +1710,7 @@ void emit_sbb16c(dynarec_arm_t* dyn, int ninst, int s1, int c, int s3, int s4)
|
||||
BFI(xFlags, s3, F_SF, 1);
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1758,7 +1758,7 @@ void emit_neg32(dynarec_arm_t* dyn, int ninst, int s1, int s3, int s4)
|
||||
BFI(xFlags, s3, F_SF, 1);
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1807,7 +1807,7 @@ void emit_neg16(dynarec_arm_t* dyn, int ninst, int s1, int s3, int s4)
|
||||
BFI(xFlags, s3, F_SF, 1);
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1855,6 +1855,6 @@ void emit_neg8(dynarec_arm_t* dyn, int ninst, int s1, int s3, int s4)
|
||||
BFI(xFlags, s3, F_SF, 1);
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
}
|
||||
@@ -76,7 +76,7 @@ void emit_shl32(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4)
|
||||
BFC_COND(cNE, xFlags, F_OF, 1);
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -130,7 +130,7 @@ void emit_shl32c(dynarec_arm_t* dyn, int ninst, int s1, int32_t c, int s3, int s
|
||||
}
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -181,7 +181,7 @@ void emit_shr32(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4)
|
||||
BFI(xFlags, s4, F_SF, 1);
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -233,7 +233,7 @@ void emit_shr32c(dynarec_arm_t* dyn, int ninst, int s1, int32_t c, int s3, int s
|
||||
BFI(xFlags, s3, F_SF, 1);
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -280,7 +280,7 @@ void emit_sar32c(dynarec_arm_t* dyn, int ninst, int s1, int32_t c, int s3, int s
|
||||
BFC(xFlags, F_OF, 1);
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -323,7 +323,7 @@ void emit_shl8(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4)
|
||||
BFI_COND(cEQ, xFlags, s4, F_OF, 1);
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -371,7 +371,7 @@ void emit_shl8c(dynarec_arm_t* dyn, int ninst, int s1, int32_t c, int s3, int s4
|
||||
}
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
} else {
|
||||
IFX(X_CF) {
|
||||
@@ -433,7 +433,7 @@ void emit_shr8(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4)
|
||||
BFI(xFlags, s4, F_SF, 1);
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -479,7 +479,7 @@ void emit_shr8c(dynarec_arm_t* dyn, int ninst, int s1, int32_t c, int s3, int s4
|
||||
BFI(xFlags, s4, F_SF, 1);
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -517,7 +517,7 @@ void emit_sar8(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4)
|
||||
BFC_COND(cEQ, xFlags, F_OF, 1);
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -557,7 +557,7 @@ void emit_sar8c(dynarec_arm_t* dyn, int ninst, int s1, int32_t c, int s3, int s4
|
||||
BFC(xFlags, F_OF, 1);
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -597,7 +597,7 @@ void emit_shl16(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4)
|
||||
BFI_COND(cEQ, xFlags, s4, F_OF, 1);
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -645,7 +645,7 @@ void emit_shl16c(dynarec_arm_t* dyn, int ninst, int s1, int32_t c, int s3, int s
|
||||
}
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
} else {
|
||||
IFX(X_CF) {
|
||||
@@ -707,7 +707,7 @@ void emit_shr16(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4)
|
||||
BFI(xFlags, s4, F_SF, 1);
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -753,7 +753,7 @@ void emit_shr16c(dynarec_arm_t* dyn, int ninst, int s1, int32_t c, int s3, int s
|
||||
BFI(xFlags, s4, F_SF, 1);
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -792,7 +792,7 @@ void emit_sar16(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4)
|
||||
BFC_COND(cEQ, xFlags, F_OF, 1);
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -835,7 +835,7 @@ void emit_sar16c(dynarec_arm_t* dyn, int ninst, int s1, int32_t c, int s3, int s
|
||||
BFC(xFlags, F_OF, 1);
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -968,7 +968,7 @@ void emit_shrd32c(dynarec_arm_t* dyn, int ninst, int s1, int s2, int32_t c, int
|
||||
}
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1035,7 +1035,7 @@ void emit_shld32c(dynarec_arm_t* dyn, int ninst, int s1, int s2, int32_t c, int
|
||||
BFI(xFlags, s3, F_SF, 1);
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1096,7 +1096,7 @@ void emit_shrd32(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4)
|
||||
BFI_COND(cEQ, xFlags, s4, F_OF, 1);
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1160,7 +1160,7 @@ void emit_shld32(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4)
|
||||
BFI(xFlags, s4, F_SF, 1);
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -55,7 +55,10 @@ void emit_cmp32(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4)
|
||||
MOV_REG_LSR_IMM5(s4, s3, 31);
|
||||
BFI(xFlags, s4, F_SF, 1);
|
||||
}
|
||||
// and now the tricky ones (and mostly unused), PF and AF
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s3, s4);
|
||||
}
|
||||
// and now the tricky ones (and mostly unused), AF
|
||||
IFX(X_AF) {
|
||||
// bc = (res & (~d | s)) | (~d & s)
|
||||
MVN_REG_LSL_IMM5(s4, s1, 0); // s4 = ~d
|
||||
@@ -68,19 +71,6 @@ void emit_cmp32(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4)
|
||||
BFI(xFlags, s4, F_AF, 1); // AF: bc & 0x08
|
||||
}
|
||||
}
|
||||
IFX(X_PF) {
|
||||
// PF: (((emu->x86emu_parity_tab[(res) / 32] >> ((res) % 32)) & 1) == 0)
|
||||
IFX(X_CF|X_AF) {
|
||||
SUB_REG_LSL_IMM5(s3, s1, s2, 0);
|
||||
}
|
||||
AND_IMM8(s3, s3, 0xE0); // lsr 5 masking pre-applied
|
||||
MOV32(s4, GetParityTab());
|
||||
LDR_REG_LSR_IMM5(s4, s4, s3, 5-2); // x/32 and then *4 because array is integer
|
||||
SUB_REG_LSL_IMM5(s3, s1, s2, 0);
|
||||
AND_IMM8(s3, s3, 31);
|
||||
MVN_REG_LSR_REG(s4, s4, s3);
|
||||
BFI(xFlags, s4, F_PF, 1);
|
||||
}
|
||||
}
|
||||
|
||||
// emit CMP32 instruction, from cmp s1 , 0, using s3 and s4 as scratch
|
||||
@@ -112,7 +102,7 @@ void emit_cmp32_0(dynarec_arm_t* dyn, int ninst, int s1, int s3, int s4)
|
||||
BFI(xFlags, s4, F_SF, 1);
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -140,6 +130,9 @@ void emit_cmp16(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4)
|
||||
MOV_REG_LSR_IMM5(s4, s3, 15);
|
||||
BFI(xFlags, s4, F_SF, 1);
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s3, s4);
|
||||
}
|
||||
// bc = (res & (~d | s)) | (~d & s)
|
||||
IFX(X_CF|X_AF|X_OF) {
|
||||
MVN_REG_LSL_IMM5(s4, s1, 0); // s4 = ~d
|
||||
@@ -161,18 +154,6 @@ void emit_cmp16(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4)
|
||||
BFI(xFlags, s4, F_OF, 1); // OF: ((bc >> 14) ^ ((bc>>14)>>1)) & 1
|
||||
}
|
||||
}
|
||||
IFX(X_PF) {
|
||||
IFX(X_CF|X_AF|X_OF) {
|
||||
SUB_REG_LSL_IMM5(s3, s1, s2, 0);
|
||||
}
|
||||
AND_IMM8(s3, s3, 0xE0); // lsr 5 masking pre-applied
|
||||
MOV32(s4, GetParityTab());
|
||||
LDR_REG_LSR_IMM5(s4, s4, s3, 5-2); // x/32 and then *4 because array is integer
|
||||
SUB_REG_LSL_IMM5(s3, s1, s2, 0);
|
||||
AND_IMM8(s3, s3, 31);
|
||||
MVN_REG_LSR_REG(s4, s4, s3);
|
||||
BFI(xFlags, s4, F_PF, 1);
|
||||
}
|
||||
}
|
||||
|
||||
// emit CMP16 instruction, from cmp s1 , #0, using s3 and s4 as scratch
|
||||
@@ -204,7 +185,7 @@ void emit_cmp16_0(dynarec_arm_t* dyn, int ninst, int s1, int s3, int s4)
|
||||
BFI(xFlags, s4, F_SF, 1);
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
}
|
||||
// emit CMP8 instruction, from cmp s1 , s2, using s3 and s4 as scratch
|
||||
@@ -230,6 +211,9 @@ void emit_cmp8(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4)
|
||||
MOV_REG_LSR_IMM5(s4, s3, 7);
|
||||
BFI(xFlags, s4, F_SF, 1);
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s3, s4);
|
||||
}
|
||||
// bc = (res & (~d | s)) | (~d & s)
|
||||
IFX(X_CF|X_AF|X_OF) {
|
||||
MVN_REG_LSL_IMM5(s4, s1, 0); // s4 = ~d
|
||||
@@ -251,18 +235,6 @@ void emit_cmp8(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4)
|
||||
BFI(xFlags, s4, F_OF, 1); // OF: ((bc >> 6) ^ ((bc>>6)>>1)) & 1
|
||||
}
|
||||
}
|
||||
IFX(X_PF) {
|
||||
IFX(X_CF|X_AF|X_OF) {
|
||||
SUB_REG_LSL_IMM5(s3, s1, s2, 0);
|
||||
}
|
||||
AND_IMM8(s3, s3, 0xE0); // lsr 5 masking pre-applied
|
||||
MOV32(s4, GetParityTab());
|
||||
LDR_REG_LSR_IMM5(s4, s4, s3, 5-2); // x/32 and then *4 because array is integer
|
||||
SUB_REG_LSL_IMM5(s3, s1, s2, 0);
|
||||
AND_IMM8(s3, s3, 31);
|
||||
MVN_REG_LSR_REG(s4, s4, s3);
|
||||
BFI(xFlags, s4, F_PF, 1);
|
||||
}
|
||||
}
|
||||
// emit CMP8 instruction, from cmp s1 , 0, using s3 and s4 as scratch
|
||||
void emit_cmp8_0(dynarec_arm_t* dyn, int ninst, int s1, int s3, int s4)
|
||||
@@ -292,7 +264,7 @@ void emit_cmp8_0(dynarec_arm_t* dyn, int ninst, int s1, int s3, int s4)
|
||||
BFI(xFlags, s4, F_SF, 1);
|
||||
}
|
||||
IFX(X_PF) {
|
||||
emit_pf(dyn, ninst, s1, s3, s4);
|
||||
emit_pf(dyn, ninst, s1, s4);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -321,19 +293,8 @@ void emit_test32(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4)
|
||||
MOV_REG_LSR_IMM5(s4, s3, 31);
|
||||
BFI(xFlags, s4, F_SF, 1);
|
||||
}
|
||||
// PF: (((emu->x86emu_parity_tab[(res) / 32] >> ((res) % 32)) & 1) == 0)
|
||||
IFX(X_PF) {
|
||||
AND_IMM8(s3, s3, 0xE0); // lsr 5 masking pre-applied
|
||||
MOV32(s4, GetParityTab());
|
||||
LDR_REG_LSR_IMM5(s4, s4, s3, 5-2); // x/32 and then *4 because array is integer
|
||||
if(s1==s2) {
|
||||
AND_IMM8(s3, s1, 31);
|
||||
} else {
|
||||
AND_REG_LSL_IMM5(s3, s1, s2, 0);
|
||||
AND_IMM8(s3, s3, 31);
|
||||
}
|
||||
MVN_REG_LSR_REG(s4, s4, s3);
|
||||
BFI(xFlags, s4, F_PF, 1);
|
||||
emit_pf(dyn, ninst, s3, s4);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -362,15 +323,8 @@ void emit_test16(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4)
|
||||
MOV_REG_LSR_IMM5(s4, s3, 15);
|
||||
BFI(xFlags, s4, F_SF, 1);
|
||||
}
|
||||
// PF: (((emu->x86emu_parity_tab[(res) / 32] >> ((res) % 32)) & 1) == 0)
|
||||
IFX(X_PF) {
|
||||
AND_IMM8(s3, s3, 0xE0); // lsr 5 masking pre-applied
|
||||
MOV32(s4, GetParityTab());
|
||||
LDR_REG_LSR_IMM5(s4, s4, s3, 5-2); // x/32 and then *4 because array is integer
|
||||
AND_REG_LSL_IMM5(s3, s1, s2, 0);
|
||||
AND_IMM8(s3, s3, 31);
|
||||
MVN_REG_LSR_REG(s4, s4, s3);
|
||||
BFI(xFlags, s4, F_PF, 1);
|
||||
emit_pf(dyn, ninst, s3, s4);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -399,13 +353,7 @@ void emit_test8(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4)
|
||||
MOV_REG_LSR_IMM5(s4, s3, 7);
|
||||
BFI(xFlags, s4, F_SF, 1);
|
||||
}
|
||||
// PF: (((emu->x86emu_parity_tab[(res) / 32] >> ((res) % 32)) & 1) == 0)
|
||||
IFX(X_PF) {
|
||||
AND_IMM8(s2, s3, 0xE0); // lsr 5 masking pre-applied
|
||||
MOV32(s4, GetParityTab());
|
||||
LDR_REG_LSR_IMM5(s4, s4, s2, 5-2); // x/32 and then *4 because array is integer
|
||||
AND_IMM8(s3, s3, 31);
|
||||
MVN_REG_LSR_REG(s4, s4, s3);
|
||||
BFI(xFlags, s4, F_PF, 1);
|
||||
emit_pf(dyn, ninst, s3, s4);
|
||||
}
|
||||
}
|
||||
@@ -62,10 +62,20 @@ void arm_fpatan(x86emu_t* emu)
|
||||
}
|
||||
void arm_fxtract(x86emu_t* emu)
|
||||
{
|
||||
int32_t tmp32s = (ST1.q&0x7ff0000000000000LL)>>52;
|
||||
tmp32s -= 1023;
|
||||
ST1.d /= exp2(tmp32s);
|
||||
ST0.d = tmp32s;
|
||||
int tmp32s;
|
||||
if(isnan(ST1.d)) {
|
||||
ST0.d = ST1.d;
|
||||
} else if(isinf(ST1.d)) {
|
||||
ST0.d = ST1.d;
|
||||
ST1.d = INFINITY;
|
||||
} else if(ST1.d==0.0) {
|
||||
ST0.d = ST1.d;
|
||||
ST1.d = -INFINITY;
|
||||
} else {
|
||||
// LD80bits doesn't have implicit "1" bit, so need to adjust for that
|
||||
ST0.d = frexp(ST1.d, &tmp32s)*2;
|
||||
ST1.d = tmp32s-1;
|
||||
}
|
||||
}
|
||||
void arm_fprem(x86emu_t* emu)
|
||||
{
|
||||
|
||||
@@ -1044,9 +1044,9 @@ static void x87_unreflectcache(dynarec_arm_t* dyn, int ninst, int s1, int s2, in
|
||||
if(a>0) {
|
||||
MOV32(s2, 0xffff);
|
||||
ORR_REG_LSL_IMM5(s1, s1, s2, 16);
|
||||
MOV_REG_LSR_IMM5(s1, s1, -a*2);
|
||||
MOV_REG_LSR_IMM5(s1, s1, a*2);
|
||||
} else {
|
||||
MOV_REG_LSL_IMM5(s1, s1, a*2);
|
||||
MOV_REG_LSL_IMM5(s1, s1, -a*2);
|
||||
}
|
||||
STRH_IMM8(s1, xEmu, offsetof(x86emu_t, fpu_tags));
|
||||
// Sub x87stack to top, with and 7
|
||||
@@ -2118,14 +2118,13 @@ void fpu_putback_single_reg(dynarec_arm_t* dyn, int ninst, int reg, int idx, int
|
||||
}
|
||||
}
|
||||
|
||||
void emit_pf(dynarec_arm_t* dyn, int ninst, int s1, int s3, int s4)
|
||||
void emit_pf(dynarec_arm_t* dyn, int ninst, int s1, int s4)
|
||||
{
|
||||
// PF: (((emu->x86emu_parity_tab[(res) / 32] >> ((res) % 32)) & 1) == 0)
|
||||
AND_IMM8(s3, s1, 0xE0); // lsr 5 masking pre-applied
|
||||
MOV32(s4, GetParityTab());
|
||||
LDR_REG_LSR_IMM5(s4, s4, s3, 5-2); // x/32 and then *4 because array is integer
|
||||
AND_IMM8(s3, s1, 31);
|
||||
MVN_REG_LSR_REG(s4, s4, s3);
|
||||
// by xor'ing all the bit 2 by two with a shift, pair of bits are removed, and only 1 is left if bit number if odd
|
||||
XOR_REG_LSR_IMM8(s4, s1, s1, 4);
|
||||
XOR_REG_LSR_IMM8(s4, s4, s4, 2);
|
||||
XOR_REG_LSR_IMM8(s4, s4, s4, 1);
|
||||
MVN_REG_LSL_IMM5(s4, s4, 0);
|
||||
BFI(xFlags, s4, F_PF, 1);
|
||||
}
|
||||
|
||||
|
||||
@@ -316,7 +316,7 @@
|
||||
#define IFXN(A, B) if((dyn->insts[ninst].x86.gen_flags&(A) && !(dyn->insts[ninst].x86.gen_flags&(B))))
|
||||
|
||||
// Generate FCOM with s1 and s2 scratch regs (the VCMP is already done)
|
||||
#define FCOM(s1, s2) \
|
||||
#define FCOM(s1, s2, s3, s4, v1, v2, is_f) \
|
||||
VMRS_APSR(); /* 0b0100011100000000 */ \
|
||||
LDRH_IMM8(s1, xEmu, offsetof(x86emu_t, sw)); /*offset is 8bits right?*/ \
|
||||
BIC_IMM8(s1, s1, 0b01000111, 12); \
|
||||
@@ -324,10 +324,36 @@
|
||||
ORR_IMM8_COND(cEQ, s1, s1, 0b01000000, 12); /* equal */ \
|
||||
ORR_IMM8_COND(cMI, s1, s1, 0b00000001, 12); /* less than */ \
|
||||
/* greater than leave 0 */ \
|
||||
if(s4) { \
|
||||
Bcond(cVS, (is_f?11:13)*4-8); \
|
||||
if(is_f) { \
|
||||
MOVW(s4, 0); \
|
||||
MOVT(s4, 0x7ff0); /* +inf */ \
|
||||
VMOVfrV(s2, v1); \
|
||||
CMPS_REG_LSL_IMM5(s2, s4, 0); \
|
||||
Bcond(cEQ, 5*4-8); /* same */ \
|
||||
VMOVfrV(s2, v2); \
|
||||
ORR_IMM8(s4, s4, 0b10, 1); /* -inf */ \
|
||||
CMPS_REG_LSL_IMM5(s2, s4, 0); \
|
||||
} else { \
|
||||
MOVW(s4, 0); \
|
||||
MOVT(s4, 0x7ff0); /* +inf */ \
|
||||
VMOVfrV_D(s2, s3, v1); \
|
||||
ORR_REG_LSL_IMM5(s2, s2, s3, 0); \
|
||||
CMPS_REG_LSL_IMM5(s2, s4, 0); \
|
||||
Bcond(cEQ, 6*4-8); /* same */ \
|
||||
VMOVfrV_D(s2, s3, v2); \
|
||||
ORR_REG_LSL_IMM5(s2, s2, s3, 0); \
|
||||
ORR_IMM8(s4, s4, 0b10, 1); /* -inf */ \
|
||||
CMPS_REG_LSL_IMM5(s2, s4, 0); \
|
||||
} \
|
||||
Bcond(cNE, 4+4-8); /* same */ \
|
||||
MOVW(s1, 0); \
|
||||
} \
|
||||
STRH_IMM8(s1, xEmu, offsetof(x86emu_t, sw))
|
||||
|
||||
// Generate FCOMI with s1 and s2 scratch regs (the VCMP is already done)
|
||||
#define FCOMI(s1, s2) \
|
||||
#define FCOMI(s1, s2, s3, s4, v1, v2, is_f) \
|
||||
IFX(X_CF|X_PF|X_ZF|X_PEND) { \
|
||||
VMRS_APSR(); /* 0b111 */ \
|
||||
BIC_IMM8(xFlags, xFlags, 0b1000101, 0); \
|
||||
@@ -335,6 +361,32 @@
|
||||
ORR_IMM8_COND(cEQ, xFlags, xFlags, 0b01000000, 0); /* zero */ \
|
||||
ORR_IMM8_COND(cMI, xFlags, xFlags, 0b00000001, 0); /* less than */ \
|
||||
/* greater than leave 0 */ \
|
||||
if(s4) { \
|
||||
Bcond(cVS, (is_f?11:13)*4-8); \
|
||||
if(is_f) { \
|
||||
MOVW(s4, 0); \
|
||||
MOVT(s4, 0x7ff0); /* +inf */ \
|
||||
VMOVfrV(s2, v1); \
|
||||
CMPS_REG_LSL_IMM5(s2, s4, 0); \
|
||||
Bcond(cEQ, 5*4-8); /* same */ \
|
||||
VMOVfrV(s2, v2); \
|
||||
ORR_IMM8(s4, s4, 0b10, 1); /* -inf */ \
|
||||
CMPS_REG_LSL_IMM5(s2, s4, 0); \
|
||||
} else { \
|
||||
MOVW(s4, 0); \
|
||||
MOVT(s4, 0x7ff0); /* +inf */ \
|
||||
VMOVfrV_D(s2, s3, v1); \
|
||||
ORR_REG_LSL_IMM5(s2, s2, s3, 0); \
|
||||
CMPS_REG_LSL_IMM5(s2, s4, 0); \
|
||||
Bcond(cEQ, 6*4-8); /* same */ \
|
||||
VMOVfrV_D(s2, s3, v2); \
|
||||
ORR_REG_LSL_IMM5(s2, s2, s3, 0); \
|
||||
ORR_IMM8(s4, s4, 0b10, 1); /* -inf */ \
|
||||
CMPS_REG_LSL_IMM5(s2, s4, 0); \
|
||||
} \
|
||||
Bcond(cNE, 4+4-8); /* same */ \
|
||||
BIC_IMM8(xFlags, xFlags, 0b1000101, 0); \
|
||||
} \
|
||||
} \
|
||||
SET_DFNONE(s1); \
|
||||
IFX(X_OF|X_AF|X_SF|X_PEND) { \
|
||||
@@ -745,7 +797,7 @@ void emit_shld32c(dynarec_arm_t* dyn, int ninst, int s1, int s2, int32_t c, int
|
||||
void emit_shrd32(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4);
|
||||
void emit_shld32(dynarec_arm_t* dyn, int ninst, int s1, int s2, int s3, int s4);
|
||||
|
||||
void emit_pf(dynarec_arm_t* dyn, int ninst, int s1, int s3, int s4);
|
||||
void emit_pf(dynarec_arm_t* dyn, int ninst, int s1, int s4);
|
||||
|
||||
// x87 helper
|
||||
// cache of the local stack counter, to avoid upadte at every call
|
||||
@@ -894,21 +946,25 @@ uintptr_t dynarecF30F(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nins
|
||||
#define MAYUSE(A)
|
||||
#endif
|
||||
|
||||
#define NOTEST(s1) \
|
||||
#define NOTEST(s1, s2) \
|
||||
if(box86_dynarec_test) { \
|
||||
MOVW(s1, 0); \
|
||||
STR_IMM9(s1, xEmu, offsetof(x86emu_t, test.test)); \
|
||||
STR_IMM9(s1, xEmu, offsetof(x86emu_t, test.clean)); \
|
||||
MOVW(s2, offsetof(x86emu_t, test.test)); \
|
||||
STR_REG_LSL_IMM5(s1, xEmu, s2, 0); \
|
||||
ADD_IMM8(s2, s2, offsetof(x86emu_t, test.clean)-offsetof(x86emu_t, test.test));\
|
||||
STR_REG_LSL_IMM5(s1, xEmu, s2, 0); \
|
||||
}
|
||||
#define SKIPTEST(s1) \
|
||||
#define SKIPTEST(s1, s2) \
|
||||
if(box86_dynarec_test) { \
|
||||
MOVW(s1, 0); \
|
||||
STR_IMM9(s1, xEmu, offsetof(x86emu_t, test.clean)); \
|
||||
MOVW(s2, offsetof(x86emu_t, test.clean)); \
|
||||
STR_REG_LSL_IMM5(s1, xEmu, s2, 0); \
|
||||
}
|
||||
#define GOTEST(s1, s2) \
|
||||
if(box86_dynarec_test) { \
|
||||
MOVW(s2, 1); \
|
||||
STR_IMM9(s2, xEmu, offsetof(x86emu_t, test.test)); \
|
||||
MOVW(s1, offsetof(x86emu_t, test.test)); \
|
||||
STR_REG_LSL_IMM5(s2, xEmu, s1, 0); \
|
||||
}
|
||||
|
||||
#endif //__DYNAREC_ARM_HELPER_H__
|
||||
@@ -307,14 +307,14 @@ uintptr_t arm_pass(dynarec_arm_t* dyn, uintptr_t addr)
|
||||
dyn->insts[ninst].x86.need_after |= X_PEND;
|
||||
#endif
|
||||
++ninst;
|
||||
NOTEST(x3);
|
||||
NOTEST(x1, x3);
|
||||
fpu_purgecache(dyn, ninst, 0, x1, x2, x3);
|
||||
jump_to_next(dyn, addr, 0, ninst);
|
||||
ok=0; need_epilog=0;
|
||||
}
|
||||
}
|
||||
if(need_epilog) {
|
||||
NOTEST(x3);
|
||||
NOTEST(x1, x3);
|
||||
fpu_purgecache(dyn, ninst, 0, x1, x2, x3);
|
||||
jump_to_epilog(dyn, ip, 0, ninst); // no linker here, it's an unknow instruction
|
||||
}
|
||||
|
||||
@@ -353,8 +353,10 @@ ARM_ cond 0 0 0 1 1 1 1 0 Rn Rd (1) (1) (1) (1) 1 0 0 1 Rt STREXH<c> <Rd>, <Rt>,
|
||||
ARM_ cond 0 0 0 1 1 1 1 1 Rn Rt (1) (1) (1) (1) 1 0 0 1 (1) (1) (1) (1) LDREXH<c> <Rt>, [<Rn>]
|
||||
ARM_ cond 0 0 1 0 0 0 0 S Rn Rd imm12 AND{S}<c> <Rd>, <Rn>, #<const>
|
||||
ARM_ cond 0 0 1 0 0 0 1 S Rn Rd imm12 EOR{S}<c> <Rd>, <Rn>, #<const>
|
||||
ARM_ cond 0 0 1 0 0 1 0 0 1 1 1 1 Rd imm12 ADR<c> <Rd>, #-<const>
|
||||
ARM_ cond 0 0 1 0 0 1 0 S Rn Rd imm12 SUB{S}<c> <Rd>, <Rn>, #<const>
|
||||
ARM_ cond 0 0 1 0 0 1 1 S Rn Rd imm12 RSB{S}<c> <Rd>, <Rn>, #<const>
|
||||
ARM_ cond 0 0 1 0 1 0 0 0 1 1 1 1 Rd imm12 ADR<c> <Rd>, #<const>
|
||||
ARM_ cond 0 0 1 0 1 0 0 S Rn Rd imm12 ADD{S}<c> <Rd>, <Rn>, #<const>
|
||||
ARM_ cond 0 0 1 0 1 0 1 S Rn Rd imm12 ADC{S}<c> <Rd>, <Rn>, #<const>
|
||||
ARM_ cond 0 0 1 0 1 1 0 S Rn Rd imm12 SBC{S}<c> <Rd>, <Rn>, #<const>
|
||||
|
||||
+18
-20
@@ -49,11 +49,6 @@ static uint32_t x86emu_parity_tab[8] =
|
||||
0x69969669,
|
||||
};
|
||||
|
||||
uint32_t* GetParityTab()
|
||||
{
|
||||
return x86emu_parity_tab;
|
||||
}
|
||||
|
||||
static void internalX86Setup(x86emu_t* emu, box86context_t *context, uintptr_t start, uintptr_t stack, int stacksize, int ownstack)
|
||||
{
|
||||
emu->context = context;
|
||||
@@ -232,10 +227,6 @@ void CloneEmu(x86emu_t *newemu, const x86emu_t* emu)
|
||||
newemu->mxcsr = emu->mxcsr;
|
||||
newemu->quit = emu->quit;
|
||||
newemu->error = emu->error;
|
||||
// adapt R_ESP to new stack frame
|
||||
uintptr_t oldst = (uintptr_t)((emu->init_stack)?emu->init_stack:emu->context->stack);
|
||||
uintptr_t newst = (uintptr_t)((newemu->init_stack)?newemu->init_stack:newemu->context->stack);
|
||||
newemu->regs[_SP].dword[0] = emu->regs[_SP].dword[0] + (intptr_t)(newst - oldst);
|
||||
}
|
||||
|
||||
void CopyEmu(x86emu_t *newemu, const x86emu_t* emu)
|
||||
@@ -338,6 +329,7 @@ const char* DumpCPURegs(x86emu_t* emu, uintptr_t ip)
|
||||
{
|
||||
static char buff[800];
|
||||
static const char* regname[] = {"EAX", "ECX", "EDX", "EBX", "ESP", "EBP", "ESI", "EDI"};
|
||||
static const char* segname[] = {"ES", "CS", "SS", "DS", "FS", "GS"};
|
||||
char tmp[80];
|
||||
buff[0] = '\0';
|
||||
if(trace_emm) {
|
||||
@@ -358,21 +350,27 @@ const char* DumpCPURegs(x86emu_t* emu, uintptr_t ip)
|
||||
}
|
||||
// start with FPU regs...
|
||||
if(emu->fpu_stack) {
|
||||
if(emu->fpu_stack<9)
|
||||
for (int i=0; i<emu->fpu_stack; i++) {
|
||||
//if(i==4) strcat(buff, "\n");
|
||||
sprintf(tmp, "ST%d=%f", i, emu->x87[(emu->top+i)&7].d);
|
||||
strcat(buff, tmp);
|
||||
int c = 10-strlen(tmp);
|
||||
if(c<1) c=1;
|
||||
while(c--) strcat(buff, " ");
|
||||
}
|
||||
else {
|
||||
sprintf(tmp, "Warning, incoherent fpu_stack=%d", emu->fpu_stack);
|
||||
int stack = emu->fpu_stack;
|
||||
if(stack>8) stack = 8;
|
||||
for (int i=0; i<stack; i++) {
|
||||
sprintf(tmp, "ST%d=%f", i, ST(i).d);
|
||||
strcat(buff, tmp);
|
||||
int c = 10-strlen(tmp);
|
||||
if(c<1) c=1;
|
||||
while(c--) strcat(buff, " ");
|
||||
if(i==3) strcat(buff, "\n");
|
||||
}
|
||||
sprintf(tmp, " C3210 = %d%d%d%d", emu->sw.f.F87_C3, emu->sw.f.F87_C2, emu->sw.f.F87_C1, emu->sw.f.F87_C0);
|
||||
strcat(buff, tmp);
|
||||
strcat(buff, "\n");
|
||||
}
|
||||
for (int i=0; i<6; ++i) {
|
||||
sprintf(tmp, "%s=0x%04x", segname[i], emu->segs[i]);
|
||||
strcat(buff, tmp);
|
||||
if(i!=_GS)
|
||||
strcat(buff, " ");
|
||||
}
|
||||
strcat(buff, "\n");
|
||||
for (int i=_AX; i<=_DI; ++i) {
|
||||
sprintf(tmp, "%s=%08x ", regname[i], emu->regs[i].dword[0]);
|
||||
strcat(buff, tmp);
|
||||
|
||||
@@ -198,6 +198,8 @@ void x86Int3(x86emu_t* emu)
|
||||
perr = 3;
|
||||
} else if(strstr(s, "strcasecmp")==s || strstr(s, "__strcasecmp")==s) {
|
||||
snprintf(buff, 256, "%04d|%p: Calling %s(\"%s\", \"%s\")", tid, *(void**)(R_ESP), s, *(char**)(R_ESP+4), *(char**)(R_ESP+8));
|
||||
} else if(strstr(s, "wcsncasecmp")==s) {
|
||||
snprintf(buff, 256, "%04d|%p: Calling %s(\"%S\", \"%S\", %d)", tid, *(void**)(R_ESP), s, *(wchar_t**)(R_ESP+4), *(wchar_t**)(R_ESP+8), *(int*)(R_ESP+12));
|
||||
} else if(strstr(s, "gtk_signal_connect_full")) {
|
||||
snprintf(buff, 256, "%04d|%p: Calling %s(%p, \"%s\", %p, %p, %p, %p, %d, %d)", tid, *(void**)(R_ESP), "gtk_signal_connect_full", *(void**)(R_ESP+4), *(char**)(R_ESP+8), *(void**)(R_ESP+12), *(void**)(R_ESP+16), *(void**)(R_ESP+20), *(void**)(R_ESP+24), *(int32_t*)(R_ESP+28), *(int32_t*)(R_ESP+32));
|
||||
} else if(strstr(s, "strcmp")==s || strstr(s, "__strcmp")==s) {
|
||||
@@ -268,6 +270,8 @@ void x86Int3(x86emu_t* emu)
|
||||
snprintf(buff, 256, "%04d|%p: Calling %s(%p, \"%s\")", tid, *(void**)(R_ESP), s, *(void**)(R_ESP+4), *(char**)(R_ESP+8));
|
||||
} else if(strstr(s, "glXGetProcAddress")==s) {
|
||||
snprintf(buff, 256, "%04d|%p: Calling %s(\"%s\")", tid, *(void**)(R_ESP), s, *(char**)(R_ESP+4));
|
||||
} else if (!strcmp(s, "glTexImage2D")) {
|
||||
snprintf(buff, 256, "%04d|%p: Calling %s(0x%x, %d, 0x%x, %d, %d, %d, 0x%x, 0x%x, %p)", tid, *(void**)(R_ESP), s, *(uint32_t*)(R_ESP+4), *(int*)(R_ESP+8), *(int*)(R_ESP+12), *(int*)(R_ESP+16), *(int*)(R_ESP+20), *(int*)(R_ESP+24), *(uint32_t*)(R_ESP+28), *(uint32_t*)(R_ESP+32), *(void**)(R_ESP+36));
|
||||
} else if(strstr(s, "sscanf")==s) {
|
||||
snprintf(buff, 256, "%04d|%p: Calling %s(\"%s\", \"%s\", ...)", tid, *(void**)(R_ESP), s, *(char**)(R_ESP+4), *(char**)(R_ESP+8));
|
||||
} else if(!strcmp(s, "vsscanf")) {
|
||||
@@ -298,6 +302,10 @@ void x86Int3(x86emu_t* emu)
|
||||
} else if(strstr(s, "__tls_get_addr")) {
|
||||
pu32 = *(uint32_t**)(R_ESP+4);
|
||||
snprintf(buff, 256, "%04d|%p: Calling %s(%p[%d, %d])", tid, *(void**)(R_ESP), s, pu32, pu32[0], pu32[1]);
|
||||
} else if (!strcmp(s, "FT_Outline_Get_CBox")) {
|
||||
pu32 = *(uint32_t**)(R_ESP+8);
|
||||
snprintf(buff, 256, "%04d|%p: Calling %s(%p, %p)", tid, *(void**)(R_ESP), s, *(void**)(R_ESP+4), *(void**)(R_ESP+8));
|
||||
post = 7;
|
||||
} else if (!strcmp(s, "XDrawImageString")) {
|
||||
snprintf(buff, 256, "%04d|%p: Calling %s(%p, %p, %p, %i, %i, %p\"%s\", %d)", tid, *(void**)(R_ESP), s, *(void**)(R_ESP+4), *(void**)(R_ESP+8), *(void**)(R_ESP+12), *(int*)(R_ESP+16), *(int*)(R_ESP+20), *(char**)(R_ESP+24), *(char**)(R_ESP+24), *(int*)(R_ESP+28));
|
||||
} else {
|
||||
@@ -329,6 +337,8 @@ void x86Int3(x86emu_t* emu)
|
||||
break;
|
||||
case 6: snprintf(buff2, 63, "(%S)", pu32?((wchar_t*)pu32):L"nil");
|
||||
break;
|
||||
case 7: snprintf(buff2, 63, " [%d / %d / %d /%d]", pu32[0], pu32[1], pu32[2], pu32[3]);
|
||||
break;
|
||||
}
|
||||
if(perr==1 && ((int)R_EAX)<0)
|
||||
snprintf(buff3, 63, " (errno=%d:\"%s\")", errno, strerror(errno));
|
||||
|
||||
@@ -229,6 +229,15 @@ uintptr_t Run0F(x86emu_t *emu, uintptr_t addr, int *step)
|
||||
nextop = F8;
|
||||
GET_ED_;
|
||||
break;
|
||||
case 0x20: /* MOV REG, crX */
|
||||
case 0x21: /* MOV REG, drX */
|
||||
case 0x22: /* MOV cxR, REG */
|
||||
case 0x23: /* MOV drX, REG */
|
||||
// this is a privilege opcode...
|
||||
#ifndef TEST_INTERPRETER
|
||||
emit_signal(emu, SIGSEGV, (void*)R_EIP, 0);
|
||||
#endif
|
||||
break;
|
||||
|
||||
case 0x28: /* MOVAPS Gx,Ex */
|
||||
nextop = F8;
|
||||
|
||||
@@ -812,7 +812,10 @@ uintptr_t GetSegmentBaseEmu(x86emu_t* emu, int seg)
|
||||
|
||||
const char* getAddrFunctionName(uintptr_t addr)
|
||||
{
|
||||
static char ret[1000];
|
||||
static char rets[8][1000];
|
||||
static int idx = 0;
|
||||
char* ret = rets[idx];
|
||||
idx = (idx+1)&7;
|
||||
uint32_t sz = 0;
|
||||
uintptr_t start = 0;
|
||||
elfheader_t* elf = FindElfAddress(my_context, addr);
|
||||
@@ -920,7 +923,11 @@ void PrintTrace(x86emu_t* emu, uintptr_t ip, int dynarec)
|
||||
if(peek==0xC3 || peek==0xC2) {
|
||||
printf_log(LOG_NONE, " => %p", *(void**)(R_ESP));
|
||||
printFunctionAddr(*(uintptr_t*)(R_ESP), "=> ");
|
||||
} else if(peek==0x55) {
|
||||
} else if(peek==0x55 || peek==0x57 || peek==0x53) {
|
||||
printf_log(LOG_NONE, " => STACK_TOP: %p", *(void**)(R_ESP));
|
||||
printFunctionAddr(*(uintptr_t*)(R_ESP), "top:");
|
||||
printFunctionAddr(ip, "here: ");
|
||||
} else if(peek==0x83 && PK(1)==0xEC) {
|
||||
printf_log(LOG_NONE, " => STACK_TOP: %p", *(void**)(R_ESP));
|
||||
printFunctionAddr(*(uintptr_t*)(R_ESP), "top:");
|
||||
printFunctionAddr(ip, "here: ");
|
||||
|
||||
+13
-2
@@ -144,9 +144,20 @@ uintptr_t RunD9(x86emu_t *emu, uintptr_t addr)
|
||||
emu->sw.f.F87_C1 = 0;
|
||||
break;
|
||||
case 0xF4: /* FXTRACT */
|
||||
ST0.d = frexp(ST0.d, &tmp32s);
|
||||
fpu_do_push(emu);
|
||||
ST0.d = tmp32s;
|
||||
if(isnan(ST1.d)) {
|
||||
ST0.d = ST1.d;
|
||||
} else if(isinf(ST1.d)) {
|
||||
ST0.d = ST1.d;
|
||||
ST1.d = INFINITY;
|
||||
} else if(ST1.d==0.0) {
|
||||
ST0.d = ST1.d;
|
||||
ST1.d = -INFINITY;
|
||||
} else {
|
||||
// LD80bits doesn't have implicit "1" bit, so need to adjust for that
|
||||
ST0.d = frexp(ST1.d, &tmp32s)*2;
|
||||
ST1.d = tmp32s-1;
|
||||
}
|
||||
// C1 set only if stack under/overflow occurs
|
||||
break;
|
||||
|
||||
|
||||
+3
-3
@@ -172,10 +172,10 @@ uintptr_t RunDB(x86emu_t *emu, uintptr_t addr)
|
||||
break;
|
||||
case 7: /* FSTP tbyte */
|
||||
GET_EDT;
|
||||
if(ST0.q!=STld(0).uref)
|
||||
D2LD(&ST0.d, ED);
|
||||
else
|
||||
if(STld(0).uref && (ST0.q==STld(0).uref))
|
||||
memcpy(ED, &STld(0).ld, 10);
|
||||
else
|
||||
D2LD(&ST0.d, ED);
|
||||
fpu_do_pop(emu);
|
||||
break;
|
||||
default:
|
||||
|
||||
+24
-12
@@ -116,6 +116,7 @@ int my_socketcall(x86emu_t* emu, int n, unsigned long *args) {
|
||||
#define O_NONBLOCK 04000
|
||||
#endif
|
||||
int my_fcntl(x86emu_t* emu, int fd, int cmd, ... /* arg */ );
|
||||
long my_ptrace(x86emu_t* emu, int request, pid_t pid, void* addr, uint32_t* data);
|
||||
|
||||
// Syscall table for x86 can be found here: http://shell-storm.org/shellcode/files/syscalls.html
|
||||
typedef struct scwrap_s {
|
||||
@@ -141,6 +142,7 @@ scwrap_t syscallwrap[] = {
|
||||
[19] { __NR_lseek, 3 },
|
||||
[20] { __NR_getpid, 0 },
|
||||
[24] { __NR_getuid, 0 },
|
||||
//[26] ={__NR_ptrace, 4},
|
||||
#ifdef __NR_alarm
|
||||
[27] { __NR_alarm, 1 },
|
||||
#endif
|
||||
@@ -485,6 +487,11 @@ void EXPORT x86Syscall(x86emu_t *emu)
|
||||
S_EAX = -errno;
|
||||
break;
|
||||
#endif
|
||||
case 26: // sys_ptrace
|
||||
S_EAX = my_ptrace(emu, R_EBX, R_ECX, (void*)R_EDX, (void*)R_ESI);
|
||||
if(S_EAX==-1 && errno>0)
|
||||
S_EAX = -errno;
|
||||
break;
|
||||
#ifndef __NR_alarm
|
||||
case 27:
|
||||
R_EAX = alarm(R_EBX);
|
||||
@@ -581,6 +588,7 @@ void EXPORT x86Syscall(x86emu_t *emu)
|
||||
break;
|
||||
case 120: // clone
|
||||
// x86 raw syscall is long clone(unsigned long flags, void *stack, int *parent_tid, unsigned long tls, int *child_tid);
|
||||
printf_log(LOG_DEBUG, "clone syscall flags=0x%x, stack=%p, parent_tid=%d,tls=%p, child_tid=%d\n", R_EBX, (void*)R_ECX, R_EDX, (void*)R_ESI, R_EDI);
|
||||
// so flags=R_EBX, stack=R_ECX, parent_tid=R_EDX, tls=R_ESI, child_tid=R_EDI
|
||||
if((R_EBX&~0xff)==0x4100) {
|
||||
// this is a case of vfork...
|
||||
@@ -592,6 +600,7 @@ void EXPORT x86Syscall(x86emu_t *emu)
|
||||
{
|
||||
void* stack_base = (void*)R_ECX;
|
||||
int stack_size = 0;
|
||||
uintptr_t sp = R_ECX;
|
||||
if(!R_ECX) {
|
||||
// allocate a new stack...
|
||||
int currstack = 0;
|
||||
@@ -600,18 +609,19 @@ void EXPORT x86Syscall(x86emu_t *emu)
|
||||
stack_size = (currstack)?emu->size_stack:(1024*1024);
|
||||
stack_base = mmap(NULL, stack_size, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_GROWSDOWN, -1, 0);
|
||||
// copy value from old stack to new stack
|
||||
if(currstack)
|
||||
if(currstack) {
|
||||
memcpy(stack_base, emu->init_stack, stack_size);
|
||||
else {
|
||||
sp = (uintptr_t)emu->init_stack + R_ESP - (uintptr_t)stack_base;
|
||||
} else {
|
||||
int size_to_copy = (uintptr_t)emu->init_stack + emu->size_stack - (R_ESP);
|
||||
memcpy(stack_base+stack_size-size_to_copy, (void*)R_ESP, size_to_copy);
|
||||
sp = (uintptr_t)stack_base+stack_size-size_to_copy;
|
||||
}
|
||||
}
|
||||
x86emu_t * newemu = NewX86Emu(emu->context, R_EIP, (uintptr_t)stack_base, stack_size, (R_ECX)?0:1);
|
||||
SetupX86Emu(newemu);
|
||||
CloneEmu(newemu, emu);
|
||||
Push32(newemu, 0);
|
||||
PushExit(newemu);
|
||||
newemu->regs[_SP].dword[0] = sp; // setupnew stack pointer
|
||||
void* mystack = NULL;
|
||||
if(my_context->stack_clone_used) {
|
||||
mystack = box_malloc(1024*1024); // stack for own process... memory leak, but no practical way to remove it
|
||||
@@ -685,7 +695,7 @@ void EXPORT x86Syscall(x86emu_t *emu)
|
||||
{
|
||||
struct stat64 st;
|
||||
unsigned int r = syscall(__NR_stat64, R_EBX, &st);
|
||||
UnalignStat64(&st, (void*)R_ECX);
|
||||
UnalignSysStat64(&st, (void*)R_ECX);
|
||||
|
||||
R_EAX = r;
|
||||
}
|
||||
@@ -696,7 +706,7 @@ void EXPORT x86Syscall(x86emu_t *emu)
|
||||
{
|
||||
struct stat64 st;
|
||||
unsigned int r = syscall(__NR_lstat64, R_EBX, &st);
|
||||
UnalignStat64(&st, (void*)R_ECX);
|
||||
UnalignSysStat64(&st, (void*)R_ECX);
|
||||
|
||||
R_EAX = r;
|
||||
}
|
||||
@@ -707,7 +717,7 @@ void EXPORT x86Syscall(x86emu_t *emu)
|
||||
{
|
||||
struct stat64 st;
|
||||
unsigned int r = syscall(__NR_fstat64, R_EBX, &st);
|
||||
UnalignStat64(&st, (void*)R_ECX);
|
||||
UnalignSysStat64(&st, (void*)R_ECX);
|
||||
|
||||
R_EAX = r;
|
||||
}
|
||||
@@ -850,6 +860,7 @@ long EXPORT my_syscall(x86emu_t *emu)
|
||||
{
|
||||
void* stack_base = p(8);
|
||||
int stack_size = 0;
|
||||
uintptr_t sp = u32(8);
|
||||
if(!stack_base) {
|
||||
// allocate a new stack...
|
||||
int currstack = 0;
|
||||
@@ -858,18 +869,19 @@ long EXPORT my_syscall(x86emu_t *emu)
|
||||
stack_size = (currstack)?emu->size_stack:(1024*1024);
|
||||
stack_base = mmap(NULL, stack_size, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_GROWSDOWN, -1, 0);
|
||||
// copy value from old stack to new stack
|
||||
if(currstack)
|
||||
if(currstack) {
|
||||
memcpy(stack_base, emu->init_stack, stack_size);
|
||||
else {
|
||||
sp = (uintptr_t)emu->init_stack + R_ESP - (uintptr_t)stack_base;
|
||||
} else {
|
||||
int size_to_copy = (uintptr_t)emu->init_stack + emu->size_stack - (R_ESP);
|
||||
memcpy(stack_base+stack_size-size_to_copy, (void*)R_ESP, size_to_copy);
|
||||
sp = (uintptr_t)stack_base+stack_size-size_to_copy;
|
||||
}
|
||||
}
|
||||
x86emu_t * newemu = NewX86Emu(emu->context, R_EIP, (uintptr_t)stack_base, stack_size, (p(8))?0:1);
|
||||
SetupX86Emu(newemu);
|
||||
CloneEmu(newemu, emu);
|
||||
Push32(newemu, 0);
|
||||
PushExit(newemu);
|
||||
newemu->regs[_SP].dword[0] = sp;
|
||||
void* mystack = NULL;
|
||||
if(my_context->stack_clone_used) {
|
||||
mystack = box_malloc(1024*1024); // stack for own process... memory leak, but no practical way to remove it
|
||||
@@ -924,7 +936,7 @@ long EXPORT my_syscall(x86emu_t *emu)
|
||||
#endif
|
||||
#ifndef __NR_memfd_create
|
||||
case 356: // memfd_create
|
||||
return my_memfd_create(emu, (void*)R_EBX, R_ECX);
|
||||
return my_memfd_create(emu, p(4), u32(8));
|
||||
#endif
|
||||
case 449:
|
||||
#ifdef __NR_futex_waitv
|
||||
|
||||
+2
-2
@@ -241,8 +241,8 @@ void* resizeTLSData(box86context_t *context, void* oldptr)
|
||||
for (int i=oldata->n_elfs; i<context->elfsize; ++i) {
|
||||
// set pointer
|
||||
dtp = (uintptr_t)ptr + GetTLSBase(context->elfs[i]);
|
||||
*(uint64_t*)((uintptr_t)ptr+POS_TLS+i*8) = dtp;
|
||||
*(uint64_t*)((uintptr_t)ptr+POS_TLS+i*8+4) = i; // index
|
||||
*(uint32_t*)((uintptr_t)ptr+POS_TLS+i*8) = dtp;
|
||||
*(uint32_t*)((uintptr_t)ptr+POS_TLS+i*8+4) = i; // index
|
||||
}
|
||||
oldata->n_elfs = context->elfsize;
|
||||
}
|
||||
|
||||
+43
-54
@@ -77,53 +77,45 @@ void LD2D(void* ld, void* d)
|
||||
*(uint64_t*)d = *(uint64_t*)ld;
|
||||
return;
|
||||
}
|
||||
FPU_t result;
|
||||
FPU_t result;
|
||||
#pragma pack(push, 1)
|
||||
struct {
|
||||
FPU_t f;
|
||||
int16_t b;
|
||||
} val;
|
||||
struct {
|
||||
FPU_t f;
|
||||
int16_t b;
|
||||
} val;
|
||||
#pragma pack(pop)
|
||||
#if 1
|
||||
memcpy(&val, ld, 10);
|
||||
#else
|
||||
val.f.ud[0] = *(uint32_t*)ld;
|
||||
val.f.ud[0] = *(uint32_t*)ld;
|
||||
val.f.ud[1] = *(uint32_t*)(char*)(ld+4);
|
||||
val.b = *(int16_t*)((char*)ld+8);
|
||||
val.b = *(int16_t*)((char*)ld+8);
|
||||
#endif
|
||||
int32_t exp64 = (((uint32_t)(val.b&0x7fff) - BIAS80) + BIAS64);
|
||||
int32_t exp64final = exp64&0x7ff;
|
||||
// do specific value first (0, infinite...)
|
||||
// bit 63 is "integer part"
|
||||
// bit 62 is sign
|
||||
if((uint32_t)(val.b&0x7fff)==0x7fff) {
|
||||
// infinity and nans
|
||||
int t = 0; //nan
|
||||
switch((val.f.ud[1]>>30)) {
|
||||
case 0: if((val.f.ud[1]&(1<<29))==0) t = 1;
|
||||
break;
|
||||
case 2: if((val.f.ud[1]&(1<<29))==0) t = 1;
|
||||
break;
|
||||
}
|
||||
int t = (val.f.q&0x7fffffffffffffffLL)?0:1;
|
||||
if(t) { // infinite
|
||||
result.d = HUGE_VAL;
|
||||
} else { // NaN
|
||||
result.ud[1] = 0x7ff << 20;
|
||||
result.ud[1] = (val.b>>4) << 20;
|
||||
result.ud[0] = 0;
|
||||
} else { // NaN
|
||||
result.ud[1] = (val.b>>4) << 20 | ((val.f.q>>(63-20))&0x000fffff);
|
||||
result.ud[0] = (val.f.q>>(63-56))&0xffffffff;
|
||||
if(!(result.q&0x000fffffffffffffLL))
|
||||
result.q |= 1;
|
||||
}
|
||||
if(val.b&0x8000)
|
||||
result.ud[1] |= 0x80000000;
|
||||
*(uint64_t*)d = result.q;
|
||||
return;
|
||||
}
|
||||
int32_t exp64 = (((uint32_t)(val.b&0x7fff) - BIAS80) + BIAS64);
|
||||
int32_t exp64final = exp64&0x7ff;
|
||||
if(((uint32_t)(val.b&0x7fff)==0) || (exp64<-1074)) {
|
||||
//if(val.f.ll==0)
|
||||
//if(val.f.q==0)
|
||||
// zero
|
||||
//if(val.f.ll!=0)
|
||||
//if(val.f.q!=0)
|
||||
// denormal, but that's to small value for double
|
||||
uint64_t r = 0;
|
||||
if(val.b&0x8000)
|
||||
r |= 0x8000000000000000LL;
|
||||
uint64_t r = (val.b&0x8000)?0x8000000000000000LL:0LL;
|
||||
*(uint64_t*)d = r;
|
||||
return;
|
||||
}
|
||||
@@ -149,12 +141,12 @@ void LD2D(void* ld, void* d)
|
||||
return;
|
||||
}
|
||||
|
||||
uint64_t mant64 = (val.f.q >> 11) & 0xfffffffffffffLL;
|
||||
uint32_t sign = (val.b&0x8000)?1:0;
|
||||
uint64_t mant64 = (val.f.q >> 11) & 0xfffffffffffffL;
|
||||
uint32_t sign = (val.b&0x8000)?1:0;
|
||||
result.q = mant64;
|
||||
result.ud[1] |= (sign <<31)|((exp64final&0x7ff) << 20);
|
||||
result.ud[1] |= (sign <<31)|((exp64final&0x7ff) << 20);
|
||||
|
||||
*(uint64_t*)d = result.q;
|
||||
*(uint64_t*)d = result.q;
|
||||
}
|
||||
|
||||
// double (64bits) -> long double (80bits)
|
||||
@@ -165,40 +157,37 @@ void D2LD(void* d, void* ld)
|
||||
return;
|
||||
}
|
||||
#pragma pack(push, 1)
|
||||
struct {
|
||||
FPU_t f;
|
||||
int16_t b;
|
||||
} val;
|
||||
struct {
|
||||
FPU_t f;
|
||||
int16_t b;
|
||||
} val;
|
||||
#pragma pack(pop)
|
||||
FPU_t s;
|
||||
s.q = *(uint64_t*)d; // use memcpy to avoid risk of Bus Error?
|
||||
// do special value first
|
||||
if((s.q&0x7fffffffffffffffLL)==0) {
|
||||
if((s.q&0x7fffffffffffffffL)==0) {
|
||||
// zero...
|
||||
val.f.q = 0;
|
||||
if(s.ud[1]&0x8000)
|
||||
val.b = 0x8000;
|
||||
else
|
||||
val.b = 0;
|
||||
val.b = (s.ud[1]&0x80000000)?0x8000:0;
|
||||
memcpy(ld, &val, 10);
|
||||
return;
|
||||
}
|
||||
|
||||
int32_t sign80 = (s.ud[1]&0x80000000)?1:0;
|
||||
int32_t exp80 = s.ud[1]&0x7ff00000;
|
||||
int32_t exp80final = (exp80>>20);
|
||||
int64_t mant80 = s.sq&0x000fffffffffffffLL;
|
||||
int64_t mant80final = (mant80 << 11);
|
||||
int32_t sign80 = (s.ud[1]&0x80000000)?1:0;
|
||||
int32_t exp80 = s.ud[1]&0x7ff00000;
|
||||
int32_t exp80final = (exp80>>20);
|
||||
uint64_t mant80 = s.q&0x000fffffffffffffL;
|
||||
uint64_t mant80final = (mant80 << 11);
|
||||
if(exp80final==0x7ff) {
|
||||
// NaN and Infinite
|
||||
exp80final = 0x7fff;
|
||||
if(mant80==0x0)
|
||||
mant80final = 0x8000000000000000LL; //infinity
|
||||
mant80final = 0x8000000000000000L; //infinity
|
||||
else
|
||||
mant80final = 0xc000000000000000LL; //(quiet)NaN
|
||||
mant80final |= 0x8000000000000000L; //(quiet)NaN
|
||||
} else {
|
||||
if(exp80!=0){
|
||||
mant80final |= 0x8000000000000000LL;
|
||||
mant80final |= 0x8000000000000000L;
|
||||
exp80final += (BIAS80 - BIAS64);
|
||||
} else if(mant80final!=0) {
|
||||
// denormals -> normal
|
||||
@@ -208,8 +197,8 @@ void D2LD(void* d, void* ld)
|
||||
mant80final<<=one;
|
||||
}
|
||||
}
|
||||
val.b = ((int16_t)(sign80)<<15)| (int16_t)(exp80final);
|
||||
val.f.sq = mant80final;
|
||||
val.b = ((int16_t)(sign80)<<15)| (int16_t)(exp80final);
|
||||
val.f.q = mant80final;
|
||||
memcpy(ld, &val, 10);
|
||||
/*memcpy(ld, &f.ll, 8);
|
||||
memcpy((char*)ld + 8, &val.b, 2);*/
|
||||
@@ -295,7 +284,7 @@ void fpu_fxsave(x86emu_t* emu, void* ed)
|
||||
int top = emu->top&7;
|
||||
int stack = 8-top;
|
||||
if(top==0) // check if stack is full or empty, based on tag[0]
|
||||
stack = (emu->fpu_tags&0b11)?8:0;
|
||||
stack = (emu->fpu_tags)?8:0;
|
||||
emu->sw.f.F87_TOP = top;
|
||||
p->ControlWord = emu->cw.x16;
|
||||
p->StatusWord = emu->sw.x16;
|
||||
@@ -303,7 +292,7 @@ void fpu_fxsave(x86emu_t* emu, void* ed)
|
||||
p->MxCsr_Mask = 0;
|
||||
uint8_t tags = 0;
|
||||
for (int i=0; i<8; ++i)
|
||||
tags |= ((emu->fpu_tags>>(i*2))&0b11)?0:1;
|
||||
tags |= (((emu->fpu_tags>>(i*2))&0b11)?0:1)<<i;
|
||||
p->TagWord = tags;
|
||||
p->ErrorOpcode = 0;
|
||||
p->ErrorOffset = 0;
|
||||
@@ -327,12 +316,12 @@ void fpu_fxrstor(x86emu_t* emu, void* ed)
|
||||
uint8_t tags = p->TagWord;
|
||||
emu->fpu_tags = 0;
|
||||
for(int i=0; i<8; ++i)
|
||||
emu->fpu_tags |= (((tags>>(i*2))&0b1)?0:0b11)<<(i*2);
|
||||
emu->fpu_tags |= (((tags>>i)&0b1)?0:0b11)<<(i*2);
|
||||
// copy back MMX regs...
|
||||
int top = emu->top&7;
|
||||
int stack = 8-top;
|
||||
if(top==0) // check if stack is full or empty, based on tag[0]
|
||||
stack = (emu->fpu_tags&0b11)?8:0;
|
||||
stack = (emu->fpu_tags)?0:8;
|
||||
for(int i=0; i<8; ++i)
|
||||
memcpy((i<stack)?&ST(i):&emu->mmx[i], &p->FloatRegisters[i].q[0], sizeof(mmx87_regs_t));
|
||||
// copy SSE regs
|
||||
|
||||
@@ -84,6 +84,10 @@ static inline void fpu_fcom(x86emu_t* emu, double b)
|
||||
emu->sw.f.F87_C0 = 1;
|
||||
emu->sw.f.F87_C2 = 1;
|
||||
emu->sw.f.F87_C3 = 1;
|
||||
} else if ((b==-INFINITY) || (ST0.d==INFINITY)) {
|
||||
emu->sw.f.F87_C0 = 0;
|
||||
emu->sw.f.F87_C2 = 0;
|
||||
emu->sw.f.F87_C3 = 0;
|
||||
} else if (isgreater(ST0.d, b)) {
|
||||
emu->sw.f.F87_C0 = 0;
|
||||
emu->sw.f.F87_C2 = 0;
|
||||
@@ -111,6 +115,10 @@ static inline void fpu_fcomi(x86emu_t* emu, double b)
|
||||
SET_FLAG(F_CF);
|
||||
SET_FLAG(F_PF);
|
||||
SET_FLAG(F_ZF);
|
||||
} else if ((b==-INFINITY) || (ST0.d==INFINITY)) {
|
||||
CLEAR_FLAG(F_CF);
|
||||
CLEAR_FLAG(F_PF);
|
||||
CLEAR_FLAG(F_ZF);
|
||||
} else if (isgreater(ST0.d, b)) {
|
||||
CLEAR_FLAG(F_CF);
|
||||
CLEAR_FLAG(F_PF);
|
||||
|
||||
@@ -10,6 +10,8 @@ extern int box86_dynarec;
|
||||
extern uintptr_t box86_pagesize;
|
||||
extern uintptr_t box86_load_addr;
|
||||
extern int box86_showbt;
|
||||
extern int box86_maxcpu;
|
||||
extern int box86_maxcpu_immutable;
|
||||
#ifdef DYNAREC
|
||||
extern int box86_dynarec_dump;
|
||||
extern int box86_dynarec_trace;
|
||||
@@ -59,6 +61,7 @@ extern int box86_musl;
|
||||
extern int box86_nopulse; // disabling the use of wrapped pulseaudio
|
||||
extern int box86_nogtk; // disabling the use of wrapped gtk
|
||||
extern int box86_novulkan; // disabling the use of wrapped vulkan
|
||||
extern int box86_nocrashhandler;
|
||||
extern int box86_futex_waitv;
|
||||
extern int box86_mapclean;
|
||||
extern int box86_showsegv;
|
||||
|
||||
+39
-9
@@ -25,8 +25,11 @@ void myStackAlignW(const char* fmt, uint32_t* st, uint32_t* mystack);
|
||||
|
||||
void AlignStat64(const void* source, void* dest);
|
||||
void UnalignStat64(const void* source, void* dest);
|
||||
void UnalignSysStat64(const void* source, void* dest);
|
||||
void UnalignStat(const void* source, void* dest);
|
||||
|
||||
void UnalignStatFS64(const void* source, void* dest);
|
||||
void UnalignStatFS(const void* source, void* dest);
|
||||
|
||||
void UnalignOggVorbis(void* dest, void* source); // Arm -> x86
|
||||
void AlignOggVorbis(void* dest, void* source); // x86 -> Arm
|
||||
@@ -43,6 +46,9 @@ void AlignEpollEvent(void* dest, void* source, int nbr); // x86 -> Arm
|
||||
void UnalignSmpegInfo(void* dest, void* source); // Arm -> x86
|
||||
void AlignSmpegInfo(void* dest, void* source); // x86 -> Arm
|
||||
|
||||
void Timespec2Timespec64(void* dest, const void* source);
|
||||
void Timespec642Timespec(void* dest, const void* source);
|
||||
|
||||
// stat64 is packed on i386, not on arm (and possibly other structures)
|
||||
#undef st_atime
|
||||
#undef st_atime_nsec
|
||||
@@ -50,19 +56,43 @@ void AlignSmpegInfo(void* dest, void* source); // x86 -> Arm
|
||||
#undef st_mtime_nsec
|
||||
#undef st_ctime
|
||||
#undef st_ctime_nsec
|
||||
|
||||
struct i386_stat {
|
||||
uint64_t st_dev;
|
||||
uint32_t __pad1;
|
||||
uint32_t st_ino;
|
||||
uint32_t st_mode;
|
||||
uint32_t st_nlink;
|
||||
uint32_t st_uid;
|
||||
uint32_t st_gid;
|
||||
uint64_t st_rdev;
|
||||
uint32_t __pad2;
|
||||
int32_t st_size;
|
||||
int32_t st_blksize;
|
||||
int32_t st_blocks;
|
||||
int32_t st_atime_sec;
|
||||
uint32_t st_atime_nsec;
|
||||
int32_t st_mtime_sec;
|
||||
uint32_t st_mtime_nsec;
|
||||
int32_t st_ctime_sec;
|
||||
uint32_t st_ctime_nsec;
|
||||
uint32_t __unused4;
|
||||
uint32_t __unused5;
|
||||
} __attribute__((packed));
|
||||
|
||||
struct i386_stat64 {
|
||||
uint64_t st_dev;
|
||||
uint8_t __pad0[4];
|
||||
uint32_t __st_ino;
|
||||
uint32_t st_mode;
|
||||
uint32_t st_nlink;
|
||||
uint32_t st_uid;
|
||||
uint32_t st_gid;
|
||||
uint32_t __pad0;
|
||||
uint32_t __st_ino;
|
||||
uint32_t st_mode;
|
||||
uint32_t st_nlink;
|
||||
uint32_t st_uid;
|
||||
uint32_t st_gid;
|
||||
uint64_t st_rdev;
|
||||
uint8_t __pad3[4];
|
||||
uint32_t __pad3;
|
||||
int64_t st_size;
|
||||
uint32_t st_blksize;
|
||||
uint64_t st_blocks;
|
||||
uint32_t st_blksize;
|
||||
uint64_t st_blocks;
|
||||
uint32_t st_atime;
|
||||
uint32_t st_atime_nsec;
|
||||
uint32_t st_mtime;
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
#ifndef __STAT64_HELPER_H_
|
||||
#define __STAT64_HELPER_H_
|
||||
|
||||
int stat64_time64_helper(void *path, void *buf);
|
||||
int fstatat64_time64_helper(int dirfd, void *path, void *buf, int flags);
|
||||
int fstat64_time64_helper(int fd, void *buf);
|
||||
int lstat64_time64_helper(void *path, void *buf);
|
||||
|
||||
#endif
|
||||
@@ -14,7 +14,6 @@ void CopyEmu(x86emu_t *newemu, const x86emu_t* emu);
|
||||
void SetTraceEmu(uintptr_t trace_start, uintptr_t trace_end);
|
||||
|
||||
box86context_t* GetEmuContext(x86emu_t* emu);
|
||||
uint32_t* GetParityTab();
|
||||
|
||||
uint32_t GetEAX(x86emu_t *emu);
|
||||
uint64_t GetEDXEAX(x86emu_t *emu);
|
||||
|
||||
@@ -452,6 +452,15 @@ library_t *NewLibrary(const char* path, box86context_t* context, elfheader_t* ve
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
if(box86_nocrashhandler) {
|
||||
if(strstr(lib->name, "crashhandler.so")==lib->name) {
|
||||
box_free(lib->name);
|
||||
box_free(lib->path);
|
||||
initDummyLib(lib);
|
||||
//box_free(lib);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
int notwrapped = FindInCollection(lib->name, &context->box86_emulated_libs);
|
||||
int essential = isEssentialLib(lib->name);
|
||||
if(!notwrapped && box86_prefer_emulated && !essential)
|
||||
|
||||
+1
-1
@@ -265,5 +265,5 @@ GO("libxml2.so.2", xml2)
|
||||
|
||||
GO("ld-linux.so.2", ldlinux)
|
||||
|
||||
GO("crashhandler.so", crashhandler)
|
||||
//GO("crashhandler.so", crashhandler)
|
||||
GO("libv4l2.so.0", libv4l2)
|
||||
@@ -1,5 +1,6 @@
|
||||
#undef _LARGEFILE_SOURCE
|
||||
#undef _FILE_OFFSET_BITS
|
||||
#undef _TIME_BITS
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
@@ -7,6 +8,8 @@
|
||||
#include <wchar.h>
|
||||
#include <sys/epoll.h>
|
||||
#include <fts.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/statfs.h>
|
||||
|
||||
#include "x86emu.h"
|
||||
#include "emu/x86emu_private.h"
|
||||
@@ -917,3 +920,87 @@ void unalignNGValue(void* value, my_GValue_t* v, int n)
|
||||
--n;
|
||||
}
|
||||
}
|
||||
|
||||
void UnalignStat(const void* source, void* dest)
|
||||
{
|
||||
struct i386_stat *i386st = (struct i386_stat*)dest;
|
||||
struct stat *st = (struct stat*) source;
|
||||
|
||||
i386st->__pad1 = 0;
|
||||
i386st->__pad2 = 0;
|
||||
i386st->st_dev = st->st_dev;
|
||||
i386st->st_ino = st->st_ino;
|
||||
i386st->st_mode = st->st_mode;
|
||||
i386st->st_nlink = st->st_nlink;
|
||||
i386st->st_uid = st->st_uid;
|
||||
i386st->st_gid = st->st_gid;
|
||||
i386st->st_rdev = st->st_rdev;
|
||||
i386st->st_size = st->st_size;
|
||||
i386st->st_blksize = st->st_blksize;
|
||||
i386st->st_blocks = st->st_blocks;
|
||||
#if defined(__USE_XOPEN2K8) || defined(ANDROID) || defined(PANDORA)
|
||||
i386st->st_atime_sec = st->st_atim.tv_sec;
|
||||
i386st->st_atime_nsec = st->st_atim.tv_nsec;
|
||||
i386st->st_mtime_sec = st->st_mtim.tv_sec;
|
||||
i386st->st_mtime_nsec = st->st_mtim.tv_nsec;
|
||||
i386st->st_ctime_sec = st->st_ctim.tv_sec;
|
||||
i386st->st_ctime_nsec = st->st_ctim.tv_nsec;
|
||||
#else
|
||||
i386st->st_atime_sec = st->st_atime;
|
||||
i386st->st_atime_nsec = st->st_atimensec;
|
||||
i386st->st_mtime_sec = st->st_mtime;
|
||||
i386st->st_mtime_nsec = st->st_mtimensec;
|
||||
i386st->st_ctime_sec = st->st_ctime;
|
||||
i386st->st_ctime_nsec = st->st_ctimensec;
|
||||
#endif
|
||||
}
|
||||
|
||||
void UnalignStatFS(const void* source, void* dest)
|
||||
{
|
||||
struct i386_statfs *i386st = (struct i386_statfs*)dest;
|
||||
struct statfs *st = (struct statfs*) source;
|
||||
|
||||
i386st->f_type = st->f_type;
|
||||
i386st->f_bsize = st->f_bsize;
|
||||
i386st->f_blocks = st->f_blocks;
|
||||
i386st->f_bfree = st->f_bfree;
|
||||
i386st->f_bavail = st->f_bavail;
|
||||
i386st->f_files = st->f_files;
|
||||
i386st->f_ffree = st->f_ffree;
|
||||
memcpy(&i386st->f_fsid, &st->f_fsid, sizeof(i386st->f_fsid));
|
||||
i386st->f_namelen = st->f_namelen;
|
||||
i386st->f_frsize = st->f_frsize;
|
||||
#ifndef PANDORA
|
||||
i386st->f_flags = st->f_flags;
|
||||
#endif
|
||||
i386st->f_spare[0] = st->f_spare[0];
|
||||
i386st->f_spare[1] = st->f_spare[1];
|
||||
i386st->f_spare[2] = st->f_spare[2];
|
||||
i386st->f_spare[3] = st->f_spare[3];
|
||||
}
|
||||
|
||||
typedef struct my_timespec_s {
|
||||
int tv_sec;
|
||||
int tv_nsec;
|
||||
} my_timespec_t;
|
||||
|
||||
typedef struct my_timespec64_s {
|
||||
int64_t tv_sec;
|
||||
int tv_nsec;
|
||||
int :32;
|
||||
} my_timespec64_t;
|
||||
|
||||
void Timespec2Timespec64(void* dest, const void* source)
|
||||
{
|
||||
my_timespec64_t* dst = (my_timespec64_t*)dest;
|
||||
my_timespec_t* src = (my_timespec_t*)source;
|
||||
dst->tv_sec = src->tv_sec;
|
||||
dst->tv_nsec = src->tv_nsec;
|
||||
}
|
||||
void Timespec642Timespec(void* dest, const void* source)
|
||||
{
|
||||
my_timespec_t* dst = (my_timespec_t*)dest;
|
||||
my_timespec64_t* src = (my_timespec64_t*)source;
|
||||
dst->tv_sec = src->tv_sec;
|
||||
dst->tv_nsec = src->tv_nsec;
|
||||
}
|
||||
+29
-11
@@ -5,27 +5,28 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdint.h>
|
||||
#include <asm/stat.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/vfs.h>
|
||||
#include <signal.h>
|
||||
#include <stddef.h>
|
||||
|
||||
#include "x86emu.h"
|
||||
#include "emu/x86emu_private.h"
|
||||
#include "myalign.h"
|
||||
#include "debug.h"
|
||||
|
||||
void UnalignStat64(const void* source, void* dest)
|
||||
{
|
||||
struct i386_stat64 *i386st = (struct i386_stat64*)dest;
|
||||
struct stat64 *st = (struct stat64*) source;
|
||||
|
||||
memset(i386st->__pad0, 0, sizeof(i386st->__pad0));
|
||||
memset(i386st->__pad3, 0, sizeof(i386st->__pad3));
|
||||
i386st->__pad0 = 0;
|
||||
i386st->__pad3 = 0;
|
||||
i386st->st_dev = st->st_dev;
|
||||
#ifndef POWERPCLE
|
||||
i386st->__st_ino = st->__st_ino;
|
||||
#if defined(__USE_TIME64_REDIRECTS) || defined(POWERPCLE) || !defined(HAVE_ST_INO)
|
||||
i386st->__st_ino = st->st_ino;
|
||||
#else
|
||||
i386st->__st_ino = st->st_ino; // Separate __st_ino doesn't
|
||||
// exist on powerpc
|
||||
i386st->__st_ino = st->__st_ino;
|
||||
#endif
|
||||
i386st->st_mode = st->st_mode;
|
||||
i386st->st_nlink = st->st_nlink;
|
||||
@@ -35,12 +36,21 @@ void UnalignStat64(const void* source, void* dest)
|
||||
i386st->st_size = st->st_size;
|
||||
i386st->st_blksize = st->st_blksize;
|
||||
i386st->st_blocks = st->st_blocks;
|
||||
#if defined(__USE_XOPEN2K8) || defined(ANDROID) || defined(PANDORA)
|
||||
i386st->st_atime = st->st_atim.tv_sec;
|
||||
i386st->st_atime_nsec = st->st_atim.tv_nsec;
|
||||
i386st->st_mtime = st->st_mtim.tv_sec;
|
||||
i386st->st_mtime_nsec = st->st_mtim.tv_nsec;
|
||||
i386st->st_ctime = st->st_ctim.tv_sec;
|
||||
i386st->st_ctime_nsec = st->st_ctim.tv_nsec;
|
||||
#else
|
||||
i386st->st_atime = st->st_atime;
|
||||
i386st->st_atime_nsec = st->st_atime_nsec;
|
||||
i386st->st_mtime = st->st_mtime;
|
||||
i386st->st_mtime_nsec = st->st_mtime_nsec;
|
||||
i386st->st_ctime = st->st_ctime;
|
||||
i386st->st_ctime_nsec = st->st_ctime_nsec;
|
||||
#endif
|
||||
i386st->st_ino = st->st_ino;
|
||||
}
|
||||
|
||||
@@ -50,11 +60,10 @@ void AlignStat64(const void* source, void* dest)
|
||||
struct i386_stat64 *i386st = (struct i386_stat64*)source;
|
||||
|
||||
st->st_dev = i386st->st_dev;
|
||||
#ifndef POWERPCLE
|
||||
st->__st_ino = i386st->__st_ino;
|
||||
#if defined(__USE_TIME64_REDIRECTS) || defined(POWERPCLE)|| !defined(HAVE_ST_INO)
|
||||
// Separate __st_ino doesn't exist
|
||||
#else
|
||||
st->st_ino = i386st->__st_ino; // Separate __st_ino doesn't
|
||||
// exist on powerpc
|
||||
st->__st_ino = i386st->__st_ino;
|
||||
#endif
|
||||
st->st_mode = i386st->st_mode;
|
||||
st->st_nlink = i386st->st_nlink;
|
||||
@@ -64,12 +73,21 @@ void AlignStat64(const void* source, void* dest)
|
||||
st->st_size = i386st->st_size;
|
||||
st->st_blksize = i386st->st_blksize;
|
||||
st->st_blocks = i386st->st_blocks;
|
||||
#if defined(__USE_XOPEN2K8) || defined(ANDROID) || defined(PANDORA)
|
||||
st->st_atim.tv_sec = i386st->st_atime;
|
||||
st->st_atim.tv_nsec = i386st->st_atime_nsec;
|
||||
st->st_mtim.tv_sec = i386st->st_mtime;
|
||||
st->st_mtim.tv_nsec = i386st->st_mtime_nsec;
|
||||
st->st_ctim.tv_sec = i386st->st_ctime;
|
||||
st->st_ctim.tv_nsec = i386st->st_ctime_nsec;
|
||||
#else
|
||||
st->st_atime = i386st->st_atime;
|
||||
st->st_atime_nsec = i386st->st_atime_nsec;
|
||||
st->st_mtime = i386st->st_mtime;
|
||||
st->st_mtime_nsec = i386st->st_mtime_nsec;
|
||||
st->st_ctime = i386st->st_ctime;
|
||||
st->st_ctime_nsec = i386st->st_ctime_nsec;
|
||||
#endif
|
||||
st->st_ino = i386st->st_ino;
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,47 @@
|
||||
#define _LARGEFILE_SOURCE 1
|
||||
#define _FILE_OFFSET_BITS 64
|
||||
#define _GNU_SOURCE
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdint.h>
|
||||
#include <asm/stat.h>
|
||||
#include <sys/vfs.h>
|
||||
#include <signal.h>
|
||||
#include <stddef.h>
|
||||
|
||||
#include "x86emu.h"
|
||||
#include "emu/x86emu_private.h"
|
||||
#include "myalign.h"
|
||||
#include "debug.h"
|
||||
|
||||
void UnalignSysStat64(const void* source, void* dest)
|
||||
{
|
||||
struct i386_stat64 *i386st = (struct i386_stat64*)dest;
|
||||
struct stat64 *st = (struct stat64*) source;
|
||||
|
||||
i386st->__pad0 = 0;
|
||||
i386st->__pad3 = 0;
|
||||
i386st->st_dev = st->st_dev;
|
||||
#ifndef POWERPCLE
|
||||
i386st->__st_ino = st->__st_ino;
|
||||
#else
|
||||
i386st->__st_ino = st->st_ino; // Separate __st_ino doesn't
|
||||
// exist on powerpc
|
||||
#endif
|
||||
i386st->st_mode = st->st_mode;
|
||||
i386st->st_nlink = st->st_nlink;
|
||||
i386st->st_uid = st->st_uid;
|
||||
i386st->st_gid = st->st_gid;
|
||||
i386st->st_rdev = st->st_rdev;
|
||||
i386st->st_size = st->st_size;
|
||||
i386st->st_blksize = st->st_blksize;
|
||||
i386st->st_blocks = st->st_blocks;
|
||||
i386st->st_atime = st->st_atime;
|
||||
i386st->st_atime_nsec = st->st_atime_nsec;
|
||||
i386st->st_mtime = st->st_mtime;
|
||||
i386st->st_mtime_nsec = st->st_mtime_nsec;
|
||||
i386st->st_ctime = st->st_ctime;
|
||||
i386st->st_ctime_nsec = st->st_ctime_nsec;
|
||||
i386st->st_ino = st->st_ino;
|
||||
}
|
||||
+11
-12
@@ -607,12 +607,12 @@ void my_sigactionhandler_oldcode(int32_t sig, int simple, int Locks, siginfo_t*
|
||||
sigcontext->uc_mcontext.gregs[REG_TRAPNO] = ((info->si_code==SEGV_ACCERR) || (info->si_errno==0x1234) || ((uintptr_t)info->si_addr==0))?13:14;
|
||||
} else if((info->si_code==SEGV_ACCERR) && !(prot&PROT_WRITE)) {
|
||||
sigcontext->uc_mcontext.gregs[REG_ERR] = 0x0002; // write flag issue
|
||||
if(abs((intptr_t)info->si_addr-(intptr_t)sigcontext->uc_mcontext.gregs[REG_ESP])<8)
|
||||
sigcontext->uc_mcontext.gregs[REG_TRAPNO] = 14;
|
||||
} else {
|
||||
if((info->si_code!=SEGV_ACCERR) && abs((intptr_t)info->si_addr-(intptr_t)sigcontext->uc_mcontext.gregs[REG_ESP])<8)
|
||||
sigcontext->uc_mcontext.gregs[REG_TRAPNO] = 12; // stack overflow probably
|
||||
else
|
||||
sigcontext->uc_mcontext.gregs[REG_TRAPNO] = 14;
|
||||
} else {
|
||||
sigcontext->uc_mcontext.gregs[REG_TRAPNO] = (info->si_code==SEGV_ACCERR)?13:14;
|
||||
sigcontext->uc_mcontext.gregs[REG_TRAPNO] = (info->si_code==SEGV_ACCERR)?13:14;
|
||||
//REG_ERR seems to be INT:8 CODE:8. So for write access segfault it's 0x0002 For a read it's 0x0004 (and 8 for exec). For an int 2d it could be 0x2D01 for example
|
||||
sigcontext->uc_mcontext.gregs[REG_ERR] = 0x0004; // read error? there is no execute control in box86 anyway, and no easy way to see if it's a write error
|
||||
}
|
||||
@@ -1005,10 +1005,9 @@ exit(-1);
|
||||
esp = (void*)p->uc_mcontext.arm_r8;
|
||||
}
|
||||
#endif
|
||||
x86name = getAddrFunctionName(x86pc);
|
||||
elfheader_t* elf = FindElfAddress(my_context, x86pc);
|
||||
if(elf)
|
||||
elfname = ElfName(elf);
|
||||
x86name = getAddrFunctionName(x86pc);
|
||||
if(jit_gdb) {
|
||||
pid_t pid = getpid();
|
||||
int v = fork(); // is this ok in a signal handler???
|
||||
@@ -1039,8 +1038,8 @@ exit(-1);
|
||||
uint32_t hash = 0;
|
||||
if(db && ((addr<db->x86_addr || addr>(db->x86_addr+db->x86_size)) || (prot&PROT_READ)))
|
||||
hash = X31_hash_code(db->x86_addr, db->x86_size);
|
||||
printf_log(log_minimum, "%04d|%s @%p (%s) (x86pc=%p/%s:\"%s\", esp=%p, stack=%p:%p own=%p fp=%p), for accessing %p (code=%d/prot=%x), db=%p(%p:%p/%p:%p/%s:%s, hash:%x/%x)",
|
||||
GetTID(), signame, pc, name, (void*)x86pc, elfname?elfname:"???", x86name?x86name:"???", esp,
|
||||
printf_log(log_minimum, "%04d|%s @%p (%s) (x86pc=%p/\"%s\", esp=%p, stack=%p:%p own=%p fp=%p), for accessing %p (code=%d/prot=%x), db=%p(%p:%p/%p:%p/%s:%s, hash:%x/%x)",
|
||||
GetTID(), signame, pc, name, (void*)x86pc, x86name?x86name:"???", esp,
|
||||
emu->init_stack, emu->init_stack+emu->size_stack, emu->stack2free, (void*)R_EBP,
|
||||
addr, info->si_code, prot, db, db?db->block:0, db?(db->block+db->size):0,
|
||||
db?db->x86_addr:0, db?(db->x86_addr+db->x86_size):0,
|
||||
@@ -1060,7 +1059,7 @@ exit(-1);
|
||||
#warning TODO
|
||||
#endif
|
||||
#else
|
||||
printf_log(log_minimum, "%04d|%s @%p (%s) (x86pc=%p/%s:\"%s\", esp=%p), for accessing %p (code=%d)", GetTID(), signame, pc, name, (void*)x86pc, elfname?elfname:"???", x86name?x86name:"???", esp, addr, info->si_code);
|
||||
printf_log(log_minimum, "%04d|%s @%p (%s) (x86pc=%p/\"%s\", esp=%p), for accessing %p (code=%d)", GetTID(), signame, pc, name, (void*)x86pc, x86name?x86name:"???", esp, addr, info->si_code);
|
||||
#endif
|
||||
if(sig==SIGILL) {
|
||||
printf_log(log_minimum, " opcode=%02X %02X %02X %02X %02X %02X %02X %02X", ((uint8_t*)pc)[0], ((uint8_t*)pc)[1], ((uint8_t*)pc)[2], ((uint8_t*)pc)[3], ((uint8_t*)pc)[4], ((uint8_t*)pc)[5], ((uint8_t*)pc)[6], ((uint8_t*)pc)[7]);
|
||||
@@ -1381,8 +1380,8 @@ EXPORT int my_getcontext(x86emu_t* emu, void* ucp)
|
||||
u->uc_mcontext.gregs[REG_CS] = R_CS;
|
||||
u->uc_mcontext.gregs[REG_SS] = R_SS;
|
||||
// get FloatPoint status
|
||||
if(u->uc_mcontext.fpregs)
|
||||
save_fpreg(emu, u->uc_mcontext.fpregs);
|
||||
u->uc_mcontext.fpregs = ucp + 236; // magic offset of fpregs in an actual i386 u_context
|
||||
fpu_savenv(emu, (void*)u->uc_mcontext.fpregs, 1); // it seems getcontext only save fpu env, not fpu regs
|
||||
// get signal mask
|
||||
sigprocmask(SIG_SETMASK, NULL, (sigset_t*)&u->uc_sigmask);
|
||||
// ensure uc_link is properly initialized
|
||||
@@ -1417,7 +1416,7 @@ EXPORT int my_setcontext(x86emu_t* emu, void* ucp)
|
||||
R_SS = u->uc_mcontext.gregs[REG_SS];
|
||||
// set FloatPoint status
|
||||
if(u->uc_mcontext.fpregs)
|
||||
load_fpreg(emu, u->uc_mcontext.fpregs);
|
||||
fpu_loadenv(emu, (void*)u->uc_mcontext.fpregs, 1);
|
||||
// set signal mask
|
||||
sigprocmask(SIG_SETMASK, (sigset_t*)&u->uc_sigmask, NULL);
|
||||
// set uc_link
|
||||
|
||||
@@ -0,0 +1,85 @@
|
||||
#define _TIME_BITS 64
|
||||
#define _FILE_OFFSET_BITS 64
|
||||
|
||||
#include <string.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
void stat64_time64_armhf_to_i386(struct stat *src, char *dest) {
|
||||
/*
|
||||
i386 t64
|
||||
size of stat struct 108
|
||||
Offset of st_dev 0 size 8
|
||||
Offset of st_ino 8 size 8
|
||||
Offset of st_mode 16 size 4
|
||||
Offset of st_nlink 20 size 4
|
||||
Offset of st_uid 24 size 4
|
||||
Offset of st_gid 28 size 4
|
||||
Offset of st_rdev 32 size 8
|
||||
Offset of st_size 40 size 8
|
||||
Offset of st_blksize 48 size 4
|
||||
Offset of st_blocks 52 size 8
|
||||
Offset of st_atim 60 size 16
|
||||
Offset of st_mtim 76 size 16
|
||||
Offset of st_ctim 92 size 16
|
||||
|
||||
armhf t64
|
||||
size of stat struct 112
|
||||
Offset of st_dev 0 size 8
|
||||
Offset of st_ino 8 size 8
|
||||
Offset of st_mode 16 size 4
|
||||
Offset of st_nlink 20 size 4
|
||||
Offset of st_uid 24 size 4
|
||||
Offset of st_gid 28 size 4
|
||||
Offset of st_rdev 32 size 8
|
||||
Offset of st_size 40 size 8
|
||||
Offset of st_blksize 48 size 4
|
||||
Offset of st_blocks 56 size 8
|
||||
Offset of st_atim 64 size 16
|
||||
Offset of st_mtim 80 size 16
|
||||
Offset of st_ctim 96 size 16
|
||||
*/
|
||||
|
||||
char *st = (char *)src;
|
||||
memset(dest, 0, 108);
|
||||
memcpy(dest, st, 8);
|
||||
memcpy(dest + 8, st + 8, 8);
|
||||
memcpy(dest + 16, st + 16, 4);
|
||||
memcpy(dest + 20, st + 20, 4);
|
||||
memcpy(dest + 24, st + 24, 4);
|
||||
memcpy(dest + 28, st + 28, 4);
|
||||
memcpy(dest + 32, st + 32, 8);
|
||||
memcpy(dest + 40, st + 40, 8);
|
||||
memcpy(dest + 48, st + 48, 4);
|
||||
memcpy(dest + 52, st + 56, 8);
|
||||
memcpy(dest + 60, st + 64, 16);
|
||||
memcpy(dest + 76, st + 80, 16);
|
||||
memcpy(dest + 92, st + 96, 16);
|
||||
}
|
||||
|
||||
int stat64_time64_helper(void *path, void *buf) {
|
||||
struct stat st;
|
||||
int r = stat(path, &st);
|
||||
stat64_time64_armhf_to_i386(&st, buf);
|
||||
return r;
|
||||
}
|
||||
|
||||
int fstatat64_time64_helper(int dirfd, void *path, void *buf, int flags) {
|
||||
struct stat st;
|
||||
int r = fstatat(dirfd, path, &st, flags);
|
||||
stat64_time64_armhf_to_i386(&st, buf);
|
||||
return r;
|
||||
}
|
||||
|
||||
int fstat64_time64_helper(int fd, void *buf) {
|
||||
struct stat st;
|
||||
int r = fstat(fd, &st);
|
||||
stat64_time64_armhf_to_i386(&st, buf);
|
||||
return r;
|
||||
}
|
||||
|
||||
int lstat64_time64_helper(void *path, void *buf) {
|
||||
struct stat st;
|
||||
int r = lstat(path, &st);
|
||||
stat64_time64_armhf_to_i386(&st, buf);
|
||||
return r;
|
||||
}
|
||||
+55
-76
@@ -478,100 +478,71 @@ EXPORT int my_pthread_key_delete(x86emu_t* emu, pthread_key_t key)
|
||||
int ret = pthread_key_delete(key);
|
||||
return ret;
|
||||
}
|
||||
// phtread_cond_init with null attr seems to only write 1 (NULL) dword on x86, while it's 48 bytes on ARM.
|
||||
// Not sure why as sizeof(pthread_cond_init) is 48 on both platform... But Neverwinter Night init seems to rely on that
|
||||
// What about cond that are statically initialized?
|
||||
// Note, this is is a versionned function (the pthread_cond_*), and this seems to correspond to an old behaviour
|
||||
typedef struct pthread_cond_old_s {
|
||||
pthread_cond_t* cond;
|
||||
} pthread_cond_old_t;
|
||||
|
||||
KHASH_MAP_INIT_INT(mapcond, pthread_cond_t*);
|
||||
|
||||
// should all access to that map be behind a mutex?
|
||||
kh_mapcond_t *mapcond = NULL;
|
||||
|
||||
static pthread_cond_t* add_cond(void* cond)
|
||||
{
|
||||
mutex_lock(&my_context->mutex_thread);
|
||||
khint_t k;
|
||||
int ret;
|
||||
pthread_cond_t *c;
|
||||
k = kh_put(mapcond, mapcond, (uintptr_t)cond, &ret);
|
||||
if(!ret)
|
||||
c = kh_value(mapcond, k); // already there... reinit an existing one?
|
||||
else
|
||||
c = kh_value(mapcond, k) = (pthread_cond_t*)box_calloc(1, sizeof(pthread_cond_t));
|
||||
*(void**)cond = cond;
|
||||
mutex_unlock(&my_context->mutex_thread);
|
||||
return c;
|
||||
}
|
||||
static pthread_cond_t* get_cond(void* cond)
|
||||
{
|
||||
pthread_cond_t* ret;
|
||||
int r;
|
||||
mutex_lock(&my_context->mutex_thread);
|
||||
khint_t k = kh_get(mapcond, mapcond, *(uintptr_t*)cond);
|
||||
if(k==kh_end(mapcond)) {
|
||||
khint_t k = kh_get(mapcond, mapcond, (uintptr_t)cond);
|
||||
if(k==kh_end(mapcond)) {
|
||||
printf_log(LOG_DEBUG, "BOX86: Note: phtread_cond not found, create a new empty one\n");
|
||||
ret = (pthread_cond_t*)box_calloc(1, sizeof(pthread_cond_t));
|
||||
k = kh_put(mapcond, mapcond, (uintptr_t)cond, &r);
|
||||
kh_value(mapcond, k) = ret;
|
||||
} else
|
||||
ret = kh_value(mapcond, k);
|
||||
*(void**)cond = cond;
|
||||
pthread_cond_init(ret, NULL);
|
||||
} else
|
||||
ret = kh_value(mapcond, k);
|
||||
mutex_unlock(&my_context->mutex_thread);
|
||||
return ret;
|
||||
}
|
||||
static void del_cond(void* cond)
|
||||
{
|
||||
if(!mapcond)
|
||||
return;
|
||||
mutex_lock(&my_context->mutex_thread);
|
||||
khint_t k = kh_get(mapcond, mapcond, *(uintptr_t*)cond);
|
||||
if(k!=kh_end(mapcond)) {
|
||||
box_free(kh_value(mapcond, k));
|
||||
kh_del(mapcond, mapcond, k);
|
||||
static pthread_cond_t* get_cond(pthread_cond_old_t* cond) {
|
||||
if(!cond->cond) {
|
||||
pthread_cond_t* newcond = box_calloc(1, sizeof(pthread_cond_t));
|
||||
#ifdef DYNAREC
|
||||
if(arm_lock_storeifnull(&cond->cond, newcond))
|
||||
box_free(newcond);
|
||||
#else
|
||||
static pthread_mutex_t mutex_cond = PTHREAD_MUTEX_INITIALIZER;
|
||||
pthread_mutex_lock(&mutex_cond);
|
||||
if(!cond->cond)
|
||||
cond->cond = newcond;
|
||||
else
|
||||
box_free(newcond);
|
||||
#endif
|
||||
}
|
||||
mutex_unlock(&my_context->mutex_thread);
|
||||
return cond->cond;
|
||||
}
|
||||
|
||||
static pthread_mutex_t* getAlignedMutex(pthread_mutex_t* m);
|
||||
|
||||
EXPORT int my_pthread_cond_broadcast_old(x86emu_t* emu, void* cond)
|
||||
EXPORT int my_pthread_cond_broadcast_old(x86emu_t* emu, pthread_cond_old_t* cond)
|
||||
{
|
||||
(void)emu;
|
||||
pthread_cond_t * c = get_cond(cond);
|
||||
return pthread_cond_broadcast(c);
|
||||
}
|
||||
EXPORT int my_pthread_cond_destroy_old(x86emu_t* emu, void* cond)
|
||||
EXPORT int my_pthread_cond_destroy_old(x86emu_t* emu, pthread_cond_old_t* cond)
|
||||
{
|
||||
(void)emu;
|
||||
pthread_cond_t * c = get_cond(cond);
|
||||
int ret = pthread_cond_destroy(c);
|
||||
if(c!=cond) del_cond(cond);
|
||||
box_free(cond->cond);
|
||||
return ret;
|
||||
}
|
||||
EXPORT int my_pthread_cond_init_old(x86emu_t* emu, void* cond, void* attr)
|
||||
EXPORT int my_pthread_cond_init_old(x86emu_t* emu, pthread_cond_old_t* cond, void* attr)
|
||||
{
|
||||
(void)emu;
|
||||
pthread_cond_t *c = add_cond(cond);
|
||||
pthread_cond_t *c = get_cond(cond);
|
||||
return pthread_cond_init(c, (const pthread_condattr_t*)attr);
|
||||
}
|
||||
EXPORT int my_pthread_cond_signal_old(x86emu_t* emu, void* cond)
|
||||
EXPORT int my_pthread_cond_signal_old(x86emu_t* emu, pthread_cond_old_t* cond)
|
||||
{
|
||||
(void)emu;
|
||||
pthread_cond_t * c = get_cond(cond);
|
||||
return pthread_cond_signal(c);
|
||||
}
|
||||
EXPORT int my_pthread_cond_timedwait_old(x86emu_t* emu, void* cond, void* mutex, void* abstime)
|
||||
EXPORT int my_pthread_cond_timedwait_old(x86emu_t* emu, pthread_cond_old_t* cond, void* mutex, void* abstime)
|
||||
{
|
||||
(void)emu;
|
||||
pthread_cond_t * c = get_cond(cond);
|
||||
return pthread_cond_timedwait(c, getAlignedMutex((pthread_mutex_t*)mutex), (const struct timespec*)abstime);
|
||||
#ifdef __USE_TIME64_REDIRECTS
|
||||
struct timespec t1;
|
||||
Timespec2Timespec64(&t1, abstime);
|
||||
#define T abstime?(&t1):NULL
|
||||
#else
|
||||
#define T (const struct timespec*)abstime
|
||||
#endif
|
||||
return pthread_cond_timedwait(c, getAlignedMutex((pthread_mutex_t*)mutex), T);
|
||||
#undef T
|
||||
}
|
||||
EXPORT int my_pthread_cond_wait_old(x86emu_t* emu, void* cond, void* mutex)
|
||||
EXPORT int my_pthread_cond_wait_old(x86emu_t* emu, pthread_cond_old_t* cond, void* mutex)
|
||||
{
|
||||
(void)emu;
|
||||
pthread_cond_t * c = get_cond(cond);
|
||||
@@ -581,7 +552,15 @@ EXPORT int my_pthread_cond_wait_old(x86emu_t* emu, void* cond, void* mutex)
|
||||
EXPORT int my_pthread_cond_timedwait(x86emu_t* emu, void* cond, void* mutex, void* abstime)
|
||||
{
|
||||
(void)emu;
|
||||
return pthread_cond_timedwait((pthread_cond_t*)cond, getAlignedMutex((pthread_mutex_t*)mutex), (const struct timespec*)abstime);
|
||||
#ifdef __USE_TIME64_REDIRECTS
|
||||
struct timespec t1;
|
||||
Timespec2Timespec64(&t1, abstime);
|
||||
#define T abstime?(&t1):NULL
|
||||
#else
|
||||
#define T (const struct timespec*)abstime
|
||||
#endif
|
||||
return pthread_cond_timedwait((pthread_cond_t*)cond, getAlignedMutex((pthread_mutex_t*)mutex), T);
|
||||
#undef T
|
||||
}
|
||||
EXPORT int my_pthread_cond_wait(x86emu_t* emu, void* cond, void* mutex)
|
||||
{
|
||||
@@ -914,9 +893,17 @@ EXPORT int my_pthread_mutex_lock(pthread_mutex_t *m)
|
||||
}
|
||||
EXPORT int my___pthread_mutex_lock(pthread_mutex_t *m) __attribute__((alias("my_pthread_mutex_lock")));
|
||||
|
||||
EXPORT int my_pthread_mutex_timedlock(pthread_mutex_t *m, const struct timespec * t)
|
||||
EXPORT int my_pthread_mutex_timedlock(pthread_mutex_t *m, void* abstime)
|
||||
{
|
||||
return pthread_mutex_timedlock(getAlignedMutex(m), t);
|
||||
#ifdef __USE_TIME64_REDIRECTS
|
||||
struct timespec t1;
|
||||
Timespec2Timespec64(&t1, abstime);
|
||||
#define T abstime?(&t1):NULL
|
||||
#else
|
||||
#define T (const struct timespec*)abstime
|
||||
#endif
|
||||
return pthread_mutex_timedlock(getAlignedMutex(m), T);
|
||||
#undef T
|
||||
}
|
||||
|
||||
EXPORT int my_pthread_mutex_trylock(pthread_mutex_t *m)
|
||||
@@ -951,7 +938,6 @@ void init_pthread_helper()
|
||||
real_phtread_kill_old = (iFli_t)pthread_kill;
|
||||
}
|
||||
|
||||
mapcond = kh_init(mapcond);
|
||||
pthread_key_create(&thread_key, emuthread_destroy);
|
||||
pthread_setspecific(thread_key, NULL);
|
||||
#if !defined(NOALIGN) && defined(ANDROID)
|
||||
@@ -971,13 +957,6 @@ void clean_current_emuthread()
|
||||
void fini_pthread_helper(box86context_t* context)
|
||||
{
|
||||
CleanStackSize(context);
|
||||
pthread_cond_t *cond;
|
||||
kh_foreach_value(mapcond, cond,
|
||||
pthread_cond_destroy(cond);
|
||||
box_free(cond);
|
||||
);
|
||||
kh_destroy(mapcond, mapcond);
|
||||
mapcond = NULL;
|
||||
#ifndef NOALIGN
|
||||
#ifdef ANDROID
|
||||
pthread_mutex_t *m;
|
||||
|
||||
+223
-50
@@ -1,5 +1,3 @@
|
||||
#undef _LARGEFILE_SOURCE
|
||||
#undef _FILE_OFFSET_BITS
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
@@ -285,34 +283,40 @@ typedef enum VkStructureType {
|
||||
VK_STRUCTURE_TYPE_CU_LAUNCH_INFO_NVX = 1000029002,
|
||||
VK_STRUCTURE_TYPE_IMAGE_VIEW_HANDLE_INFO_NVX = 1000030000,
|
||||
VK_STRUCTURE_TYPE_IMAGE_VIEW_ADDRESS_PROPERTIES_NVX = 1000030001,
|
||||
VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_CAPABILITIES_EXT = 1000038000,
|
||||
VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_CREATE_INFO_EXT = 1000038001,
|
||||
VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_ADD_INFO_EXT = 1000038002,
|
||||
VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_VCL_FRAME_INFO_EXT = 1000038003,
|
||||
VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_DPB_SLOT_INFO_EXT = 1000038004,
|
||||
VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_NALU_SLICE_INFO_EXT = 1000038005,
|
||||
VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_EMIT_PICTURE_PARAMETERS_INFO_EXT = 1000038006,
|
||||
VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_PROFILE_INFO_EXT = 1000038007,
|
||||
VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_RATE_CONTROL_INFO_EXT = 1000038008,
|
||||
VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_RATE_CONTROL_LAYER_INFO_EXT = 1000038009,
|
||||
VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_REFERENCE_LISTS_INFO_EXT = 1000038010,
|
||||
VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_CAPABILITIES_EXT = 1000039000,
|
||||
VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_PARAMETERS_CREATE_INFO_EXT = 1000039001,
|
||||
VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_PARAMETERS_ADD_INFO_EXT = 1000039002,
|
||||
VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_VCL_FRAME_INFO_EXT = 1000039003,
|
||||
VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_DPB_SLOT_INFO_EXT = 1000039004,
|
||||
VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_NALU_SLICE_SEGMENT_INFO_EXT = 1000039005,
|
||||
VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_EMIT_PICTURE_PARAMETERS_INFO_EXT = 1000039006,
|
||||
VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_PROFILE_INFO_EXT = 1000039007,
|
||||
VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_REFERENCE_LISTS_INFO_EXT = 1000039008,
|
||||
VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_RATE_CONTROL_INFO_EXT = 1000039009,
|
||||
VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_RATE_CONTROL_LAYER_INFO_EXT = 1000039010,
|
||||
VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_CAPABILITIES_EXT = 1000040000,
|
||||
VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PICTURE_INFO_EXT = 1000040001,
|
||||
VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PROFILE_INFO_EXT = 1000040003,
|
||||
VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_CREATE_INFO_EXT = 1000040004,
|
||||
VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_ADD_INFO_EXT = 1000040005,
|
||||
VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_DPB_SLOT_INFO_EXT = 1000040006,
|
||||
VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_CAPABILITIES_KHR = 1000038000,
|
||||
VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_CREATE_INFO_KHR = 1000038001,
|
||||
VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_ADD_INFO_KHR = 1000038002,
|
||||
VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_PICTURE_INFO_KHR = 1000038003,
|
||||
VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_DPB_SLOT_INFO_KHR = 1000038004,
|
||||
VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_NALU_SLICE_INFO_KHR = 1000038005,
|
||||
VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_GOP_REMAINING_FRAME_INFO_KHR = 1000038006,
|
||||
VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_PROFILE_INFO_KHR = 1000038007,
|
||||
VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_RATE_CONTROL_INFO_KHR = 1000038008,
|
||||
VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_RATE_CONTROL_LAYER_INFO_KHR = 1000038009,
|
||||
VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_CREATE_INFO_KHR = 1000038010,
|
||||
VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_QUALITY_LEVEL_PROPERTIES_KHR = 1000038011,
|
||||
VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_GET_INFO_KHR = 1000038012,
|
||||
VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_FEEDBACK_INFO_KHR = 1000038013,
|
||||
VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_CAPABILITIES_KHR = 1000039000,
|
||||
VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_PARAMETERS_CREATE_INFO_KHR = 1000039001,
|
||||
VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_PARAMETERS_ADD_INFO_KHR = 1000039002,
|
||||
VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_PICTURE_INFO_KHR = 1000039003,
|
||||
VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_DPB_SLOT_INFO_KHR = 1000039004,
|
||||
VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_NALU_SLICE_SEGMENT_INFO_KHR = 1000039005,
|
||||
VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_GOP_REMAINING_FRAME_INFO_KHR = 1000039006,
|
||||
VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_PROFILE_INFO_KHR = 1000039007,
|
||||
VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_RATE_CONTROL_INFO_KHR = 1000039009,
|
||||
VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_RATE_CONTROL_LAYER_INFO_KHR = 1000039010,
|
||||
VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_CREATE_INFO_KHR = 1000039011,
|
||||
VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_QUALITY_LEVEL_PROPERTIES_KHR = 1000039012,
|
||||
VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_PARAMETERS_GET_INFO_KHR = 1000039013,
|
||||
VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_PARAMETERS_FEEDBACK_INFO_KHR = 1000039014,
|
||||
VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_CAPABILITIES_KHR = 1000040000,
|
||||
VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PICTURE_INFO_KHR = 1000040001,
|
||||
VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PROFILE_INFO_KHR = 1000040003,
|
||||
VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_CREATE_INFO_KHR = 1000040004,
|
||||
VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_ADD_INFO_KHR = 1000040005,
|
||||
VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_DPB_SLOT_INFO_KHR = 1000040006,
|
||||
VK_STRUCTURE_TYPE_TEXTURE_LOD_GATHER_FORMAT_PROPERTIES_AMD = 1000041000,
|
||||
VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR = 1000044006,
|
||||
VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_DENSITY_MAP_ATTACHMENT_INFO_EXT = 1000044007,
|
||||
@@ -367,6 +371,7 @@ typedef enum VkStructureType {
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT = 1000102000,
|
||||
VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_DEPTH_CLIP_STATE_CREATE_INFO_EXT = 1000102001,
|
||||
VK_STRUCTURE_TYPE_HDR_METADATA_EXT = 1000105000,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RELAXED_LINE_RASTERIZATION_FEATURES_IMG = 1000110000,
|
||||
VK_STRUCTURE_TYPE_SHARED_PRESENT_SURFACE_CAPABILITIES_KHR = 1000111000,
|
||||
VK_STRUCTURE_TYPE_IMPORT_FENCE_WIN32_HANDLE_INFO_KHR = 1000114000,
|
||||
VK_STRUCTURE_TYPE_EXPORT_FENCE_WIN32_HANDLE_INFO_KHR = 1000114001,
|
||||
@@ -402,6 +407,11 @@ typedef enum VkStructureType {
|
||||
VK_STRUCTURE_TYPE_MEMORY_GET_ANDROID_HARDWARE_BUFFER_INFO_ANDROID = 1000129004,
|
||||
VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID = 1000129005,
|
||||
VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_2_ANDROID = 1000129006,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ENQUEUE_FEATURES_AMDX = 1000134000,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ENQUEUE_PROPERTIES_AMDX = 1000134001,
|
||||
VK_STRUCTURE_TYPE_EXECUTION_GRAPH_PIPELINE_SCRATCH_SIZE_AMDX = 1000134002,
|
||||
VK_STRUCTURE_TYPE_EXECUTION_GRAPH_PIPELINE_CREATE_INFO_AMDX = 1000134003,
|
||||
VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_NODE_CREATE_INFO_AMDX = 1000134004,
|
||||
VK_STRUCTURE_TYPE_SAMPLE_LOCATIONS_INFO_EXT = 1000143000,
|
||||
VK_STRUCTURE_TYPE_RENDER_PASS_SAMPLE_LOCATIONS_BEGIN_INFO_EXT = 1000143001,
|
||||
VK_STRUCTURE_TYPE_PIPELINE_SAMPLE_LOCATIONS_STATE_CREATE_INFO_EXT = 1000143002,
|
||||
@@ -469,21 +479,18 @@ typedef enum VkStructureType {
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT = 1000178002,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CLOCK_FEATURES_KHR = 1000181000,
|
||||
VK_STRUCTURE_TYPE_PIPELINE_COMPILER_CONTROL_CREATE_INFO_AMD = 1000183000,
|
||||
VK_STRUCTURE_TYPE_CALIBRATED_TIMESTAMP_INFO_EXT = 1000184000,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_AMD = 1000185000,
|
||||
VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_CAPABILITIES_EXT = 1000187000,
|
||||
VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_CREATE_INFO_EXT = 1000187001,
|
||||
VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_ADD_INFO_EXT = 1000187002,
|
||||
VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PROFILE_INFO_EXT = 1000187003,
|
||||
VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PICTURE_INFO_EXT = 1000187004,
|
||||
VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_DPB_SLOT_INFO_EXT = 1000187005,
|
||||
VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_CAPABILITIES_KHR = 1000187000,
|
||||
VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_CREATE_INFO_KHR = 1000187001,
|
||||
VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_ADD_INFO_KHR = 1000187002,
|
||||
VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PROFILE_INFO_KHR = 1000187003,
|
||||
VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PICTURE_INFO_KHR = 1000187004,
|
||||
VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_DPB_SLOT_INFO_KHR = 1000187005,
|
||||
VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_KHR = 1000174000,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES_KHR = 1000388000,
|
||||
VK_STRUCTURE_TYPE_QUEUE_FAMILY_GLOBAL_PRIORITY_PROPERTIES_KHR = 1000388001,
|
||||
VK_STRUCTURE_TYPE_DEVICE_MEMORY_OVERALLOCATION_CREATE_INFO_AMD = 1000189000,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT = 1000190000,
|
||||
VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT = 1000190001,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT = 1000190002,
|
||||
VK_STRUCTURE_TYPE_PRESENT_FRAME_TOKEN_GGP = 1000191000,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_FEATURES_NV = 1000201000,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_NV = 1000202000,
|
||||
@@ -515,7 +522,11 @@ typedef enum VkStructureType {
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_KHR = 1000226004,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_2_AMD = 1000227000,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COHERENT_MEMORY_FEATURES_AMD = 1000229000,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_LOCAL_READ_FEATURES_KHR = 1000232000,
|
||||
VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_LOCATION_INFO_KHR = 1000232001,
|
||||
VK_STRUCTURE_TYPE_RENDERING_INPUT_ATTACHMENT_INDEX_INFO_KHR = 1000232002,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_ATOMIC_INT64_FEATURES_EXT = 1000234000,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_QUAD_CONTROL_FEATURES_KHR = 1000235000,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_BUDGET_PROPERTIES_EXT = 1000237000,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PRIORITY_FEATURES_EXT = 1000238000,
|
||||
VK_STRUCTURE_TYPE_MEMORY_PRIORITY_ALLOCATE_INFO_EXT = 1000238001,
|
||||
@@ -540,11 +551,7 @@ typedef enum VkStructureType {
|
||||
VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_FULL_SCREEN_EXCLUSIVE_EXT = 1000255002,
|
||||
VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_WIN32_INFO_EXT = 1000255001,
|
||||
VK_STRUCTURE_TYPE_HEADLESS_SURFACE_CREATE_INFO_EXT = 1000256000,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT = 1000259000,
|
||||
VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_EXT = 1000259001,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_EXT = 1000259002,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_FEATURES_EXT = 1000260000,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT = 1000265000,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT = 1000267000,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_EXECUTABLE_PROPERTIES_FEATURES_KHR = 1000269000,
|
||||
VK_STRUCTURE_TYPE_PIPELINE_INFO_KHR = 1000269001,
|
||||
@@ -552,6 +559,21 @@ typedef enum VkStructureType {
|
||||
VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_INFO_KHR = 1000269003,
|
||||
VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_STATISTIC_KHR = 1000269004,
|
||||
VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_INTERNAL_REPRESENTATION_KHR = 1000269005,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_IMAGE_COPY_FEATURES_EXT = 1000270000,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_IMAGE_COPY_PROPERTIES_EXT = 1000270001,
|
||||
VK_STRUCTURE_TYPE_MEMORY_TO_IMAGE_COPY_EXT = 1000270002,
|
||||
VK_STRUCTURE_TYPE_IMAGE_TO_MEMORY_COPY_EXT = 1000270003,
|
||||
VK_STRUCTURE_TYPE_COPY_IMAGE_TO_MEMORY_INFO_EXT = 1000270004,
|
||||
VK_STRUCTURE_TYPE_COPY_MEMORY_TO_IMAGE_INFO_EXT = 1000270005,
|
||||
VK_STRUCTURE_TYPE_HOST_IMAGE_LAYOUT_TRANSITION_INFO_EXT = 1000270006,
|
||||
VK_STRUCTURE_TYPE_COPY_IMAGE_TO_IMAGE_INFO_EXT = 1000270007,
|
||||
VK_STRUCTURE_TYPE_SUBRESOURCE_HOST_MEMCPY_SIZE_EXT = 1000270008,
|
||||
VK_STRUCTURE_TYPE_HOST_IMAGE_COPY_DEVICE_PERFORMANCE_QUERY_EXT = 1000270009,
|
||||
VK_STRUCTURE_TYPE_MEMORY_MAP_INFO_KHR = 1000271000,
|
||||
VK_STRUCTURE_TYPE_MEMORY_UNMAP_INFO_KHR = 1000271001,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAP_MEMORY_PLACED_FEATURES_EXT = 1000272000,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAP_MEMORY_PLACED_PROPERTIES_EXT = 1000272001,
|
||||
VK_STRUCTURE_TYPE_MEMORY_MAP_PLACED_INFO_EXT = 1000272002,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT_2_FEATURES_EXT = 1000273000,
|
||||
VK_STRUCTURE_TYPE_SURFACE_PRESENT_MODE_EXT = 1000274000,
|
||||
VK_STRUCTURE_TYPE_SURFACE_PRESENT_SCALING_CAPABILITIES_EXT = 1000274001,
|
||||
@@ -560,7 +582,7 @@ typedef enum VkStructureType {
|
||||
VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_FENCE_INFO_EXT = 1000275001,
|
||||
VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_MODES_CREATE_INFO_EXT = 1000275002,
|
||||
VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_MODE_INFO_EXT = 1000275003,
|
||||
VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_SCALING_CREATE_INFO_EXT = 1000275004,
|
||||
VK_STRUCTURE_TYPE_SWAPCHAIN_PRESENT_SCALING_CREATE_INFO_EXT = 1000275004,
|
||||
VK_STRUCTURE_TYPE_RELEASE_SWAPCHAIN_IMAGES_INFO_EXT = 1000275005,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_PROPERTIES_NV = 1000277000,
|
||||
VK_STRUCTURE_TYPE_GRAPHICS_SHADER_GROUP_CREATE_INFO_NV = 1000277001,
|
||||
@@ -575,12 +597,12 @@ typedef enum VkStructureType {
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT = 1000281000,
|
||||
VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDER_PASS_TRANSFORM_INFO_QCOM = 1000282000,
|
||||
VK_STRUCTURE_TYPE_RENDER_PASS_TRANSFORM_BEGIN_INFO_QCOM = 1000282001,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_BIAS_CONTROL_FEATURES_EXT = 1000283000,
|
||||
VK_STRUCTURE_TYPE_DEPTH_BIAS_INFO_EXT = 1000283001,
|
||||
VK_STRUCTURE_TYPE_DEPTH_BIAS_REPRESENTATION_INFO_EXT = 1000283002,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_MEMORY_REPORT_FEATURES_EXT = 1000284000,
|
||||
VK_STRUCTURE_TYPE_DEVICE_DEVICE_MEMORY_REPORT_CREATE_INFO_EXT = 1000284001,
|
||||
VK_STRUCTURE_TYPE_DEVICE_MEMORY_REPORT_CALLBACK_DATA_EXT = 1000284002,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_BIAS_CONTROL_FEATURES_EXT = 1000283000,
|
||||
VK_STRUCTURE_TYPE_DEPTH_BIAS_INFO_EXT = 1000283001,
|
||||
VK_STRUCTURE_TYPE_DEPTH_BIAS_REPRESENTATION_INFO_EXT = 1000283002,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT = 1000286000,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_PROPERTIES_EXT = 1000286001,
|
||||
VK_STRUCTURE_TYPE_SAMPLER_CUSTOM_BORDER_COLOR_CREATE_INFO_EXT = 1000287000,
|
||||
@@ -597,8 +619,20 @@ typedef enum VkStructureType {
|
||||
VK_STRUCTURE_TYPE_VIDEO_ENCODE_RATE_CONTROL_LAYER_INFO_KHR = 1000299002,
|
||||
VK_STRUCTURE_TYPE_VIDEO_ENCODE_CAPABILITIES_KHR = 1000299003,
|
||||
VK_STRUCTURE_TYPE_VIDEO_ENCODE_USAGE_INFO_KHR = 1000299004,
|
||||
VK_STRUCTURE_TYPE_QUERY_POOL_VIDEO_ENCODE_FEEDBACK_CREATE_INFO_KHR = 1000299005,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_ENCODE_QUALITY_LEVEL_INFO_KHR = 1000299006,
|
||||
VK_STRUCTURE_TYPE_VIDEO_ENCODE_QUALITY_LEVEL_PROPERTIES_KHR = 1000299007,
|
||||
VK_STRUCTURE_TYPE_VIDEO_ENCODE_QUALITY_LEVEL_INFO_KHR = 1000299008,
|
||||
VK_STRUCTURE_TYPE_VIDEO_ENCODE_SESSION_PARAMETERS_GET_INFO_KHR = 1000299009,
|
||||
VK_STRUCTURE_TYPE_VIDEO_ENCODE_SESSION_PARAMETERS_FEEDBACK_INFO_KHR = 1000299010,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DIAGNOSTICS_CONFIG_FEATURES_NV = 1000300000,
|
||||
VK_STRUCTURE_TYPE_DEVICE_DIAGNOSTICS_CONFIG_CREATE_INFO_NV = 1000300001,
|
||||
VK_STRUCTURE_TYPE_CUDA_MODULE_CREATE_INFO_NV = 1000307000,
|
||||
VK_STRUCTURE_TYPE_CUDA_FUNCTION_CREATE_INFO_NV = 1000307001,
|
||||
VK_STRUCTURE_TYPE_CUDA_LAUNCH_INFO_NV = 1000307002,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUDA_KERNEL_LAUNCH_FEATURES_NV = 1000307003,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUDA_KERNEL_LAUNCH_PROPERTIES_NV = 1000307004,
|
||||
VK_STRUCTURE_TYPE_QUERY_LOW_LATENCY_SUPPORT_NV = 1000310000,
|
||||
VK_STRUCTURE_TYPE_EXPORT_METAL_OBJECT_CREATE_INFO_EXT = 1000311000,
|
||||
VK_STRUCTURE_TYPE_EXPORT_METAL_OBJECTS_INFO_EXT = 1000311001,
|
||||
VK_STRUCTURE_TYPE_EXPORT_METAL_DEVICE_INFO_EXT = 1000311002,
|
||||
@@ -613,6 +647,19 @@ typedef enum VkStructureType {
|
||||
VK_STRUCTURE_TYPE_IMPORT_METAL_SHARED_EVENT_INFO_EXT = 1000311011,
|
||||
VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_2_NV = 1000314008,
|
||||
VK_STRUCTURE_TYPE_CHECKPOINT_DATA_2_NV = 1000314009,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_PROPERTIES_EXT = 1000316000,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_DENSITY_MAP_PROPERTIES_EXT = 1000316001,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_FEATURES_EXT = 1000316002,
|
||||
VK_STRUCTURE_TYPE_DESCRIPTOR_ADDRESS_INFO_EXT = 1000316003,
|
||||
VK_STRUCTURE_TYPE_DESCRIPTOR_GET_INFO_EXT = 1000316004,
|
||||
VK_STRUCTURE_TYPE_BUFFER_CAPTURE_DESCRIPTOR_DATA_INFO_EXT = 1000316005,
|
||||
VK_STRUCTURE_TYPE_IMAGE_CAPTURE_DESCRIPTOR_DATA_INFO_EXT = 1000316006,
|
||||
VK_STRUCTURE_TYPE_IMAGE_VIEW_CAPTURE_DESCRIPTOR_DATA_INFO_EXT = 1000316007,
|
||||
VK_STRUCTURE_TYPE_SAMPLER_CAPTURE_DESCRIPTOR_DATA_INFO_EXT = 1000316008,
|
||||
VK_STRUCTURE_TYPE_OPAQUE_CAPTURE_DESCRIPTOR_DATA_CREATE_INFO_EXT = 1000316010,
|
||||
VK_STRUCTURE_TYPE_DESCRIPTOR_BUFFER_BINDING_INFO_EXT = 1000316011,
|
||||
VK_STRUCTURE_TYPE_DESCRIPTOR_BUFFER_BINDING_PUSH_DESCRIPTOR_BUFFER_HANDLE_EXT = 1000316012,
|
||||
VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CAPTURE_DESCRIPTOR_DATA_INFO_EXT = 1000316009,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GRAPHICS_PIPELINE_LIBRARY_FEATURES_EXT = 1000320000,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GRAPHICS_PIPELINE_LIBRARY_PROPERTIES_EXT = 1000320001,
|
||||
VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_LIBRARY_CREATE_INFO_EXT = 1000320002,
|
||||
@@ -635,8 +682,6 @@ typedef enum VkStructureType {
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_FEATURES_KHR = 1000336000,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_COMPRESSION_CONTROL_FEATURES_EXT = 1000338000,
|
||||
VK_STRUCTURE_TYPE_IMAGE_COMPRESSION_CONTROL_EXT = 1000338001,
|
||||
VK_STRUCTURE_TYPE_SUBRESOURCE_LAYOUT_2_EXT = 1000338002,
|
||||
VK_STRUCTURE_TYPE_IMAGE_SUBRESOURCE_2_EXT = 1000338003,
|
||||
VK_STRUCTURE_TYPE_IMAGE_COMPRESSION_PROPERTIES_EXT = 1000338004,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ATTACHMENT_FEEDBACK_LOOP_LAYOUT_FEATURES_EXT = 1000339000,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_4444_FORMATS_FEATURES_EXT = 1000340000,
|
||||
@@ -677,6 +722,8 @@ typedef enum VkStructureType {
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_RDMA_FEATURES_NV = 1000371001,
|
||||
VK_STRUCTURE_TYPE_PIPELINE_PROPERTIES_IDENTIFIER_EXT = 1000372000,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_PROPERTIES_FEATURES_EXT = 1000372001,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAME_BOUNDARY_FEATURES_EXT = 1000375000,
|
||||
VK_STRUCTURE_TYPE_FRAME_BOUNDARY_EXT = 1000375001,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_FEATURES_EXT = 1000376000,
|
||||
VK_STRUCTURE_TYPE_SUBPASS_RESOLVE_PERFORMANCE_QUERY_EXT = 1000376001,
|
||||
VK_STRUCTURE_TYPE_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_INFO_EXT = 1000376002,
|
||||
@@ -691,6 +738,8 @@ typedef enum VkStructureType {
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_FEATURES_EXT = 1000392000,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_PROPERTIES_EXT = 1000392001,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_2D_VIEW_OF_3D_FEATURES_EXT = 1000393000,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TILE_IMAGE_FEATURES_EXT = 1000395000,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TILE_IMAGE_PROPERTIES_EXT = 1000395001,
|
||||
VK_STRUCTURE_TYPE_MICROMAP_BUILD_INFO_EXT = 1000396000,
|
||||
VK_STRUCTURE_TYPE_MICROMAP_VERSION_INFO_EXT = 1000396001,
|
||||
VK_STRUCTURE_TYPE_COPY_MICROMAP_INFO_EXT = 1000396002,
|
||||
@@ -701,28 +750,59 @@ typedef enum VkStructureType {
|
||||
VK_STRUCTURE_TYPE_MICROMAP_CREATE_INFO_EXT = 1000396007,
|
||||
VK_STRUCTURE_TYPE_MICROMAP_BUILD_SIZES_INFO_EXT = 1000396008,
|
||||
VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_TRIANGLES_OPACITY_MICROMAP_EXT = 1000396009,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISPLACEMENT_MICROMAP_FEATURES_NV = 1000397000,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISPLACEMENT_MICROMAP_PROPERTIES_NV = 1000397001,
|
||||
VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_TRIANGLES_DISPLACEMENT_MICROMAP_NV = 1000397002,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CLUSTER_CULLING_SHADER_FEATURES_HUAWEI = 1000404000,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CLUSTER_CULLING_SHADER_PROPERTIES_HUAWEI = 1000404001,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CLUSTER_CULLING_SHADER_VRS_FEATURES_HUAWEI = 1000404002,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BORDER_COLOR_SWIZZLE_FEATURES_EXT = 1000411000,
|
||||
VK_STRUCTURE_TYPE_SAMPLER_BORDER_COLOR_COMPONENT_MAPPING_CREATE_INFO_EXT = 1000411001,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PAGEABLE_DEVICE_LOCAL_MEMORY_FEATURES_EXT = 1000412000,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_ARM = 1000415000,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_ROTATE_FEATURES_KHR = 1000416000,
|
||||
VK_STRUCTURE_TYPE_DEVICE_QUEUE_SHADER_CORE_CONTROL_CREATE_INFO_ARM = 1000417000,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCHEDULING_CONTROLS_FEATURES_ARM = 1000417001,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCHEDULING_CONTROLS_PROPERTIES_ARM = 1000417002,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_SLICED_VIEW_OF_3D_FEATURES_EXT = 1000418000,
|
||||
VK_STRUCTURE_TYPE_IMAGE_VIEW_SLICED_CREATE_INFO_EXT = 1000418001,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_SET_HOST_MAPPING_FEATURES_VALVE = 1000420000,
|
||||
VK_STRUCTURE_TYPE_DESCRIPTOR_SET_BINDING_REFERENCE_VALVE = 1000420001,
|
||||
VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_HOST_MAPPING_INFO_VALVE = 1000420002,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLAMP_ZERO_ONE_FEATURES_EXT = 1000421000,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_NON_SEAMLESS_CUBE_MAP_FEATURES_EXT = 1000422000,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RENDER_PASS_STRIPED_FEATURES_ARM = 1000424000,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RENDER_PASS_STRIPED_PROPERTIES_ARM = 1000424001,
|
||||
VK_STRUCTURE_TYPE_RENDER_PASS_STRIPE_BEGIN_INFO_ARM = 1000424002,
|
||||
VK_STRUCTURE_TYPE_RENDER_PASS_STRIPE_INFO_ARM = 1000424003,
|
||||
VK_STRUCTURE_TYPE_RENDER_PASS_STRIPE_SUBMIT_INFO_ARM = 1000424004,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_OFFSET_FEATURES_QCOM = 1000425000,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_OFFSET_PROPERTIES_QCOM = 1000425001,
|
||||
VK_STRUCTURE_TYPE_SUBPASS_FRAGMENT_DENSITY_MAP_OFFSET_END_INFO_QCOM = 1000425002,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COPY_MEMORY_INDIRECT_FEATURES_NV = 1000426000,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COPY_MEMORY_INDIRECT_PROPERTIES_NV = 1000426001,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_DECOMPRESSION_FEATURES_NV = 1000427000,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_DECOMPRESSION_PROPERTIES_NV = 1000427001,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_COMPUTE_FEATURES_NV = 1000428000,
|
||||
VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_INDIRECT_BUFFER_INFO_NV = 1000428001,
|
||||
VK_STRUCTURE_TYPE_PIPELINE_INDIRECT_DEVICE_ADDRESS_INFO_NV = 1000428002,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINEAR_COLOR_ATTACHMENT_FEATURES_NV = 1000430000,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_MAXIMAL_RECONVERGENCE_FEATURES_KHR = 1000434000,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_COMPRESSION_CONTROL_SWAPCHAIN_FEATURES_EXT = 1000437000,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_PROCESSING_FEATURES_QCOM = 1000440000,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_PROCESSING_PROPERTIES_QCOM = 1000440001,
|
||||
VK_STRUCTURE_TYPE_IMAGE_VIEW_SAMPLE_WEIGHT_CREATE_INFO_QCOM = 1000440002,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_NESTED_COMMAND_BUFFER_FEATURES_EXT = 1000451000,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_NESTED_COMMAND_BUFFER_PROPERTIES_EXT = 1000451001,
|
||||
VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_ACQUIRE_UNMODIFIED_EXT = 1000453000,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_FEATURES_EXT = 1000455000,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_3_PROPERTIES_EXT = 1000455001,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_MERGE_FEEDBACK_FEATURES_EXT = 1000458000,
|
||||
VK_STRUCTURE_TYPE_RENDER_PASS_CREATION_CONTROL_EXT = 1000458001,
|
||||
VK_STRUCTURE_TYPE_RENDER_PASS_CREATION_FEEDBACK_CREATE_INFO_EXT = 1000458002,
|
||||
VK_STRUCTURE_TYPE_RENDER_PASS_SUBPASS_FEEDBACK_CREATE_INFO_EXT = 1000458003,
|
||||
VK_STRUCTURE_TYPE_DIRECT_DRIVER_LOADING_INFO_LUNARG = 1000459000,
|
||||
VK_STRUCTURE_TYPE_DIRECT_DRIVER_LOADING_LIST_LUNARG = 1000459001,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_MODULE_IDENTIFIER_FEATURES_EXT = 1000462000,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_MODULE_IDENTIFIER_PROPERTIES_EXT = 1000462001,
|
||||
VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_MODULE_IDENTIFIER_CREATE_INFO_EXT = 1000462002,
|
||||
@@ -737,21 +817,98 @@ typedef enum VkStructureType {
|
||||
VK_STRUCTURE_TYPE_OPTICAL_FLOW_SESSION_CREATE_PRIVATE_DATA_INFO_NV = 1000464010,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LEGACY_DITHERING_FEATURES_EXT = 1000465000,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_PROTECTED_ACCESS_FEATURES_EXT = 1000466000,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_FORMAT_RESOLVE_FEATURES_ANDROID = 1000468000,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_FORMAT_RESOLVE_PROPERTIES_ANDROID = 1000468001,
|
||||
VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_RESOLVE_PROPERTIES_ANDROID = 1000468002,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_5_FEATURES_KHR = 1000470000,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_5_PROPERTIES_KHR = 1000470001,
|
||||
VK_STRUCTURE_TYPE_SUBRESOURCE_LAYOUT_2_KHR = 1000338002,
|
||||
VK_STRUCTURE_TYPE_RENDERING_AREA_INFO_KHR = 1000470003,
|
||||
VK_STRUCTURE_TYPE_DEVICE_IMAGE_SUBRESOURCE_INFO_KHR = 1000470004,
|
||||
VK_STRUCTURE_TYPE_SUBRESOURCE_LAYOUT_2_KHR = 1000338002,
|
||||
VK_STRUCTURE_TYPE_IMAGE_SUBRESOURCE_2_KHR = 1000338003,
|
||||
VK_STRUCTURE_TYPE_PIPELINE_CREATE_FLAGS_2_CREATE_INFO_KHR = 1000470005,
|
||||
VK_STRUCTURE_TYPE_BUFFER_USAGE_FLAGS_2_CREATE_INFO_KHR = 1000470006,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_POSITION_FETCH_FEATURES_KHR = 1000481000,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_OBJECT_FEATURES_EXT = 1000482000,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_OBJECT_PROPERTIES_EXT = 1000482001,
|
||||
VK_STRUCTURE_TYPE_SHADER_CREATE_INFO_EXT = 1000482002,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TILE_PROPERTIES_FEATURES_QCOM = 1000484000,
|
||||
VK_STRUCTURE_TYPE_TILE_PROPERTIES_QCOM = 1000484001,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_AMIGO_PROFILING_FEATURES_SEC = 1000485000,
|
||||
VK_STRUCTURE_TYPE_AMIGO_PROFILING_SUBMIT_INFO_SEC = 1000485001,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_VIEWPORTS_FEATURES_QCOM = 1000488000,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_FEATURES_NV = 1000490000,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_INVOCATION_REORDER_PROPERTIES_NV = 1000490001,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_SPARSE_ADDRESS_SPACE_FEATURES_NV = 1000492000,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_SPARSE_ADDRESS_SPACE_PROPERTIES_NV = 1000492001,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_EXT = 1000351000,
|
||||
VK_STRUCTURE_TYPE_MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_EXT = 1000351002,
|
||||
VK_STRUCTURE_TYPE_LAYER_SETTINGS_CREATE_INFO_EXT = 1000496000,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_BUILTINS_FEATURES_ARM = 1000497000,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_BUILTINS_PROPERTIES_ARM = 1000497001,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_LIBRARY_GROUP_HANDLES_FEATURES_EXT = 1000498000,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_UNUSED_ATTACHMENTS_FEATURES_EXT = 1000499000,
|
||||
VK_STRUCTURE_TYPE_LATENCY_SLEEP_MODE_INFO_NV = 1000505000,
|
||||
VK_STRUCTURE_TYPE_LATENCY_SLEEP_INFO_NV = 1000505001,
|
||||
VK_STRUCTURE_TYPE_SET_LATENCY_MARKER_INFO_NV = 1000505002,
|
||||
VK_STRUCTURE_TYPE_GET_LATENCY_MARKER_INFO_NV = 1000505003,
|
||||
VK_STRUCTURE_TYPE_LATENCY_TIMINGS_FRAME_REPORT_NV = 1000505004,
|
||||
VK_STRUCTURE_TYPE_LATENCY_SUBMISSION_PRESENT_ID_NV = 1000505005,
|
||||
VK_STRUCTURE_TYPE_OUT_OF_BAND_QUEUE_TYPE_INFO_NV = 1000505006,
|
||||
VK_STRUCTURE_TYPE_SWAPCHAIN_LATENCY_CREATE_INFO_NV = 1000505007,
|
||||
VK_STRUCTURE_TYPE_LATENCY_SURFACE_CAPABILITIES_NV = 1000505008,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_KHR = 1000506000,
|
||||
VK_STRUCTURE_TYPE_COOPERATIVE_MATRIX_PROPERTIES_KHR = 1000506001,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_KHR = 1000506002,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_RENDER_AREAS_FEATURES_QCOM = 1000510000,
|
||||
VK_STRUCTURE_TYPE_MULTIVIEW_PER_VIEW_RENDER_AREAS_RENDER_PASS_BEGIN_INFO_QCOM = 1000510001,
|
||||
VK_STRUCTURE_TYPE_VIDEO_DECODE_AV1_CAPABILITIES_KHR = 1000512000,
|
||||
VK_STRUCTURE_TYPE_VIDEO_DECODE_AV1_PICTURE_INFO_KHR = 1000512001,
|
||||
VK_STRUCTURE_TYPE_VIDEO_DECODE_AV1_PROFILE_INFO_KHR = 1000512003,
|
||||
VK_STRUCTURE_TYPE_VIDEO_DECODE_AV1_SESSION_PARAMETERS_CREATE_INFO_KHR = 1000512004,
|
||||
VK_STRUCTURE_TYPE_VIDEO_DECODE_AV1_DPB_SLOT_INFO_KHR = 1000512005,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_MAINTENANCE_1_FEATURES_KHR = 1000515000,
|
||||
VK_STRUCTURE_TYPE_VIDEO_INLINE_QUERY_INFO_KHR = 1000515001,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PER_STAGE_DESCRIPTOR_SET_FEATURES_NV = 1000516000,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_PROCESSING_2_FEATURES_QCOM = 1000518000,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_PROCESSING_2_PROPERTIES_QCOM = 1000518001,
|
||||
VK_STRUCTURE_TYPE_SAMPLER_BLOCK_MATCH_WINDOW_CREATE_INFO_QCOM = 1000518002,
|
||||
VK_STRUCTURE_TYPE_SAMPLER_CUBIC_WEIGHTS_CREATE_INFO_QCOM = 1000519000,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUBIC_WEIGHTS_FEATURES_QCOM = 1000519001,
|
||||
VK_STRUCTURE_TYPE_BLIT_IMAGE_CUBIC_WEIGHTS_INFO_QCOM = 1000519002,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_DEGAMMA_FEATURES_QCOM = 1000520000,
|
||||
VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_YCBCR_DEGAMMA_CREATE_INFO_QCOM = 1000520001,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUBIC_CLAMP_FEATURES_QCOM = 1000521000,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ATTACHMENT_FEEDBACK_LOOP_DYNAMIC_STATE_FEATURES_EXT = 1000524000,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_KHR = 1000525000,
|
||||
VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_KHR = 1000190001,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_KHR = 1000190002,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT_CONTROLS_2_FEATURES_KHR = 1000528000,
|
||||
VK_STRUCTURE_TYPE_SCREEN_BUFFER_PROPERTIES_QNX = 1000529000,
|
||||
VK_STRUCTURE_TYPE_SCREEN_BUFFER_FORMAT_PROPERTIES_QNX = 1000529001,
|
||||
VK_STRUCTURE_TYPE_IMPORT_SCREEN_BUFFER_INFO_QNX = 1000529002,
|
||||
VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_QNX = 1000529003,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_SCREEN_BUFFER_FEATURES_QNX = 1000529004,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LAYERED_DRIVER_PROPERTIES_MSFT = 1000530000,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_KHR = 1000265000,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_KHR = 1000259000,
|
||||
VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_KHR = 1000259001,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_KHR = 1000259002,
|
||||
VK_STRUCTURE_TYPE_CALIBRATED_TIMESTAMP_INFO_KHR = 1000184000,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_EXPECT_ASSUME_FEATURES_KHR = 1000544000,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_6_FEATURES_KHR = 1000545000,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_6_PROPERTIES_KHR = 1000545001,
|
||||
VK_STRUCTURE_TYPE_BIND_MEMORY_STATUS_KHR = 1000545002,
|
||||
VK_STRUCTURE_TYPE_BIND_DESCRIPTOR_SETS_INFO_KHR = 1000545003,
|
||||
VK_STRUCTURE_TYPE_PUSH_CONSTANTS_INFO_KHR = 1000545004,
|
||||
VK_STRUCTURE_TYPE_PUSH_DESCRIPTOR_SET_INFO_KHR = 1000545005,
|
||||
VK_STRUCTURE_TYPE_PUSH_DESCRIPTOR_SET_WITH_TEMPLATE_INFO_KHR = 1000545006,
|
||||
VK_STRUCTURE_TYPE_SET_DESCRIPTOR_BUFFER_OFFSETS_INFO_EXT = 1000545007,
|
||||
VK_STRUCTURE_TYPE_BIND_DESCRIPTOR_BUFFER_EMBEDDED_SAMPLERS_INFO_EXT = 1000545008,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_POOL_OVERALLOCATION_FEATURES_NV = 1000546000,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAW_ACCESS_CHAINS_FEATURES_NV = 1000555000,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_FLOAT16_VECTOR_FEATURES_NV = 1000563000,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_VALIDATION_FEATURES_NV = 1000568000,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTER_FEATURES = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETER_FEATURES = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES,
|
||||
VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT = VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT,
|
||||
@@ -852,6 +1009,9 @@ typedef enum VkStructureType {
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES,
|
||||
VK_STRUCTURE_TYPE_CALIBRATED_TIMESTAMP_INFO_EXT = VK_STRUCTURE_TYPE_CALIBRATED_TIMESTAMP_INFO_KHR,
|
||||
VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_KHR,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_KHR,
|
||||
VK_STRUCTURE_TYPE_PIPELINE_CREATION_FEEDBACK_CREATE_INFO_EXT = VK_STRUCTURE_TYPE_PIPELINE_CREATION_FEEDBACK_CREATE_INFO,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES,
|
||||
@@ -884,7 +1044,11 @@ typedef enum VkStructureType {
|
||||
VK_STRUCTURE_TYPE_BUFFER_OPAQUE_CAPTURE_ADDRESS_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_BUFFER_OPAQUE_CAPTURE_ADDRESS_CREATE_INFO,
|
||||
VK_STRUCTURE_TYPE_MEMORY_OPAQUE_CAPTURE_ADDRESS_ALLOCATE_INFO_KHR = VK_STRUCTURE_TYPE_MEMORY_OPAQUE_CAPTURE_ADDRESS_ALLOCATE_INFO,
|
||||
VK_STRUCTURE_TYPE_DEVICE_MEMORY_OPAQUE_CAPTURE_ADDRESS_INFO_KHR = VK_STRUCTURE_TYPE_DEVICE_MEMORY_OPAQUE_CAPTURE_ADDRESS_INFO,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_KHR,
|
||||
VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_EXT = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_KHR,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_KHR,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_KHR,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_FEATURES,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_PROPERTIES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_DOT_PRODUCT_PROPERTIES,
|
||||
@@ -914,6 +1078,8 @@ typedef enum VkStructureType {
|
||||
VK_STRUCTURE_TYPE_IMAGE_BLIT_2_KHR = VK_STRUCTURE_TYPE_IMAGE_BLIT_2,
|
||||
VK_STRUCTURE_TYPE_BUFFER_IMAGE_COPY_2_KHR = VK_STRUCTURE_TYPE_BUFFER_IMAGE_COPY_2,
|
||||
VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2_KHR = VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2,
|
||||
VK_STRUCTURE_TYPE_SUBRESOURCE_LAYOUT_2_EXT = VK_STRUCTURE_TYPE_SUBRESOURCE_LAYOUT_2_KHR,
|
||||
VK_STRUCTURE_TYPE_IMAGE_SUBRESOURCE_2_EXT = VK_STRUCTURE_TYPE_IMAGE_SUBRESOURCE_2_KHR,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_ARM = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT,
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_VALVE = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_EXT,
|
||||
VK_STRUCTURE_TYPE_MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_VALVE = VK_STRUCTURE_TYPE_MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_EXT,
|
||||
@@ -925,6 +1091,7 @@ typedef enum VkStructureType {
|
||||
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_PROPERTIES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_PROPERTIES,
|
||||
VK_STRUCTURE_TYPE_DEVICE_BUFFER_MEMORY_REQUIREMENTS_KHR = VK_STRUCTURE_TYPE_DEVICE_BUFFER_MEMORY_REQUIREMENTS,
|
||||
VK_STRUCTURE_TYPE_DEVICE_IMAGE_MEMORY_REQUIREMENTS_KHR = VK_STRUCTURE_TYPE_DEVICE_IMAGE_MEMORY_REQUIREMENTS,
|
||||
VK_STRUCTURE_TYPE_SHADER_REQUIRED_SUBGROUP_SIZE_CREATE_INFO_EXT = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO,
|
||||
VK_STRUCTURE_TYPE_MAX_ENUM = 0x7FFFFFFF
|
||||
} VkStructureType;
|
||||
|
||||
@@ -1086,6 +1253,9 @@ typedef struct my_vkhead_s {
|
||||
case VK_STRUCTURE_TYPE_RENDERING_AREA_INFO_KHR: \
|
||||
case VK_STRUCTURE_TYPE_PIPELINE_CREATE_FLAGS_2_CREATE_INFO_KHR: \
|
||||
case VK_STRUCTURE_TYPE_BUFFER_USAGE_FLAGS_2_CREATE_INFO_KHR: \
|
||||
case VK_STRUCTURE_TYPE_VIDEO_CODING_CONTROL_INFO_KHR: \
|
||||
case VK_STRUCTURE_TYPE_VIDEO_END_CODING_INFO_KHR: \
|
||||
case VK_STRUCTURE_TYPE_VIDEO_SESSION_CREATE_INFO_KHR: \
|
||||
|
||||
#define CH(C, B, A) \
|
||||
case C: \
|
||||
@@ -1158,6 +1328,9 @@ typedef struct my_vkhead_s {
|
||||
CH(VK_STRUCTURE_TYPE_RELEASE_SWAPCHAIN_IMAGES_INFO_EXT, "uPUup", A) \
|
||||
CH(VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES, "uPSuuu", A) \
|
||||
CH(VK_STRUCTURE_TYPE_DEVICE_IMAGE_SUBRESOURCE_INFO_KHR, "uPPP", A) \
|
||||
CH(VK_STRUCTURE_TYPE_BIND_VIDEO_SESSION_MEMORY_INFO_KHR, "uPuUUU", A) \
|
||||
CH(VK_STRUCTURE_TYPE_VIDEO_BEGIN_CODING_INFO_KHR, "uPuUUup", A) \
|
||||
CH(VK_STRUCTURE_TYPE_VIDEO_SESSION_PARAMETERS_CREATE_INFO_KHR, "uPuUU", A) \
|
||||
|
||||
|
||||
//--------------------------------------------------------------
|
||||
|
||||
+41
-3
@@ -51,6 +51,8 @@ int box86_dynarec_log = LOG_NONE;
|
||||
uintptr_t box86_pagesize;
|
||||
uintptr_t box86_load_addr = 0;
|
||||
int box86_showbt = 0;
|
||||
int box86_maxcpu = 0;
|
||||
int box86_maxcpu_immutable = 0;
|
||||
int box86_isglibc234 = 0;
|
||||
int box86_nosandbox = 0;
|
||||
int box86_malloc_hack = 0;
|
||||
@@ -129,6 +131,7 @@ int box86_musl = 0;
|
||||
int box86_nopulse = 0;
|
||||
int box86_nogtk = 0;
|
||||
int box86_novulkan = 0;
|
||||
int box86_nocrashhandler = 0;
|
||||
#ifdef BAD_SIGNAL
|
||||
int box86_futex_waitv = 0;
|
||||
#else
|
||||
@@ -571,6 +574,15 @@ void LoadLogEnv()
|
||||
if(!box86_libcef)
|
||||
printf_log(LOG_INFO, "Dynarec will not detect libcef\n");
|
||||
}
|
||||
p = getenv("BOX86_NOCRASHHANDLER");
|
||||
if(p) {
|
||||
if(strlen(p)==1) {
|
||||
if(p[0]>='0' && p[0]<='1')
|
||||
box86_nocrashhandler = p[0]-'0';
|
||||
}
|
||||
if(box86_nocrashhandler)
|
||||
printf_log(LOG_INFO, "Box86 will consider crashhnadler.so to not be present\n");
|
||||
}
|
||||
p = getenv("BOX86_SDL2_JGUID");
|
||||
if(p) {
|
||||
if(strlen(p)==1) {
|
||||
@@ -759,6 +771,19 @@ void LoadLogEnv()
|
||||
if(box86_showbt)
|
||||
printf_log(LOG_INFO, "Show Backtrace for signals\n");
|
||||
}
|
||||
p = getenv("BOX86_MAXCPU");
|
||||
if(p) {
|
||||
int maxcpu = 0;
|
||||
if(sscanf(p, "%d", &maxcpu)==1)
|
||||
box86_maxcpu = maxcpu;
|
||||
if(box86_maxcpu<0)
|
||||
box86_maxcpu = 0;
|
||||
if(box86_maxcpu) {
|
||||
printf_log(LOG_INFO, "Will not expose more than %d cpu cores\n", box86_maxcpu);
|
||||
} else {
|
||||
printf_log(LOG_INFO, "Will not limit the number of cpu cores exposed\n");
|
||||
}
|
||||
}
|
||||
box86_pagesize = sysconf(_SC_PAGESIZE);
|
||||
if(!box86_pagesize)
|
||||
box86_pagesize = 4096;
|
||||
@@ -888,8 +913,8 @@ void PrintFlags() {
|
||||
printf(" BOX86_LIBGL=libXXXX set the name (and optionnaly full path) for libGL.so.1\n");
|
||||
printf(" BOX86_LD_PRELOAD=XXXX[:YYYYY] force loading XXXX (and YYYY...) libraries with the binary\n");
|
||||
printf(" BOX86_ALLOWMISSINGLIBS with 1 to allow to continue even if a lib is missing (unadvised, will probably crash later)\n");
|
||||
printf(" BOX64_PREFER_EMULATED=1 to prefer emulated libs first (execpt for glibc, alsa, pulse, GL, vulkan and X11)\n");
|
||||
printf(" BOX64_PREFER_WRAPPED if box86 will use wrapped libs even if the lib is specified with absolute path\n");
|
||||
printf(" BOX86_PREFER_EMULATED=1 to prefer emulated libs first (execpt for glibc, alsa, pulse, GL, vulkan and X11)\n");
|
||||
printf(" BOX86_PREFER_WRAPPED if box86 will use wrapped libs even if the lib is specified with absolute path\n");
|
||||
printf(" BOX86_NOPULSE=1 to disable the loading of pulseaudio libs\n");
|
||||
printf(" BOX86_NOGTK=1 to disable the loading of wrapped gtk libs\n");
|
||||
printf(" BOX86_NOVULKAN=1 to disable the loading of wrapped vulkan libs\n");
|
||||
@@ -949,6 +974,10 @@ void LoadEnvVars(box86context_t *context)
|
||||
AddPath("/mnt/utmp/codeblocks/usr/lib/i386-linux-gnu", &context->box86_ld_lib, 1);
|
||||
if(FileExist("/mnt/utmp/box86/lib/i386-linux-gnu", 0))
|
||||
AddPath("/mnt/utmp/box86/lib/i386-linux-gnu", &context->box86_ld_lib, 1);
|
||||
if(FileExist("/mnt/utmp/codeblocks/usr/lib/box86-i386-linux-gnu", 0))
|
||||
AddPath("/mnt/utmp/codeblocks/usr/lib/box86-i386-linux-gnu", &context->box86_ld_lib, 1);
|
||||
if(FileExist("/mnt/utmp/box86/lib/box86-i386-linux-gnu", 0))
|
||||
AddPath("/mnt/utmp/box86/lib/box86-i386-linux-gnu", &context->box86_ld_lib, 1);
|
||||
//TODO: add relative path to box86 location
|
||||
#endif
|
||||
#ifndef TERMUX
|
||||
@@ -966,11 +995,17 @@ void LoadEnvVars(box86context_t *context)
|
||||
AddPath("/usr/lib/i686-pc-linux-gnu", &context->box86_ld_lib, 1);
|
||||
if(FileExist("/usr/lib32", 0))
|
||||
AddPath("/usr/lib32", &context->box86_ld_lib, 1);
|
||||
if(FileExist("/lib/box86-i386-linux-gnu", 0))
|
||||
AddPath("/lib/box86-i386-linux-gnu", &context->box86_ld_lib, 1);
|
||||
if(FileExist("/usr/lib/box86-i386-linux-gnu", 0))
|
||||
AddPath("/usr/lib/box86-i386-linux-gnu", &context->box86_ld_lib, 1);
|
||||
#else
|
||||
if(FileExist("/data/data/com.termux/files/usr/lib/i386-linux-gnu", 0))
|
||||
AddPath("/data/data/com.termux/files/usr/lib/i386-linux-gnu", &context->box86_ld_lib, 1);
|
||||
if(FileExist("/data/data/com.termux/files/usr/lib/i686-linux-gnu", 0))
|
||||
AddPath("/data/data/com.termux/files/usr/lib/i686-linux-gnu", &context->box86_ld_lib, 1);
|
||||
if(FileExist("/data/data/com.termux/files/usr/lib/box86-i386-linux-gnu", 0))
|
||||
AddPath("/data/data/com.termux/files/usr/lib/box86-i386-linux-gnu", &context->box86_ld_lib, 1);
|
||||
#endif
|
||||
if(getenv("LD_LIBRARY_PATH"))
|
||||
PrependList(&context->box86_ld_lib, getenv("LD_LIBRARY_PATH"), 1); // in case some of the path are for x86 world
|
||||
@@ -1306,7 +1341,7 @@ int main(int argc, const char **argv, char **env)
|
||||
|
||||
// check BOX86_LOG debug level
|
||||
LoadLogEnv();
|
||||
if(!getenv("BOX64_NORCFILES")) {
|
||||
if(!getenv("BOX86_NORCFILES")) {
|
||||
load_rcfiles();
|
||||
}
|
||||
char* bashpath = NULL;
|
||||
@@ -1569,6 +1604,9 @@ int main(int argc, const char **argv, char **env)
|
||||
my_context->argv[i] = box_strdup(argv[i+nextarg]);
|
||||
printf_log(LOG_INFO, "argv[%i]=\"%s\"\n", i, my_context->argv[i]);
|
||||
}
|
||||
if(box86_wine) {
|
||||
box86_maxcpu_immutable = 1; // cannot change once wine is loaded
|
||||
}
|
||||
if(box86_nosandbox)
|
||||
{
|
||||
add_argv("--no-sandbox");
|
||||
|
||||
@@ -93,8 +93,8 @@ int getNCpu()
|
||||
{
|
||||
if(!nCPU)
|
||||
grabNCpu();
|
||||
if(box86_wine && nCPU>32)
|
||||
return 32;
|
||||
if(box86_maxcpu && nCPU>box86_maxcpu)
|
||||
return box86_maxcpu;
|
||||
return nCPU;
|
||||
}
|
||||
|
||||
|
||||
+11
-1
@@ -52,9 +52,11 @@ ENTRYSTRING_(BOX86_BOX64, box64) \
|
||||
ENTRYSTRING_(BOX86_LD_PRELOAD, ld_preload) \
|
||||
ENTRYBOOL(BOX86_NOSANDBOX, box86_nosandbox) \
|
||||
ENTRYBOOL(BOX86_LIBCEF, box86_libcef) \
|
||||
ENTRYBOOL(BOX86_NOCRASHHANDLER, box86_nocrashhandler) \
|
||||
ENTRYBOOL(BOX86_SDL2_JGUID, box86_sdl2_jguid) \
|
||||
ENTRYBOOL(BOX86_MUTEX_ALIGNED, box86_mutex_aligned) \
|
||||
ENTRYINT(BOX86_MALLOC_HACK, box86_malloc_hack, 0, 2, 2) \
|
||||
ENTRYINTPOS(BOX86_MAXCPU, new_maxcpu) \
|
||||
|
||||
#ifdef HAVE_TRACE
|
||||
#define SUPER2() \
|
||||
@@ -109,7 +111,7 @@ IGNORE(BOX86_DYNAREC_X87DOUBLE) \
|
||||
IGNORE(BOX86_DYNAREC_FASTNAN) \
|
||||
IGNORE(BOX86_DYNAREC_FASTROUND) \
|
||||
IGNORE(BOX86_DYNAREC_SAFEFLAGS) \
|
||||
IGNORE(BOX64_DYNAREC_CALLRET) \
|
||||
IGNORE(BOX86_DYNAREC_CALLRET) \
|
||||
IGNORE(BOX86_DYNAREC_HOTPAGE) \
|
||||
IGNORE(BOX86_DYNAREC_FASTPAGE) \
|
||||
IGNORE(BOX86_DYNAREC_WAIT) \
|
||||
@@ -399,6 +401,7 @@ void ApplyParams(const char* name, path_collection_t* preload)
|
||||
return;
|
||||
static const char* old_name = NULL;
|
||||
int new_cycle_log = cycle_log;
|
||||
int new_maxcpu = box86_maxcpu;
|
||||
if(old_name && !strcmp(name, old_name))
|
||||
return;
|
||||
old_name = name;
|
||||
@@ -442,6 +445,13 @@ void ApplyParams(const char* name, path_collection_t* preload)
|
||||
cycle_log = new_cycle_log;
|
||||
initCycleLog(my_context);
|
||||
}
|
||||
if(!box86_maxcpu_immutable) {
|
||||
if(new_maxcpu!=box86_maxcpu && box86_maxcpu && box86_maxcpu<new_maxcpu) {
|
||||
printf_log(LOG_INFO, "Not applying BOX86_MAXCPU=%d because a lesser value is already active: %d\n", new_maxcpu, box86_maxcpu);
|
||||
} else
|
||||
box86_maxcpu = new_maxcpu;
|
||||
} else if(new_maxcpu!=box86_maxcpu)
|
||||
printf_log(LOG_INFO, "Not applying BOX86_MAXCPU=%d because it's too late\n", new_maxcpu);
|
||||
if(param->is_ld_library_path_present) AppendList(&my_context->box86_ld_lib, param->ld_library_path, 1);
|
||||
if(param->is_box86_path_present) AppendList(&my_context->box86_path, param->box86_path, 1);
|
||||
if(param->is_trace_file_present) {
|
||||
|
||||
@@ -491,6 +491,7 @@
|
||||
#() iFpOu
|
||||
#() iFpPU
|
||||
#() iFpPp
|
||||
#() iFpPP
|
||||
#() iFpGG
|
||||
#() iFSpi
|
||||
#() iFSpL
|
||||
@@ -1297,6 +1298,7 @@
|
||||
#() iFpupup
|
||||
#() iFpuppu
|
||||
#() iFpuppp
|
||||
#() iFpuPpp
|
||||
#() iFpUiUi
|
||||
#() iFplluu
|
||||
#() iFpLlpp
|
||||
@@ -1332,6 +1334,7 @@
|
||||
#() iFppppL
|
||||
#() iFppppp
|
||||
#() iFpppGp
|
||||
#() iFpPPpp
|
||||
#() IFppIII
|
||||
#() uFEippp
|
||||
#() uFEpipp
|
||||
@@ -1587,6 +1590,7 @@
|
||||
#() iFiiiuwp
|
||||
#() iFiuiipi
|
||||
#() iFiuUuUu
|
||||
#() iFipiipi
|
||||
#() iFipipuu
|
||||
#() iFipuIup
|
||||
#() iFipupup
|
||||
@@ -2418,8 +2422,7 @@
|
||||
#defined(HAVE_LD80BITS) DFDD
|
||||
#defined(HAVE_LD80BITS) DFDp
|
||||
#defined(HAVE_LD80BITS) DFppi
|
||||
#defined(HAVE_LD80BITS) DFppu
|
||||
#defined(HAVE_LD80BITS) DFppip
|
||||
#defined(HAVE_LD80BITS) DFppp
|
||||
#defined(HAVE_LD80BITS) iFDipppL
|
||||
#defined(HAVE_LD80BITS) vFppippDDC
|
||||
#!defined(HAVE_LD80BITS) iFK
|
||||
@@ -2429,8 +2432,7 @@
|
||||
#!defined(HAVE_LD80BITS) KFKp
|
||||
#!defined(HAVE_LD80BITS) KFpp
|
||||
#!defined(HAVE_LD80BITS) KFppi
|
||||
#!defined(HAVE_LD80BITS) KFppu
|
||||
#!defined(HAVE_LD80BITS) KFppip
|
||||
#!defined(HAVE_LD80BITS) KFppp
|
||||
#!defined(HAVE_LD80BITS) iFKipppL
|
||||
#!defined(HAVE_LD80BITS) vFppippKKC
|
||||
#() iFEvpp -> iFEpp
|
||||
@@ -3175,10 +3177,13 @@ wrappedlibc:
|
||||
- vFpp:
|
||||
- vFpV:
|
||||
- iFip:
|
||||
- __fstat64_time64
|
||||
- fstat
|
||||
- iFpi:
|
||||
- iFpL:
|
||||
- iFpp:
|
||||
- __lstat64_time64
|
||||
- __stat64_time64
|
||||
- execvp
|
||||
- lstat
|
||||
- lstat64
|
||||
@@ -3223,6 +3228,7 @@ wrappedlibc:
|
||||
- iFppL:
|
||||
- iFppp:
|
||||
- _IO_vfscanf
|
||||
- execvpe
|
||||
- iFppV:
|
||||
- __isoc23_fscanf
|
||||
- __isoc23_sscanf
|
||||
@@ -3242,7 +3248,8 @@ wrappedlibc:
|
||||
- __isoc23_strtoull
|
||||
- KFppi:
|
||||
- __strtold_internal
|
||||
- KFppu:
|
||||
- KFppp:
|
||||
- __strtold_l
|
||||
- strtold_l
|
||||
- lFipL:
|
||||
- __read_nocancel
|
||||
@@ -3263,7 +3270,9 @@ wrappedlibc:
|
||||
- ptrace
|
||||
- iFipii:
|
||||
- iFipuu:
|
||||
- sendmmsg
|
||||
- iFippi:
|
||||
- __fstatat64_time64
|
||||
- iFippL:
|
||||
- readlinkat
|
||||
- iFpvpp:
|
||||
@@ -3282,8 +3291,6 @@ wrappedlibc:
|
||||
- __isoc23_strtoll_l
|
||||
- UFppip:
|
||||
- __isoc23_strtoull_l
|
||||
- KFppip:
|
||||
- __strtold_l
|
||||
- lFipiI:
|
||||
- lFpupp:
|
||||
- vFpLLpp:
|
||||
@@ -3656,6 +3663,7 @@ wrappedlibpthread:
|
||||
- pthread_mutex_timedlock
|
||||
- pthread_once
|
||||
- pthread_setname_np
|
||||
- sem_timedwait
|
||||
- vFppp:
|
||||
- _pthread_cleanup_push
|
||||
- _pthread_cleanup_push_defer
|
||||
@@ -3687,6 +3695,7 @@ wrappedlibrt:
|
||||
- aio_cancel
|
||||
- iFupp:
|
||||
- timer_create
|
||||
- iFiipp:
|
||||
- iFipip:
|
||||
- lio_listio
|
||||
wrappedlibsm:
|
||||
@@ -4820,6 +4829,8 @@ wrappedvulkan:
|
||||
- vkDestroySurfaceKHR
|
||||
- vkDestroySwapchainKHR
|
||||
- vkDestroyValidationCacheEXT
|
||||
- vkDestroyVideoSessionKHR
|
||||
- vkDestroyVideoSessionParametersKHR
|
||||
- vFppp:
|
||||
- vkDestroyDebugUtilsMessengerEXT
|
||||
- vFpPp:
|
||||
@@ -4846,12 +4857,15 @@ wrappedvulkan:
|
||||
- vkQueueSubmit2
|
||||
- vkQueueSubmit2KHR
|
||||
- iFpUup:
|
||||
- vkBindVideoSessionMemoryKHR
|
||||
- vkGetDisplayPlaneCapabilitiesKHR
|
||||
- iFpUpP:
|
||||
- vkGetPastPresentationTimingGOOGLE
|
||||
- iFpppp:
|
||||
- vkCreateDebugReportCallbackEXT
|
||||
- vkCreateDebugUtilsMessengerEXT
|
||||
- vkCreateVideoSessionKHR
|
||||
- vkCreateVideoSessionParametersKHR
|
||||
- vkCreateWaylandSurfaceKHR
|
||||
- iFpPpp:
|
||||
- vkAllocateMemory
|
||||
|
||||
@@ -67,7 +67,7 @@ typedef int32_t (*iFpOV_t)(void*, int32_t, ...);
|
||||
typedef int64_t (*IFppi_t)(void*, void*, int32_t);
|
||||
typedef uint64_t (*UFppi_t)(void*, void*, int32_t);
|
||||
typedef double (*KFppi_t)(void*, void*, int32_t);
|
||||
typedef double (*KFppu_t)(void*, void*, uint32_t);
|
||||
typedef double (*KFppp_t)(void*, void*, void*);
|
||||
typedef intptr_t (*lFipL_t)(int32_t, void*, uintptr_t);
|
||||
typedef intptr_t (*lFppi_t)(void*, void*, int32_t);
|
||||
typedef void* (*pFpii_t)(void*, int32_t, int32_t);
|
||||
@@ -96,7 +96,6 @@ typedef int32_t (*iFppiV_t)(void*, void*, int32_t, ...);
|
||||
typedef int32_t (*iFpppp_t)(void*, void*, void*, void*);
|
||||
typedef int64_t (*IFppip_t)(void*, void*, int32_t, void*);
|
||||
typedef uint64_t (*UFppip_t)(void*, void*, int32_t, void*);
|
||||
typedef double (*KFppip_t)(void*, void*, int32_t, void*);
|
||||
typedef intptr_t (*lFipiI_t)(int32_t, void*, int32_t, int64_t);
|
||||
typedef intptr_t (*lFpupp_t)(void*, uint32_t, void*, void*);
|
||||
typedef void (*vFpLLpp_t)(void*, uintptr_t, uintptr_t, void*, void*);
|
||||
@@ -136,7 +135,10 @@ typedef int32_t (*iFpLiLppp_t)(void*, uintptr_t, int32_t, uintptr_t, void*, void
|
||||
GO(getpwuid, pFu_t) \
|
||||
GO(__secure_getenv, pFp_t) \
|
||||
GO(secure_getenv, pFp_t) \
|
||||
GO(__fstat64_time64, iFip_t) \
|
||||
GO(fstat, iFip_t) \
|
||||
GO(__lstat64_time64, iFpp_t) \
|
||||
GO(__stat64_time64, iFpp_t) \
|
||||
GO(execvp, iFpp_t) \
|
||||
GO(lstat, iFpp_t) \
|
||||
GO(lstat64, iFpp_t) \
|
||||
@@ -156,6 +158,7 @@ typedef int32_t (*iFpLiLppp_t)(void*, uintptr_t, int32_t, uintptr_t, void*, void
|
||||
GO(getopt, iFipp_t) \
|
||||
GO(dprintf, iFipV_t) \
|
||||
GO(_IO_vfscanf, iFppp_t) \
|
||||
GO(execvpe, iFppp_t) \
|
||||
GO(__isoc23_fscanf, iFppV_t) \
|
||||
GO(__isoc23_sscanf, iFppV_t) \
|
||||
GO(__isoc23_sscanf, iFppV_t) \
|
||||
@@ -169,18 +172,20 @@ typedef int32_t (*iFpLiLppp_t)(void*, uintptr_t, int32_t, uintptr_t, void*, void
|
||||
GO(__isoc23_strtoll, IFppi_t) \
|
||||
GO(__isoc23_strtoull, UFppi_t) \
|
||||
GO(__strtold_internal, KFppi_t) \
|
||||
GO(strtold_l, KFppu_t) \
|
||||
GO(__strtold_l, KFppp_t) \
|
||||
GO(strtold_l, KFppp_t) \
|
||||
GO(__read_nocancel, lFipL_t) \
|
||||
GO(__isoc23_strtol, lFppi_t) \
|
||||
GO(__syslog_chk, vFiipV_t) \
|
||||
GO(__libc_init, vFpppp_t) \
|
||||
GO(ptrace, iFiupp_t) \
|
||||
GO(sendmmsg, iFipuu_t) \
|
||||
GO(__fstatat64_time64, iFippi_t) \
|
||||
GO(readlinkat, iFippL_t) \
|
||||
GO(__vfwprintf_chk, iFpvpp_t) \
|
||||
GO(_IO_vfprintf, iFpppp_t) \
|
||||
GO(__isoc23_strtoll_l, IFppip_t) \
|
||||
GO(__isoc23_strtoull_l, UFppip_t) \
|
||||
GO(__strtold_l, KFppip_t) \
|
||||
GO(prctl, iFiLLLL_t) \
|
||||
GO(getopt_long, iFipppp_t) \
|
||||
GO(getopt_long_only, iFipppp_t)
|
||||
|
||||
@@ -67,6 +67,7 @@ typedef int32_t (*iFpppp_t)(void*, void*, void*, void*);
|
||||
GO(pthread_mutex_timedlock, iFpp_t) \
|
||||
GO(pthread_once, iFpp_t) \
|
||||
GO(pthread_setname_np, iFpp_t) \
|
||||
GO(sem_timedwait, iFpp_t) \
|
||||
GO(_pthread_cleanup_push, vFppp_t) \
|
||||
GO(_pthread_cleanup_push_defer, vFppp_t) \
|
||||
GO(pthread_setaffinity_np, iFLup_t) \
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
typedef int32_t (*iFp_t)(void*);
|
||||
typedef int32_t (*iFip_t)(int32_t, void*);
|
||||
typedef int32_t (*iFupp_t)(uint32_t, void*, void*);
|
||||
typedef int32_t (*iFiipp_t)(int32_t, int32_t, void*, void*);
|
||||
typedef int32_t (*iFipip_t)(int32_t, void*, int32_t, void*);
|
||||
|
||||
#define SUPER() ADDED_FUNCTIONS() \
|
||||
|
||||
@@ -69,6 +69,8 @@ typedef void (*vFpiiiupupup_t)(void*, int32_t, int32_t, int32_t, uint32_t, void*
|
||||
GO(vkDestroySurfaceKHR, vFpUp_t) \
|
||||
GO(vkDestroySwapchainKHR, vFpUp_t) \
|
||||
GO(vkDestroyValidationCacheEXT, vFpUp_t) \
|
||||
GO(vkDestroyVideoSessionKHR, vFpUp_t) \
|
||||
GO(vkDestroyVideoSessionParametersKHR, vFpUp_t) \
|
||||
GO(vkDestroyDebugUtilsMessengerEXT, vFppp_t) \
|
||||
GO(vkGetImageMemoryRequirements2, vFpPp_t) \
|
||||
GO(vkGetImageMemoryRequirements2KHR, vFpPp_t) \
|
||||
@@ -86,10 +88,13 @@ typedef void (*vFpiiiupupup_t)(void*, int32_t, int32_t, int32_t, uint32_t, void*
|
||||
GO(vkGetDeviceImageSparseMemoryRequirementsKHR, vFpPpp_t) \
|
||||
GO(vkQueueSubmit2, iFpupU_t) \
|
||||
GO(vkQueueSubmit2KHR, iFpupU_t) \
|
||||
GO(vkBindVideoSessionMemoryKHR, iFpUup_t) \
|
||||
GO(vkGetDisplayPlaneCapabilitiesKHR, iFpUup_t) \
|
||||
GO(vkGetPastPresentationTimingGOOGLE, iFpUpP_t) \
|
||||
GO(vkCreateDebugReportCallbackEXT, iFpppp_t) \
|
||||
GO(vkCreateDebugUtilsMessengerEXT, iFpppp_t) \
|
||||
GO(vkCreateVideoSessionKHR, iFpppp_t) \
|
||||
GO(vkCreateVideoSessionParametersKHR, iFpppp_t) \
|
||||
GO(vkCreateWaylandSurfaceKHR, iFpppp_t) \
|
||||
GO(vkAllocateMemory, iFpPpp_t) \
|
||||
GO(vkCreateBuffer, iFpPpp_t) \
|
||||
|
||||
@@ -563,6 +563,7 @@ typedef int32_t (*iFppG_t)(void*, void*, void*);
|
||||
typedef int32_t (*iFpOu_t)(void*, int32_t, uint32_t);
|
||||
typedef int32_t (*iFpPU_t)(void*, void*, uint64_t);
|
||||
typedef int32_t (*iFpPp_t)(void*, void*, void*);
|
||||
typedef int32_t (*iFpPP_t)(void*, void*, void*);
|
||||
typedef int32_t (*iFpGG_t)(void*, void*, void*);
|
||||
typedef int32_t (*iFSpi_t)(void*, void*, int32_t);
|
||||
typedef int32_t (*iFSpL_t)(void*, void*, uintptr_t);
|
||||
@@ -1369,6 +1370,7 @@ typedef int32_t (*iFpupuu_t)(void*, uint32_t, void*, uint32_t, uint32_t);
|
||||
typedef int32_t (*iFpupup_t)(void*, uint32_t, void*, uint32_t, void*);
|
||||
typedef int32_t (*iFpuppu_t)(void*, uint32_t, void*, void*, uint32_t);
|
||||
typedef int32_t (*iFpuppp_t)(void*, uint32_t, void*, void*, void*);
|
||||
typedef int32_t (*iFpuPpp_t)(void*, uint32_t, void*, void*, void*);
|
||||
typedef int32_t (*iFpUiUi_t)(void*, uint64_t, int32_t, uint64_t, int32_t);
|
||||
typedef int32_t (*iFplluu_t)(void*, intptr_t, intptr_t, uint32_t, uint32_t);
|
||||
typedef int32_t (*iFpLlpp_t)(void*, uintptr_t, intptr_t, void*, void*);
|
||||
@@ -1404,6 +1406,7 @@ typedef int32_t (*iFppppu_t)(void*, void*, void*, void*, uint32_t);
|
||||
typedef int32_t (*iFppppL_t)(void*, void*, void*, void*, uintptr_t);
|
||||
typedef int32_t (*iFppppp_t)(void*, void*, void*, void*, void*);
|
||||
typedef int32_t (*iFpppGp_t)(void*, void*, void*, void*, void*);
|
||||
typedef int32_t (*iFpPPpp_t)(void*, void*, void*, void*, void*);
|
||||
typedef int64_t (*IFppIII_t)(void*, void*, int64_t, int64_t, int64_t);
|
||||
typedef uint32_t (*uFEippp_t)(x86emu_t*, int32_t, void*, void*, void*);
|
||||
typedef uint32_t (*uFEpipp_t)(x86emu_t*, void*, int32_t, void*, void*);
|
||||
@@ -1659,6 +1662,7 @@ typedef int32_t (*iFiiiiip_t)(int32_t, int32_t, int32_t, int32_t, int32_t, void*
|
||||
typedef int32_t (*iFiiiuwp_t)(int32_t, int32_t, int32_t, uint32_t, int16_t, void*);
|
||||
typedef int32_t (*iFiuiipi_t)(int32_t, uint32_t, int32_t, int32_t, void*, int32_t);
|
||||
typedef int32_t (*iFiuUuUu_t)(int32_t, uint32_t, uint64_t, uint32_t, uint64_t, uint32_t);
|
||||
typedef int32_t (*iFipiipi_t)(int32_t, void*, int32_t, int32_t, void*, int32_t);
|
||||
typedef int32_t (*iFipipuu_t)(int32_t, void*, int32_t, void*, uint32_t, uint32_t);
|
||||
typedef int32_t (*iFipuIup_t)(int32_t, void*, uint32_t, int64_t, uint32_t, void*);
|
||||
typedef int32_t (*iFipupup_t)(int32_t, void*, uint32_t, void*, uint32_t, void*);
|
||||
@@ -2504,8 +2508,7 @@ typedef long double (*DFED_t)(x86emu_t*, long double);
|
||||
typedef long double (*DFDD_t)(long double, long double);
|
||||
typedef long double (*DFDp_t)(long double, void*);
|
||||
typedef long double (*DFppi_t)(void*, void*, int32_t);
|
||||
typedef long double (*DFppu_t)(void*, void*, uint32_t);
|
||||
typedef long double (*DFppip_t)(void*, void*, int32_t, void*);
|
||||
typedef long double (*DFppp_t)(void*, void*, void*);
|
||||
typedef int32_t (*iFDipppL_t)(long double, int32_t, void*, void*, void*, uintptr_t);
|
||||
typedef void (*vFppippDDC_t)(void*, void*, int32_t, void*, void*, long double, long double, uint8_t);
|
||||
#endif
|
||||
@@ -2518,8 +2521,7 @@ typedef double (*KFKK_t)(double, double);
|
||||
typedef double (*KFKp_t)(double, void*);
|
||||
typedef double (*KFpp_t)(void*, void*);
|
||||
typedef double (*KFppi_t)(void*, void*, int32_t);
|
||||
typedef double (*KFppu_t)(void*, void*, uint32_t);
|
||||
typedef double (*KFppip_t)(void*, void*, int32_t, void*);
|
||||
typedef double (*KFppp_t)(void*, void*, void*);
|
||||
typedef int32_t (*iFKipppL_t)(double, int32_t, void*, void*, void*, uintptr_t);
|
||||
typedef void (*vFppippKKC_t)(void*, void*, int32_t, void*, void*, double, double, uint8_t);
|
||||
#endif
|
||||
@@ -3017,6 +3019,7 @@ void iFppG(x86emu_t *emu, uintptr_t fcn) { iFppG_t fn = (iFppG_t)fcn; my_GValue_
|
||||
void iFpOu(x86emu_t *emu, uintptr_t fcn) { iFpOu_t fn = (iFpOu_t)fcn; R_EAX=fn(*(void**)(R_ESP + 4), of_convert(*(int32_t*)(R_ESP + 8)), *(uint32_t*)(R_ESP + 12)); }
|
||||
void iFpPU(x86emu_t *emu, uintptr_t fcn) { iFpPU_t fn = (iFpPU_t)fcn; void *arg8 = VulkanFromx86(*(void**)(R_ESP + 8)); R_EAX=fn(*(void**)(R_ESP + 4), arg8, *(uint64_t*)(R_ESP + 12)); VulkanTox86(arg8); }
|
||||
void iFpPp(x86emu_t *emu, uintptr_t fcn) { iFpPp_t fn = (iFpPp_t)fcn; void *arg8 = VulkanFromx86(*(void**)(R_ESP + 8)); R_EAX=fn(*(void**)(R_ESP + 4), arg8, *(void**)(R_ESP + 12)); VulkanTox86(arg8); }
|
||||
void iFpPP(x86emu_t *emu, uintptr_t fcn) { iFpPP_t fn = (iFpPP_t)fcn; void *arg8 = VulkanFromx86(*(void**)(R_ESP + 8)); void *arg12 = VulkanFromx86(*(void**)(R_ESP + 12)); R_EAX=fn(*(void**)(R_ESP + 4), arg8, arg12); VulkanTox86(arg8); VulkanTox86(arg12); }
|
||||
void iFpGG(x86emu_t *emu, uintptr_t fcn) { iFpGG_t fn = (iFpGG_t)fcn; my_GValue_t arg8; alignGValue(&arg8, *(void**)(R_ESP + 8)); my_GValue_t arg12; alignGValue(&arg12, *(void**)(R_ESP + 12)); R_EAX=fn(*(void**)(R_ESP + 4), &arg8, &arg12); unalignGValue(*(void**)(R_ESP + 8), &arg8); unalignGValue(*(void**)(R_ESP + 12), &arg12); }
|
||||
void iFSpi(x86emu_t *emu, uintptr_t fcn) { iFSpi_t fn = (iFSpi_t)fcn; R_EAX=fn(io_convert(*(void**)(R_ESP + 4)), *(void**)(R_ESP + 8), *(int32_t*)(R_ESP + 12)); }
|
||||
void iFSpL(x86emu_t *emu, uintptr_t fcn) { iFSpL_t fn = (iFSpL_t)fcn; R_EAX=fn(io_convert(*(void**)(R_ESP + 4)), *(void**)(R_ESP + 8), *(uintptr_t*)(R_ESP + 12)); }
|
||||
@@ -3823,6 +3826,7 @@ void iFpupuu(x86emu_t *emu, uintptr_t fcn) { iFpupuu_t fn = (iFpupuu_t)fcn; R_EA
|
||||
void iFpupup(x86emu_t *emu, uintptr_t fcn) { iFpupup_t fn = (iFpupup_t)fcn; R_EAX=fn(*(void**)(R_ESP + 4), *(uint32_t*)(R_ESP + 8), *(void**)(R_ESP + 12), *(uint32_t*)(R_ESP + 16), *(void**)(R_ESP + 20)); }
|
||||
void iFpuppu(x86emu_t *emu, uintptr_t fcn) { iFpuppu_t fn = (iFpuppu_t)fcn; R_EAX=fn(*(void**)(R_ESP + 4), *(uint32_t*)(R_ESP + 8), *(void**)(R_ESP + 12), *(void**)(R_ESP + 16), *(uint32_t*)(R_ESP + 20)); }
|
||||
void iFpuppp(x86emu_t *emu, uintptr_t fcn) { iFpuppp_t fn = (iFpuppp_t)fcn; R_EAX=fn(*(void**)(R_ESP + 4), *(uint32_t*)(R_ESP + 8), *(void**)(R_ESP + 12), *(void**)(R_ESP + 16), *(void**)(R_ESP + 20)); }
|
||||
void iFpuPpp(x86emu_t *emu, uintptr_t fcn) { iFpuPpp_t fn = (iFpuPpp_t)fcn; void *arg12 = VulkanFromx86(*(void**)(R_ESP + 12)); R_EAX=fn(*(void**)(R_ESP + 4), *(uint32_t*)(R_ESP + 8), arg12, *(void**)(R_ESP + 16), *(void**)(R_ESP + 20)); VulkanTox86(arg12); }
|
||||
void iFpUiUi(x86emu_t *emu, uintptr_t fcn) { iFpUiUi_t fn = (iFpUiUi_t)fcn; R_EAX=fn(*(void**)(R_ESP + 4), *(uint64_t*)(R_ESP + 8), *(int32_t*)(R_ESP + 16), *(uint64_t*)(R_ESP + 20), *(int32_t*)(R_ESP + 28)); }
|
||||
void iFplluu(x86emu_t *emu, uintptr_t fcn) { iFplluu_t fn = (iFplluu_t)fcn; R_EAX=fn(*(void**)(R_ESP + 4), *(intptr_t*)(R_ESP + 8), *(intptr_t*)(R_ESP + 12), *(uint32_t*)(R_ESP + 16), *(uint32_t*)(R_ESP + 20)); }
|
||||
void iFpLlpp(x86emu_t *emu, uintptr_t fcn) { iFpLlpp_t fn = (iFpLlpp_t)fcn; R_EAX=fn(*(void**)(R_ESP + 4), *(uintptr_t*)(R_ESP + 8), *(intptr_t*)(R_ESP + 12), *(void**)(R_ESP + 16), *(void**)(R_ESP + 20)); }
|
||||
@@ -3858,6 +3862,7 @@ void iFppppu(x86emu_t *emu, uintptr_t fcn) { iFppppu_t fn = (iFppppu_t)fcn; R_EA
|
||||
void iFppppL(x86emu_t *emu, uintptr_t fcn) { iFppppL_t fn = (iFppppL_t)fcn; R_EAX=fn(*(void**)(R_ESP + 4), *(void**)(R_ESP + 8), *(void**)(R_ESP + 12), *(void**)(R_ESP + 16), *(uintptr_t*)(R_ESP + 20)); }
|
||||
void iFppppp(x86emu_t *emu, uintptr_t fcn) { iFppppp_t fn = (iFppppp_t)fcn; R_EAX=fn(*(void**)(R_ESP + 4), *(void**)(R_ESP + 8), *(void**)(R_ESP + 12), *(void**)(R_ESP + 16), *(void**)(R_ESP + 20)); }
|
||||
void iFpppGp(x86emu_t *emu, uintptr_t fcn) { iFpppGp_t fn = (iFpppGp_t)fcn; my_GValue_t arg16; alignGValue(&arg16, *(void**)(R_ESP + 16)); R_EAX=fn(*(void**)(R_ESP + 4), *(void**)(R_ESP + 8), *(void**)(R_ESP + 12), &arg16, *(void**)(R_ESP + 20)); unalignGValue(*(void**)(R_ESP + 16), &arg16); }
|
||||
void iFpPPpp(x86emu_t *emu, uintptr_t fcn) { iFpPPpp_t fn = (iFpPPpp_t)fcn; void *arg8 = VulkanFromx86(*(void**)(R_ESP + 8)); void *arg12 = VulkanFromx86(*(void**)(R_ESP + 12)); R_EAX=fn(*(void**)(R_ESP + 4), arg8, arg12, *(void**)(R_ESP + 16), *(void**)(R_ESP + 20)); VulkanTox86(arg8); VulkanTox86(arg12); }
|
||||
void IFppIII(x86emu_t *emu, uintptr_t fcn) { IFppIII_t fn = (IFppIII_t)fcn; ui64_t r; r.i=fn(*(void**)(R_ESP + 4), *(void**)(R_ESP + 8), *(int64_t*)(R_ESP + 12), *(int64_t*)(R_ESP + 20), *(int64_t*)(R_ESP + 28)); R_EAX=r.d[0]; R_EDX=r.d[1]; }
|
||||
void uFEippp(x86emu_t *emu, uintptr_t fcn) { uFEippp_t fn = (uFEippp_t)fcn; R_EAX=(uint32_t)fn(emu, *(int32_t*)(R_ESP + 4), *(void**)(R_ESP + 8), *(void**)(R_ESP + 12), *(void**)(R_ESP + 16)); }
|
||||
void uFEpipp(x86emu_t *emu, uintptr_t fcn) { uFEpipp_t fn = (uFEpipp_t)fcn; R_EAX=(uint32_t)fn(emu, *(void**)(R_ESP + 4), *(int32_t*)(R_ESP + 8), *(void**)(R_ESP + 12), *(void**)(R_ESP + 16)); }
|
||||
@@ -4113,6 +4118,7 @@ void iFiiiiip(x86emu_t *emu, uintptr_t fcn) { iFiiiiip_t fn = (iFiiiiip_t)fcn; R
|
||||
void iFiiiuwp(x86emu_t *emu, uintptr_t fcn) { iFiiiuwp_t fn = (iFiiiuwp_t)fcn; R_EAX=fn(*(int32_t*)(R_ESP + 4), *(int32_t*)(R_ESP + 8), *(int32_t*)(R_ESP + 12), *(uint32_t*)(R_ESP + 16), *(int16_t*)(R_ESP + 20), *(void**)(R_ESP + 24)); }
|
||||
void iFiuiipi(x86emu_t *emu, uintptr_t fcn) { iFiuiipi_t fn = (iFiuiipi_t)fcn; R_EAX=fn(*(int32_t*)(R_ESP + 4), *(uint32_t*)(R_ESP + 8), *(int32_t*)(R_ESP + 12), *(int32_t*)(R_ESP + 16), *(void**)(R_ESP + 20), *(int32_t*)(R_ESP + 24)); }
|
||||
void iFiuUuUu(x86emu_t *emu, uintptr_t fcn) { iFiuUuUu_t fn = (iFiuUuUu_t)fcn; R_EAX=fn(*(int32_t*)(R_ESP + 4), *(uint32_t*)(R_ESP + 8), *(uint64_t*)(R_ESP + 12), *(uint32_t*)(R_ESP + 20), *(uint64_t*)(R_ESP + 24), *(uint32_t*)(R_ESP + 32)); }
|
||||
void iFipiipi(x86emu_t *emu, uintptr_t fcn) { iFipiipi_t fn = (iFipiipi_t)fcn; R_EAX=fn(*(int32_t*)(R_ESP + 4), *(void**)(R_ESP + 8), *(int32_t*)(R_ESP + 12), *(int32_t*)(R_ESP + 16), *(void**)(R_ESP + 20), *(int32_t*)(R_ESP + 24)); }
|
||||
void iFipipuu(x86emu_t *emu, uintptr_t fcn) { iFipipuu_t fn = (iFipipuu_t)fcn; R_EAX=fn(*(int32_t*)(R_ESP + 4), *(void**)(R_ESP + 8), *(int32_t*)(R_ESP + 12), *(void**)(R_ESP + 16), *(uint32_t*)(R_ESP + 20), *(uint32_t*)(R_ESP + 24)); }
|
||||
void iFipuIup(x86emu_t *emu, uintptr_t fcn) { iFipuIup_t fn = (iFipuIup_t)fcn; R_EAX=fn(*(int32_t*)(R_ESP + 4), *(void**)(R_ESP + 8), *(uint32_t*)(R_ESP + 12), *(int64_t*)(R_ESP + 16), *(uint32_t*)(R_ESP + 24), *(void**)(R_ESP + 28)); }
|
||||
void iFipupup(x86emu_t *emu, uintptr_t fcn) { iFipupup_t fn = (iFipupup_t)fcn; R_EAX=fn(*(int32_t*)(R_ESP + 4), *(void**)(R_ESP + 8), *(uint32_t*)(R_ESP + 12), *(void**)(R_ESP + 16), *(uint32_t*)(R_ESP + 20), *(void**)(R_ESP + 24)); }
|
||||
@@ -4958,8 +4964,7 @@ void DFED(x86emu_t *emu, uintptr_t fcn) { DFED_t fn = (DFED_t)fcn; long double l
|
||||
void DFDD(x86emu_t *emu, uintptr_t fcn) { DFDD_t fn = (DFDD_t)fcn; long double ld=fn(LD2localLD((void*)(R_ESP + 4)), LD2localLD((void*)(R_ESP + 16))); fpu_do_push(emu); ST0val = ld; }
|
||||
void DFDp(x86emu_t *emu, uintptr_t fcn) { DFDp_t fn = (DFDp_t)fcn; long double ld=fn(LD2localLD((void*)(R_ESP + 4)), *(void**)(R_ESP + 16)); fpu_do_push(emu); ST0val = ld; }
|
||||
void DFppi(x86emu_t *emu, uintptr_t fcn) { DFppi_t fn = (DFppi_t)fcn; long double ld=fn(*(void**)(R_ESP + 4), *(void**)(R_ESP + 8), *(int32_t*)(R_ESP + 12)); fpu_do_push(emu); ST0val = ld; }
|
||||
void DFppu(x86emu_t *emu, uintptr_t fcn) { DFppu_t fn = (DFppu_t)fcn; long double ld=fn(*(void**)(R_ESP + 4), *(void**)(R_ESP + 8), *(uint32_t*)(R_ESP + 12)); fpu_do_push(emu); ST0val = ld; }
|
||||
void DFppip(x86emu_t *emu, uintptr_t fcn) { DFppip_t fn = (DFppip_t)fcn; long double ld=fn(*(void**)(R_ESP + 4), *(void**)(R_ESP + 8), *(int32_t*)(R_ESP + 12), *(void**)(R_ESP + 16)); fpu_do_push(emu); ST0val = ld; }
|
||||
void DFppp(x86emu_t *emu, uintptr_t fcn) { DFppp_t fn = (DFppp_t)fcn; long double ld=fn(*(void**)(R_ESP + 4), *(void**)(R_ESP + 8), *(void**)(R_ESP + 12)); fpu_do_push(emu); ST0val = ld; }
|
||||
void iFDipppL(x86emu_t *emu, uintptr_t fcn) { iFDipppL_t fn = (iFDipppL_t)fcn; R_EAX=fn(LD2localLD((void*)(R_ESP + 4)), *(int32_t*)(R_ESP + 16), *(void**)(R_ESP + 20), *(void**)(R_ESP + 24), *(void**)(R_ESP + 28), *(uintptr_t*)(R_ESP + 32)); }
|
||||
void vFppippDDC(x86emu_t *emu, uintptr_t fcn) { vFppippDDC_t fn = (vFppippDDC_t)fcn; fn(*(void**)(R_ESP + 4), *(void**)(R_ESP + 8), *(int32_t*)(R_ESP + 12), *(void**)(R_ESP + 16), *(void**)(R_ESP + 20), LD2localLD((void*)(R_ESP + 24)), LD2localLD((void*)(R_ESP + 36)), *(uint8_t*)(R_ESP + 48)); }
|
||||
#endif
|
||||
@@ -4972,8 +4977,7 @@ void KFKK(x86emu_t *emu, uintptr_t fcn) { KFKK_t fn = (KFKK_t)fcn; double db=fn(
|
||||
void KFKp(x86emu_t *emu, uintptr_t fcn) { KFKp_t fn = (KFKp_t)fcn; double db=fn(FromLD((void*)(R_ESP + 4)), *(void**)(R_ESP + 16)); fpu_do_push(emu); ST0val = db; }
|
||||
void KFpp(x86emu_t *emu, uintptr_t fcn) { KFpp_t fn = (KFpp_t)fcn; double db=fn(*(void**)(R_ESP + 4), *(void**)(R_ESP + 8)); fpu_do_push(emu); ST0val = db; }
|
||||
void KFppi(x86emu_t *emu, uintptr_t fcn) { KFppi_t fn = (KFppi_t)fcn; double db=fn(*(void**)(R_ESP + 4), *(void**)(R_ESP + 8), *(int32_t*)(R_ESP + 12)); fpu_do_push(emu); ST0val = db; }
|
||||
void KFppu(x86emu_t *emu, uintptr_t fcn) { KFppu_t fn = (KFppu_t)fcn; double db=fn(*(void**)(R_ESP + 4), *(void**)(R_ESP + 8), *(uint32_t*)(R_ESP + 12)); fpu_do_push(emu); ST0val = db; }
|
||||
void KFppip(x86emu_t *emu, uintptr_t fcn) { KFppip_t fn = (KFppip_t)fcn; double db=fn(*(void**)(R_ESP + 4), *(void**)(R_ESP + 8), *(int32_t*)(R_ESP + 12), *(void**)(R_ESP + 16)); fpu_do_push(emu); ST0val = db; }
|
||||
void KFppp(x86emu_t *emu, uintptr_t fcn) { KFppp_t fn = (KFppp_t)fcn; double db=fn(*(void**)(R_ESP + 4), *(void**)(R_ESP + 8), *(void**)(R_ESP + 12)); fpu_do_push(emu); ST0val = db; }
|
||||
void iFKipppL(x86emu_t *emu, uintptr_t fcn) { iFKipppL_t fn = (iFKipppL_t)fcn; R_EAX=fn(FromLD((void*)(R_ESP + 4)), *(int32_t*)(R_ESP + 16), *(void**)(R_ESP + 20), *(void**)(R_ESP + 24), *(void**)(R_ESP + 28), *(uintptr_t*)(R_ESP + 32)); }
|
||||
void vFppippKKC(x86emu_t *emu, uintptr_t fcn) { vFppippKKC_t fn = (vFppippKKC_t)fcn; fn(*(void**)(R_ESP + 4), *(void**)(R_ESP + 8), *(int32_t*)(R_ESP + 12), *(void**)(R_ESP + 16), *(void**)(R_ESP + 20), FromLD((void*)(R_ESP + 24)), FromLD((void*)(R_ESP + 36)), *(uint8_t*)(R_ESP + 48)); }
|
||||
#endif
|
||||
@@ -5045,8 +5049,7 @@ int isRetX87Wrapper(wrapper_t fun) {
|
||||
if (fun == &DFDD) return 1;
|
||||
if (fun == &DFDp) return 1;
|
||||
if (fun == &DFppi) return 1;
|
||||
if (fun == &DFppu) return 1;
|
||||
if (fun == &DFppip) return 1;
|
||||
if (fun == &DFppp) return 1;
|
||||
#endif
|
||||
#if !defined(HAVE_LD80BITS)
|
||||
if (fun == &KFK) return 1;
|
||||
@@ -5054,8 +5057,7 @@ int isRetX87Wrapper(wrapper_t fun) {
|
||||
if (fun == &KFKp) return 1;
|
||||
if (fun == &KFpp) return 1;
|
||||
if (fun == &KFppi) return 1;
|
||||
if (fun == &KFppu) return 1;
|
||||
if (fun == &KFppip) return 1;
|
||||
if (fun == &KFppp) return 1;
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
@@ -523,6 +523,7 @@ void iFppG(x86emu_t *emu, uintptr_t fnc);
|
||||
void iFpOu(x86emu_t *emu, uintptr_t fnc);
|
||||
void iFpPU(x86emu_t *emu, uintptr_t fnc);
|
||||
void iFpPp(x86emu_t *emu, uintptr_t fnc);
|
||||
void iFpPP(x86emu_t *emu, uintptr_t fnc);
|
||||
void iFpGG(x86emu_t *emu, uintptr_t fnc);
|
||||
void iFSpi(x86emu_t *emu, uintptr_t fnc);
|
||||
void iFSpL(x86emu_t *emu, uintptr_t fnc);
|
||||
@@ -1329,6 +1330,7 @@ void iFpupuu(x86emu_t *emu, uintptr_t fnc);
|
||||
void iFpupup(x86emu_t *emu, uintptr_t fnc);
|
||||
void iFpuppu(x86emu_t *emu, uintptr_t fnc);
|
||||
void iFpuppp(x86emu_t *emu, uintptr_t fnc);
|
||||
void iFpuPpp(x86emu_t *emu, uintptr_t fnc);
|
||||
void iFpUiUi(x86emu_t *emu, uintptr_t fnc);
|
||||
void iFplluu(x86emu_t *emu, uintptr_t fnc);
|
||||
void iFpLlpp(x86emu_t *emu, uintptr_t fnc);
|
||||
@@ -1364,6 +1366,7 @@ void iFppppu(x86emu_t *emu, uintptr_t fnc);
|
||||
void iFppppL(x86emu_t *emu, uintptr_t fnc);
|
||||
void iFppppp(x86emu_t *emu, uintptr_t fnc);
|
||||
void iFpppGp(x86emu_t *emu, uintptr_t fnc);
|
||||
void iFpPPpp(x86emu_t *emu, uintptr_t fnc);
|
||||
void IFppIII(x86emu_t *emu, uintptr_t fnc);
|
||||
void uFEippp(x86emu_t *emu, uintptr_t fnc);
|
||||
void uFEpipp(x86emu_t *emu, uintptr_t fnc);
|
||||
@@ -1619,6 +1622,7 @@ void iFiiiiip(x86emu_t *emu, uintptr_t fnc);
|
||||
void iFiiiuwp(x86emu_t *emu, uintptr_t fnc);
|
||||
void iFiuiipi(x86emu_t *emu, uintptr_t fnc);
|
||||
void iFiuUuUu(x86emu_t *emu, uintptr_t fnc);
|
||||
void iFipiipi(x86emu_t *emu, uintptr_t fnc);
|
||||
void iFipipuu(x86emu_t *emu, uintptr_t fnc);
|
||||
void iFipuIup(x86emu_t *emu, uintptr_t fnc);
|
||||
void iFipupup(x86emu_t *emu, uintptr_t fnc);
|
||||
@@ -2464,8 +2468,7 @@ void DFED(x86emu_t *emu, uintptr_t fnc);
|
||||
void DFDD(x86emu_t *emu, uintptr_t fnc);
|
||||
void DFDp(x86emu_t *emu, uintptr_t fnc);
|
||||
void DFppi(x86emu_t *emu, uintptr_t fnc);
|
||||
void DFppu(x86emu_t *emu, uintptr_t fnc);
|
||||
void DFppip(x86emu_t *emu, uintptr_t fnc);
|
||||
void DFppp(x86emu_t *emu, uintptr_t fnc);
|
||||
void iFDipppL(x86emu_t *emu, uintptr_t fnc);
|
||||
void vFppippDDC(x86emu_t *emu, uintptr_t fnc);
|
||||
#endif
|
||||
@@ -2478,8 +2481,7 @@ void KFKK(x86emu_t *emu, uintptr_t fnc);
|
||||
void KFKp(x86emu_t *emu, uintptr_t fnc);
|
||||
void KFpp(x86emu_t *emu, uintptr_t fnc);
|
||||
void KFppi(x86emu_t *emu, uintptr_t fnc);
|
||||
void KFppu(x86emu_t *emu, uintptr_t fnc);
|
||||
void KFppip(x86emu_t *emu, uintptr_t fnc);
|
||||
void KFppp(x86emu_t *emu, uintptr_t fnc);
|
||||
void iFKipppL(x86emu_t *emu, uintptr_t fnc);
|
||||
void vFppippKKC(x86emu_t *emu, uintptr_t fnc);
|
||||
#endif
|
||||
|
||||
@@ -58,7 +58,7 @@ GO(FcConfigGetFonts, pFpi)
|
||||
//GO(FcConfigHome,
|
||||
//GO(FcConfigParseAndLoad,
|
||||
//GO(FcConfigReference,
|
||||
//GO(FcConfigSetCurrent,
|
||||
GO(FcConfigSetCurrent, iFp)
|
||||
//GO(FcConfigSetRescanInterval,
|
||||
//GO(FcConfigSetRescanInverval,
|
||||
GO(FcConfigSubstitute, iFppi)
|
||||
|
||||
@@ -161,7 +161,7 @@ GO(gnutls_dh_params_export_raw, iFpppp)
|
||||
GO(gnutls_dh_params_generate2, iFpu)
|
||||
//GO(gnutls_dh_params_import_dsa,
|
||||
//GO(gnutls_dh_params_import_pkcs3,
|
||||
//GO(gnutls_dh_params_import_raw,
|
||||
GO(gnutls_dh_params_import_raw, iFppp)
|
||||
GO(gnutls_dh_params_import_raw2, iFpppu)
|
||||
GO(gnutls_dh_params_init, iFp)
|
||||
//GO(gnutls_dh_set_prime_bits,
|
||||
|
||||
@@ -36,7 +36,7 @@ EXPORT void* my____tls_get_addr(x86emu_t* emu)
|
||||
EXPORT void* my___libc_stack_end;
|
||||
void stSetup(box86context_t* context)
|
||||
{
|
||||
my___libc_stack_end = context->stack; // is this the end, or should I add stasz?
|
||||
my___libc_stack_end = context->stack + context->stacksz;
|
||||
}
|
||||
|
||||
const char* ldlinuxName = "ld-linux.so.3";
|
||||
|
||||
+147
-37
@@ -60,6 +60,7 @@
|
||||
#include "bridge.h"
|
||||
#include "globalsymbols.h"
|
||||
#include "rcfile.h"
|
||||
#include "stat64_helper.h"
|
||||
|
||||
#ifdef PANDORA
|
||||
#ifndef __NR_preadv
|
||||
@@ -1196,29 +1197,6 @@ EXPORT void my__ITM_registerTMCloneTable(x86emu_t* emu, void* p, uint32_t s) { (
|
||||
EXPORT void my__ITM_deregisterTMCloneTable(x86emu_t* emu, void* p) { (void)emu; (void)p; }
|
||||
|
||||
|
||||
struct i386_stat {
|
||||
uint64_t st_dev;
|
||||
uint32_t __pad1;
|
||||
uint32_t st_ino;
|
||||
uint32_t st_mode;
|
||||
uint32_t st_nlink;
|
||||
uint32_t st_uid;
|
||||
uint32_t st_gid;
|
||||
uint64_t st_rdev;
|
||||
uint32_t __pad2;
|
||||
int32_t st_size;
|
||||
int32_t st_blksize;
|
||||
int32_t st_blocks;
|
||||
int32_t st_atime_sec;
|
||||
uint32_t st_atime_nsec;
|
||||
int32_t st_mtime_sec;
|
||||
uint32_t st_mtime_nsec;
|
||||
int32_t st_ctime_sec;
|
||||
uint32_t st_ctime_nsec;
|
||||
uint32_t __unused4;
|
||||
uint32_t __unused5;
|
||||
} __attribute__((packed));
|
||||
|
||||
static int FillStatFromStat64(int vers, const struct stat64 *st64, void *st32)
|
||||
{
|
||||
struct i386_stat *i386st = (struct i386_stat *)st32;
|
||||
@@ -1263,23 +1241,21 @@ static int FillStatFromStat64(int vers, const struct stat64 *st64, void *st32)
|
||||
errno = EOVERFLOW;
|
||||
return -1;
|
||||
}
|
||||
i386st->st_atime_sec = st64->st_atim.tv_sec;
|
||||
i386st->st_atime_sec = st64->st_atim.tv_sec;
|
||||
i386st->st_atime_nsec = st64->st_atim.tv_nsec;
|
||||
i386st->st_mtime_sec = st64->st_mtim.tv_sec;
|
||||
i386st->st_mtime_sec = st64->st_mtim.tv_sec;
|
||||
i386st->st_mtime_nsec = st64->st_mtim.tv_nsec;
|
||||
i386st->st_ctime_sec = st64->st_ctim.tv_sec;
|
||||
i386st->st_ctime_sec = st64->st_ctim.tv_sec;
|
||||
i386st->st_ctime_nsec = st64->st_ctim.tv_nsec;
|
||||
i386st->__unused4 = 0;
|
||||
i386st->__unused5 = 0;
|
||||
i386st->st_ino = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef ANDROID
|
||||
EXPORT int my_stat(char* path, void* buf)
|
||||
{
|
||||
struct stat64 st;
|
||||
int r = stat64(path, &st);
|
||||
UnalignStat64(&st, buf);
|
||||
FillStatFromStat64(3, &st, buf);
|
||||
return r;
|
||||
}
|
||||
|
||||
@@ -1287,7 +1263,7 @@ EXPORT int my_fstat(int fd, void* buf)
|
||||
{
|
||||
struct stat64 st;
|
||||
int r = fstat64(fd, &st);
|
||||
UnalignStat64(&st, buf);
|
||||
FillStatFromStat64(3, &st, buf);
|
||||
return r;
|
||||
}
|
||||
|
||||
@@ -1295,10 +1271,9 @@ EXPORT int my_lstat(char* path, void* buf)
|
||||
{
|
||||
struct stat64 st;
|
||||
int r = lstat64(path, &st);
|
||||
UnalignStat64(&st, buf);
|
||||
FillStatFromStat64(3, &st, buf);
|
||||
return r;
|
||||
}
|
||||
#endif
|
||||
|
||||
EXPORT int my___fxstat(x86emu_t *emu, int vers, int fd, void* buf)
|
||||
{
|
||||
@@ -1343,6 +1318,7 @@ EXPORT int my_stat64(x86emu_t* emu, void* path, void* buf)
|
||||
UnalignStat64(&st, buf);
|
||||
return r;
|
||||
}
|
||||
|
||||
EXPORT int my_lstat64(x86emu_t* emu, void* path, void* buf)
|
||||
{
|
||||
(void)emu;
|
||||
@@ -1352,6 +1328,26 @@ EXPORT int my_lstat64(x86emu_t* emu, void* path, void* buf)
|
||||
return r;
|
||||
}
|
||||
|
||||
EXPORT int my___stat64_time64(x86emu_t* emu, void* path, void* buf)
|
||||
{
|
||||
return stat64_time64_helper(path, buf);
|
||||
}
|
||||
|
||||
EXPORT int my___fstatat64_time64(x86emu_t* emu, int dirfd, void* path, void* buf, int flags)
|
||||
{
|
||||
return fstatat64_time64_helper(dirfd, path, buf, flags);
|
||||
}
|
||||
|
||||
EXPORT int my___fstat64_time64(x86emu_t* emu, int fd, void* buf)
|
||||
{
|
||||
return fstat64_time64_helper(fd, buf);
|
||||
}
|
||||
|
||||
EXPORT int my___lstat64_time64(x86emu_t* emu, void* path, void* buf)
|
||||
{
|
||||
return lstat64_time64_helper(path, buf);
|
||||
}
|
||||
|
||||
EXPORT int my___xstat(x86emu_t* emu, int v, void* path, void* buf)
|
||||
{
|
||||
(void)emu;
|
||||
@@ -1464,6 +1460,21 @@ EXPORT int my_statfs64(const char* path, void* buf)
|
||||
return r;
|
||||
}
|
||||
|
||||
EXPORT int my_fstatfs(int fd, void* buf)
|
||||
{
|
||||
struct statfs st;
|
||||
int r = fstatfs(fd, &st);
|
||||
UnalignStatFS(&st, buf);
|
||||
return r;
|
||||
}
|
||||
|
||||
EXPORT int my_statfs(const char* path, void* buf)
|
||||
{
|
||||
struct statfs st;
|
||||
int r = statfs(path, &st);
|
||||
UnalignStatFS(&st, buf);
|
||||
return r;
|
||||
}
|
||||
|
||||
#ifdef ANDROID
|
||||
typedef int (*__compar_d_fn_t)(const void*, const void*, void*);
|
||||
@@ -1870,6 +1881,15 @@ EXPORT int32_t my_open(x86emu_t* emu, void* pathname, int32_t flags, uint32_t mo
|
||||
lseek(tmp, 0, SEEK_SET);
|
||||
return tmp;
|
||||
}
|
||||
if(box86_maxcpu && (!strcmp(pathname, "/sys/devices/system/cpu/present") || !strcmp(pathname, "/sys/devices/system/cpu/online")) && (getNCpu()>=box86_maxcpu)) {
|
||||
// special case for cpu present (to limit to box86_maxcpu cores)
|
||||
int tmp = shm_open(TMP_CPUPRESENT, O_RDWR | O_CREAT, S_IRWXU);
|
||||
if(tmp<0) return open(pathname, flags, mode); // error fallback
|
||||
shm_unlink(TMP_CPUPRESENT); // remove the shm file, but it will still exist because it's currently in use
|
||||
CreateCPUPresentFile(tmp);
|
||||
lseek(tmp, 0, SEEK_SET);
|
||||
return tmp;
|
||||
}
|
||||
if(isCpuTopology((const char*)pathname)!=-1) {
|
||||
int n = isCpuTopology((const char*)pathname);
|
||||
char buf[512];
|
||||
@@ -1987,6 +2007,15 @@ EXPORT int32_t my_open64(x86emu_t* emu, void* pathname, int32_t flags, uint32_t
|
||||
lseek(tmp, 0, SEEK_SET);
|
||||
return tmp;
|
||||
}
|
||||
if(box86_maxcpu && (!strcmp(pathname, "/sys/devices/system/cpu/present") || !strcmp(pathname, "/sys/devices/system/cpu/online")) && (getNCpu()>=box86_maxcpu)) {
|
||||
// special case for cpu present (to limit to box86_maxcpu cores)
|
||||
int tmp = shm_open(TMP_CPUPRESENT, O_RDWR | O_CREAT, S_IRWXU);
|
||||
if(tmp<0) return open64(pathname, flags, mode); // error fallback
|
||||
shm_unlink(TMP_CPUPRESENT); // remove the shm file, but it will still exist because it's currently in use
|
||||
CreateCPUPresentFile(tmp);
|
||||
lseek(tmp, 0, SEEK_SET);
|
||||
return tmp;
|
||||
}
|
||||
if(isCpuTopology((const char*)pathname)!=-1) {
|
||||
int n = isCpuTopology((const char*)pathname);
|
||||
char buf[512];
|
||||
@@ -2062,8 +2091,8 @@ EXPORT FILE* my_fopen(x86emu_t* emu, const char* path, const char* mode)
|
||||
lseek(tmp, 0, SEEK_SET);
|
||||
return fdopen(tmp, mode);;
|
||||
}
|
||||
if(box86_wine && (!strcmp(path, "/sys/devices/system/cpu/present") || !strcmp(path, "/sys/devices/system/cpu/online")) && (getNCpu()>=32)) {
|
||||
// special case for cpu present (to limit to 64 cores)
|
||||
if(box86_maxcpu && (!strcmp(path, "/sys/devices/system/cpu/present") || !strcmp(path, "/sys/devices/system/cpu/online")) && (getNCpu()>=box86_maxcpu)) {
|
||||
// special case for cpu present (to limit to box86_maxcpu cores)
|
||||
int tmp = shm_open(TMP_CPUPRESENT, O_RDWR | O_CREAT, S_IRWXU);
|
||||
if(tmp<0) return fopen(path, mode); // error fallback
|
||||
shm_unlink(TMP_CPUPRESENT); // remove the shm file, but it will still exist because it's currently in use
|
||||
@@ -2138,8 +2167,8 @@ EXPORT FILE* my_fopen64(x86emu_t* emu, const char* path, const char* mode)
|
||||
lseek(tmp, 0, SEEK_SET);
|
||||
return fdopen(tmp, mode);;
|
||||
}
|
||||
if(box86_wine && (!strcmp(path, "/sys/devices/system/cpu/present") || !strcmp(path, "/sys/devices/system/cpu/online")) && (getNCpu()>=32)) {
|
||||
// special case for cpu present (to limit to 64 cores)
|
||||
if(box86_maxcpu && (!strcmp(path, "/sys/devices/system/cpu/present") || !strcmp(path, "/sys/devices/system/cpu/online")) && (getNCpu()>=box86_maxcpu)) {
|
||||
// special case for cpu present (to limit to box86_maxcpu cores)
|
||||
int tmp = shm_open(TMP_CPUPRESENT, O_RDWR | O_CREAT, S_IRWXU);
|
||||
if(tmp<0) return fopen64(path, mode); // error fallback
|
||||
shm_unlink(TMP_CPUPRESENT); // remove the shm file, but it will still exist because it's currently in use
|
||||
@@ -2544,6 +2573,50 @@ EXPORT int32_t my_execvp(x86emu_t* emu, const char* path, char* const argv[])
|
||||
return execvp(path, argv);
|
||||
}
|
||||
|
||||
// execvpe should use PATH to search for the program first
|
||||
EXPORT int32_t my_execvpe(x86emu_t* emu, const char* path, char* const argv[], char* const envv[])
|
||||
{
|
||||
// need to use BOX86_PATH / PATH here...
|
||||
char* fullpath = ResolveFile(path, &my_context->box86_path);
|
||||
// use fullpath...
|
||||
int self = isProcSelf(fullpath, "exe");
|
||||
int x86 = FileIsX86ELF(fullpath);
|
||||
int x64 = my_context->box86path?FileIsX64ELF(path):0;
|
||||
int script = (my_context->bashpath && FileIsShell(path))?1:0;
|
||||
if(script && FileIsX64ELF(my_context->bashpath)) x64 = 1;
|
||||
printf_log(LOG_DEBUG, "execvp(\"%s\", %p), IsX86=%d / fullpath=\"%s\"\n", path, argv, x86, fullpath);
|
||||
if (x86 || x64 || script || self) {
|
||||
// count argv...
|
||||
int i=0;
|
||||
while(argv[i]) ++i;
|
||||
int toadd = script?2:1;
|
||||
char** newargv = (char**)alloca((i+toadd+1)*sizeof(char*));
|
||||
memset(newargv, 0, (i+toadd+1)*sizeof(char*));
|
||||
newargv[0] = x64?emu->context->box64path:emu->context->box86path;
|
||||
if(script) newargv[1] = emu->context->bashpath; // script needs to be launched with bash
|
||||
for (int j=0; j<i; ++j)
|
||||
newargv[j+1] = argv[j];
|
||||
if(self) newargv[1] = emu->context->fullpath;
|
||||
if(script) newargv[2] = emu->context->bashpath;
|
||||
printf_log(LOG_DEBUG, " => execvp(\"%s\", %p [\"%s\", \"%s\"...:%d])\n", newargv[0], newargv, newargv[1], i?newargv[2]:"", i);
|
||||
int ret = execvpe(newargv[0], newargv, envv);
|
||||
box_free(fullpath);
|
||||
return ret;
|
||||
}
|
||||
box_free(fullpath);
|
||||
if((!strcmp(path + strlen(path) - strlen("/uname"), "/uname") || !strcmp(path, "uname"))
|
||||
&& argv[1] && (!strcmp(argv[1], "-m") || !strcmp(argv[1], "-p") || !strcmp(argv[1], "-i"))
|
||||
&& !argv[2]) {
|
||||
// uname -m is redirected to box86 -m
|
||||
path = my_context->box86path;
|
||||
char *argv2[3] = { my_context->box86path, argv[1], NULL };
|
||||
return execvpe(path, argv2, envv);
|
||||
}
|
||||
|
||||
// fullpath is gone, so the search will only be on PATH, not on BOX86_PATH (is that an issue?)
|
||||
return execvpe(path, argv, envv);
|
||||
}
|
||||
|
||||
// execvp should use PATH to search for the program first
|
||||
EXPORT int32_t my_posix_spawnp(x86emu_t* emu, pid_t* pid, const char* path,
|
||||
const posix_spawn_file_actions_t *actions, const posix_spawnattr_t* attrp, char* const argv[], char* const envp[])
|
||||
@@ -2757,6 +2830,34 @@ EXPORT int32_t my_fcntl(x86emu_t* emu, int32_t a, int32_t b, uint32_t d1, uint32
|
||||
}
|
||||
EXPORT int32_t my___fcntl(x86emu_t* emu, int32_t a, int32_t b, uint32_t d1, uint32_t d2, uint32_t d3, uint32_t d4, uint32_t d5, uint32_t d6) __attribute__((alias("my_fcntl")));
|
||||
|
||||
EXPORT int32_t my___fcntl_time64(x86emu_t* emu, int32_t a, int32_t b, uint32_t d1, uint32_t d2, uint32_t d3, uint32_t d4, uint32_t d5, uint32_t d6)
|
||||
{
|
||||
(void)emu; (void)d2; (void)d3; (void)d4; (void)d5; (void)d6;
|
||||
// Implemented starting glibc 2.14+
|
||||
library_t* lib = my_lib;
|
||||
if(!lib) return 0;
|
||||
iFiiV_t f = dlsym(lib->w.lib, "__fcntl_time64");
|
||||
if(b==F_SETFL)
|
||||
d1 = of_convert(d1);
|
||||
if(b==F_GETLK64 || b==F_SETLK64 || b==F_SETLKW64)
|
||||
{
|
||||
my_flock64_t fl;
|
||||
AlignFlock64(&fl, (void*)d1);
|
||||
int ret = f?f(a, b, &fl):fcntl(a, b, &fl);
|
||||
UnalignFlock64((void*)d1, &fl);
|
||||
return ret;
|
||||
}
|
||||
//TODO: check if better to use the syscall or regular fcntl?
|
||||
//return syscall(__NR_fcntl64, a, b, d1); // should be enough
|
||||
int ret = f?f(a, b, d1):fcntl(a, b, d1);
|
||||
|
||||
if(b==F_GETFL && ret!=-1)
|
||||
ret = of_unconvert(ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
EXPORT int32_t my_preadv64(x86emu_t* emu, int32_t fd, void* v, int32_t c, int64_t o)
|
||||
{
|
||||
(void)emu;
|
||||
@@ -3317,7 +3418,16 @@ EXPORT int my_nanosleep(const struct timespec *req, struct timespec *rem)
|
||||
{
|
||||
if(!req)
|
||||
return 0; // workaround for some strange calls
|
||||
#ifdef __USE_TIME64_REDIRECTS
|
||||
struct timespec t1, t2;
|
||||
Timespec2Timespec64(&t1, req);
|
||||
int ret = nanosleep(&t1, rem?(&t2):NULL);
|
||||
if(rem)
|
||||
Timespec642Timespec(rem, &t2);
|
||||
return ret;
|
||||
#else
|
||||
return nanosleep(req, rem);
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifndef NOALIGN
|
||||
|
||||
@@ -293,6 +293,7 @@ GO2(execlp, iFpV, execvp)
|
||||
GOWM(execv, iFEpp) //%%
|
||||
GOM(execve, iFEppp) //%% and this one too...
|
||||
GOWM(execvp, iFEpp)
|
||||
GOWM(execvpe, iFEppp)
|
||||
GOM(exit, vFEi)
|
||||
GOM(_exit, vFEi)
|
||||
GOWM(_Exit, vFEi)
|
||||
@@ -417,7 +418,7 @@ GO(__fsetlocking, iFpi)
|
||||
GO(fsetpos, iFpp)
|
||||
GO(fsetpos64, iFpp)
|
||||
GO(fsetxattr, iFippui)
|
||||
GOW(fstatfs, iFip)
|
||||
GOWM(fstatfs, iFip) //%%,noE
|
||||
GOWM(fstatfs64, iFip) //%%,noE
|
||||
GO(fstatvfs, iFip)
|
||||
GOW(fstatvfs64, iFip) // alignment?
|
||||
@@ -1281,20 +1282,20 @@ GO(posix_fallocate64, iFiII)
|
||||
GOW(posix_memalign, iFpLL)
|
||||
// posix_openpt // Weak
|
||||
GO(posix_spawn, iFpppppp)
|
||||
// posix_spawnattr_destroy
|
||||
// posix_spawnattr_getflags
|
||||
// posix_spawnattr_getpgroup
|
||||
// posix_spawnattr_getschedparam
|
||||
// posix_spawnattr_getschedpolicy
|
||||
// posix_spawnattr_getsigdefault
|
||||
// posix_spawnattr_getsigmask
|
||||
// posix_spawnattr_init
|
||||
// posix_spawnattr_setflags
|
||||
// posix_spawnattr_setpgroup
|
||||
// posix_spawnattr_setschedparam
|
||||
// posix_spawnattr_setschedpolicy
|
||||
// posix_spawnattr_setsigdefault
|
||||
// posix_spawnattr_setsigmask
|
||||
GOW(posix_spawnattr_destroy, iFp)
|
||||
GO(posix_spawnattr_getflags, iFpp)
|
||||
GO(posix_spawnattr_getpgroup, iFpp)
|
||||
GO(posix_spawnattr_getschedparam, iFpp)
|
||||
GO(posix_spawnattr_getschedpolicy, iFpp)
|
||||
GO(posix_spawnattr_getsigdefault, iFpp)
|
||||
GO(posix_spawnattr_getsigmask, iFpp)
|
||||
GOW(posix_spawnattr_init, iFp)
|
||||
GOW(posix_spawnattr_setflags, iFpw)
|
||||
GO(posix_spawnattr_setpgroup, iFpi)
|
||||
GO(posix_spawnattr_setschedparam, iFpp)
|
||||
GO(posix_spawnattr_setschedpolicy, iFpi)
|
||||
GOW(posix_spawnattr_setsigdefault, iFpp)
|
||||
GOW(posix_spawnattr_setsigmask, iFpp)
|
||||
GO(posix_spawn_file_actions_addclose, iFpi)
|
||||
GO(posix_spawn_file_actions_adddup2, iFpii)
|
||||
GO(posix_spawn_file_actions_addopen, iFpipii)
|
||||
@@ -1509,6 +1510,7 @@ GOW(send, lFipLi)
|
||||
GO(sendfile, lFiipL)
|
||||
GO(sendfile64, lFiipL)
|
||||
GOW(sendmsg, lFipi)
|
||||
GO2(sendmmsg, iFEipuu, my___sendmmsg)
|
||||
GOM(__sendmmsg, iFEipuu) //%% actual __sendmmsg is glibc 2.14+. The syscall is Linux 3.0+, so use syscall...
|
||||
GOW(sendto, lFipLipu)
|
||||
// setaliasent
|
||||
@@ -1573,6 +1575,7 @@ GO(setxattr, iFpppui)
|
||||
// sgetspent_r // Weak
|
||||
GOW(shmat, pFipi)
|
||||
GOW(shmctl, iFiip)
|
||||
GO(__shmctl64, iFiip)
|
||||
GOW(shmdt, iFp)
|
||||
GOW(shmget, iFuui)
|
||||
GOW(shutdown, iFii)
|
||||
@@ -1644,7 +1647,7 @@ GO2(sscanf, iFppV, vsscanf) // sscanf va_list is only pointer, no realign to
|
||||
GOM(__stack_chk_fail, vFEv) //%%
|
||||
GOM(lstat64, iFEpp)
|
||||
GOM(stat64, iFEpp)
|
||||
GOW(statfs, iFpp)
|
||||
GOWM(statfs, iFpp) //%%,noE
|
||||
// __statfs
|
||||
GOWM(statfs64, iFpp) //%%,noE
|
||||
GO(statvfs, iFpp)
|
||||
@@ -1742,13 +1745,13 @@ GO2(__isoc23_strtol, lFppi, strtol)
|
||||
#ifdef HAVE_LD80BITS
|
||||
GO(strtold, DFpp)
|
||||
GO(__strtold_internal, DFppi)
|
||||
GO(__strtold_l, DFppip)
|
||||
GOW(strtold_l, DFppu)
|
||||
GO(__strtold_l, DFppp)
|
||||
GOW(strtold_l, DFppp)
|
||||
#else
|
||||
GO(strtold, KFpp)
|
||||
GO2(__strtold_internal, KFppi, __strtod_internal)
|
||||
GO2(__strtold_l, KFppip, __strtod_l)
|
||||
GOW2(strtold_l, KFppu, strtod_l)
|
||||
GO2(__strtold_l, KFppp, __strtod_l)
|
||||
GOW2(strtold_l, KFppp, strtod_l)
|
||||
#endif
|
||||
GO(__strtol_internal, lFppi)
|
||||
GO(strtoll, IFppi)
|
||||
@@ -2240,12 +2243,11 @@ GO(asctime64_r, pFpp)
|
||||
GO(ctime64, pFp)
|
||||
GO(ctime64_r, pFpp)
|
||||
GO(gmtime64, pFp)
|
||||
GOM(__fcntl_time64, iFEiiN) //%%
|
||||
GO(gmtime64_r, pFpp)
|
||||
GO(localtime64, pFpp)
|
||||
GO(localtime64_r, pFpp)
|
||||
GO(mktime64, UFp)
|
||||
GO(timegm64, UFp)
|
||||
GO(timelocal64, UFp)
|
||||
GO(__ppoll64, iFpupp)
|
||||
GO(__clock_gettime64, iFpp)
|
||||
GO(__stat_time64, iFpp) //needs alignement?
|
||||
GO(__fstat_time64, iFip)
|
||||
@@ -2253,6 +2255,32 @@ GO(__lstat_time64, iFpp)
|
||||
GO(__fstatat_time64, iFippi)
|
||||
GO(__futimens_time64, iFip)
|
||||
GO(__utimensat_time64, iFippi)
|
||||
//tested
|
||||
GOW(__gettimeofday64, iFpp)
|
||||
GO(__mktime64, IFp)
|
||||
GOM(__lstat64_time64, iFEpp)
|
||||
GOM(__stat64_time64, iFEpp)
|
||||
GOM(__fstatat64_time64, iFEippi)
|
||||
GOM(__fstat64_time64, iFEip)
|
||||
GO(__ctime64, pFp)
|
||||
GO(__gmtime64, pFp)
|
||||
GO(__localtime64, pFpp)
|
||||
GO(mktime64, IFp)
|
||||
GO(timegm64, IFp)
|
||||
GO(timelocal64, IFp)
|
||||
GO(__clock_getres64, iFpp)
|
||||
GO(__futimens64, iFip)
|
||||
GO(__time64, IFp)
|
||||
GO(timespec_get, iFpi)
|
||||
|
||||
//untested
|
||||
GOW(__getrusage64, iFip)
|
||||
GOW(__getsockopt64, iFiiipp)
|
||||
GO(__ioctl_time64, iFiLN)
|
||||
GOW(__recvmsg64, lFipi)
|
||||
GOW(__select64, iFipppp)
|
||||
GOW(__sendmsg64, lFipi)
|
||||
GOW(__setsockopt64, iFiiipu)
|
||||
|
||||
GOM(fstatat64, iFippi) //%%,noE
|
||||
GOM(fstat64, iFip) //%%,noE
|
||||
@@ -2266,17 +2294,14 @@ GO(dummy_safer_scalable_aligned_realloc, pFpLLp) // for mallochook.c
|
||||
|
||||
#ifdef ANDROID
|
||||
GOM(__libc_init, vFEpppp)
|
||||
GOM(stat, iFpp) //%noE
|
||||
GOM(lstat, iFpp) //%noE
|
||||
GOM(fstat, iFip) //%noE
|
||||
GO(__errno, pFv)
|
||||
#include "wrappedlibpthread_private.h"
|
||||
#include "wrappedlibrt_private.h"
|
||||
#else
|
||||
// Those symbols don't exist in non-Android builds
|
||||
//GOM(__libc_init,
|
||||
//GOM(stat,
|
||||
//GOM(lstat,
|
||||
//GOM(fstat,
|
||||
//GO(__errno,
|
||||
#endif
|
||||
GOM(stat, iFpp) //%noE
|
||||
GOM(lstat, iFpp) //%noE
|
||||
GOM(fstat, iFip) //%noE
|
||||
@@ -100,7 +100,7 @@ void* my_dlopen(x86emu_t* emu, void *filename, int flag)
|
||||
if(sys)
|
||||
return sys;
|
||||
}
|
||||
if(!strcmp(rfilename, "/usr/lib/x86_64-linux-gnu/d3d")) {
|
||||
if(!strcmp(rfilename, "/usr/lib/i386-linux-gnu/d3d")) {
|
||||
void* sys = my_dlopen(emu, "d3dadapter9.so.1", flag);
|
||||
if(sys)
|
||||
return sys;
|
||||
@@ -121,7 +121,7 @@ void* my_dlopen(x86emu_t* emu, void *filename, int flag)
|
||||
box_free(origin);
|
||||
}
|
||||
while(strstr(rfilename, "${PLATFORM}")) {
|
||||
char* platform = box_strdup("x86_64");
|
||||
char* platform = box_strdup("i386");
|
||||
char* p = strrchr(platform, '/');
|
||||
if(p) *p = '\0'; // remove file name to have only full path, without last '/'
|
||||
char* tmp = (char*)box_calloc(1, strlen(rfilename)-strlen("${PLATFORM}")+strlen(platform)+1);
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
#include <dlfcn.h>
|
||||
#include <errno.h>
|
||||
#include <pthread.h>
|
||||
#include <semaphore.h>
|
||||
|
||||
#include "wrappedlibs.h"
|
||||
|
||||
@@ -132,6 +133,33 @@ EXPORT void my___pthread_initialize()
|
||||
// nothing, the lib initialize itself now
|
||||
}
|
||||
|
||||
void Timespec2Timespec64(void* dest, const void* source);
|
||||
EXPORT int my_sem_timedwait(sem_t* sem, struct timespec * t)
|
||||
{
|
||||
// some x86 game are not computing timeout correctly (ex: Anomaly Warzone Earth linux version)
|
||||
#ifdef __USE_TIME64_REDIRECTS
|
||||
struct timespec t1;
|
||||
Timespec2Timespec64(&t1, t);
|
||||
while(t1.tv_nsec>=1000000000) {
|
||||
t1.tv_nsec-=1000000000;
|
||||
t1.tv_sec+=1;
|
||||
}
|
||||
return sem_timedwait(sem, &t1);
|
||||
#else
|
||||
if(t->tv_nsec>=1000000000) {
|
||||
struct timespec t1;
|
||||
t1.tv_sec=t->tv_sec+1;
|
||||
t1.tv_nsec=t->tv_nsec-1000000000;
|
||||
while(t1.tv_nsec>=1000000000) {
|
||||
t1.tv_nsec-=1000000000;
|
||||
t1.tv_sec+=1;
|
||||
}
|
||||
return sem_timedwait(sem, &t1);
|
||||
}
|
||||
return sem_timedwait(sem, t);
|
||||
#endif
|
||||
}
|
||||
|
||||
#define PRE_INIT\
|
||||
if(1) \
|
||||
lib->w.lib = dlopen(NULL, RTLD_LAZY | RTLD_GLOBAL); \
|
||||
|
||||
@@ -202,7 +202,7 @@ GO(sem_getvalue, iFpp)
|
||||
GO(sem_init, iFpiu)
|
||||
GO(sem_open, pFpOM)
|
||||
GO(sem_post, iFp)
|
||||
GO(sem_timedwait, iFpp)
|
||||
GOM(sem_timedwait, iFpp) //%noE
|
||||
GO(sem_trywait, iFp)
|
||||
GO(sem_unlink, iFp)
|
||||
GO(sem_wait, iFp)
|
||||
|
||||
@@ -85,7 +85,7 @@ GO(__res_mkquery, iFipiipippi)
|
||||
GOW(res_mkquery, iFipiipippi)
|
||||
GO(__res_nameinquery, iFpiipp)
|
||||
//GO(__res_nmkquery
|
||||
//GO(__res_nquery
|
||||
GO(__res_nquery, iFipiipi)
|
||||
//GO(__res_nquerydomain
|
||||
GO(__res_nsearch, iFppiipi)
|
||||
//GO(__res_nsend
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
#include "librarian.h"
|
||||
#include "box86context.h"
|
||||
#include "emu/x86emu_private.h"
|
||||
#include "myalign.h"
|
||||
|
||||
#undef aio_suspend
|
||||
#undef aio_return
|
||||
@@ -29,8 +30,6 @@
|
||||
#undef aio_read
|
||||
#undef aio_error
|
||||
|
||||
#undef clock_gettime
|
||||
|
||||
const char* librtName = "librt.so.1";
|
||||
#define LIBNAME librt
|
||||
|
||||
@@ -155,6 +154,43 @@ EXPORT int mylio_listio(x86emu_t* emu, int mode, void* list[], int nent, struct
|
||||
}
|
||||
#endif
|
||||
|
||||
EXPORT int my_clock_gettime(int clock, void* buf)
|
||||
{
|
||||
#ifdef __USE_TIME64_REDIRECTS
|
||||
struct timespec spec;
|
||||
int ret = clock_gettime(clock, &spec);
|
||||
Timespec642Timespec(buf, &spec);
|
||||
return ret;
|
||||
#else
|
||||
return clock_gettime(clock, buf);
|
||||
#endif
|
||||
}
|
||||
EXPORT int my_clock_settime(int clock, void* buf)
|
||||
{
|
||||
#ifdef __USE_TIME64_REDIRECTS
|
||||
struct timespec spec;
|
||||
Timespec2Timespec64(&spec, buf);
|
||||
return clock_settime(clock, &spec);
|
||||
#else
|
||||
return clock_settime(clock, buf);
|
||||
#endif
|
||||
}
|
||||
|
||||
EXPORT int my_clock_nanosleep(int clock, int flags, void* _t1, void* _t2)
|
||||
{
|
||||
#ifdef __USE_TIME64_REDIRECTS
|
||||
struct timespec t1, t2;
|
||||
if(_t1)
|
||||
Timespec2Timespec64(&t1, _t1);
|
||||
int ret = clock_nanosleep(clock, flags, _t1?(&t1):NULL, _t2?(&t2):NULL);
|
||||
if(_t2)
|
||||
Timespec642Timespec(_t2, &t2);
|
||||
return ret;
|
||||
#else
|
||||
return clock_nanosleep(clock, flags, _t1, _t2);
|
||||
#endif
|
||||
}
|
||||
|
||||
#define CUSTOM_INIT \
|
||||
getMy(lib);
|
||||
|
||||
|
||||
@@ -23,9 +23,9 @@ GOM(aio_write, iFEp)
|
||||
GOM(aio_write64, iFEp)
|
||||
GO(clock_getcpuclockid, iFup)
|
||||
GO(clock_getres, iFup)
|
||||
GO(clock_gettime, iFup)
|
||||
GO(clock_nanosleep, iFuipp)
|
||||
GO(clock_settime, iFup)
|
||||
GOM(clock_gettime, iFip) //%%,noE
|
||||
GOM(clock_nanosleep, iFiipp) //%%,noE
|
||||
GOM(clock_settime, iFip) //%%,noE
|
||||
GOM(lio_listio, iFEipip)
|
||||
// lio_listio64
|
||||
// mq_close
|
||||
|
||||
@@ -290,7 +290,7 @@ GO(XDisplayWidthMM, iFpi)
|
||||
GO(XDrawArc, iFpppiiuuii)
|
||||
//GO(XDrawArcs
|
||||
GO(XDrawImageString, iFpppiipi)
|
||||
//GO(XDrawImageString16
|
||||
GO(XDrawImageString16, iFpppiipi)
|
||||
GO(XDrawLine, iFpppiiii)
|
||||
GO(XDrawLines, iFppppii)
|
||||
GO(XDrawPoint, iFpppii)
|
||||
|
||||
@@ -397,7 +397,7 @@ GOS(xcb_open_font_checked, xFEpuWp)
|
||||
//GO(xcb_open_font_name_end,
|
||||
//GO(xcb_open_font_name_length,
|
||||
//GO(xcb_open_font_sizeof,
|
||||
//GO(xcb_parse_display,
|
||||
GO(xcb_parse_display, iFpppp)
|
||||
//GO(xcb_pixmap_end,
|
||||
//GO(xcb_pixmap_next,
|
||||
//GO(xcb_point_end,
|
||||
|
||||
@@ -911,7 +911,7 @@ static void* find_io_new_Fct(void* fct)
|
||||
// io_enable
|
||||
#define GO(A) \
|
||||
static uintptr_t my_io_enable_fct_##A = 0; \
|
||||
static void* my_io_enable_##A(void* api, int events) \
|
||||
static void my_io_enable_##A(void* api, int events) \
|
||||
{ \
|
||||
RunFunctionFmt(my_io_enable_fct_##A, "pi", api, events); \
|
||||
}
|
||||
@@ -933,7 +933,7 @@ static void* find_io_enable_Fct(void* fct)
|
||||
// io_free
|
||||
#define GO(A) \
|
||||
static uintptr_t my_io_free_fct_##A = 0; \
|
||||
static void* my_io_free_##A(void* e) \
|
||||
static void my_io_free_##A(void* e) \
|
||||
{ \
|
||||
RunFunctionFmt(my_io_free_fct_##A, "p", e); \
|
||||
}
|
||||
@@ -999,7 +999,7 @@ static void* find_time_new_Fct(void* fct)
|
||||
// time_restart
|
||||
#define GO(A) \
|
||||
static uintptr_t my_time_restart_fct_##A = 0; \
|
||||
static void* my_time_restart_##A(void* e, void* t) \
|
||||
static void my_time_restart_##A(void* e, void* t) \
|
||||
{ \
|
||||
RunFunctionFmt(my_time_restart_fct_##A, "pp", e, t); \
|
||||
}
|
||||
@@ -1021,7 +1021,7 @@ static void* find_time_restart_Fct(void* fct)
|
||||
// time_free
|
||||
#define GO(A) \
|
||||
static uintptr_t my_time_free_fct_##A = 0; \
|
||||
static void* my_time_free_##A(void* e) \
|
||||
static void my_time_free_##A(void* e) \
|
||||
{ \
|
||||
RunFunctionFmt(my_time_free_fct_##A, "p", e); \
|
||||
}
|
||||
@@ -1087,7 +1087,7 @@ static void* find_defer_new_Fct(void* fct)
|
||||
// defer_enable
|
||||
#define GO(A) \
|
||||
static uintptr_t my_defer_enable_fct_##A = 0; \
|
||||
static void* my_defer_enable_##A(void* e, int b) \
|
||||
static void my_defer_enable_##A(void* e, int b) \
|
||||
{ \
|
||||
RunFunctionFmt(my_defer_enable_fct_##A, "pi", e, b); \
|
||||
}
|
||||
@@ -1109,7 +1109,7 @@ static void* find_defer_enable_Fct(void* fct)
|
||||
// defer_free
|
||||
#define GO(A) \
|
||||
static uintptr_t my_defer_free_fct_##A = 0; \
|
||||
static void* my_defer_free_##A(void* e) \
|
||||
static void my_defer_free_##A(void* e) \
|
||||
{ \
|
||||
RunFunctionFmt(my_defer_free_fct_##A, "p", e); \
|
||||
}
|
||||
@@ -1153,7 +1153,7 @@ static void* find_defer_set_destroy_Fct(void* fct)
|
||||
// quit
|
||||
#define GO(A) \
|
||||
static uintptr_t my_quit_fct_##A = 0; \
|
||||
static void* my_quit_##A(void* e, int retval) \
|
||||
static void my_quit_##A(void* e, int retval) \
|
||||
{ \
|
||||
RunFunctionFmt(my_quit_fct_##A, "pi", e, retval); \
|
||||
}
|
||||
|
||||
@@ -681,6 +681,12 @@ DESTROY64(vkDestroyPrivateDataSlotEXT)
|
||||
CREATE(vkCreateOpticalFlowSessionNV)
|
||||
DESTROY64(vkDestroyOpticalFlowSessionNV)
|
||||
|
||||
CREATE(vkCreateVideoSessionKHR)
|
||||
CREATE(vkCreateVideoSessionParametersKHR)
|
||||
DESTROY64(vkDestroyVideoSessionKHR)
|
||||
DESTROY64(vkDestroyVideoSessionParametersKHR)
|
||||
|
||||
|
||||
EXPORT void my_vkGetPhysicalDeviceProperties(x86emu_t* emu, void* device, void* pProps)
|
||||
{
|
||||
(void)emu;
|
||||
@@ -906,3 +912,13 @@ EXPORT int my_vkGetPhysicalDeviceOpticalFlowImageFormatsNV(x86emu_t* emu, void*
|
||||
vkunalignStruct(m, desc, *count); // bad things will happens if *count is changed while pSparseMemoryRequirements is not NULL
|
||||
return ret;
|
||||
}
|
||||
|
||||
EXPORT int my_vkBindVideoSessionMemoryKHR(x86emu_t* emu, void* device, uint64_t session, uint32_t count, void* pInfos)
|
||||
{
|
||||
(void)emu;
|
||||
static const char* desc = "uPuUUU";
|
||||
void* m = vkalignStruct(pInfos, desc, count);
|
||||
int ret = my->vkBindVideoSessionMemoryKHR(device, session, count, m);
|
||||
vkunalignStruct(m, desc, count);
|
||||
return ret;
|
||||
}
|
||||
@@ -433,7 +433,7 @@ GO(vkReleaseFullScreenExclusiveModeEXT, iFpU)
|
||||
GO(vkGetDeviceGroupSurfacePresentModes2EXT, iFpPp)
|
||||
|
||||
// VK_EXT_calibrated_timestamps
|
||||
GO(vkGetCalibratedTimestampsEXT, iFpuppp)
|
||||
GO(vkGetCalibratedTimestampsEXT, iFpuPpp)
|
||||
GO(vkGetPhysicalDeviceCalibrateableTimeDomainsEXT, iFppp)
|
||||
|
||||
// VK_EXT_sample_locations
|
||||
@@ -660,4 +660,27 @@ GO(vkGetPhysicalDeviceCooperativeMatrixPropertiesKHR, iFppp) // last arg shou
|
||||
GO(vkCmdBindIndexBuffer2KHR, vFpUUUu)
|
||||
GO(vkGetDeviceImageSubresourceLayoutKHR, vFpPP)
|
||||
GO(vkGetImageSubresourceLayout2KHR, vFpUPP)
|
||||
GO(vkGetRenderingAreaGranularityKHR, vFpPp)
|
||||
GO(vkGetRenderingAreaGranularityKHR, vFpPp)
|
||||
|
||||
// VK_KHR_calibrated_timestamps
|
||||
GO(vkGetCalibratedTimestampsKHR, iFpuPpp)
|
||||
GO(vkGetPhysicalDeviceCalibrateableTimeDomainsKHR, iFppp)
|
||||
|
||||
// VK_KHR_video_queue
|
||||
GOM(vkBindVideoSessionMemoryKHR, iFEpUup)
|
||||
GO(vkCmdBeginVideoCodingKHR, vFpP)
|
||||
GO(vkCmdControlVideoCodingKHR, vFpP)
|
||||
GO(vkCmdEndVideoCodingKHR, vFpP)
|
||||
GOM(vkCreateVideoSessionKHR, iFEpppp)
|
||||
GOM(vkCreateVideoSessionParametersKHR, iFEpppp)
|
||||
GOM(vkDestroyVideoSessionKHR, vFEpUp)
|
||||
GOM(vkDestroyVideoSessionParametersKHR, vFEpUp)
|
||||
GO(vkGetPhysicalDeviceVideoCapabilitiesKHR, iFpPp)
|
||||
GO(vkGetPhysicalDeviceVideoFormatPropertiesKHR, iFpPpp)
|
||||
GO(vkGetVideoSessionMemoryRequirementsKHR, iFpUpp)
|
||||
GO(vkUpdateVideoSessionParametersKHR, iFpUp)
|
||||
|
||||
//VK_KHR_video_encode_queue
|
||||
GO(vkCmdEncodeVideoKHR, vFpP)
|
||||
GO(vkGetEncodedVideoSessionParametersKHR, iFpPPpp)
|
||||
GO(vkGetPhysicalDeviceVideoEncodeQualityLevelPropertiesKHR, iFpPP)
|
||||
@@ -76,6 +76,7 @@ BOX86_NOGTK=1
|
||||
BOX86_DYNAREC_STRONGMEM=1
|
||||
BOX86_X11COLOR16=1
|
||||
BOX86_DYNAREC_CALLRET=0 #it seems to be unstable in some cases, so disabling (for #920)
|
||||
#BOX86_NOCRASHHANDLER=1
|
||||
|
||||
[streaming_client]
|
||||
BOX86_EMULATED_LIBS=libSDL2-2.0.so.0:libSDL2_ttf-2.0.so.0
|
||||
@@ -113,6 +114,11 @@ BOX86_DYNAREC_FORWARD=512
|
||||
# Wine process
|
||||
#
|
||||
|
||||
[EAappInstaller.exe]
|
||||
BOX86_DYNAREC_SAFEFLAGS=2
|
||||
BOX86_DYNAREC_BIGBLOCK=0
|
||||
BOX86_DYNAREC_STRONGMEM=1
|
||||
|
||||
[MassEffect.exe]
|
||||
BOX86_DYNAREC_STRONGMEM=1
|
||||
BOX86_DYNAREC_FASTNAN=0
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
#define _LARGEFILE_SOURCE 1
|
||||
#define _FILE_OFFSET_BITS 64
|
||||
#define _GNU_SOURCE
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdint.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/vfs.h>
|
||||
#include <stddef.h>
|
||||
int main(int argc, char** argv)
|
||||
{
|
||||
struct stat64 st;
|
||||
st.__st_ino = 0;
|
||||
return 0;
|
||||
}
|
||||
Reference in new issue
Block a user