From 29b56dad8fb8f460f5f40ff21aeef63f2089d243 Mon Sep 17 00:00:00 2001 From: John Williams Date: Thu, 9 Oct 2025 11:28:38 +1100 Subject: [PATCH 01/11] mkimage / fs-resize - mke2fs - ext4 usage type --- packages/sysutils/busybox/scripts/fs-resize | 2 +- scripts/mkimage | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/sysutils/busybox/scripts/fs-resize b/packages/sysutils/busybox/scripts/fs-resize index 15df5bcae4..ac03e4c430 100755 --- a/packages/sysutils/busybox/scripts/fs-resize +++ b/packages/sysutils/busybox/scripts/fs-resize @@ -62,7 +62,7 @@ if [ -e /storage/.please_resize_me ] ; then echo "" StartProgressLog spinner "Resizing partition... " "parted -s -f -m $DISK resizepart 2 100% >>$LOG 2>&1" - StartProgressLog spinner "Creating file system... " "mke2fs -F -q -t ext4 -m 0 -L \"$LABEL\" -U \"$UUID\" $PART >>$LOG 2>&1" + StartProgressLog spinner "Creating file system... " "mke2fs -F -q -t ext4 -T ext4 -m 0 -L \"$LABEL\" -U \"$UUID\" $PART >>$LOG 2>&1" StartProgressLog spinner "Checking file system... " "e2fsck -f -p $PART >>$LOG 2>&1" StartProgress countdown "Rebooting in 15s... " 15 "NOW" else diff --git a/scripts/mkimage b/scripts/mkimage index b1b80fe09d..cccd7a7ccd 100755 --- a/scripts/mkimage +++ b/scripts/mkimage @@ -96,7 +96,7 @@ dd if="${DISK}" of="${IMG_TMP}/part2.ext4" bs=512 count=0 seek="${STORAGE_PART_C # create filesystem on part2 echo "image: creating filesystem on part2..." -mke2fs -F -q -t ext4 -O ^orphan_file -m 0 -b 4096 "${IMG_TMP}/part2.ext4" +mke2fs -F -q -t ext4 -T ext4 -O ^orphan_file -m 0 "${IMG_TMP}/part2.ext4" tune2fs -L "${DISTRO_DISKLABEL}" -U ${UUID_STORAGE} "${IMG_TMP}/part2.ext4" >"${SAVE_ERROR}" 2>&1 || show_error e2fsck -n "${IMG_TMP}/part2.ext4" >"${SAVE_ERROR}" 2>&1 || show_error sync From bd4203d5ab65f1b2c4fc2dd58145735fd3b2ce88 Mon Sep 17 00:00:00 2001 From: John Williams Date: Thu, 9 Oct 2025 15:03:14 +1100 Subject: [PATCH 02/11] azahar-sa - bump to AZAHAR_PLUS_2123_2_A --- .../azahar-sa/config/AMD64/qt-config.ini | 12 +- .../azahar-sa/config/RK3588/qt-config_ACE.ini | 12 +- .../azahar-sa/config/RK3588/qt-config_CM5.ini | 12 +- .../azahar-sa/config/S922X/qt-config.ini | 12 +- .../azahar-sa/config/S922X/qt-config.ini.new | 705 ++++++++++++++++++ .../azahar-sa/config/SDM845/qt-config.ini | 12 +- .../azahar-sa/config/SM8250/qt-config.ini | 12 +- .../azahar-sa/config/SM8550/qt-config.ini | 12 +- .../emulators/standalone/azahar-sa/package.mk | 5 +- 9 files changed, 749 insertions(+), 45 deletions(-) create mode 100644 projects/ROCKNIX/packages/emulators/standalone/azahar-sa/config/S922X/qt-config.ini.new diff --git a/projects/ROCKNIX/packages/emulators/standalone/azahar-sa/config/AMD64/qt-config.ini b/projects/ROCKNIX/packages/emulators/standalone/azahar-sa/config/AMD64/qt-config.ini index 6a46605085..691bb1088f 100644 --- a/projects/ROCKNIX/packages/emulators/standalone/azahar-sa/config/AMD64/qt-config.ini +++ b/projects/ROCKNIX/packages/emulators/standalone/azahar-sa/config/AMD64/qt-config.ini @@ -5,11 +5,11 @@ enable_audio_stretching=true enable_audio_stretching\default=true enable_realtime_audio=false enable_realtime_audio\default=true -input_device=auto +input_device=Auto input_device\default=true input_type=0 input_type\default=true -output_device=auto +output_device=Auto output_device\default=true output_type=0 output_type\default=true @@ -81,8 +81,8 @@ profiles\1\circle_pad="axis_x:0,axis_y:1,deadzone:0.100000,engine:sdl,guid:03001 profiles\1\circle_pad\default=false profiles\1\motion_device="engine:motion_emu,update_period:100,sensitivity:0.01,tilt_clamp:90.0" profiles\1\motion_device\default=true -profiles\1\name=default -profiles\1\name\default=true +profiles\1\name=Default +profiles\1\name\default=false profiles\1\touch_device=engine:emu_window profiles\1\touch_device\default=true profiles\1\touch_from_button_map=0 @@ -623,13 +623,13 @@ Shortcuts\Main%20Window\Toggle%20Turbo%20Mode\Context=2 Shortcuts\Main%20Window\Toggle%20Turbo%20Mode\Context\default=true Shortcuts\Main%20Window\Toggle%20Turbo%20Mode\KeySeq= Shortcuts\Main%20Window\Toggle%20Turbo%20Mode\KeySeq\default=true -UILayout\gameListHeaderState=@ByteArray(\0\0\0\xff\0\0\0\0\0\0\0\x1\0\0\0\x1\0\0\0\x6\x1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x5\0\0\0\0\x6\x1\x1\0\x1\0\0\0\0\0\0\0\0\0\0\0\0\x64\xff\xff\xff\xff\0\0\0\x81\0\0\0\0\0\0\0\x6\0\0\x2\x80\0\0\0\x1\0\0\0\0\0\0\0\x64\0\0\0\x1\0\0\0\0\0\0\0\x64\0\0\0\x1\0\0\0\0\0\0\0\x64\0\0\0\x1\0\0\0\0\0\0\0\x64\0\0\0\x1\0\0\0\0\0\0\0\xf0\0\0\0\x1\0\0\0\0\0\0\x3\xe8\0\0\0\0\x64\0\0\0\0) +UILayout\gameListHeaderState="@ByteArray(\0\0\0\xff\0\0\0\0\0\0\0\x1\0\0\0\x1\0\0\0\x6\x1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x3\xe2\0\0\0\x6\x1\x1\0\x1\0\0\0\0\0\0\0\0\0\0\0\0\x64\xff\xff\xff\xff\0\0\0\x81\0\0\0\0\0\0\0\x6\0\0\x2\x80\0\0\0\x1\0\0\0\0\0\0\0\x62\0\0\0\x1\0\0\0\0\0\0\0=\0\0\0\x1\0\0\0\0\0\0\0G\0\0\0\x1\0\0\0\0\0\0\0\x30\0\0\0\x1\0\0\0\0\0\0\0L\0\0\0\x1\0\0\0\0\0\0\x3\xe8\0\0\0\0L\0\0\0\0)" UILayout\geometry="@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\x1=\0\0\0\xd5\0\0\x6\x42\0\0\x3\x11\0\0\x1@\0\0\0\xf3\0\0\x6?\0\0\x3\xe\0\0\0\0\0\0\0\0\a\x80\0\0\x1@\0\0\0\xf3\0\0\x6?\0\0\x3\xe)" UILayout\geometryRenderWindow=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\x1\0\0\0\x19\0\0\0\x64\0\0\0\x36\0\0\0\0\0\0\0\0\xff\xff\xff\xff\xff\xff\xff\xff\0\0\0\0\0\0\0\0\x5\0\0\0\0\x1\0\0\0\x19\0\0\0\x64\0\0\0\x36) UILayout\microProfileDialogGeometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\x1\0\0\0\x19\0\0\x3\xe8\0\0\x2p\0\0\0\x1\0\0\0\x19\0\0\x3\xe8\0\0\x2p\0\0\0\0\0\0\0\0\a\x80\0\0\0\x1\0\0\0\x19\0\0\x3\xe8\0\0\x2p) UILayout\microProfileDialogVisible=false UILayout\microProfileDialogVisible\default=true -UILayout\state=@ByteArray(\0\0\0\xff\0\0\0\0\xfd\0\0\0\x2\0\0\0\0\0\0\0\0\0\0\0\0\xfc\x2\0\0\0\x1\xfb\0\0\0\x1c\0W\0\x61\0i\0t\0T\0r\0\x65\0\x65\0W\0i\0\x64\0g\0\x65\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0V\0\xff\xff\xff\0\0\0\x1\0\0\0\0\0\0\0\0\xfc\x2\0\0\0\b\xfb\0\0\0\x18\0\x41\0R\0M\0R\0\x65\0g\0i\0s\0t\0\x65\0r\0s\0\0\0\0\0\xff\xff\xff\xff\0\0\0h\0\xff\xff\xff\xfb\0\0\0 \0G\0r\0\x61\0p\0h\0i\0\x63\0s\0\x44\0\x65\0\x62\0u\0g\0g\0\x65\0r\0\0\0\0\0\xff\xff\xff\xff\0\0\0V\0\xff\xff\xff\xfb\0\0\0\"\0P\0i\0\x63\0\x61\0 \0\x43\0o\0m\0m\0\x61\0n\0\x64\0 \0L\0i\0s\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x84\0\xff\xff\xff\xfb\0\0\0*\0P\0i\0\x63\0\x61\0\x42\0r\0\x65\0\x61\0k\0P\0o\0i\0n\0t\0s\0W\0i\0\x64\0g\0\x65\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x84\0\xff\xff\xff\xfb\0\0\0 \0P\0i\0\x63\0\x61\0V\0\x65\0r\0t\0\x65\0x\0S\0h\0\x61\0\x64\0\x65\0r\0\0\0\0\0\xff\xff\xff\xff\0\0\x1\xa6\0\xff\xff\xff\xfb\0\0\0\x12\0\x43\0i\0T\0r\0\x61\0\x63\0i\0n\0g\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x38\0\xff\xff\xff\xfb\0\0\0.\0L\0L\0\x45\0S\0\x65\0r\0v\0i\0\x63\0\x65\0M\0o\0\x64\0u\0l\0\x65\0s\0W\0i\0\x64\0g\0\x65\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0V\0\xff\xff\xff\xfb\0\0\0\x16\0I\0P\0\x43\0R\0\x65\0\x63\0o\0r\0\x64\0\x65\0r\0\0\0\0\0\xff\xff\xff\xff\0\0\0\xba\0\xff\xff\xff\0\0\x5\0\0\0\x1\xee\0\0\0\x4\0\0\0\x4\0\0\0\b\0\0\0\b\xfc\0\0\0\0) +UILayout\state=@ByteArray(\0\0\0\xff\0\0\0\0\xfd\0\0\0\x2\0\0\0\0\0\0\0\0\0\0\0\0\xfc\x2\0\0\0\x1\xfb\0\0\0\x1c\0W\0\x61\0i\0t\0T\0r\0\x65\0\x65\0W\0i\0\x64\0g\0\x65\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0V\0\xff\xff\xff\0\0\0\x1\0\0\0\0\0\0\0\0\xfc\x2\0\0\0\b\xfb\0\0\0\x18\0\x41\0R\0M\0R\0\x65\0g\0i\0s\0t\0\x65\0r\0s\0\0\0\0\0\xff\xff\xff\xff\0\0\0h\0\xff\xff\xff\xfb\0\0\0 \0G\0r\0\x61\0p\0h\0i\0\x63\0s\0\x44\0\x65\0\x62\0u\0g\0g\0\x65\0r\0\0\0\0\0\xff\xff\xff\xff\0\0\0V\0\xff\xff\xff\xfb\0\0\0\"\0P\0i\0\x63\0\x61\0 \0\x43\0o\0m\0m\0\x61\0n\0\x64\0 \0L\0i\0s\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x84\0\xff\xff\xff\xfb\0\0\0*\0P\0i\0\x63\0\x61\0\x42\0r\0\x65\0\x61\0k\0P\0o\0i\0n\0t\0s\0W\0i\0\x64\0g\0\x65\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x84\0\xff\xff\xff\xfb\0\0\0 \0P\0i\0\x63\0\x61\0V\0\x65\0r\0t\0\x65\0x\0S\0h\0\x61\0\x64\0\x65\0r\0\0\0\0\0\xff\xff\xff\xff\0\0\x1\xa6\0\xff\xff\xff\xfb\0\0\0\x12\0\x43\0i\0T\0r\0\x61\0\x63\0i\0n\0g\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x38\0\xff\xff\xff\xfb\0\0\0.\0L\0L\0\x45\0S\0\x65\0r\0v\0i\0\x63\0\x65\0M\0o\0\x64\0u\0l\0\x65\0s\0W\0i\0\x64\0g\0\x65\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0V\0\xff\xff\xff\xfb\0\0\0\x16\0I\0P\0\x43\0R\0\x65\0\x63\0o\0r\0\x64\0\x65\0r\0\0\0\0\0\xff\xff\xff\xff\0\0\0\xba\0\xff\xff\xff\0\0\x2\x39\0\0\0\xc2\0\0\0\x4\0\0\0\x4\0\0\0\b\0\0\0\b\xfc\0\0\0\0) Updater\check_for_update_on_start=true Updater\check_for_update_on_start\default=true Updater\update_on_close=false diff --git a/projects/ROCKNIX/packages/emulators/standalone/azahar-sa/config/RK3588/qt-config_ACE.ini b/projects/ROCKNIX/packages/emulators/standalone/azahar-sa/config/RK3588/qt-config_ACE.ini index 8eba657d5a..9f08b23a7e 100644 --- a/projects/ROCKNIX/packages/emulators/standalone/azahar-sa/config/RK3588/qt-config_ACE.ini +++ b/projects/ROCKNIX/packages/emulators/standalone/azahar-sa/config/RK3588/qt-config_ACE.ini @@ -5,11 +5,11 @@ enable_audio_stretching=true enable_audio_stretching\default=true enable_realtime_audio=false enable_realtime_audio\default=true -input_device=auto +input_device=Auto input_device\default=true input_type=0 input_type\default=true -output_device=auto +output_device=Auto output_device\default=true output_type=0 output_type\default=true @@ -81,8 +81,8 @@ profiles\1\circle_pad="axis_x:0,axis_y:1,deadzone:0.100000,engine:sdl,guid:03001 profiles\1\circle_pad\default=false profiles\1\motion_device="engine:motion_emu,update_period:100,sensitivity:0.01,tilt_clamp:90.0" profiles\1\motion_device\default=true -profiles\1\name=default -profiles\1\name\default=true +profiles\1\name=Default +profiles\1\name\default=false profiles\1\touch_device=engine:emu_window profiles\1\touch_device\default=true profiles\1\touch_from_button_map=0 @@ -623,13 +623,13 @@ Shortcuts\Main%20Window\Toggle%20Turbo%20Mode\Context=2 Shortcuts\Main%20Window\Toggle%20Turbo%20Mode\Context\default=true Shortcuts\Main%20Window\Toggle%20Turbo%20Mode\KeySeq= Shortcuts\Main%20Window\Toggle%20Turbo%20Mode\KeySeq\default=true -UILayout\gameListHeaderState=@ByteArray(\0\0\0\xff\0\0\0\0\0\0\0\x1\0\0\0\x1\0\0\0\x6\x1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x5\0\0\0\0\x6\x1\x1\0\x1\0\0\0\0\0\0\0\0\0\0\0\0\x64\xff\xff\xff\xff\0\0\0\x81\0\0\0\0\0\0\0\x6\0\0\x2\x80\0\0\0\x1\0\0\0\0\0\0\0\x64\0\0\0\x1\0\0\0\0\0\0\0\x64\0\0\0\x1\0\0\0\0\0\0\0\x64\0\0\0\x1\0\0\0\0\0\0\0\x64\0\0\0\x1\0\0\0\0\0\0\0\xf0\0\0\0\x1\0\0\0\0\0\0\x3\xe8\0\0\0\0\x64\0\0\0\0) +UILayout\gameListHeaderState="@ByteArray(\0\0\0\xff\0\0\0\0\0\0\0\x1\0\0\0\x1\0\0\0\x6\x1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x3\xe2\0\0\0\x6\x1\x1\0\x1\0\0\0\0\0\0\0\0\0\0\0\0\x64\xff\xff\xff\xff\0\0\0\x81\0\0\0\0\0\0\0\x6\0\0\x2\x80\0\0\0\x1\0\0\0\0\0\0\0\x62\0\0\0\x1\0\0\0\0\0\0\0=\0\0\0\x1\0\0\0\0\0\0\0G\0\0\0\x1\0\0\0\0\0\0\0\x30\0\0\0\x1\0\0\0\0\0\0\0L\0\0\0\x1\0\0\0\0\0\0\x3\xe8\0\0\0\0L\0\0\0\0)" UILayout\geometry="@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\x1=\0\0\0\xd5\0\0\x6\x42\0\0\x3\x11\0\0\x1@\0\0\0\xf3\0\0\x6?\0\0\x3\xe\0\0\0\0\0\0\0\0\a\x80\0\0\x1@\0\0\0\xf3\0\0\x6?\0\0\x3\xe)" UILayout\geometryRenderWindow=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\x1\0\0\0\x19\0\0\0\x64\0\0\0\x36\0\0\0\0\0\0\0\0\xff\xff\xff\xff\xff\xff\xff\xff\0\0\0\0\0\0\0\0\x5\0\0\0\0\x1\0\0\0\x19\0\0\0\x64\0\0\0\x36) UILayout\microProfileDialogGeometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\x1\0\0\0\x19\0\0\x3\xe8\0\0\x2p\0\0\0\x1\0\0\0\x19\0\0\x3\xe8\0\0\x2p\0\0\0\0\0\0\0\0\a\x80\0\0\0\x1\0\0\0\x19\0\0\x3\xe8\0\0\x2p) UILayout\microProfileDialogVisible=false UILayout\microProfileDialogVisible\default=true -UILayout\state=@ByteArray(\0\0\0\xff\0\0\0\0\xfd\0\0\0\x2\0\0\0\0\0\0\0\0\0\0\0\0\xfc\x2\0\0\0\x1\xfb\0\0\0\x1c\0W\0\x61\0i\0t\0T\0r\0\x65\0\x65\0W\0i\0\x64\0g\0\x65\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0V\0\xff\xff\xff\0\0\0\x1\0\0\0\0\0\0\0\0\xfc\x2\0\0\0\b\xfb\0\0\0\x18\0\x41\0R\0M\0R\0\x65\0g\0i\0s\0t\0\x65\0r\0s\0\0\0\0\0\xff\xff\xff\xff\0\0\0h\0\xff\xff\xff\xfb\0\0\0 \0G\0r\0\x61\0p\0h\0i\0\x63\0s\0\x44\0\x65\0\x62\0u\0g\0g\0\x65\0r\0\0\0\0\0\xff\xff\xff\xff\0\0\0V\0\xff\xff\xff\xfb\0\0\0\"\0P\0i\0\x63\0\x61\0 \0\x43\0o\0m\0m\0\x61\0n\0\x64\0 \0L\0i\0s\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x84\0\xff\xff\xff\xfb\0\0\0*\0P\0i\0\x63\0\x61\0\x42\0r\0\x65\0\x61\0k\0P\0o\0i\0n\0t\0s\0W\0i\0\x64\0g\0\x65\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x84\0\xff\xff\xff\xfb\0\0\0 \0P\0i\0\x63\0\x61\0V\0\x65\0r\0t\0\x65\0x\0S\0h\0\x61\0\x64\0\x65\0r\0\0\0\0\0\xff\xff\xff\xff\0\0\x1\xa6\0\xff\xff\xff\xfb\0\0\0\x12\0\x43\0i\0T\0r\0\x61\0\x63\0i\0n\0g\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x38\0\xff\xff\xff\xfb\0\0\0.\0L\0L\0\x45\0S\0\x65\0r\0v\0i\0\x63\0\x65\0M\0o\0\x64\0u\0l\0\x65\0s\0W\0i\0\x64\0g\0\x65\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0V\0\xff\xff\xff\xfb\0\0\0\x16\0I\0P\0\x43\0R\0\x65\0\x63\0o\0r\0\x64\0\x65\0r\0\0\0\0\0\xff\xff\xff\xff\0\0\0\xba\0\xff\xff\xff\0\0\x5\0\0\0\x1\xee\0\0\0\x4\0\0\0\x4\0\0\0\b\0\0\0\b\xfc\0\0\0\0) +UILayout\state=@ByteArray(\0\0\0\xff\0\0\0\0\xfd\0\0\0\x2\0\0\0\0\0\0\0\0\0\0\0\0\xfc\x2\0\0\0\x1\xfb\0\0\0\x1c\0W\0\x61\0i\0t\0T\0r\0\x65\0\x65\0W\0i\0\x64\0g\0\x65\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0V\0\xff\xff\xff\0\0\0\x1\0\0\0\0\0\0\0\0\xfc\x2\0\0\0\b\xfb\0\0\0\x18\0\x41\0R\0M\0R\0\x65\0g\0i\0s\0t\0\x65\0r\0s\0\0\0\0\0\xff\xff\xff\xff\0\0\0h\0\xff\xff\xff\xfb\0\0\0 \0G\0r\0\x61\0p\0h\0i\0\x63\0s\0\x44\0\x65\0\x62\0u\0g\0g\0\x65\0r\0\0\0\0\0\xff\xff\xff\xff\0\0\0V\0\xff\xff\xff\xfb\0\0\0\"\0P\0i\0\x63\0\x61\0 \0\x43\0o\0m\0m\0\x61\0n\0\x64\0 \0L\0i\0s\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x84\0\xff\xff\xff\xfb\0\0\0*\0P\0i\0\x63\0\x61\0\x42\0r\0\x65\0\x61\0k\0P\0o\0i\0n\0t\0s\0W\0i\0\x64\0g\0\x65\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x84\0\xff\xff\xff\xfb\0\0\0 \0P\0i\0\x63\0\x61\0V\0\x65\0r\0t\0\x65\0x\0S\0h\0\x61\0\x64\0\x65\0r\0\0\0\0\0\xff\xff\xff\xff\0\0\x1\xa6\0\xff\xff\xff\xfb\0\0\0\x12\0\x43\0i\0T\0r\0\x61\0\x63\0i\0n\0g\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x38\0\xff\xff\xff\xfb\0\0\0.\0L\0L\0\x45\0S\0\x65\0r\0v\0i\0\x63\0\x65\0M\0o\0\x64\0u\0l\0\x65\0s\0W\0i\0\x64\0g\0\x65\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0V\0\xff\xff\xff\xfb\0\0\0\x16\0I\0P\0\x43\0R\0\x65\0\x63\0o\0r\0\x64\0\x65\0r\0\0\0\0\0\xff\xff\xff\xff\0\0\0\xba\0\xff\xff\xff\0\0\x2\x39\0\0\0\xc2\0\0\0\x4\0\0\0\x4\0\0\0\b\0\0\0\b\xfc\0\0\0\0) Updater\check_for_update_on_start=true Updater\check_for_update_on_start\default=true Updater\update_on_close=false diff --git a/projects/ROCKNIX/packages/emulators/standalone/azahar-sa/config/RK3588/qt-config_CM5.ini b/projects/ROCKNIX/packages/emulators/standalone/azahar-sa/config/RK3588/qt-config_CM5.ini index 36a204927b..ec11526e79 100644 --- a/projects/ROCKNIX/packages/emulators/standalone/azahar-sa/config/RK3588/qt-config_CM5.ini +++ b/projects/ROCKNIX/packages/emulators/standalone/azahar-sa/config/RK3588/qt-config_CM5.ini @@ -5,11 +5,11 @@ enable_audio_stretching=true enable_audio_stretching\default=true enable_realtime_audio=false enable_realtime_audio\default=true -input_device=auto +input_device=Auto input_device\default=true input_type=0 input_type\default=true -output_device=auto +output_device=Auto output_device\default=true output_type=0 output_type\default=true @@ -81,8 +81,8 @@ profiles\1\circle_pad="axis_x:0,axis_y:1,deadzone:0.100000,engine:sdl,guid:03008 profiles\1\circle_pad\default=false profiles\1\motion_device="engine:motion_emu,update_period:100,sensitivity:0.01,tilt_clamp:90.0" profiles\1\motion_device\default=true -profiles\1\name=default -profiles\1\name\default=true +profiles\1\name=Default +profiles\1\name\default=false profiles\1\touch_device=engine:emu_window profiles\1\touch_device\default=true profiles\1\touch_from_button_map=0 @@ -623,13 +623,13 @@ Shortcuts\Main%20Window\Toggle%20Turbo%20Mode\Context=2 Shortcuts\Main%20Window\Toggle%20Turbo%20Mode\Context\default=true Shortcuts\Main%20Window\Toggle%20Turbo%20Mode\KeySeq= Shortcuts\Main%20Window\Toggle%20Turbo%20Mode\KeySeq\default=true -UILayout\gameListHeaderState=@ByteArray(\0\0\0\xff\0\0\0\0\0\0\0\x1\0\0\0\x1\0\0\0\x6\x1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x5\0\0\0\0\x6\x1\x1\0\x1\0\0\0\0\0\0\0\0\0\0\0\0\x64\xff\xff\xff\xff\0\0\0\x81\0\0\0\0\0\0\0\x6\0\0\x2\x80\0\0\0\x1\0\0\0\0\0\0\0\x64\0\0\0\x1\0\0\0\0\0\0\0\x64\0\0\0\x1\0\0\0\0\0\0\0\x64\0\0\0\x1\0\0\0\0\0\0\0\x64\0\0\0\x1\0\0\0\0\0\0\0\xf0\0\0\0\x1\0\0\0\0\0\0\x3\xe8\0\0\0\0\x64\0\0\0\0) +UILayout\gameListHeaderState="@ByteArray(\0\0\0\xff\0\0\0\0\0\0\0\x1\0\0\0\x1\0\0\0\x6\x1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x3\xe2\0\0\0\x6\x1\x1\0\x1\0\0\0\0\0\0\0\0\0\0\0\0\x64\xff\xff\xff\xff\0\0\0\x81\0\0\0\0\0\0\0\x6\0\0\x2\x80\0\0\0\x1\0\0\0\0\0\0\0\x62\0\0\0\x1\0\0\0\0\0\0\0=\0\0\0\x1\0\0\0\0\0\0\0G\0\0\0\x1\0\0\0\0\0\0\0\x30\0\0\0\x1\0\0\0\0\0\0\0L\0\0\0\x1\0\0\0\0\0\0\x3\xe8\0\0\0\0L\0\0\0\0)" UILayout\geometry="@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\x1=\0\0\0\xd5\0\0\x6\x42\0\0\x3\x11\0\0\x1@\0\0\0\xf3\0\0\x6?\0\0\x3\xe\0\0\0\0\0\0\0\0\a\x80\0\0\x1@\0\0\0\xf3\0\0\x6?\0\0\x3\xe)" UILayout\geometryRenderWindow=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\x1\0\0\0\x19\0\0\0\x64\0\0\0\x36\0\0\0\0\0\0\0\0\xff\xff\xff\xff\xff\xff\xff\xff\0\0\0\0\0\0\0\0\x5\0\0\0\0\x1\0\0\0\x19\0\0\0\x64\0\0\0\x36) UILayout\microProfileDialogGeometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\x1\0\0\0\x19\0\0\x3\xe8\0\0\x2p\0\0\0\x1\0\0\0\x19\0\0\x3\xe8\0\0\x2p\0\0\0\0\0\0\0\0\a\x80\0\0\0\x1\0\0\0\x19\0\0\x3\xe8\0\0\x2p) UILayout\microProfileDialogVisible=false UILayout\microProfileDialogVisible\default=true -UILayout\state=@ByteArray(\0\0\0\xff\0\0\0\0\xfd\0\0\0\x2\0\0\0\0\0\0\0\0\0\0\0\0\xfc\x2\0\0\0\x1\xfb\0\0\0\x1c\0W\0\x61\0i\0t\0T\0r\0\x65\0\x65\0W\0i\0\x64\0g\0\x65\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0V\0\xff\xff\xff\0\0\0\x1\0\0\0\0\0\0\0\0\xfc\x2\0\0\0\b\xfb\0\0\0\x18\0\x41\0R\0M\0R\0\x65\0g\0i\0s\0t\0\x65\0r\0s\0\0\0\0\0\xff\xff\xff\xff\0\0\0h\0\xff\xff\xff\xfb\0\0\0 \0G\0r\0\x61\0p\0h\0i\0\x63\0s\0\x44\0\x65\0\x62\0u\0g\0g\0\x65\0r\0\0\0\0\0\xff\xff\xff\xff\0\0\0V\0\xff\xff\xff\xfb\0\0\0\"\0P\0i\0\x63\0\x61\0 \0\x43\0o\0m\0m\0\x61\0n\0\x64\0 \0L\0i\0s\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x84\0\xff\xff\xff\xfb\0\0\0*\0P\0i\0\x63\0\x61\0\x42\0r\0\x65\0\x61\0k\0P\0o\0i\0n\0t\0s\0W\0i\0\x64\0g\0\x65\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x84\0\xff\xff\xff\xfb\0\0\0 \0P\0i\0\x63\0\x61\0V\0\x65\0r\0t\0\x65\0x\0S\0h\0\x61\0\x64\0\x65\0r\0\0\0\0\0\xff\xff\xff\xff\0\0\x1\xa6\0\xff\xff\xff\xfb\0\0\0\x12\0\x43\0i\0T\0r\0\x61\0\x63\0i\0n\0g\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x38\0\xff\xff\xff\xfb\0\0\0.\0L\0L\0\x45\0S\0\x65\0r\0v\0i\0\x63\0\x65\0M\0o\0\x64\0u\0l\0\x65\0s\0W\0i\0\x64\0g\0\x65\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0V\0\xff\xff\xff\xfb\0\0\0\x16\0I\0P\0\x43\0R\0\x65\0\x63\0o\0r\0\x64\0\x65\0r\0\0\0\0\0\xff\xff\xff\xff\0\0\0\xba\0\xff\xff\xff\0\0\x5\0\0\0\x1\xee\0\0\0\x4\0\0\0\x4\0\0\0\b\0\0\0\b\xfc\0\0\0\0) +UILayout\state=@ByteArray(\0\0\0\xff\0\0\0\0\xfd\0\0\0\x2\0\0\0\0\0\0\0\0\0\0\0\0\xfc\x2\0\0\0\x1\xfb\0\0\0\x1c\0W\0\x61\0i\0t\0T\0r\0\x65\0\x65\0W\0i\0\x64\0g\0\x65\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0V\0\xff\xff\xff\0\0\0\x1\0\0\0\0\0\0\0\0\xfc\x2\0\0\0\b\xfb\0\0\0\x18\0\x41\0R\0M\0R\0\x65\0g\0i\0s\0t\0\x65\0r\0s\0\0\0\0\0\xff\xff\xff\xff\0\0\0h\0\xff\xff\xff\xfb\0\0\0 \0G\0r\0\x61\0p\0h\0i\0\x63\0s\0\x44\0\x65\0\x62\0u\0g\0g\0\x65\0r\0\0\0\0\0\xff\xff\xff\xff\0\0\0V\0\xff\xff\xff\xfb\0\0\0\"\0P\0i\0\x63\0\x61\0 \0\x43\0o\0m\0m\0\x61\0n\0\x64\0 \0L\0i\0s\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x84\0\xff\xff\xff\xfb\0\0\0*\0P\0i\0\x63\0\x61\0\x42\0r\0\x65\0\x61\0k\0P\0o\0i\0n\0t\0s\0W\0i\0\x64\0g\0\x65\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x84\0\xff\xff\xff\xfb\0\0\0 \0P\0i\0\x63\0\x61\0V\0\x65\0r\0t\0\x65\0x\0S\0h\0\x61\0\x64\0\x65\0r\0\0\0\0\0\xff\xff\xff\xff\0\0\x1\xa6\0\xff\xff\xff\xfb\0\0\0\x12\0\x43\0i\0T\0r\0\x61\0\x63\0i\0n\0g\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x38\0\xff\xff\xff\xfb\0\0\0.\0L\0L\0\x45\0S\0\x65\0r\0v\0i\0\x63\0\x65\0M\0o\0\x64\0u\0l\0\x65\0s\0W\0i\0\x64\0g\0\x65\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0V\0\xff\xff\xff\xfb\0\0\0\x16\0I\0P\0\x43\0R\0\x65\0\x63\0o\0r\0\x64\0\x65\0r\0\0\0\0\0\xff\xff\xff\xff\0\0\0\xba\0\xff\xff\xff\0\0\x2\x39\0\0\0\xc2\0\0\0\x4\0\0\0\x4\0\0\0\b\0\0\0\b\xfc\0\0\0\0) Updater\check_for_update_on_start=true Updater\check_for_update_on_start\default=true Updater\update_on_close=false diff --git a/projects/ROCKNIX/packages/emulators/standalone/azahar-sa/config/S922X/qt-config.ini b/projects/ROCKNIX/packages/emulators/standalone/azahar-sa/config/S922X/qt-config.ini index 8c8418e8cc..207552870f 100644 --- a/projects/ROCKNIX/packages/emulators/standalone/azahar-sa/config/S922X/qt-config.ini +++ b/projects/ROCKNIX/packages/emulators/standalone/azahar-sa/config/S922X/qt-config.ini @@ -5,11 +5,11 @@ enable_audio_stretching=true enable_audio_stretching\default=true enable_realtime_audio=false enable_realtime_audio\default=true -input_device=auto +input_device=Auto input_device\default=true input_type=0 input_type\default=true -output_device=auto +output_device=Auto output_device\default=true output_type=0 output_type\default=true @@ -81,8 +81,8 @@ profiles\1\circle_pad="axis_x:0,axis_y:1,deadzone:0.100000,engine:sdl,guid:03001 profiles\1\circle_pad\default=false profiles\1\motion_device="engine:motion_emu,update_period:100,sensitivity:0.01,tilt_clamp:90.0" profiles\1\motion_device\default=true -profiles\1\name=default -profiles\1\name\default=true +profiles\1\name=Default +profiles\1\name\default=false profiles\1\touch_device=engine:emu_window profiles\1\touch_device\default=true profiles\1\touch_from_button_map=0 @@ -623,13 +623,13 @@ Shortcuts\Main%20Window\Toggle%20Turbo%20Mode\Context=2 Shortcuts\Main%20Window\Toggle%20Turbo%20Mode\Context\default=true Shortcuts\Main%20Window\Toggle%20Turbo%20Mode\KeySeq= Shortcuts\Main%20Window\Toggle%20Turbo%20Mode\KeySeq\default=true -UILayout\gameListHeaderState=@ByteArray(\0\0\0\xff\0\0\0\0\0\0\0\x1\0\0\0\x1\0\0\0\x6\x1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x5\0\0\0\0\x6\x1\x1\0\x1\0\0\0\0\0\0\0\0\0\0\0\0\x64\xff\xff\xff\xff\0\0\0\x81\0\0\0\0\0\0\0\x6\0\0\x2\x80\0\0\0\x1\0\0\0\0\0\0\0\x64\0\0\0\x1\0\0\0\0\0\0\0\x64\0\0\0\x1\0\0\0\0\0\0\0\x64\0\0\0\x1\0\0\0\0\0\0\0\x64\0\0\0\x1\0\0\0\0\0\0\0\xf0\0\0\0\x1\0\0\0\0\0\0\x3\xe8\0\0\0\0\x64\0\0\0\0) +UILayout\gameListHeaderState="@ByteArray(\0\0\0\xff\0\0\0\0\0\0\0\x1\0\0\0\x1\0\0\0\x6\x1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x3\xe2\0\0\0\x6\x1\x1\0\x1\0\0\0\0\0\0\0\0\0\0\0\0\x64\xff\xff\xff\xff\0\0\0\x81\0\0\0\0\0\0\0\x6\0\0\x2\x80\0\0\0\x1\0\0\0\0\0\0\0\x62\0\0\0\x1\0\0\0\0\0\0\0=\0\0\0\x1\0\0\0\0\0\0\0G\0\0\0\x1\0\0\0\0\0\0\0\x30\0\0\0\x1\0\0\0\0\0\0\0L\0\0\0\x1\0\0\0\0\0\0\x3\xe8\0\0\0\0L\0\0\0\0)" UILayout\geometry="@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\x1=\0\0\0\xd5\0\0\x6\x42\0\0\x3\x11\0\0\x1@\0\0\0\xf3\0\0\x6?\0\0\x3\xe\0\0\0\0\0\0\0\0\a\x80\0\0\x1@\0\0\0\xf3\0\0\x6?\0\0\x3\xe)" UILayout\geometryRenderWindow=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\x1\0\0\0\x19\0\0\0\x64\0\0\0\x36\0\0\0\0\0\0\0\0\xff\xff\xff\xff\xff\xff\xff\xff\0\0\0\0\0\0\0\0\x5\0\0\0\0\x1\0\0\0\x19\0\0\0\x64\0\0\0\x36) UILayout\microProfileDialogGeometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\x1\0\0\0\x19\0\0\x3\xe8\0\0\x2p\0\0\0\x1\0\0\0\x19\0\0\x3\xe8\0\0\x2p\0\0\0\0\0\0\0\0\a\x80\0\0\0\x1\0\0\0\x19\0\0\x3\xe8\0\0\x2p) UILayout\microProfileDialogVisible=false UILayout\microProfileDialogVisible\default=true -UILayout\state=@ByteArray(\0\0\0\xff\0\0\0\0\xfd\0\0\0\x2\0\0\0\0\0\0\0\0\0\0\0\0\xfc\x2\0\0\0\x1\xfb\0\0\0\x1c\0W\0\x61\0i\0t\0T\0r\0\x65\0\x65\0W\0i\0\x64\0g\0\x65\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0V\0\xff\xff\xff\0\0\0\x1\0\0\0\0\0\0\0\0\xfc\x2\0\0\0\b\xfb\0\0\0\x18\0\x41\0R\0M\0R\0\x65\0g\0i\0s\0t\0\x65\0r\0s\0\0\0\0\0\xff\xff\xff\xff\0\0\0h\0\xff\xff\xff\xfb\0\0\0 \0G\0r\0\x61\0p\0h\0i\0\x63\0s\0\x44\0\x65\0\x62\0u\0g\0g\0\x65\0r\0\0\0\0\0\xff\xff\xff\xff\0\0\0V\0\xff\xff\xff\xfb\0\0\0\"\0P\0i\0\x63\0\x61\0 \0\x43\0o\0m\0m\0\x61\0n\0\x64\0 \0L\0i\0s\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x84\0\xff\xff\xff\xfb\0\0\0*\0P\0i\0\x63\0\x61\0\x42\0r\0\x65\0\x61\0k\0P\0o\0i\0n\0t\0s\0W\0i\0\x64\0g\0\x65\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x84\0\xff\xff\xff\xfb\0\0\0 \0P\0i\0\x63\0\x61\0V\0\x65\0r\0t\0\x65\0x\0S\0h\0\x61\0\x64\0\x65\0r\0\0\0\0\0\xff\xff\xff\xff\0\0\x1\xa6\0\xff\xff\xff\xfb\0\0\0\x12\0\x43\0i\0T\0r\0\x61\0\x63\0i\0n\0g\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x38\0\xff\xff\xff\xfb\0\0\0.\0L\0L\0\x45\0S\0\x65\0r\0v\0i\0\x63\0\x65\0M\0o\0\x64\0u\0l\0\x65\0s\0W\0i\0\x64\0g\0\x65\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0V\0\xff\xff\xff\xfb\0\0\0\x16\0I\0P\0\x43\0R\0\x65\0\x63\0o\0r\0\x64\0\x65\0r\0\0\0\0\0\xff\xff\xff\xff\0\0\0\xba\0\xff\xff\xff\0\0\x5\0\0\0\x1\xee\0\0\0\x4\0\0\0\x4\0\0\0\b\0\0\0\b\xfc\0\0\0\0) +UILayout\state=@ByteArray(\0\0\0\xff\0\0\0\0\xfd\0\0\0\x2\0\0\0\0\0\0\0\0\0\0\0\0\xfc\x2\0\0\0\x1\xfb\0\0\0\x1c\0W\0\x61\0i\0t\0T\0r\0\x65\0\x65\0W\0i\0\x64\0g\0\x65\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0V\0\xff\xff\xff\0\0\0\x1\0\0\0\0\0\0\0\0\xfc\x2\0\0\0\b\xfb\0\0\0\x18\0\x41\0R\0M\0R\0\x65\0g\0i\0s\0t\0\x65\0r\0s\0\0\0\0\0\xff\xff\xff\xff\0\0\0h\0\xff\xff\xff\xfb\0\0\0 \0G\0r\0\x61\0p\0h\0i\0\x63\0s\0\x44\0\x65\0\x62\0u\0g\0g\0\x65\0r\0\0\0\0\0\xff\xff\xff\xff\0\0\0V\0\xff\xff\xff\xfb\0\0\0\"\0P\0i\0\x63\0\x61\0 \0\x43\0o\0m\0m\0\x61\0n\0\x64\0 \0L\0i\0s\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x84\0\xff\xff\xff\xfb\0\0\0*\0P\0i\0\x63\0\x61\0\x42\0r\0\x65\0\x61\0k\0P\0o\0i\0n\0t\0s\0W\0i\0\x64\0g\0\x65\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x84\0\xff\xff\xff\xfb\0\0\0 \0P\0i\0\x63\0\x61\0V\0\x65\0r\0t\0\x65\0x\0S\0h\0\x61\0\x64\0\x65\0r\0\0\0\0\0\xff\xff\xff\xff\0\0\x1\xa6\0\xff\xff\xff\xfb\0\0\0\x12\0\x43\0i\0T\0r\0\x61\0\x63\0i\0n\0g\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x38\0\xff\xff\xff\xfb\0\0\0.\0L\0L\0\x45\0S\0\x65\0r\0v\0i\0\x63\0\x65\0M\0o\0\x64\0u\0l\0\x65\0s\0W\0i\0\x64\0g\0\x65\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0V\0\xff\xff\xff\xfb\0\0\0\x16\0I\0P\0\x43\0R\0\x65\0\x63\0o\0r\0\x64\0\x65\0r\0\0\0\0\0\xff\xff\xff\xff\0\0\0\xba\0\xff\xff\xff\0\0\x2\x39\0\0\0\xc2\0\0\0\x4\0\0\0\x4\0\0\0\b\0\0\0\b\xfc\0\0\0\0) Updater\check_for_update_on_start=true Updater\check_for_update_on_start\default=true Updater\update_on_close=false diff --git a/projects/ROCKNIX/packages/emulators/standalone/azahar-sa/config/S922X/qt-config.ini.new b/projects/ROCKNIX/packages/emulators/standalone/azahar-sa/config/S922X/qt-config.ini.new new file mode 100644 index 0000000000..b2c73a1048 --- /dev/null +++ b/projects/ROCKNIX/packages/emulators/standalone/azahar-sa/config/S922X/qt-config.ini.new @@ -0,0 +1,705 @@ +[Audio] +audio_emulation=0 +audio_emulation\default=true +enable_audio_stretching=true +enable_audio_stretching\default=true +enable_realtime_audio=false +enable_realtime_audio\default=true +input_device=Auto +input_device\default=true +input_type=0 +input_type\default=true +output_device=Auto +output_device\default=true +output_type=0 +output_type\default=true +volume=1 +volume\default=true + +[Camera] +camera_inner_config= +camera_inner_config\default=true +camera_inner_flip=0 +camera_inner_flip\default=true +camera_inner_name=blank +camera_inner_name\default=true +camera_outer_left_config= +camera_outer_left_config\default=true +camera_outer_left_flip=0 +camera_outer_left_flip\default=true +camera_outer_left_name=blank +camera_outer_left_name\default=true +camera_outer_right_config= +camera_outer_right_config\default=true +camera_outer_right_flip=0 +camera_outer_right_flip\default=true +camera_outer_right_name=blank +camera_outer_right_name\default=true + +[Controls] +profile=0 +profile\default=true +profiles\1\button_a="button:1,engine:sdl,guid:03001354474f2d556c74726120476100,port:0" +profiles\1\button_a\default=false +profiles\1\button_b="button:0,engine:sdl,guid:03001354474f2d556c74726120476100,port:0" +profiles\1\button_b\default=false +profiles\1\button_debug="code:79,engine:keyboard" +profiles\1\button_debug\default=true +profiles\1\button_down="button:15,engine:sdl,guid:03001354474f2d556c74726120476100,port:0" +profiles\1\button_down\default=false +profiles\1\button_gpio14="code:80,engine:keyboard" +profiles\1\button_gpio14\default=true +profiles\1\button_home="button:11,engine:sdl,guid:03001354474f2d556c74726120476100,port:0" +profiles\1\button_home\default=false +profiles\1\button_l="button:5,engine:sdl,guid:03001354474f2d556c74726120476100,port:0" +profiles\1\button_l\default=false +profiles\1\button_left="button:16,engine:sdl,guid:03001354474f2d556c74726120476100,port:0" +profiles\1\button_left\default=false +profiles\1\button_power="code:86,engine:keyboard" +profiles\1\button_power\default=true +profiles\1\button_r="button:6,engine:sdl,guid:03001354474f2d556c74726120476100,port:0" +profiles\1\button_r\default=false +profiles\1\button_right="button:17,engine:sdl,guid:03001354474f2d556c74726120476100,port:0" +profiles\1\button_right\default=false +profiles\1\button_select="button:9,engine:sdl,guid:03001354474f2d556c74726120476100,port:0" +profiles\1\button_select\default=false +profiles\1\button_start="button:10,engine:sdl,guid:03001354474f2d556c74726120476100,port:0" +profiles\1\button_start\default=false +profiles\1\button_up="button:14,engine:sdl,guid:03001354474f2d556c74726120476100,port:0" +profiles\1\button_up\default=false +profiles\1\button_x="button:3,engine:sdl,guid:03001354474f2d556c74726120476100,port:0" +profiles\1\button_x\default=false +profiles\1\button_y="button:4,engine:sdl,guid:03001354474f2d556c74726120476100,port:0" +profiles\1\button_y\default=false +profiles\1\button_zl="button:7,engine:sdl,guid:03001354474f2d556c74726120476100,port:0" +profiles\1\button_zl\default=false +profiles\1\button_zr="button:8,engine:sdl,guid:03001354474f2d556c74726120476100,port:0" +profiles\1\button_zr\default=false +profiles\1\c_stick="axis_x:2,axis_y:3,deadzone:0.100000,engine:sdl,guid:03001354474f2d556c74726120476100,port:0" +profiles\1\c_stick\default=false +profiles\1\circle_pad="axis_x:0,axis_y:1,deadzone:0.100000,engine:sdl,guid:03001354474f2d556c74726120476100,port:0" +profiles\1\circle_pad\default=false +profiles\1\motion_device="engine:motion_emu,update_period:100,sensitivity:0.01,tilt_clamp:90.0" +profiles\1\motion_device\default=true +profiles\1\name=Default +profiles\1\name\default=false +profiles\1\touch_device=engine:emu_window +profiles\1\touch_device\default=true +profiles\1\touch_from_button_map=0 +profiles\1\touch_from_button_map\default=true +profiles\1\udp_input_address=127.0.0.1 +profiles\1\udp_input_address\default=true +profiles\1\udp_input_port=26760 +profiles\1\udp_input_port\default=true +profiles\1\udp_pad_index=0 +profiles\1\udp_pad_index\default=true +profiles\1\use_touch_from_button=false +profiles\1\use_touch_from_button\default=true +profiles\size=1 +touch_from_button_maps\1\entries\size=0 +touch_from_button_maps\1\name=default +touch_from_button_maps\1\name\default=true +touch_from_button_maps\size=1 +use_artic_base_controller=false +use_artic_base_controller\default=true + +[Core] +cpu_clock_percentage=100 +cpu_clock_percentage\default=true +delay_start_for_lle_modules=true +delay_start_for_lle_modules\default=true +use_cpu_jit=true +use_cpu_jit\default=true + +[Data%20Storage] +compress_cia_installs=false +compress_cia_installs\default=true +nand_directory=/storage/.local/share/azahar/nand/ +nand_directory\default=false +sdmc_directory=/storage/.local/share/azahar/sdmc/ +sdmc_directory\default=false +use_custom_storage=false +use_custom_storage\default=true +use_virtual_sd=true +use_virtual_sd\default=true + +[Debugging] +LLE\AC=false +LLE\AC\default=true +LLE\ACT=false +LLE\ACT\default=true +LLE\AM=false +LLE\AM\default=true +LLE\BOSS=false +LLE\BOSS\default=true +LLE\CAM=false +LLE\CAM\default=true +LLE\CDC=false +LLE\CDC\default=true +LLE\CECD=false +LLE\CECD\default=true +LLE\CFG=false +LLE\CFG\default=true +LLE\CSND=false +LLE\CSND\default=true +LLE\DLP=false +LLE\DLP\default=true +LLE\DSP=false +LLE\DSP\default=true +LLE\ERR=false +LLE\ERR\default=true +LLE\FRD=false +LLE\FRD\default=true +LLE\FS=false +LLE\FS\default=true +LLE\GPIO=false +LLE\GPIO\default=true +LLE\GSP=false +LLE\GSP\default=true +LLE\HID=false +LLE\HID\default=true +LLE\HTTP=false +LLE\HTTP\default=true +LLE\I2C=false +LLE\I2C\default=true +LLE\IR=false +LLE\IR\default=true +LLE\LDR=false +LLE\LDR\default=true +LLE\MCU=false +LLE\MCU\default=true +LLE\MIC=false +LLE\MIC\default=true +LLE\MP=false +LLE\MP\default=true +LLE\MVD=false +LLE\MVD\default=true +LLE\NDM=false +LLE\NDM\default=true +LLE\NEWS=false +LLE\NEWS\default=true +LLE\NFC=false +LLE\NFC\default=true +LLE\NIM=false +LLE\NIM\default=true +LLE\NS=false +LLE\NS\default=true +LLE\NWM=false +LLE\NWM\default=true +LLE\PDN=false +LLE\PDN\default=true +LLE\PLGLDR=false +LLE\PLGLDR\default=true +LLE\PM=false +LLE\PM\default=true +LLE\PS=false +LLE\PS\default=true +LLE\PTM=false +LLE\PTM\default=true +LLE\PXI=false +LLE\PXI\default=true +LLE\QTM=false +LLE\QTM\default=true +LLE\SOC=false +LLE\SOC\default=true +LLE\SPI=false +LLE\SPI\default=true +LLE\SSL=false +LLE\SSL\default=true +enable_rpc_server=false +enable_rpc_server\default=true +gdbstub_port=24689 +gdbstub_port\default=true +instant_debug_log=false +instant_debug_log\default=true +record_frame_times=false +renderer_debug=false +renderer_debug\default=true +use_gdbstub=false +use_gdbstub\default=true + +[Layout] +anaglyph_shader_name=Dubois (builtin) +anaglyph_shader_name\default=true +custom_bottom_height=480 +custom_bottom_height\default=true +custom_bottom_width=640 +custom_bottom_width\default=true +custom_bottom_x=80 +custom_bottom_x\default=true +custom_bottom_y=500 +custom_bottom_y\default=true +custom_portrait_bottom_height=480 +custom_portrait_bottom_height\default=true +custom_portrait_bottom_width=640 +custom_portrait_bottom_width\default=true +custom_portrait_bottom_x=80 +custom_portrait_bottom_x\default=true +custom_portrait_bottom_y=500 +custom_portrait_bottom_y\default=true +custom_portrait_top_height=480 +custom_portrait_top_height\default=true +custom_portrait_top_width=800 +custom_portrait_top_width\default=true +custom_portrait_top_x=0 +custom_portrait_top_x\default=true +custom_portrait_top_y=0 +custom_portrait_top_y\default=true +custom_second_layer_opacity=100 +custom_second_layer_opacity\default=true +custom_top_height=480 +custom_top_height\default=true +custom_top_width=800 +custom_top_width\default=true +custom_top_x=0 +custom_top_x\default=true +custom_top_y=0 +custom_top_y\default=true +factor_3d=0 +factor_3d\default=true +filter_mode=true +filter_mode\default=true +large_screen_proportion=4 +large_screen_proportion\default=true +layout_option=0 +layout_option\default=true +mono_render_option=0 +mono_render_option\default=true +pp_shader_name=None (builtin) +pp_shader_name\default=true +render_3d=0 +render_3d\default=true +screen_bottom_leftright_padding=0 +screen_bottom_leftright_padding\default=true +screen_bottom_stretch=false +screen_bottom_stretch\default=true +screen_bottom_topbottom_padding=0 +screen_bottom_topbottom_padding\default=true +screen_gap=0 +screen_gap\default=true +screen_top_leftright_padding=0 +screen_top_leftright_padding\default=true +screen_top_stretch=false +screen_top_stretch\default=true +screen_top_topbottom_padding=0 +screen_top_topbottom_padding\default=true +small_screen_position=2 +small_screen_position\default=true +swap_screen=false +swap_screen\default=true +upright_screen=false +upright_screen\default=true + +[Miscellaneous] +check_for_update_on_start=false +check_for_update_on_start\default=false +enable_gamemode=true +enable_gamemode\default=true +log_filter=*:Info +log_filter\default=true +log_regex_filter= +log_regex_filter\default=true + +[Renderer] +async_presentation=true +async_presentation\default=true +async_shader_compilation=false +async_shader_compilation\default=true +bg_blue=0 +bg_blue\default=true +bg_green=0 +bg_green\default=true +bg_red=0 +bg_red\default=true +delay_game_render_thread_us=0 +delay_game_render_thread_us\default=true +disable_right_eye_render=false +disable_right_eye_render\default=true +disable_spirv_optimizer=true +disable_spirv_optimizer\default=true +frame_limit=100 +frame_limit\default=true +graphics_api=2 +graphics_api\default=false +physical_device=0 +physical_device\default=true +resolution_factor=1 +resolution_factor\default=true +shaders_accurate_mul=true +shaders_accurate_mul\default=true +spirv_shader_gen=true +spirv_shader_gen\default=true +texture_filter=0 +texture_filter\default=true +texture_sampling=0 +texture_sampling\default=true +turbo_limit=200 +turbo_limit\default=true +use_disk_shader_cache=true +use_disk_shader_cache\default=true +use_hw_shader=true +use_hw_shader\default=true +use_shader_jit=false +use_shader_jit\default=false +use_vsync_new=true +use_vsync_new\default=true + +[System] +allow_plugin_loader=true +allow_plugin_loader\default=true +enable_required_online_lle_modules=false +enable_required_online_lle_modules\default=true +init_clock=0 +init_clock\default=true +init_ticks_override=@Variant(\0\0\0\x81\0\0\0\0\0\0\0\0) +init_ticks_override\default=true +init_ticks_type=0 +init_ticks_type\default=true +init_time=@Variant(\0\0\0\x84\0\0\0\0\x38m5\xbd) +init_time\default=true +init_time_offset=@Variant(\0\0\0\x81\0\0\0\0\0\0\0\0) +init_time_offset\default=true +is_new_3ds=true +is_new_3ds\default=true +lle_applets=true +lle_applets\default=true +plugin_loader=false +plugin_loader\default=true +region_value=-1 +region_value\default=true +steps_per_hour=0 +steps_per_hour\default=true + +[UI] +GameList\favorites\size=0 +GameList\hideNoIcon=false +GameList\hideNoIcon\default=true +GameList\iconSize=2 +GameList\iconSize\default=true +GameList\row1=2 +GameList\row1\default=true +GameList\row2=0 +GameList\row2\default=true +GameList\show_3ds_files_warning=false +GameList\show_3ds_files_warning\default=true +GameList\show_compat_column=true +GameList\show_compat_column\default=true +GameList\show_play_time_column=true +GameList\show_play_time_column\default=true +GameList\show_region_column=true +GameList\show_region_column\default=true +GameList\show_size_column=true +GameList\show_size_column\default=true +GameList\show_type_column=true +GameList\show_type_column\default=true +GameList\singleLineMode=false +GameList\singleLineMode\default=true +Multiplayer\game_id=0 +Multiplayer\game_id\default=true +Multiplayer\host_type=0 +Multiplayer\host_type\default=true +Multiplayer\ip= +Multiplayer\ip\default=true +Multiplayer\ip_ban_list\size=0 +Multiplayer\max_player=8 +Multiplayer\max_player\default=true +Multiplayer\multiplayer_filter_games_owned=false +Multiplayer\multiplayer_filter_games_owned\default=true +Multiplayer\multiplayer_filter_hide_empty=false +Multiplayer\multiplayer_filter_hide_empty\default=true +Multiplayer\multiplayer_filter_hide_full=false +Multiplayer\multiplayer_filter_hide_full\default=true +Multiplayer\multiplayer_filter_text= +Multiplayer\multiplayer_filter_text\default=true +Multiplayer\nickname= +Multiplayer\nickname\default=true +Multiplayer\port=24872 +Multiplayer\port\default=true +Multiplayer\room_description= +Multiplayer\room_description\default=true +Multiplayer\room_name= +Multiplayer\room_name\default=true +Multiplayer\room_nickname= +Multiplayer\room_nickname\default=true +Multiplayer\room_port=24872 +Multiplayer\room_port\default=true +Multiplayer\username_ban_list\size=0 +Paths\gamedirs\1\deep_scan=false +Paths\gamedirs\1\deep_scan\default=true +Paths\gamedirs\1\expanded=true +Paths\gamedirs\1\expanded\default=true +Paths\gamedirs\1\path=INSTALLED +Paths\gamedirs\2\deep_scan=false +Paths\gamedirs\2\deep_scan\default=true +Paths\gamedirs\2\expanded=true +Paths\gamedirs\2\expanded\default=true +Paths\gamedirs\2\path=SYSTEM +Paths\gamedirs\size=2 +Paths\language=en +Paths\language\default=false +Paths\last_artic_base_addr= +Paths\last_artic_base_addr\default=true +Paths\moviePlaybackPath= +Paths\movieRecordPath= +Paths\recentFiles=/storage/roms/3ds/Mario Kart 7 (USA).cxi, "/storage/roms/3ds/Dead or Alive - Dimensions (USA) (En,Ja,Fr,De,Es,It).cxi", "/storage/roms/3ds/Donkey Kong Country Returns 3D (USA) (En,Fr,Es).cxi", +Paths\romsPath= +Paths\screenshotPath=/storage/.local/share/azahar/screenshots/ +Paths\screenshotPath\default=false +Paths\symbolsPath= +Paths\videoDumpingPath= +Shortcuts\Main%20Window\Advance%20Frame\Context=2 +Shortcuts\Main%20Window\Advance%20Frame\Context\default=true +Shortcuts\Main%20Window\Advance%20Frame\KeySeq= +Shortcuts\Main%20Window\Advance%20Frame\KeySeq\default=true +Shortcuts\Main%20Window\Audio%20Mute\Unmute\Context=1 +Shortcuts\Main%20Window\Audio%20Mute\Unmute\Context\default=true +Shortcuts\Main%20Window\Audio%20Mute\Unmute\KeySeq=Ctrl+M +Shortcuts\Main%20Window\Audio%20Mute\Unmute\KeySeq\default=true +Shortcuts\Main%20Window\Audio%20Volume%20Down\Context=1 +Shortcuts\Main%20Window\Audio%20Volume%20Down\Context\default=true +Shortcuts\Main%20Window\Audio%20Volume%20Down\KeySeq= +Shortcuts\Main%20Window\Audio%20Volume%20Down\KeySeq\default=true +Shortcuts\Main%20Window\Audio%20Volume%20Up\Context=1 +Shortcuts\Main%20Window\Audio%20Volume%20Up\Context\default=true +Shortcuts\Main%20Window\Audio%20Volume%20Up\KeySeq= +Shortcuts\Main%20Window\Audio%20Volume%20Up\KeySeq\default=true +Shortcuts\Main%20Window\Capture%20Screenshot\Context=3 +Shortcuts\Main%20Window\Capture%20Screenshot\Context\default=true +Shortcuts\Main%20Window\Capture%20Screenshot\KeySeq=Ctrl+P +Shortcuts\Main%20Window\Capture%20Screenshot\KeySeq\default=true +Shortcuts\Main%20Window\Continue\Pause%20Emulation\Context=1 +Shortcuts\Main%20Window\Continue\Pause%20Emulation\Context\default=true +Shortcuts\Main%20Window\Continue\Pause%20Emulation\KeySeq=F4 +Shortcuts\Main%20Window\Continue\Pause%20Emulation\KeySeq\default=true +Shortcuts\Main%20Window\Decrease%203D%20Factor\Context=2 +Shortcuts\Main%20Window\Decrease%203D%20Factor\Context\default=true +Shortcuts\Main%20Window\Decrease%203D%20Factor\KeySeq=Ctrl+- +Shortcuts\Main%20Window\Decrease%203D%20Factor\KeySeq\default=true +Shortcuts\Main%20Window\Decrease%20Speed%20Limit\Context=2 +Shortcuts\Main%20Window\Decrease%20Speed%20Limit\Context\default=true +Shortcuts\Main%20Window\Decrease%20Speed%20Limit\KeySeq=- +Shortcuts\Main%20Window\Decrease%20Speed%20Limit\KeySeq\default=true +Shortcuts\Main%20Window\Exit%20Azahar\Context=1 +Shortcuts\Main%20Window\Exit%20Azahar\Context\default=true +Shortcuts\Main%20Window\Exit%20Azahar\KeySeq=Ctrl+Q +Shortcuts\Main%20Window\Exit%20Azahar\KeySeq\default=true +Shortcuts\Main%20Window\Exit%20Fullscreen\Context=1 +Shortcuts\Main%20Window\Exit%20Fullscreen\Context\default=true +Shortcuts\Main%20Window\Exit%20Fullscreen\KeySeq=Esc +Shortcuts\Main%20Window\Exit%20Fullscreen\KeySeq\default=true +Shortcuts\Main%20Window\Exit%20Lime3DS\Context=1 +Shortcuts\Main%20Window\Exit%20Lime3DS\Context\default=true +Shortcuts\Main%20Window\Exit%20Lime3DS\KeySeq=Ctrl+Q +Shortcuts\Main%20Window\Exit%20Lime3DS\KeySeq\default=true +Shortcuts\Main%20Window\Fullscreen\Context=1 +Shortcuts\Main%20Window\Fullscreen\Context\default=true +Shortcuts\Main%20Window\Fullscreen\KeySeq=F11 +Shortcuts\Main%20Window\Fullscreen\KeySeq\default=true +Shortcuts\Main%20Window\Increase%203D%20Factor\Context=2 +Shortcuts\Main%20Window\Increase%203D%20Factor\Context\default=true +Shortcuts\Main%20Window\Increase%203D%20Factor\KeySeq=Ctrl++ +Shortcuts\Main%20Window\Increase%203D%20Factor\KeySeq\default=true +Shortcuts\Main%20Window\Increase%20Speed%20Limit\Context=2 +Shortcuts\Main%20Window\Increase%20Speed%20Limit\Context\default=true +Shortcuts\Main%20Window\Increase%20Speed%20Limit\KeySeq=+ +Shortcuts\Main%20Window\Increase%20Speed%20Limit\KeySeq\default=true +Shortcuts\Main%20Window\Load%20Amiibo\Context=3 +Shortcuts\Main%20Window\Load%20Amiibo\Context\default=true +Shortcuts\Main%20Window\Load%20Amiibo\KeySeq=F2 +Shortcuts\Main%20Window\Load%20Amiibo\KeySeq\default=true +Shortcuts\Main%20Window\Load%20File\Context=3 +Shortcuts\Main%20Window\Load%20File\Context\default=true +Shortcuts\Main%20Window\Load%20File\KeySeq=Ctrl+O +Shortcuts\Main%20Window\Load%20File\KeySeq\default=true +Shortcuts\Main%20Window\Load%20from%20Newest%20Non-Quicksave%20Slot\Context=1 +Shortcuts\Main%20Window\Load%20from%20Newest%20Non-Quicksave%20Slot\Context\default=true +Shortcuts\Main%20Window\Load%20from%20Newest%20Non-Quicksave%20Slot\KeySeq=Ctrl+V +Shortcuts\Main%20Window\Load%20from%20Newest%20Non-Quicksave%20Slot\KeySeq\default=true +Shortcuts\Main%20Window\Load%20from%20Newest%20Slot\Context=1 +Shortcuts\Main%20Window\Load%20from%20Newest%20Slot\Context\default=true +Shortcuts\Main%20Window\Load%20from%20Newest%20Slot\KeySeq=Ctrl+V +Shortcuts\Main%20Window\Load%20from%20Newest%20Slot\KeySeq\default=true +Shortcuts\Main%20Window\Multiplayer%20Browse%20Public%20Game%20Lobby\Context=2 +Shortcuts\Main%20Window\Multiplayer%20Browse%20Public%20Game%20Lobby\Context\default=true +Shortcuts\Main%20Window\Multiplayer%20Browse%20Public%20Game%20Lobby\KeySeq=Ctrl+B +Shortcuts\Main%20Window\Multiplayer%20Browse%20Public%20Game%20Lobby\KeySeq\default=true +Shortcuts\Main%20Window\Multiplayer%20Browse%20Public%20Lobby\Context=2 +Shortcuts\Main%20Window\Multiplayer%20Browse%20Public%20Lobby\Context\default=true +Shortcuts\Main%20Window\Multiplayer%20Browse%20Public%20Lobby\KeySeq=Ctrl+B +Shortcuts\Main%20Window\Multiplayer%20Browse%20Public%20Lobby\KeySeq\default=true +Shortcuts\Main%20Window\Multiplayer%20Browse%20Public%20Rooms\Context=2 +Shortcuts\Main%20Window\Multiplayer%20Browse%20Public%20Rooms\Context\default=true +Shortcuts\Main%20Window\Multiplayer%20Browse%20Public%20Rooms\KeySeq=Ctrl+B +Shortcuts\Main%20Window\Multiplayer%20Browse%20Public%20Rooms\KeySeq\default=true +Shortcuts\Main%20Window\Multiplayer%20Create%20Room\Context=2 +Shortcuts\Main%20Window\Multiplayer%20Create%20Room\Context\default=true +Shortcuts\Main%20Window\Multiplayer%20Create%20Room\KeySeq=Ctrl+N +Shortcuts\Main%20Window\Multiplayer%20Create%20Room\KeySeq\default=true +Shortcuts\Main%20Window\Multiplayer%20Direct%20Connect%20to%20Room\Context=2 +Shortcuts\Main%20Window\Multiplayer%20Direct%20Connect%20to%20Room\Context\default=true +Shortcuts\Main%20Window\Multiplayer%20Direct%20Connect%20to%20Room\KeySeq=Ctrl+Shift +Shortcuts\Main%20Window\Multiplayer%20Direct%20Connect%20to%20Room\KeySeq\default=true +Shortcuts\Main%20Window\Multiplayer%20Leave%20Room\Context=2 +Shortcuts\Main%20Window\Multiplayer%20Leave%20Room\Context\default=true +Shortcuts\Main%20Window\Multiplayer%20Leave%20Room\KeySeq=Ctrl+L +Shortcuts\Main%20Window\Multiplayer%20Leave%20Room\KeySeq\default=true +Shortcuts\Main%20Window\Multiplayer%20Show%20Current%20Room\Context=2 +Shortcuts\Main%20Window\Multiplayer%20Show%20Current%20Room\Context\default=true +Shortcuts\Main%20Window\Multiplayer%20Show%20Current%20Room\KeySeq=Ctrl+R +Shortcuts\Main%20Window\Multiplayer%20Show%20Current%20Room\KeySeq\default=true +Shortcuts\Main%20Window\Quick%20Load\Context=1 +Shortcuts\Main%20Window\Quick%20Load\Context\default=true +Shortcuts\Main%20Window\Quick%20Load\KeySeq=Alt+L +Shortcuts\Main%20Window\Quick%20Load\KeySeq\default=false +Shortcuts\Main%20Window\Quick%20Save\Context=1 +Shortcuts\Main%20Window\Quick%20Save\Context\default=true +Shortcuts\Main%20Window\Quick%20Save\KeySeq=Alt+S +Shortcuts\Main%20Window\Quick%20Save\KeySeq\default=false +Shortcuts\Main%20Window\Remove%20Amiibo\Context=2 +Shortcuts\Main%20Window\Remove%20Amiibo\Context\default=true +Shortcuts\Main%20Window\Remove%20Amiibo\KeySeq=F3 +Shortcuts\Main%20Window\Remove%20Amiibo\KeySeq\default=true +Shortcuts\Main%20Window\Restart%20Emulation\Context=1 +Shortcuts\Main%20Window\Restart%20Emulation\Context\default=true +Shortcuts\Main%20Window\Restart%20Emulation\KeySeq=F6 +Shortcuts\Main%20Window\Restart%20Emulation\KeySeq\default=true +Shortcuts\Main%20Window\Rotate%20Screens%20Upright\Context=1 +Shortcuts\Main%20Window\Rotate%20Screens%20Upright\Context\default=true +Shortcuts\Main%20Window\Rotate%20Screens%20Upright\KeySeq=F8 +Shortcuts\Main%20Window\Rotate%20Screens%20Upright\KeySeq\default=true +Shortcuts\Main%20Window\Save%20to%20Oldest%20Non-Quicksave%20Slot\Context=1 +Shortcuts\Main%20Window\Save%20to%20Oldest%20Non-Quicksave%20Slot\Context\default=true +Shortcuts\Main%20Window\Save%20to%20Oldest%20Non-Quicksave%20Slot\KeySeq=Ctrl+C +Shortcuts\Main%20Window\Save%20to%20Oldest%20Non-Quicksave%20Slot\KeySeq\default=true +Shortcuts\Main%20Window\Save%20to%20Oldest%20Slot\Context=1 +Shortcuts\Main%20Window\Save%20to%20Oldest%20Slot\Context\default=true +Shortcuts\Main%20Window\Save%20to%20Oldest%20Slot\KeySeq=Ctrl+C +Shortcuts\Main%20Window\Save%20to%20Oldest%20Slot\KeySeq\default=true +Shortcuts\Main%20Window\Stop%20Emulation\Context=1 +Shortcuts\Main%20Window\Stop%20Emulation\Context\default=true +Shortcuts\Main%20Window\Stop%20Emulation\KeySeq=F5 +Shortcuts\Main%20Window\Stop%20Emulation\KeySeq\default=true +Shortcuts\Main%20Window\Swap%20Screens\Context=1 +Shortcuts\Main%20Window\Swap%20Screens\Context\default=true +Shortcuts\Main%20Window\Swap%20Screens\KeySeq=F9 +Shortcuts\Main%20Window\Swap%20Screens\KeySeq\default=true +Shortcuts\Main%20Window\Toggle%203D\Context=2 +Shortcuts\Main%20Window\Toggle%203D\Context\default=true +Shortcuts\Main%20Window\Toggle%203D\KeySeq=Ctrl+3 +Shortcuts\Main%20Window\Toggle%203D\KeySeq\default=true +Shortcuts\Main%20Window\Toggle%20Custom%20Textures\Context=2 +Shortcuts\Main%20Window\Toggle%20Custom%20Textures\Context\default=true +Shortcuts\Main%20Window\Toggle%20Custom%20Textures\KeySeq=F7 +Shortcuts\Main%20Window\Toggle%20Custom%20Textures\KeySeq\default=true +Shortcuts\Main%20Window\Toggle%20Filter%20Bar\Context=1 +Shortcuts\Main%20Window\Toggle%20Filter%20Bar\Context\default=true +Shortcuts\Main%20Window\Toggle%20Filter%20Bar\KeySeq=Ctrl+F +Shortcuts\Main%20Window\Toggle%20Filter%20Bar\KeySeq\default=true +Shortcuts\Main%20Window\Toggle%20Frame%20Advancing\Context=2 +Shortcuts\Main%20Window\Toggle%20Frame%20Advancing\Context\default=true +Shortcuts\Main%20Window\Toggle%20Frame%20Advancing\KeySeq=Ctrl+A +Shortcuts\Main%20Window\Toggle%20Frame%20Advancing\KeySeq\default=true +Shortcuts\Main%20Window\Toggle%20Per-Application%20Speed\Context=2 +Shortcuts\Main%20Window\Toggle%20Per-Application%20Speed\Context\default=true +Shortcuts\Main%20Window\Toggle%20Per-Application%20Speed\KeySeq=Ctrl+Z +Shortcuts\Main%20Window\Toggle%20Per-Application%20Speed\KeySeq\default=true +Shortcuts\Main%20Window\Toggle%20Per-Game%20Speed\Context=2 +Shortcuts\Main%20Window\Toggle%20Per-Game%20Speed\Context\default=true +Shortcuts\Main%20Window\Toggle%20Per-Game%20Speed\KeySeq=Ctrl+Z +Shortcuts\Main%20Window\Toggle%20Per-Game%20Speed\KeySeq\default=true +Shortcuts\Main%20Window\Toggle%20Screen%20Layout\Context=1 +Shortcuts\Main%20Window\Toggle%20Screen%20Layout\Context\default=true +Shortcuts\Main%20Window\Toggle%20Screen%20Layout\KeySeq=F10 +Shortcuts\Main%20Window\Toggle%20Screen%20Layout\KeySeq\default=true +Shortcuts\Main%20Window\Toggle%20Status%20Bar\Context=1 +Shortcuts\Main%20Window\Toggle%20Status%20Bar\Context\default=true +Shortcuts\Main%20Window\Toggle%20Status%20Bar\KeySeq=Ctrl+S +Shortcuts\Main%20Window\Toggle%20Status%20Bar\KeySeq\default=true +Shortcuts\Main%20Window\Toggle%20Texture%20Dumping\Context=2 +Shortcuts\Main%20Window\Toggle%20Texture%20Dumping\Context\default=true +Shortcuts\Main%20Window\Toggle%20Texture%20Dumping\KeySeq= +Shortcuts\Main%20Window\Toggle%20Texture%20Dumping\KeySeq\default=true +Shortcuts\Main%20Window\Toggle%20Turbo%20Mode\Context=2 +Shortcuts\Main%20Window\Toggle%20Turbo%20Mode\Context\default=true +Shortcuts\Main%20Window\Toggle%20Turbo%20Mode\KeySeq= +Shortcuts\Main%20Window\Toggle%20Turbo%20Mode\KeySeq\default=true +UILayout\gameListHeaderState="@ByteArray(\0\0\0\xff\0\0\0\0\0\0\0\x1\0\0\0\x1\0\0\0\x6\x1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x3\xe2\0\0\0\x6\x1\x1\0\x1\0\0\0\0\0\0\0\0\0\0\0\0\x64\xff\xff\xff\xff\0\0\0\x81\0\0\0\0\0\0\0\x6\0\0\x2\x80\0\0\0\x1\0\0\0\0\0\0\0\x62\0\0\0\x1\0\0\0\0\0\0\0=\0\0\0\x1\0\0\0\0\0\0\0G\0\0\0\x1\0\0\0\0\0\0\0\x30\0\0\0\x1\0\0\0\0\0\0\0L\0\0\0\x1\0\0\0\0\0\0\x3\xe8\0\0\0\0L\0\0\0\0)" +UILayout\geometry="@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\x1=\0\0\0\xd5\0\0\x6\x42\0\0\x3\x11\0\0\x1@\0\0\0\xf3\0\0\x6?\0\0\x3\xe\0\0\0\0\0\0\0\0\a\x80\0\0\x1@\0\0\0\xf3\0\0\x6?\0\0\x3\xe)" +UILayout\geometryRenderWindow=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\x1\0\0\0\x19\0\0\0\x64\0\0\0\x36\0\0\0\0\0\0\0\0\xff\xff\xff\xff\xff\xff\xff\xff\0\0\0\0\0\0\0\0\x5\0\0\0\0\x1\0\0\0\x19\0\0\0\x64\0\0\0\x36) +UILayout\microProfileDialogGeometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\x1\0\0\0\x19\0\0\x3\xe8\0\0\x2p\0\0\0\x1\0\0\0\x19\0\0\x3\xe8\0\0\x2p\0\0\0\0\0\0\0\0\a\x80\0\0\0\x1\0\0\0\x19\0\0\x3\xe8\0\0\x2p) +UILayout\microProfileDialogVisible=false +UILayout\microProfileDialogVisible\default=true +UILayout\state=@ByteArray(\0\0\0\xff\0\0\0\0\xfd\0\0\0\x2\0\0\0\0\0\0\0\0\0\0\0\0\xfc\x2\0\0\0\x1\xfb\0\0\0\x1c\0W\0\x61\0i\0t\0T\0r\0\x65\0\x65\0W\0i\0\x64\0g\0\x65\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0V\0\xff\xff\xff\0\0\0\x1\0\0\0\0\0\0\0\0\xfc\x2\0\0\0\b\xfb\0\0\0\x18\0\x41\0R\0M\0R\0\x65\0g\0i\0s\0t\0\x65\0r\0s\0\0\0\0\0\xff\xff\xff\xff\0\0\0h\0\xff\xff\xff\xfb\0\0\0 \0G\0r\0\x61\0p\0h\0i\0\x63\0s\0\x44\0\x65\0\x62\0u\0g\0g\0\x65\0r\0\0\0\0\0\xff\xff\xff\xff\0\0\0V\0\xff\xff\xff\xfb\0\0\0\"\0P\0i\0\x63\0\x61\0 \0\x43\0o\0m\0m\0\x61\0n\0\x64\0 \0L\0i\0s\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x84\0\xff\xff\xff\xfb\0\0\0*\0P\0i\0\x63\0\x61\0\x42\0r\0\x65\0\x61\0k\0P\0o\0i\0n\0t\0s\0W\0i\0\x64\0g\0\x65\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x84\0\xff\xff\xff\xfb\0\0\0 \0P\0i\0\x63\0\x61\0V\0\x65\0r\0t\0\x65\0x\0S\0h\0\x61\0\x64\0\x65\0r\0\0\0\0\0\xff\xff\xff\xff\0\0\x1\xa6\0\xff\xff\xff\xfb\0\0\0\x12\0\x43\0i\0T\0r\0\x61\0\x63\0i\0n\0g\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x38\0\xff\xff\xff\xfb\0\0\0.\0L\0L\0\x45\0S\0\x65\0r\0v\0i\0\x63\0\x65\0M\0o\0\x64\0u\0l\0\x65\0s\0W\0i\0\x64\0g\0\x65\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0V\0\xff\xff\xff\xfb\0\0\0\x16\0I\0P\0\x43\0R\0\x65\0\x63\0o\0r\0\x64\0\x65\0r\0\0\0\0\0\xff\xff\xff\xff\0\0\0\xba\0\xff\xff\xff\0\0\x2\x39\0\0\0\xc2\0\0\0\x4\0\0\0\x4\0\0\0\b\0\0\0\b\xfc\0\0\0\0) +Updater\check_for_update_on_start=true +Updater\check_for_update_on_start\default=true +Updater\update_on_close=false +Updater\update_on_close\default=true +calloutFlags=0 +calloutFlags\default=true +confirmClose=true +confirmClose\default=true +displayTitleBars=true +displayTitleBars\default=true +enable_discord_presence=true +enable_discord_presence\default=true +firstStart=false +firstStart\default=false +fullscreen=true +fullscreen\default=false +hideInactiveMouse=false +hideInactiveMouse\default=true +muteWhenInBackground=false +muteWhenInBackground\default=true +pauseWhenInBackground=false +pauseWhenInBackground\default=true +saveStateWarning=false +saveStateWarning\default=false +screenshot_resolution_factor=0 +screenshot_resolution_factor\default=true +showConsole=false +showConsole\default=true +showFilterBar=true +showFilterBar\default=true +showStatusBar=true +showStatusBar\default=true +show_advanced_frametime_info=false +show_advanced_frametime_info\default=true +singleWindowMode=true +singleWindowMode\default=true +theme=default +theme\default=true + +[Utility] +async_custom_loading=true +async_custom_loading\default=true +custom_textures=false +custom_textures\default=true +dump_textures=false +dump_textures\default=true +preload_textures=false +preload_textures\default=true + +[VideoDumping] +audio_bitrate=64000 +audio_bitrate\default=true +audio_encoder=libvorbis +audio_encoder\default=true +audio_encoder_options= +audio_encoder_options\default=true +format_options= +output_format=webm +output_format\default=true +video_bitrate=2500000 +video_bitrate\default=true +video_encoder=libvpx-vp9 +video_encoder\default=true +video_encoder_options="quality:realtime,speed:6,tile-columns:4,frame-parallel:1,threads:8,row-mt:1" +video_encoder_options\default=true + +[WebService] +citra_token= +citra_username= +lime3ds_token= +lime3ds_username= +web_api_url=https://api.citra-emu.org +web_api_url\default=true diff --git a/projects/ROCKNIX/packages/emulators/standalone/azahar-sa/config/SDM845/qt-config.ini b/projects/ROCKNIX/packages/emulators/standalone/azahar-sa/config/SDM845/qt-config.ini index 10a7d71758..d41790ea9d 100644 --- a/projects/ROCKNIX/packages/emulators/standalone/azahar-sa/config/SDM845/qt-config.ini +++ b/projects/ROCKNIX/packages/emulators/standalone/azahar-sa/config/SDM845/qt-config.ini @@ -5,11 +5,11 @@ enable_audio_stretching=true enable_audio_stretching\default=true enable_realtime_audio=false enable_realtime_audio\default=true -input_device=auto +input_device=Auto input_device\default=true input_type=0 input_type\default=true -output_device=auto +output_device=Auto output_device\default=true output_type=0 output_type\default=true @@ -81,8 +81,8 @@ profiles\1\circle_pad="axis_x:0,axis_y:1,deadzone:0.100000,engine:sdl,guid:0300f profiles\1\circle_pad\default=false profiles\1\motion_device="engine:motion_emu,update_period:100,sensitivity:0.01,tilt_clamp:90.0" profiles\1\motion_device\default=true -profiles\1\name=default -profiles\1\name\default=true +profiles\1\name=Default +profiles\1\name\default=false profiles\1\touch_device=engine:emu_window profiles\1\touch_device\default=true profiles\1\touch_from_button_map=0 @@ -623,13 +623,13 @@ Shortcuts\Main%20Window\Toggle%20Turbo%20Mode\Context=2 Shortcuts\Main%20Window\Toggle%20Turbo%20Mode\Context\default=true Shortcuts\Main%20Window\Toggle%20Turbo%20Mode\KeySeq= Shortcuts\Main%20Window\Toggle%20Turbo%20Mode\KeySeq\default=true -UILayout\gameListHeaderState=@ByteArray(\0\0\0\xff\0\0\0\0\0\0\0\x1\0\0\0\x1\0\0\0\x6\x1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x5\0\0\0\0\x6\x1\x1\0\x1\0\0\0\0\0\0\0\0\0\0\0\0\x64\xff\xff\xff\xff\0\0\0\x81\0\0\0\0\0\0\0\x6\0\0\x2\x80\0\0\0\x1\0\0\0\0\0\0\0\x64\0\0\0\x1\0\0\0\0\0\0\0\x64\0\0\0\x1\0\0\0\0\0\0\0\x64\0\0\0\x1\0\0\0\0\0\0\0\x64\0\0\0\x1\0\0\0\0\0\0\0\xf0\0\0\0\x1\0\0\0\0\0\0\x3\xe8\0\0\0\0\x64\0\0\0\0) +UILayout\gameListHeaderState="@ByteArray(\0\0\0\xff\0\0\0\0\0\0\0\x1\0\0\0\x1\0\0\0\x6\x1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x3\xe2\0\0\0\x6\x1\x1\0\x1\0\0\0\0\0\0\0\0\0\0\0\0\x64\xff\xff\xff\xff\0\0\0\x81\0\0\0\0\0\0\0\x6\0\0\x2\x80\0\0\0\x1\0\0\0\0\0\0\0\x62\0\0\0\x1\0\0\0\0\0\0\0=\0\0\0\x1\0\0\0\0\0\0\0G\0\0\0\x1\0\0\0\0\0\0\0\x30\0\0\0\x1\0\0\0\0\0\0\0L\0\0\0\x1\0\0\0\0\0\0\x3\xe8\0\0\0\0L\0\0\0\0)" UILayout\geometry="@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\x1=\0\0\0\xd5\0\0\x6\x42\0\0\x3\x11\0\0\x1@\0\0\0\xf3\0\0\x6?\0\0\x3\xe\0\0\0\0\0\0\0\0\a\x80\0\0\x1@\0\0\0\xf3\0\0\x6?\0\0\x3\xe)" UILayout\geometryRenderWindow=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\x1\0\0\0\x19\0\0\0\x64\0\0\0\x36\0\0\0\0\0\0\0\0\xff\xff\xff\xff\xff\xff\xff\xff\0\0\0\0\0\0\0\0\x5\0\0\0\0\x1\0\0\0\x19\0\0\0\x64\0\0\0\x36) UILayout\microProfileDialogGeometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\x1\0\0\0\x19\0\0\x3\xe8\0\0\x2p\0\0\0\x1\0\0\0\x19\0\0\x3\xe8\0\0\x2p\0\0\0\0\0\0\0\0\a\x80\0\0\0\x1\0\0\0\x19\0\0\x3\xe8\0\0\x2p) UILayout\microProfileDialogVisible=false UILayout\microProfileDialogVisible\default=true -UILayout\state=@ByteArray(\0\0\0\xff\0\0\0\0\xfd\0\0\0\x2\0\0\0\0\0\0\0\0\0\0\0\0\xfc\x2\0\0\0\x1\xfb\0\0\0\x1c\0W\0\x61\0i\0t\0T\0r\0\x65\0\x65\0W\0i\0\x64\0g\0\x65\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0V\0\xff\xff\xff\0\0\0\x1\0\0\0\0\0\0\0\0\xfc\x2\0\0\0\b\xfb\0\0\0\x18\0\x41\0R\0M\0R\0\x65\0g\0i\0s\0t\0\x65\0r\0s\0\0\0\0\0\xff\xff\xff\xff\0\0\0h\0\xff\xff\xff\xfb\0\0\0 \0G\0r\0\x61\0p\0h\0i\0\x63\0s\0\x44\0\x65\0\x62\0u\0g\0g\0\x65\0r\0\0\0\0\0\xff\xff\xff\xff\0\0\0V\0\xff\xff\xff\xfb\0\0\0\"\0P\0i\0\x63\0\x61\0 \0\x43\0o\0m\0m\0\x61\0n\0\x64\0 \0L\0i\0s\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x84\0\xff\xff\xff\xfb\0\0\0*\0P\0i\0\x63\0\x61\0\x42\0r\0\x65\0\x61\0k\0P\0o\0i\0n\0t\0s\0W\0i\0\x64\0g\0\x65\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x84\0\xff\xff\xff\xfb\0\0\0 \0P\0i\0\x63\0\x61\0V\0\x65\0r\0t\0\x65\0x\0S\0h\0\x61\0\x64\0\x65\0r\0\0\0\0\0\xff\xff\xff\xff\0\0\x1\xa6\0\xff\xff\xff\xfb\0\0\0\x12\0\x43\0i\0T\0r\0\x61\0\x63\0i\0n\0g\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x38\0\xff\xff\xff\xfb\0\0\0.\0L\0L\0\x45\0S\0\x65\0r\0v\0i\0\x63\0\x65\0M\0o\0\x64\0u\0l\0\x65\0s\0W\0i\0\x64\0g\0\x65\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0V\0\xff\xff\xff\xfb\0\0\0\x16\0I\0P\0\x43\0R\0\x65\0\x63\0o\0r\0\x64\0\x65\0r\0\0\0\0\0\xff\xff\xff\xff\0\0\0\xba\0\xff\xff\xff\0\0\x5\0\0\0\x1\xee\0\0\0\x4\0\0\0\x4\0\0\0\b\0\0\0\b\xfc\0\0\0\0) +UILayout\state=@ByteArray(\0\0\0\xff\0\0\0\0\xfd\0\0\0\x2\0\0\0\0\0\0\0\0\0\0\0\0\xfc\x2\0\0\0\x1\xfb\0\0\0\x1c\0W\0\x61\0i\0t\0T\0r\0\x65\0\x65\0W\0i\0\x64\0g\0\x65\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0V\0\xff\xff\xff\0\0\0\x1\0\0\0\0\0\0\0\0\xfc\x2\0\0\0\b\xfb\0\0\0\x18\0\x41\0R\0M\0R\0\x65\0g\0i\0s\0t\0\x65\0r\0s\0\0\0\0\0\xff\xff\xff\xff\0\0\0h\0\xff\xff\xff\xfb\0\0\0 \0G\0r\0\x61\0p\0h\0i\0\x63\0s\0\x44\0\x65\0\x62\0u\0g\0g\0\x65\0r\0\0\0\0\0\xff\xff\xff\xff\0\0\0V\0\xff\xff\xff\xfb\0\0\0\"\0P\0i\0\x63\0\x61\0 \0\x43\0o\0m\0m\0\x61\0n\0\x64\0 \0L\0i\0s\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x84\0\xff\xff\xff\xfb\0\0\0*\0P\0i\0\x63\0\x61\0\x42\0r\0\x65\0\x61\0k\0P\0o\0i\0n\0t\0s\0W\0i\0\x64\0g\0\x65\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x84\0\xff\xff\xff\xfb\0\0\0 \0P\0i\0\x63\0\x61\0V\0\x65\0r\0t\0\x65\0x\0S\0h\0\x61\0\x64\0\x65\0r\0\0\0\0\0\xff\xff\xff\xff\0\0\x1\xa6\0\xff\xff\xff\xfb\0\0\0\x12\0\x43\0i\0T\0r\0\x61\0\x63\0i\0n\0g\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x38\0\xff\xff\xff\xfb\0\0\0.\0L\0L\0\x45\0S\0\x65\0r\0v\0i\0\x63\0\x65\0M\0o\0\x64\0u\0l\0\x65\0s\0W\0i\0\x64\0g\0\x65\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0V\0\xff\xff\xff\xfb\0\0\0\x16\0I\0P\0\x43\0R\0\x65\0\x63\0o\0r\0\x64\0\x65\0r\0\0\0\0\0\xff\xff\xff\xff\0\0\0\xba\0\xff\xff\xff\0\0\x2\x39\0\0\0\xc2\0\0\0\x4\0\0\0\x4\0\0\0\b\0\0\0\b\xfc\0\0\0\0) Updater\check_for_update_on_start=true Updater\check_for_update_on_start\default=true Updater\update_on_close=false diff --git a/projects/ROCKNIX/packages/emulators/standalone/azahar-sa/config/SM8250/qt-config.ini b/projects/ROCKNIX/packages/emulators/standalone/azahar-sa/config/SM8250/qt-config.ini index 10a7d71758..d41790ea9d 100644 --- a/projects/ROCKNIX/packages/emulators/standalone/azahar-sa/config/SM8250/qt-config.ini +++ b/projects/ROCKNIX/packages/emulators/standalone/azahar-sa/config/SM8250/qt-config.ini @@ -5,11 +5,11 @@ enable_audio_stretching=true enable_audio_stretching\default=true enable_realtime_audio=false enable_realtime_audio\default=true -input_device=auto +input_device=Auto input_device\default=true input_type=0 input_type\default=true -output_device=auto +output_device=Auto output_device\default=true output_type=0 output_type\default=true @@ -81,8 +81,8 @@ profiles\1\circle_pad="axis_x:0,axis_y:1,deadzone:0.100000,engine:sdl,guid:0300f profiles\1\circle_pad\default=false profiles\1\motion_device="engine:motion_emu,update_period:100,sensitivity:0.01,tilt_clamp:90.0" profiles\1\motion_device\default=true -profiles\1\name=default -profiles\1\name\default=true +profiles\1\name=Default +profiles\1\name\default=false profiles\1\touch_device=engine:emu_window profiles\1\touch_device\default=true profiles\1\touch_from_button_map=0 @@ -623,13 +623,13 @@ Shortcuts\Main%20Window\Toggle%20Turbo%20Mode\Context=2 Shortcuts\Main%20Window\Toggle%20Turbo%20Mode\Context\default=true Shortcuts\Main%20Window\Toggle%20Turbo%20Mode\KeySeq= Shortcuts\Main%20Window\Toggle%20Turbo%20Mode\KeySeq\default=true -UILayout\gameListHeaderState=@ByteArray(\0\0\0\xff\0\0\0\0\0\0\0\x1\0\0\0\x1\0\0\0\x6\x1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x5\0\0\0\0\x6\x1\x1\0\x1\0\0\0\0\0\0\0\0\0\0\0\0\x64\xff\xff\xff\xff\0\0\0\x81\0\0\0\0\0\0\0\x6\0\0\x2\x80\0\0\0\x1\0\0\0\0\0\0\0\x64\0\0\0\x1\0\0\0\0\0\0\0\x64\0\0\0\x1\0\0\0\0\0\0\0\x64\0\0\0\x1\0\0\0\0\0\0\0\x64\0\0\0\x1\0\0\0\0\0\0\0\xf0\0\0\0\x1\0\0\0\0\0\0\x3\xe8\0\0\0\0\x64\0\0\0\0) +UILayout\gameListHeaderState="@ByteArray(\0\0\0\xff\0\0\0\0\0\0\0\x1\0\0\0\x1\0\0\0\x6\x1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x3\xe2\0\0\0\x6\x1\x1\0\x1\0\0\0\0\0\0\0\0\0\0\0\0\x64\xff\xff\xff\xff\0\0\0\x81\0\0\0\0\0\0\0\x6\0\0\x2\x80\0\0\0\x1\0\0\0\0\0\0\0\x62\0\0\0\x1\0\0\0\0\0\0\0=\0\0\0\x1\0\0\0\0\0\0\0G\0\0\0\x1\0\0\0\0\0\0\0\x30\0\0\0\x1\0\0\0\0\0\0\0L\0\0\0\x1\0\0\0\0\0\0\x3\xe8\0\0\0\0L\0\0\0\0)" UILayout\geometry="@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\x1=\0\0\0\xd5\0\0\x6\x42\0\0\x3\x11\0\0\x1@\0\0\0\xf3\0\0\x6?\0\0\x3\xe\0\0\0\0\0\0\0\0\a\x80\0\0\x1@\0\0\0\xf3\0\0\x6?\0\0\x3\xe)" UILayout\geometryRenderWindow=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\x1\0\0\0\x19\0\0\0\x64\0\0\0\x36\0\0\0\0\0\0\0\0\xff\xff\xff\xff\xff\xff\xff\xff\0\0\0\0\0\0\0\0\x5\0\0\0\0\x1\0\0\0\x19\0\0\0\x64\0\0\0\x36) UILayout\microProfileDialogGeometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\x1\0\0\0\x19\0\0\x3\xe8\0\0\x2p\0\0\0\x1\0\0\0\x19\0\0\x3\xe8\0\0\x2p\0\0\0\0\0\0\0\0\a\x80\0\0\0\x1\0\0\0\x19\0\0\x3\xe8\0\0\x2p) UILayout\microProfileDialogVisible=false UILayout\microProfileDialogVisible\default=true -UILayout\state=@ByteArray(\0\0\0\xff\0\0\0\0\xfd\0\0\0\x2\0\0\0\0\0\0\0\0\0\0\0\0\xfc\x2\0\0\0\x1\xfb\0\0\0\x1c\0W\0\x61\0i\0t\0T\0r\0\x65\0\x65\0W\0i\0\x64\0g\0\x65\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0V\0\xff\xff\xff\0\0\0\x1\0\0\0\0\0\0\0\0\xfc\x2\0\0\0\b\xfb\0\0\0\x18\0\x41\0R\0M\0R\0\x65\0g\0i\0s\0t\0\x65\0r\0s\0\0\0\0\0\xff\xff\xff\xff\0\0\0h\0\xff\xff\xff\xfb\0\0\0 \0G\0r\0\x61\0p\0h\0i\0\x63\0s\0\x44\0\x65\0\x62\0u\0g\0g\0\x65\0r\0\0\0\0\0\xff\xff\xff\xff\0\0\0V\0\xff\xff\xff\xfb\0\0\0\"\0P\0i\0\x63\0\x61\0 \0\x43\0o\0m\0m\0\x61\0n\0\x64\0 \0L\0i\0s\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x84\0\xff\xff\xff\xfb\0\0\0*\0P\0i\0\x63\0\x61\0\x42\0r\0\x65\0\x61\0k\0P\0o\0i\0n\0t\0s\0W\0i\0\x64\0g\0\x65\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x84\0\xff\xff\xff\xfb\0\0\0 \0P\0i\0\x63\0\x61\0V\0\x65\0r\0t\0\x65\0x\0S\0h\0\x61\0\x64\0\x65\0r\0\0\0\0\0\xff\xff\xff\xff\0\0\x1\xa6\0\xff\xff\xff\xfb\0\0\0\x12\0\x43\0i\0T\0r\0\x61\0\x63\0i\0n\0g\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x38\0\xff\xff\xff\xfb\0\0\0.\0L\0L\0\x45\0S\0\x65\0r\0v\0i\0\x63\0\x65\0M\0o\0\x64\0u\0l\0\x65\0s\0W\0i\0\x64\0g\0\x65\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0V\0\xff\xff\xff\xfb\0\0\0\x16\0I\0P\0\x43\0R\0\x65\0\x63\0o\0r\0\x64\0\x65\0r\0\0\0\0\0\xff\xff\xff\xff\0\0\0\xba\0\xff\xff\xff\0\0\x5\0\0\0\x1\xee\0\0\0\x4\0\0\0\x4\0\0\0\b\0\0\0\b\xfc\0\0\0\0) +UILayout\state=@ByteArray(\0\0\0\xff\0\0\0\0\xfd\0\0\0\x2\0\0\0\0\0\0\0\0\0\0\0\0\xfc\x2\0\0\0\x1\xfb\0\0\0\x1c\0W\0\x61\0i\0t\0T\0r\0\x65\0\x65\0W\0i\0\x64\0g\0\x65\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0V\0\xff\xff\xff\0\0\0\x1\0\0\0\0\0\0\0\0\xfc\x2\0\0\0\b\xfb\0\0\0\x18\0\x41\0R\0M\0R\0\x65\0g\0i\0s\0t\0\x65\0r\0s\0\0\0\0\0\xff\xff\xff\xff\0\0\0h\0\xff\xff\xff\xfb\0\0\0 \0G\0r\0\x61\0p\0h\0i\0\x63\0s\0\x44\0\x65\0\x62\0u\0g\0g\0\x65\0r\0\0\0\0\0\xff\xff\xff\xff\0\0\0V\0\xff\xff\xff\xfb\0\0\0\"\0P\0i\0\x63\0\x61\0 \0\x43\0o\0m\0m\0\x61\0n\0\x64\0 \0L\0i\0s\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x84\0\xff\xff\xff\xfb\0\0\0*\0P\0i\0\x63\0\x61\0\x42\0r\0\x65\0\x61\0k\0P\0o\0i\0n\0t\0s\0W\0i\0\x64\0g\0\x65\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x84\0\xff\xff\xff\xfb\0\0\0 \0P\0i\0\x63\0\x61\0V\0\x65\0r\0t\0\x65\0x\0S\0h\0\x61\0\x64\0\x65\0r\0\0\0\0\0\xff\xff\xff\xff\0\0\x1\xa6\0\xff\xff\xff\xfb\0\0\0\x12\0\x43\0i\0T\0r\0\x61\0\x63\0i\0n\0g\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x38\0\xff\xff\xff\xfb\0\0\0.\0L\0L\0\x45\0S\0\x65\0r\0v\0i\0\x63\0\x65\0M\0o\0\x64\0u\0l\0\x65\0s\0W\0i\0\x64\0g\0\x65\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0V\0\xff\xff\xff\xfb\0\0\0\x16\0I\0P\0\x43\0R\0\x65\0\x63\0o\0r\0\x64\0\x65\0r\0\0\0\0\0\xff\xff\xff\xff\0\0\0\xba\0\xff\xff\xff\0\0\x2\x39\0\0\0\xc2\0\0\0\x4\0\0\0\x4\0\0\0\b\0\0\0\b\xfc\0\0\0\0) Updater\check_for_update_on_start=true Updater\check_for_update_on_start\default=true Updater\update_on_close=false diff --git a/projects/ROCKNIX/packages/emulators/standalone/azahar-sa/config/SM8550/qt-config.ini b/projects/ROCKNIX/packages/emulators/standalone/azahar-sa/config/SM8550/qt-config.ini index 8637111127..003f709dc5 100644 --- a/projects/ROCKNIX/packages/emulators/standalone/azahar-sa/config/SM8550/qt-config.ini +++ b/projects/ROCKNIX/packages/emulators/standalone/azahar-sa/config/SM8550/qt-config.ini @@ -5,11 +5,11 @@ enable_audio_stretching=true enable_audio_stretching\default=true enable_realtime_audio=false enable_realtime_audio\default=true -input_device=auto +input_device=Auto input_device\default=true input_type=0 input_type\default=true -output_device=auto +output_device=Auto output_device\default=true output_type=0 output_type\default=true @@ -81,8 +81,8 @@ profiles\1\circle_pad="axis_x:0,axis_y:1,deadzone:0.100000,engine:sdl,guid:0300b profiles\1\circle_pad\default=false profiles\1\motion_device="engine:motion_emu,update_period:100,sensitivity:0.01,tilt_clamp:90.0" profiles\1\motion_device\default=true -profiles\1\name=default -profiles\1\name\default=true +profiles\1\name=Default +profiles\1\name\default=false profiles\1\touch_device=engine:emu_window profiles\1\touch_device\default=true profiles\1\touch_from_button_map=0 @@ -623,13 +623,13 @@ Shortcuts\Main%20Window\Toggle%20Turbo%20Mode\Context=2 Shortcuts\Main%20Window\Toggle%20Turbo%20Mode\Context\default=true Shortcuts\Main%20Window\Toggle%20Turbo%20Mode\KeySeq= Shortcuts\Main%20Window\Toggle%20Turbo%20Mode\KeySeq\default=true -UILayout\gameListHeaderState=@ByteArray(\0\0\0\xff\0\0\0\0\0\0\0\x1\0\0\0\x1\0\0\0\x6\x1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x5\0\0\0\0\x6\x1\x1\0\x1\0\0\0\0\0\0\0\0\0\0\0\0\x64\xff\xff\xff\xff\0\0\0\x81\0\0\0\0\0\0\0\x6\0\0\x2\x80\0\0\0\x1\0\0\0\0\0\0\0\x64\0\0\0\x1\0\0\0\0\0\0\0\x64\0\0\0\x1\0\0\0\0\0\0\0\x64\0\0\0\x1\0\0\0\0\0\0\0\x64\0\0\0\x1\0\0\0\0\0\0\0\xf0\0\0\0\x1\0\0\0\0\0\0\x3\xe8\0\0\0\0\x64\0\0\0\0) +UILayout\gameListHeaderState="@ByteArray(\0\0\0\xff\0\0\0\0\0\0\0\x1\0\0\0\x1\0\0\0\x6\x1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x3\xe2\0\0\0\x6\x1\x1\0\x1\0\0\0\0\0\0\0\0\0\0\0\0\x64\xff\xff\xff\xff\0\0\0\x81\0\0\0\0\0\0\0\x6\0\0\x2\x80\0\0\0\x1\0\0\0\0\0\0\0\x62\0\0\0\x1\0\0\0\0\0\0\0=\0\0\0\x1\0\0\0\0\0\0\0G\0\0\0\x1\0\0\0\0\0\0\0\x30\0\0\0\x1\0\0\0\0\0\0\0L\0\0\0\x1\0\0\0\0\0\0\x3\xe8\0\0\0\0L\0\0\0\0)" UILayout\geometry="@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\x1=\0\0\0\xd5\0\0\x6\x42\0\0\x3\x11\0\0\x1@\0\0\0\xf3\0\0\x6?\0\0\x3\xe\0\0\0\0\0\0\0\0\a\x80\0\0\x1@\0\0\0\xf3\0\0\x6?\0\0\x3\xe)" UILayout\geometryRenderWindow=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\x1\0\0\0\x19\0\0\0\x64\0\0\0\x36\0\0\0\0\0\0\0\0\xff\xff\xff\xff\xff\xff\xff\xff\0\0\0\0\0\0\0\0\x5\0\0\0\0\x1\0\0\0\x19\0\0\0\x64\0\0\0\x36) UILayout\microProfileDialogGeometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\x1\0\0\0\x19\0\0\x3\xe8\0\0\x2p\0\0\0\x1\0\0\0\x19\0\0\x3\xe8\0\0\x2p\0\0\0\0\0\0\0\0\a\x80\0\0\0\x1\0\0\0\x19\0\0\x3\xe8\0\0\x2p) UILayout\microProfileDialogVisible=false UILayout\microProfileDialogVisible\default=true -UILayout\state=@ByteArray(\0\0\0\xff\0\0\0\0\xfd\0\0\0\x2\0\0\0\0\0\0\0\0\0\0\0\0\xfc\x2\0\0\0\x1\xfb\0\0\0\x1c\0W\0\x61\0i\0t\0T\0r\0\x65\0\x65\0W\0i\0\x64\0g\0\x65\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0V\0\xff\xff\xff\0\0\0\x1\0\0\0\0\0\0\0\0\xfc\x2\0\0\0\b\xfb\0\0\0\x18\0\x41\0R\0M\0R\0\x65\0g\0i\0s\0t\0\x65\0r\0s\0\0\0\0\0\xff\xff\xff\xff\0\0\0h\0\xff\xff\xff\xfb\0\0\0 \0G\0r\0\x61\0p\0h\0i\0\x63\0s\0\x44\0\x65\0\x62\0u\0g\0g\0\x65\0r\0\0\0\0\0\xff\xff\xff\xff\0\0\0V\0\xff\xff\xff\xfb\0\0\0\"\0P\0i\0\x63\0\x61\0 \0\x43\0o\0m\0m\0\x61\0n\0\x64\0 \0L\0i\0s\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x84\0\xff\xff\xff\xfb\0\0\0*\0P\0i\0\x63\0\x61\0\x42\0r\0\x65\0\x61\0k\0P\0o\0i\0n\0t\0s\0W\0i\0\x64\0g\0\x65\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x84\0\xff\xff\xff\xfb\0\0\0 \0P\0i\0\x63\0\x61\0V\0\x65\0r\0t\0\x65\0x\0S\0h\0\x61\0\x64\0\x65\0r\0\0\0\0\0\xff\xff\xff\xff\0\0\x1\xa6\0\xff\xff\xff\xfb\0\0\0\x12\0\x43\0i\0T\0r\0\x61\0\x63\0i\0n\0g\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x38\0\xff\xff\xff\xfb\0\0\0.\0L\0L\0\x45\0S\0\x65\0r\0v\0i\0\x63\0\x65\0M\0o\0\x64\0u\0l\0\x65\0s\0W\0i\0\x64\0g\0\x65\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0V\0\xff\xff\xff\xfb\0\0\0\x16\0I\0P\0\x43\0R\0\x65\0\x63\0o\0r\0\x64\0\x65\0r\0\0\0\0\0\xff\xff\xff\xff\0\0\0\xba\0\xff\xff\xff\0\0\x5\0\0\0\x1\xee\0\0\0\x4\0\0\0\x4\0\0\0\b\0\0\0\b\xfc\0\0\0\0) +UILayout\state=@ByteArray(\0\0\0\xff\0\0\0\0\xfd\0\0\0\x2\0\0\0\0\0\0\0\0\0\0\0\0\xfc\x2\0\0\0\x1\xfb\0\0\0\x1c\0W\0\x61\0i\0t\0T\0r\0\x65\0\x65\0W\0i\0\x64\0g\0\x65\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0V\0\xff\xff\xff\0\0\0\x1\0\0\0\0\0\0\0\0\xfc\x2\0\0\0\b\xfb\0\0\0\x18\0\x41\0R\0M\0R\0\x65\0g\0i\0s\0t\0\x65\0r\0s\0\0\0\0\0\xff\xff\xff\xff\0\0\0h\0\xff\xff\xff\xfb\0\0\0 \0G\0r\0\x61\0p\0h\0i\0\x63\0s\0\x44\0\x65\0\x62\0u\0g\0g\0\x65\0r\0\0\0\0\0\xff\xff\xff\xff\0\0\0V\0\xff\xff\xff\xfb\0\0\0\"\0P\0i\0\x63\0\x61\0 \0\x43\0o\0m\0m\0\x61\0n\0\x64\0 \0L\0i\0s\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x84\0\xff\xff\xff\xfb\0\0\0*\0P\0i\0\x63\0\x61\0\x42\0r\0\x65\0\x61\0k\0P\0o\0i\0n\0t\0s\0W\0i\0\x64\0g\0\x65\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x84\0\xff\xff\xff\xfb\0\0\0 \0P\0i\0\x63\0\x61\0V\0\x65\0r\0t\0\x65\0x\0S\0h\0\x61\0\x64\0\x65\0r\0\0\0\0\0\xff\xff\xff\xff\0\0\x1\xa6\0\xff\xff\xff\xfb\0\0\0\x12\0\x43\0i\0T\0r\0\x61\0\x63\0i\0n\0g\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x38\0\xff\xff\xff\xfb\0\0\0.\0L\0L\0\x45\0S\0\x65\0r\0v\0i\0\x63\0\x65\0M\0o\0\x64\0u\0l\0\x65\0s\0W\0i\0\x64\0g\0\x65\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0V\0\xff\xff\xff\xfb\0\0\0\x16\0I\0P\0\x43\0R\0\x65\0\x63\0o\0r\0\x64\0\x65\0r\0\0\0\0\0\xff\xff\xff\xff\0\0\0\xba\0\xff\xff\xff\0\0\x2\x39\0\0\0\xc2\0\0\0\x4\0\0\0\x4\0\0\0\b\0\0\0\b\xfc\0\0\0\0) Updater\check_for_update_on_start=true Updater\check_for_update_on_start\default=true Updater\update_on_close=false diff --git a/projects/ROCKNIX/packages/emulators/standalone/azahar-sa/package.mk b/projects/ROCKNIX/packages/emulators/standalone/azahar-sa/package.mk index 5488224112..979ee55d04 100644 --- a/projects/ROCKNIX/packages/emulators/standalone/azahar-sa/package.mk +++ b/projects/ROCKNIX/packages/emulators/standalone/azahar-sa/package.mk @@ -2,7 +2,7 @@ # Copyright (C) 2024-present ROCKNIX (https://github.com/ROCKNIX) PKG_NAME="azahar-sa" -PKG_VERSION="e65ed7814fc7ce22ae87e683ef22a2efc18b7029" # tag AZAHAR_PLUS_2123_A +PKG_VERSION="517dccaff646537576cf68d7c046c8d8dfca0f8f" # tag AZAHAR_PLUS_2123_2_A PKG_LICENSE="GPL" PKG_SITE="https://github.com/AzaharPlus/AzaharPlus" PKG_URL="${PKG_SITE}.git" @@ -18,8 +18,7 @@ if [ "${OPENGLES_SUPPORT}" = yes ]; then PKG_DEPENDS_TARGET+=" ${OPENGLES}" fi -if [ "${VULKAN_SUPPORT}" = "yes" ] -then +if [ "${VULKAN_SUPPORT}" = "yes" ]; then PKG_DEPENDS_TARGET+=" ${VULKAN}" fi From 1bf8d89cc10730e224c08355a3b2d7c1b90612dd Mon Sep 17 00:00:00 2001 From: John Williams Date: Fri, 10 Oct 2025 16:28:44 +1100 Subject: [PATCH 03/11] azahar-sa - enable OpenGL ES rendering where preferred --- .../azahar-sa/config/S922X/qt-config.ini.new | 705 ------------------ .../emulators/standalone/azahar-sa/package.mk | 11 +- ...creenLayout-remove-SeparateWindows-L.patch | 28 + ...emu_window-SDL_WINDOW_VULKAN-context.patch | 25 + .../0003-common-file-paths.patch} | 43 +- ...ble-use_gles-for-OpenGL-ES-rendering.patch | 25 + 6 files changed, 100 insertions(+), 737 deletions(-) delete mode 100644 projects/ROCKNIX/packages/emulators/standalone/azahar-sa/config/S922X/qt-config.ini.new create mode 100644 projects/ROCKNIX/packages/emulators/standalone/azahar-sa/patches/common/0001-citra_qt-ToggleScreenLayout-remove-SeparateWindows-L.patch create mode 100644 projects/ROCKNIX/packages/emulators/standalone/azahar-sa/patches/common/0002-citra_sdl-emu_window-SDL_WINDOW_VULKAN-context.patch rename projects/ROCKNIX/packages/emulators/standalone/azahar-sa/patches/{AzaharPlus-git.patch => common/0003-common-file-paths.patch} (58%) create mode 100644 projects/ROCKNIX/packages/emulators/standalone/azahar-sa/patches/prefer_gles/0004-Enable-use_gles-for-OpenGL-ES-rendering.patch diff --git a/projects/ROCKNIX/packages/emulators/standalone/azahar-sa/config/S922X/qt-config.ini.new b/projects/ROCKNIX/packages/emulators/standalone/azahar-sa/config/S922X/qt-config.ini.new deleted file mode 100644 index b2c73a1048..0000000000 --- a/projects/ROCKNIX/packages/emulators/standalone/azahar-sa/config/S922X/qt-config.ini.new +++ /dev/null @@ -1,705 +0,0 @@ -[Audio] -audio_emulation=0 -audio_emulation\default=true -enable_audio_stretching=true -enable_audio_stretching\default=true -enable_realtime_audio=false -enable_realtime_audio\default=true -input_device=Auto -input_device\default=true -input_type=0 -input_type\default=true -output_device=Auto -output_device\default=true -output_type=0 -output_type\default=true -volume=1 -volume\default=true - -[Camera] -camera_inner_config= -camera_inner_config\default=true -camera_inner_flip=0 -camera_inner_flip\default=true -camera_inner_name=blank -camera_inner_name\default=true -camera_outer_left_config= -camera_outer_left_config\default=true -camera_outer_left_flip=0 -camera_outer_left_flip\default=true -camera_outer_left_name=blank -camera_outer_left_name\default=true -camera_outer_right_config= -camera_outer_right_config\default=true -camera_outer_right_flip=0 -camera_outer_right_flip\default=true -camera_outer_right_name=blank -camera_outer_right_name\default=true - -[Controls] -profile=0 -profile\default=true -profiles\1\button_a="button:1,engine:sdl,guid:03001354474f2d556c74726120476100,port:0" -profiles\1\button_a\default=false -profiles\1\button_b="button:0,engine:sdl,guid:03001354474f2d556c74726120476100,port:0" -profiles\1\button_b\default=false -profiles\1\button_debug="code:79,engine:keyboard" -profiles\1\button_debug\default=true -profiles\1\button_down="button:15,engine:sdl,guid:03001354474f2d556c74726120476100,port:0" -profiles\1\button_down\default=false -profiles\1\button_gpio14="code:80,engine:keyboard" -profiles\1\button_gpio14\default=true -profiles\1\button_home="button:11,engine:sdl,guid:03001354474f2d556c74726120476100,port:0" -profiles\1\button_home\default=false -profiles\1\button_l="button:5,engine:sdl,guid:03001354474f2d556c74726120476100,port:0" -profiles\1\button_l\default=false -profiles\1\button_left="button:16,engine:sdl,guid:03001354474f2d556c74726120476100,port:0" -profiles\1\button_left\default=false -profiles\1\button_power="code:86,engine:keyboard" -profiles\1\button_power\default=true -profiles\1\button_r="button:6,engine:sdl,guid:03001354474f2d556c74726120476100,port:0" -profiles\1\button_r\default=false -profiles\1\button_right="button:17,engine:sdl,guid:03001354474f2d556c74726120476100,port:0" -profiles\1\button_right\default=false -profiles\1\button_select="button:9,engine:sdl,guid:03001354474f2d556c74726120476100,port:0" -profiles\1\button_select\default=false -profiles\1\button_start="button:10,engine:sdl,guid:03001354474f2d556c74726120476100,port:0" -profiles\1\button_start\default=false -profiles\1\button_up="button:14,engine:sdl,guid:03001354474f2d556c74726120476100,port:0" -profiles\1\button_up\default=false -profiles\1\button_x="button:3,engine:sdl,guid:03001354474f2d556c74726120476100,port:0" -profiles\1\button_x\default=false -profiles\1\button_y="button:4,engine:sdl,guid:03001354474f2d556c74726120476100,port:0" -profiles\1\button_y\default=false -profiles\1\button_zl="button:7,engine:sdl,guid:03001354474f2d556c74726120476100,port:0" -profiles\1\button_zl\default=false -profiles\1\button_zr="button:8,engine:sdl,guid:03001354474f2d556c74726120476100,port:0" -profiles\1\button_zr\default=false -profiles\1\c_stick="axis_x:2,axis_y:3,deadzone:0.100000,engine:sdl,guid:03001354474f2d556c74726120476100,port:0" -profiles\1\c_stick\default=false -profiles\1\circle_pad="axis_x:0,axis_y:1,deadzone:0.100000,engine:sdl,guid:03001354474f2d556c74726120476100,port:0" -profiles\1\circle_pad\default=false -profiles\1\motion_device="engine:motion_emu,update_period:100,sensitivity:0.01,tilt_clamp:90.0" -profiles\1\motion_device\default=true -profiles\1\name=Default -profiles\1\name\default=false -profiles\1\touch_device=engine:emu_window -profiles\1\touch_device\default=true -profiles\1\touch_from_button_map=0 -profiles\1\touch_from_button_map\default=true -profiles\1\udp_input_address=127.0.0.1 -profiles\1\udp_input_address\default=true -profiles\1\udp_input_port=26760 -profiles\1\udp_input_port\default=true -profiles\1\udp_pad_index=0 -profiles\1\udp_pad_index\default=true -profiles\1\use_touch_from_button=false -profiles\1\use_touch_from_button\default=true -profiles\size=1 -touch_from_button_maps\1\entries\size=0 -touch_from_button_maps\1\name=default -touch_from_button_maps\1\name\default=true -touch_from_button_maps\size=1 -use_artic_base_controller=false -use_artic_base_controller\default=true - -[Core] -cpu_clock_percentage=100 -cpu_clock_percentage\default=true -delay_start_for_lle_modules=true -delay_start_for_lle_modules\default=true -use_cpu_jit=true -use_cpu_jit\default=true - -[Data%20Storage] -compress_cia_installs=false -compress_cia_installs\default=true -nand_directory=/storage/.local/share/azahar/nand/ -nand_directory\default=false -sdmc_directory=/storage/.local/share/azahar/sdmc/ -sdmc_directory\default=false -use_custom_storage=false -use_custom_storage\default=true -use_virtual_sd=true -use_virtual_sd\default=true - -[Debugging] -LLE\AC=false -LLE\AC\default=true -LLE\ACT=false -LLE\ACT\default=true -LLE\AM=false -LLE\AM\default=true -LLE\BOSS=false -LLE\BOSS\default=true -LLE\CAM=false -LLE\CAM\default=true -LLE\CDC=false -LLE\CDC\default=true -LLE\CECD=false -LLE\CECD\default=true -LLE\CFG=false -LLE\CFG\default=true -LLE\CSND=false -LLE\CSND\default=true -LLE\DLP=false -LLE\DLP\default=true -LLE\DSP=false -LLE\DSP\default=true -LLE\ERR=false -LLE\ERR\default=true -LLE\FRD=false -LLE\FRD\default=true -LLE\FS=false -LLE\FS\default=true -LLE\GPIO=false -LLE\GPIO\default=true -LLE\GSP=false -LLE\GSP\default=true -LLE\HID=false -LLE\HID\default=true -LLE\HTTP=false -LLE\HTTP\default=true -LLE\I2C=false -LLE\I2C\default=true -LLE\IR=false -LLE\IR\default=true -LLE\LDR=false -LLE\LDR\default=true -LLE\MCU=false -LLE\MCU\default=true -LLE\MIC=false -LLE\MIC\default=true -LLE\MP=false -LLE\MP\default=true -LLE\MVD=false -LLE\MVD\default=true -LLE\NDM=false -LLE\NDM\default=true -LLE\NEWS=false -LLE\NEWS\default=true -LLE\NFC=false -LLE\NFC\default=true -LLE\NIM=false -LLE\NIM\default=true -LLE\NS=false -LLE\NS\default=true -LLE\NWM=false -LLE\NWM\default=true -LLE\PDN=false -LLE\PDN\default=true -LLE\PLGLDR=false -LLE\PLGLDR\default=true -LLE\PM=false -LLE\PM\default=true -LLE\PS=false -LLE\PS\default=true -LLE\PTM=false -LLE\PTM\default=true -LLE\PXI=false -LLE\PXI\default=true -LLE\QTM=false -LLE\QTM\default=true -LLE\SOC=false -LLE\SOC\default=true -LLE\SPI=false -LLE\SPI\default=true -LLE\SSL=false -LLE\SSL\default=true -enable_rpc_server=false -enable_rpc_server\default=true -gdbstub_port=24689 -gdbstub_port\default=true -instant_debug_log=false -instant_debug_log\default=true -record_frame_times=false -renderer_debug=false -renderer_debug\default=true -use_gdbstub=false -use_gdbstub\default=true - -[Layout] -anaglyph_shader_name=Dubois (builtin) -anaglyph_shader_name\default=true -custom_bottom_height=480 -custom_bottom_height\default=true -custom_bottom_width=640 -custom_bottom_width\default=true -custom_bottom_x=80 -custom_bottom_x\default=true -custom_bottom_y=500 -custom_bottom_y\default=true -custom_portrait_bottom_height=480 -custom_portrait_bottom_height\default=true -custom_portrait_bottom_width=640 -custom_portrait_bottom_width\default=true -custom_portrait_bottom_x=80 -custom_portrait_bottom_x\default=true -custom_portrait_bottom_y=500 -custom_portrait_bottom_y\default=true -custom_portrait_top_height=480 -custom_portrait_top_height\default=true -custom_portrait_top_width=800 -custom_portrait_top_width\default=true -custom_portrait_top_x=0 -custom_portrait_top_x\default=true -custom_portrait_top_y=0 -custom_portrait_top_y\default=true -custom_second_layer_opacity=100 -custom_second_layer_opacity\default=true -custom_top_height=480 -custom_top_height\default=true -custom_top_width=800 -custom_top_width\default=true -custom_top_x=0 -custom_top_x\default=true -custom_top_y=0 -custom_top_y\default=true -factor_3d=0 -factor_3d\default=true -filter_mode=true -filter_mode\default=true -large_screen_proportion=4 -large_screen_proportion\default=true -layout_option=0 -layout_option\default=true -mono_render_option=0 -mono_render_option\default=true -pp_shader_name=None (builtin) -pp_shader_name\default=true -render_3d=0 -render_3d\default=true -screen_bottom_leftright_padding=0 -screen_bottom_leftright_padding\default=true -screen_bottom_stretch=false -screen_bottom_stretch\default=true -screen_bottom_topbottom_padding=0 -screen_bottom_topbottom_padding\default=true -screen_gap=0 -screen_gap\default=true -screen_top_leftright_padding=0 -screen_top_leftright_padding\default=true -screen_top_stretch=false -screen_top_stretch\default=true -screen_top_topbottom_padding=0 -screen_top_topbottom_padding\default=true -small_screen_position=2 -small_screen_position\default=true -swap_screen=false -swap_screen\default=true -upright_screen=false -upright_screen\default=true - -[Miscellaneous] -check_for_update_on_start=false -check_for_update_on_start\default=false -enable_gamemode=true -enable_gamemode\default=true -log_filter=*:Info -log_filter\default=true -log_regex_filter= -log_regex_filter\default=true - -[Renderer] -async_presentation=true -async_presentation\default=true -async_shader_compilation=false -async_shader_compilation\default=true -bg_blue=0 -bg_blue\default=true -bg_green=0 -bg_green\default=true -bg_red=0 -bg_red\default=true -delay_game_render_thread_us=0 -delay_game_render_thread_us\default=true -disable_right_eye_render=false -disable_right_eye_render\default=true -disable_spirv_optimizer=true -disable_spirv_optimizer\default=true -frame_limit=100 -frame_limit\default=true -graphics_api=2 -graphics_api\default=false -physical_device=0 -physical_device\default=true -resolution_factor=1 -resolution_factor\default=true -shaders_accurate_mul=true -shaders_accurate_mul\default=true -spirv_shader_gen=true -spirv_shader_gen\default=true -texture_filter=0 -texture_filter\default=true -texture_sampling=0 -texture_sampling\default=true -turbo_limit=200 -turbo_limit\default=true -use_disk_shader_cache=true -use_disk_shader_cache\default=true -use_hw_shader=true -use_hw_shader\default=true -use_shader_jit=false -use_shader_jit\default=false -use_vsync_new=true -use_vsync_new\default=true - -[System] -allow_plugin_loader=true -allow_plugin_loader\default=true -enable_required_online_lle_modules=false -enable_required_online_lle_modules\default=true -init_clock=0 -init_clock\default=true -init_ticks_override=@Variant(\0\0\0\x81\0\0\0\0\0\0\0\0) -init_ticks_override\default=true -init_ticks_type=0 -init_ticks_type\default=true -init_time=@Variant(\0\0\0\x84\0\0\0\0\x38m5\xbd) -init_time\default=true -init_time_offset=@Variant(\0\0\0\x81\0\0\0\0\0\0\0\0) -init_time_offset\default=true -is_new_3ds=true -is_new_3ds\default=true -lle_applets=true -lle_applets\default=true -plugin_loader=false -plugin_loader\default=true -region_value=-1 -region_value\default=true -steps_per_hour=0 -steps_per_hour\default=true - -[UI] -GameList\favorites\size=0 -GameList\hideNoIcon=false -GameList\hideNoIcon\default=true -GameList\iconSize=2 -GameList\iconSize\default=true -GameList\row1=2 -GameList\row1\default=true -GameList\row2=0 -GameList\row2\default=true -GameList\show_3ds_files_warning=false -GameList\show_3ds_files_warning\default=true -GameList\show_compat_column=true -GameList\show_compat_column\default=true -GameList\show_play_time_column=true -GameList\show_play_time_column\default=true -GameList\show_region_column=true -GameList\show_region_column\default=true -GameList\show_size_column=true -GameList\show_size_column\default=true -GameList\show_type_column=true -GameList\show_type_column\default=true -GameList\singleLineMode=false -GameList\singleLineMode\default=true -Multiplayer\game_id=0 -Multiplayer\game_id\default=true -Multiplayer\host_type=0 -Multiplayer\host_type\default=true -Multiplayer\ip= -Multiplayer\ip\default=true -Multiplayer\ip_ban_list\size=0 -Multiplayer\max_player=8 -Multiplayer\max_player\default=true -Multiplayer\multiplayer_filter_games_owned=false -Multiplayer\multiplayer_filter_games_owned\default=true -Multiplayer\multiplayer_filter_hide_empty=false -Multiplayer\multiplayer_filter_hide_empty\default=true -Multiplayer\multiplayer_filter_hide_full=false -Multiplayer\multiplayer_filter_hide_full\default=true -Multiplayer\multiplayer_filter_text= -Multiplayer\multiplayer_filter_text\default=true -Multiplayer\nickname= -Multiplayer\nickname\default=true -Multiplayer\port=24872 -Multiplayer\port\default=true -Multiplayer\room_description= -Multiplayer\room_description\default=true -Multiplayer\room_name= -Multiplayer\room_name\default=true -Multiplayer\room_nickname= -Multiplayer\room_nickname\default=true -Multiplayer\room_port=24872 -Multiplayer\room_port\default=true -Multiplayer\username_ban_list\size=0 -Paths\gamedirs\1\deep_scan=false -Paths\gamedirs\1\deep_scan\default=true -Paths\gamedirs\1\expanded=true -Paths\gamedirs\1\expanded\default=true -Paths\gamedirs\1\path=INSTALLED -Paths\gamedirs\2\deep_scan=false -Paths\gamedirs\2\deep_scan\default=true -Paths\gamedirs\2\expanded=true -Paths\gamedirs\2\expanded\default=true -Paths\gamedirs\2\path=SYSTEM -Paths\gamedirs\size=2 -Paths\language=en -Paths\language\default=false -Paths\last_artic_base_addr= -Paths\last_artic_base_addr\default=true -Paths\moviePlaybackPath= -Paths\movieRecordPath= -Paths\recentFiles=/storage/roms/3ds/Mario Kart 7 (USA).cxi, "/storage/roms/3ds/Dead or Alive - Dimensions (USA) (En,Ja,Fr,De,Es,It).cxi", "/storage/roms/3ds/Donkey Kong Country Returns 3D (USA) (En,Fr,Es).cxi", -Paths\romsPath= -Paths\screenshotPath=/storage/.local/share/azahar/screenshots/ -Paths\screenshotPath\default=false -Paths\symbolsPath= -Paths\videoDumpingPath= -Shortcuts\Main%20Window\Advance%20Frame\Context=2 -Shortcuts\Main%20Window\Advance%20Frame\Context\default=true -Shortcuts\Main%20Window\Advance%20Frame\KeySeq= -Shortcuts\Main%20Window\Advance%20Frame\KeySeq\default=true -Shortcuts\Main%20Window\Audio%20Mute\Unmute\Context=1 -Shortcuts\Main%20Window\Audio%20Mute\Unmute\Context\default=true -Shortcuts\Main%20Window\Audio%20Mute\Unmute\KeySeq=Ctrl+M -Shortcuts\Main%20Window\Audio%20Mute\Unmute\KeySeq\default=true -Shortcuts\Main%20Window\Audio%20Volume%20Down\Context=1 -Shortcuts\Main%20Window\Audio%20Volume%20Down\Context\default=true -Shortcuts\Main%20Window\Audio%20Volume%20Down\KeySeq= -Shortcuts\Main%20Window\Audio%20Volume%20Down\KeySeq\default=true -Shortcuts\Main%20Window\Audio%20Volume%20Up\Context=1 -Shortcuts\Main%20Window\Audio%20Volume%20Up\Context\default=true -Shortcuts\Main%20Window\Audio%20Volume%20Up\KeySeq= -Shortcuts\Main%20Window\Audio%20Volume%20Up\KeySeq\default=true -Shortcuts\Main%20Window\Capture%20Screenshot\Context=3 -Shortcuts\Main%20Window\Capture%20Screenshot\Context\default=true -Shortcuts\Main%20Window\Capture%20Screenshot\KeySeq=Ctrl+P -Shortcuts\Main%20Window\Capture%20Screenshot\KeySeq\default=true -Shortcuts\Main%20Window\Continue\Pause%20Emulation\Context=1 -Shortcuts\Main%20Window\Continue\Pause%20Emulation\Context\default=true -Shortcuts\Main%20Window\Continue\Pause%20Emulation\KeySeq=F4 -Shortcuts\Main%20Window\Continue\Pause%20Emulation\KeySeq\default=true -Shortcuts\Main%20Window\Decrease%203D%20Factor\Context=2 -Shortcuts\Main%20Window\Decrease%203D%20Factor\Context\default=true -Shortcuts\Main%20Window\Decrease%203D%20Factor\KeySeq=Ctrl+- -Shortcuts\Main%20Window\Decrease%203D%20Factor\KeySeq\default=true -Shortcuts\Main%20Window\Decrease%20Speed%20Limit\Context=2 -Shortcuts\Main%20Window\Decrease%20Speed%20Limit\Context\default=true -Shortcuts\Main%20Window\Decrease%20Speed%20Limit\KeySeq=- -Shortcuts\Main%20Window\Decrease%20Speed%20Limit\KeySeq\default=true -Shortcuts\Main%20Window\Exit%20Azahar\Context=1 -Shortcuts\Main%20Window\Exit%20Azahar\Context\default=true -Shortcuts\Main%20Window\Exit%20Azahar\KeySeq=Ctrl+Q -Shortcuts\Main%20Window\Exit%20Azahar\KeySeq\default=true -Shortcuts\Main%20Window\Exit%20Fullscreen\Context=1 -Shortcuts\Main%20Window\Exit%20Fullscreen\Context\default=true -Shortcuts\Main%20Window\Exit%20Fullscreen\KeySeq=Esc -Shortcuts\Main%20Window\Exit%20Fullscreen\KeySeq\default=true -Shortcuts\Main%20Window\Exit%20Lime3DS\Context=1 -Shortcuts\Main%20Window\Exit%20Lime3DS\Context\default=true -Shortcuts\Main%20Window\Exit%20Lime3DS\KeySeq=Ctrl+Q -Shortcuts\Main%20Window\Exit%20Lime3DS\KeySeq\default=true -Shortcuts\Main%20Window\Fullscreen\Context=1 -Shortcuts\Main%20Window\Fullscreen\Context\default=true -Shortcuts\Main%20Window\Fullscreen\KeySeq=F11 -Shortcuts\Main%20Window\Fullscreen\KeySeq\default=true -Shortcuts\Main%20Window\Increase%203D%20Factor\Context=2 -Shortcuts\Main%20Window\Increase%203D%20Factor\Context\default=true -Shortcuts\Main%20Window\Increase%203D%20Factor\KeySeq=Ctrl++ -Shortcuts\Main%20Window\Increase%203D%20Factor\KeySeq\default=true -Shortcuts\Main%20Window\Increase%20Speed%20Limit\Context=2 -Shortcuts\Main%20Window\Increase%20Speed%20Limit\Context\default=true -Shortcuts\Main%20Window\Increase%20Speed%20Limit\KeySeq=+ -Shortcuts\Main%20Window\Increase%20Speed%20Limit\KeySeq\default=true -Shortcuts\Main%20Window\Load%20Amiibo\Context=3 -Shortcuts\Main%20Window\Load%20Amiibo\Context\default=true -Shortcuts\Main%20Window\Load%20Amiibo\KeySeq=F2 -Shortcuts\Main%20Window\Load%20Amiibo\KeySeq\default=true -Shortcuts\Main%20Window\Load%20File\Context=3 -Shortcuts\Main%20Window\Load%20File\Context\default=true -Shortcuts\Main%20Window\Load%20File\KeySeq=Ctrl+O -Shortcuts\Main%20Window\Load%20File\KeySeq\default=true -Shortcuts\Main%20Window\Load%20from%20Newest%20Non-Quicksave%20Slot\Context=1 -Shortcuts\Main%20Window\Load%20from%20Newest%20Non-Quicksave%20Slot\Context\default=true -Shortcuts\Main%20Window\Load%20from%20Newest%20Non-Quicksave%20Slot\KeySeq=Ctrl+V -Shortcuts\Main%20Window\Load%20from%20Newest%20Non-Quicksave%20Slot\KeySeq\default=true -Shortcuts\Main%20Window\Load%20from%20Newest%20Slot\Context=1 -Shortcuts\Main%20Window\Load%20from%20Newest%20Slot\Context\default=true -Shortcuts\Main%20Window\Load%20from%20Newest%20Slot\KeySeq=Ctrl+V -Shortcuts\Main%20Window\Load%20from%20Newest%20Slot\KeySeq\default=true -Shortcuts\Main%20Window\Multiplayer%20Browse%20Public%20Game%20Lobby\Context=2 -Shortcuts\Main%20Window\Multiplayer%20Browse%20Public%20Game%20Lobby\Context\default=true -Shortcuts\Main%20Window\Multiplayer%20Browse%20Public%20Game%20Lobby\KeySeq=Ctrl+B -Shortcuts\Main%20Window\Multiplayer%20Browse%20Public%20Game%20Lobby\KeySeq\default=true -Shortcuts\Main%20Window\Multiplayer%20Browse%20Public%20Lobby\Context=2 -Shortcuts\Main%20Window\Multiplayer%20Browse%20Public%20Lobby\Context\default=true -Shortcuts\Main%20Window\Multiplayer%20Browse%20Public%20Lobby\KeySeq=Ctrl+B -Shortcuts\Main%20Window\Multiplayer%20Browse%20Public%20Lobby\KeySeq\default=true -Shortcuts\Main%20Window\Multiplayer%20Browse%20Public%20Rooms\Context=2 -Shortcuts\Main%20Window\Multiplayer%20Browse%20Public%20Rooms\Context\default=true -Shortcuts\Main%20Window\Multiplayer%20Browse%20Public%20Rooms\KeySeq=Ctrl+B -Shortcuts\Main%20Window\Multiplayer%20Browse%20Public%20Rooms\KeySeq\default=true -Shortcuts\Main%20Window\Multiplayer%20Create%20Room\Context=2 -Shortcuts\Main%20Window\Multiplayer%20Create%20Room\Context\default=true -Shortcuts\Main%20Window\Multiplayer%20Create%20Room\KeySeq=Ctrl+N -Shortcuts\Main%20Window\Multiplayer%20Create%20Room\KeySeq\default=true -Shortcuts\Main%20Window\Multiplayer%20Direct%20Connect%20to%20Room\Context=2 -Shortcuts\Main%20Window\Multiplayer%20Direct%20Connect%20to%20Room\Context\default=true -Shortcuts\Main%20Window\Multiplayer%20Direct%20Connect%20to%20Room\KeySeq=Ctrl+Shift -Shortcuts\Main%20Window\Multiplayer%20Direct%20Connect%20to%20Room\KeySeq\default=true -Shortcuts\Main%20Window\Multiplayer%20Leave%20Room\Context=2 -Shortcuts\Main%20Window\Multiplayer%20Leave%20Room\Context\default=true -Shortcuts\Main%20Window\Multiplayer%20Leave%20Room\KeySeq=Ctrl+L -Shortcuts\Main%20Window\Multiplayer%20Leave%20Room\KeySeq\default=true -Shortcuts\Main%20Window\Multiplayer%20Show%20Current%20Room\Context=2 -Shortcuts\Main%20Window\Multiplayer%20Show%20Current%20Room\Context\default=true -Shortcuts\Main%20Window\Multiplayer%20Show%20Current%20Room\KeySeq=Ctrl+R -Shortcuts\Main%20Window\Multiplayer%20Show%20Current%20Room\KeySeq\default=true -Shortcuts\Main%20Window\Quick%20Load\Context=1 -Shortcuts\Main%20Window\Quick%20Load\Context\default=true -Shortcuts\Main%20Window\Quick%20Load\KeySeq=Alt+L -Shortcuts\Main%20Window\Quick%20Load\KeySeq\default=false -Shortcuts\Main%20Window\Quick%20Save\Context=1 -Shortcuts\Main%20Window\Quick%20Save\Context\default=true -Shortcuts\Main%20Window\Quick%20Save\KeySeq=Alt+S -Shortcuts\Main%20Window\Quick%20Save\KeySeq\default=false -Shortcuts\Main%20Window\Remove%20Amiibo\Context=2 -Shortcuts\Main%20Window\Remove%20Amiibo\Context\default=true -Shortcuts\Main%20Window\Remove%20Amiibo\KeySeq=F3 -Shortcuts\Main%20Window\Remove%20Amiibo\KeySeq\default=true -Shortcuts\Main%20Window\Restart%20Emulation\Context=1 -Shortcuts\Main%20Window\Restart%20Emulation\Context\default=true -Shortcuts\Main%20Window\Restart%20Emulation\KeySeq=F6 -Shortcuts\Main%20Window\Restart%20Emulation\KeySeq\default=true -Shortcuts\Main%20Window\Rotate%20Screens%20Upright\Context=1 -Shortcuts\Main%20Window\Rotate%20Screens%20Upright\Context\default=true -Shortcuts\Main%20Window\Rotate%20Screens%20Upright\KeySeq=F8 -Shortcuts\Main%20Window\Rotate%20Screens%20Upright\KeySeq\default=true -Shortcuts\Main%20Window\Save%20to%20Oldest%20Non-Quicksave%20Slot\Context=1 -Shortcuts\Main%20Window\Save%20to%20Oldest%20Non-Quicksave%20Slot\Context\default=true -Shortcuts\Main%20Window\Save%20to%20Oldest%20Non-Quicksave%20Slot\KeySeq=Ctrl+C -Shortcuts\Main%20Window\Save%20to%20Oldest%20Non-Quicksave%20Slot\KeySeq\default=true -Shortcuts\Main%20Window\Save%20to%20Oldest%20Slot\Context=1 -Shortcuts\Main%20Window\Save%20to%20Oldest%20Slot\Context\default=true -Shortcuts\Main%20Window\Save%20to%20Oldest%20Slot\KeySeq=Ctrl+C -Shortcuts\Main%20Window\Save%20to%20Oldest%20Slot\KeySeq\default=true -Shortcuts\Main%20Window\Stop%20Emulation\Context=1 -Shortcuts\Main%20Window\Stop%20Emulation\Context\default=true -Shortcuts\Main%20Window\Stop%20Emulation\KeySeq=F5 -Shortcuts\Main%20Window\Stop%20Emulation\KeySeq\default=true -Shortcuts\Main%20Window\Swap%20Screens\Context=1 -Shortcuts\Main%20Window\Swap%20Screens\Context\default=true -Shortcuts\Main%20Window\Swap%20Screens\KeySeq=F9 -Shortcuts\Main%20Window\Swap%20Screens\KeySeq\default=true -Shortcuts\Main%20Window\Toggle%203D\Context=2 -Shortcuts\Main%20Window\Toggle%203D\Context\default=true -Shortcuts\Main%20Window\Toggle%203D\KeySeq=Ctrl+3 -Shortcuts\Main%20Window\Toggle%203D\KeySeq\default=true -Shortcuts\Main%20Window\Toggle%20Custom%20Textures\Context=2 -Shortcuts\Main%20Window\Toggle%20Custom%20Textures\Context\default=true -Shortcuts\Main%20Window\Toggle%20Custom%20Textures\KeySeq=F7 -Shortcuts\Main%20Window\Toggle%20Custom%20Textures\KeySeq\default=true -Shortcuts\Main%20Window\Toggle%20Filter%20Bar\Context=1 -Shortcuts\Main%20Window\Toggle%20Filter%20Bar\Context\default=true -Shortcuts\Main%20Window\Toggle%20Filter%20Bar\KeySeq=Ctrl+F -Shortcuts\Main%20Window\Toggle%20Filter%20Bar\KeySeq\default=true -Shortcuts\Main%20Window\Toggle%20Frame%20Advancing\Context=2 -Shortcuts\Main%20Window\Toggle%20Frame%20Advancing\Context\default=true -Shortcuts\Main%20Window\Toggle%20Frame%20Advancing\KeySeq=Ctrl+A -Shortcuts\Main%20Window\Toggle%20Frame%20Advancing\KeySeq\default=true -Shortcuts\Main%20Window\Toggle%20Per-Application%20Speed\Context=2 -Shortcuts\Main%20Window\Toggle%20Per-Application%20Speed\Context\default=true -Shortcuts\Main%20Window\Toggle%20Per-Application%20Speed\KeySeq=Ctrl+Z -Shortcuts\Main%20Window\Toggle%20Per-Application%20Speed\KeySeq\default=true -Shortcuts\Main%20Window\Toggle%20Per-Game%20Speed\Context=2 -Shortcuts\Main%20Window\Toggle%20Per-Game%20Speed\Context\default=true -Shortcuts\Main%20Window\Toggle%20Per-Game%20Speed\KeySeq=Ctrl+Z -Shortcuts\Main%20Window\Toggle%20Per-Game%20Speed\KeySeq\default=true -Shortcuts\Main%20Window\Toggle%20Screen%20Layout\Context=1 -Shortcuts\Main%20Window\Toggle%20Screen%20Layout\Context\default=true -Shortcuts\Main%20Window\Toggle%20Screen%20Layout\KeySeq=F10 -Shortcuts\Main%20Window\Toggle%20Screen%20Layout\KeySeq\default=true -Shortcuts\Main%20Window\Toggle%20Status%20Bar\Context=1 -Shortcuts\Main%20Window\Toggle%20Status%20Bar\Context\default=true -Shortcuts\Main%20Window\Toggle%20Status%20Bar\KeySeq=Ctrl+S -Shortcuts\Main%20Window\Toggle%20Status%20Bar\KeySeq\default=true -Shortcuts\Main%20Window\Toggle%20Texture%20Dumping\Context=2 -Shortcuts\Main%20Window\Toggle%20Texture%20Dumping\Context\default=true -Shortcuts\Main%20Window\Toggle%20Texture%20Dumping\KeySeq= -Shortcuts\Main%20Window\Toggle%20Texture%20Dumping\KeySeq\default=true -Shortcuts\Main%20Window\Toggle%20Turbo%20Mode\Context=2 -Shortcuts\Main%20Window\Toggle%20Turbo%20Mode\Context\default=true -Shortcuts\Main%20Window\Toggle%20Turbo%20Mode\KeySeq= -Shortcuts\Main%20Window\Toggle%20Turbo%20Mode\KeySeq\default=true -UILayout\gameListHeaderState="@ByteArray(\0\0\0\xff\0\0\0\0\0\0\0\x1\0\0\0\x1\0\0\0\x6\x1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x3\xe2\0\0\0\x6\x1\x1\0\x1\0\0\0\0\0\0\0\0\0\0\0\0\x64\xff\xff\xff\xff\0\0\0\x81\0\0\0\0\0\0\0\x6\0\0\x2\x80\0\0\0\x1\0\0\0\0\0\0\0\x62\0\0\0\x1\0\0\0\0\0\0\0=\0\0\0\x1\0\0\0\0\0\0\0G\0\0\0\x1\0\0\0\0\0\0\0\x30\0\0\0\x1\0\0\0\0\0\0\0L\0\0\0\x1\0\0\0\0\0\0\x3\xe8\0\0\0\0L\0\0\0\0)" -UILayout\geometry="@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\x1=\0\0\0\xd5\0\0\x6\x42\0\0\x3\x11\0\0\x1@\0\0\0\xf3\0\0\x6?\0\0\x3\xe\0\0\0\0\0\0\0\0\a\x80\0\0\x1@\0\0\0\xf3\0\0\x6?\0\0\x3\xe)" -UILayout\geometryRenderWindow=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\x1\0\0\0\x19\0\0\0\x64\0\0\0\x36\0\0\0\0\0\0\0\0\xff\xff\xff\xff\xff\xff\xff\xff\0\0\0\0\0\0\0\0\x5\0\0\0\0\x1\0\0\0\x19\0\0\0\x64\0\0\0\x36) -UILayout\microProfileDialogGeometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\0\x1\0\0\0\x19\0\0\x3\xe8\0\0\x2p\0\0\0\x1\0\0\0\x19\0\0\x3\xe8\0\0\x2p\0\0\0\0\0\0\0\0\a\x80\0\0\0\x1\0\0\0\x19\0\0\x3\xe8\0\0\x2p) -UILayout\microProfileDialogVisible=false -UILayout\microProfileDialogVisible\default=true -UILayout\state=@ByteArray(\0\0\0\xff\0\0\0\0\xfd\0\0\0\x2\0\0\0\0\0\0\0\0\0\0\0\0\xfc\x2\0\0\0\x1\xfb\0\0\0\x1c\0W\0\x61\0i\0t\0T\0r\0\x65\0\x65\0W\0i\0\x64\0g\0\x65\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0V\0\xff\xff\xff\0\0\0\x1\0\0\0\0\0\0\0\0\xfc\x2\0\0\0\b\xfb\0\0\0\x18\0\x41\0R\0M\0R\0\x65\0g\0i\0s\0t\0\x65\0r\0s\0\0\0\0\0\xff\xff\xff\xff\0\0\0h\0\xff\xff\xff\xfb\0\0\0 \0G\0r\0\x61\0p\0h\0i\0\x63\0s\0\x44\0\x65\0\x62\0u\0g\0g\0\x65\0r\0\0\0\0\0\xff\xff\xff\xff\0\0\0V\0\xff\xff\xff\xfb\0\0\0\"\0P\0i\0\x63\0\x61\0 \0\x43\0o\0m\0m\0\x61\0n\0\x64\0 \0L\0i\0s\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x84\0\xff\xff\xff\xfb\0\0\0*\0P\0i\0\x63\0\x61\0\x42\0r\0\x65\0\x61\0k\0P\0o\0i\0n\0t\0s\0W\0i\0\x64\0g\0\x65\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x84\0\xff\xff\xff\xfb\0\0\0 \0P\0i\0\x63\0\x61\0V\0\x65\0r\0t\0\x65\0x\0S\0h\0\x61\0\x64\0\x65\0r\0\0\0\0\0\xff\xff\xff\xff\0\0\x1\xa6\0\xff\xff\xff\xfb\0\0\0\x12\0\x43\0i\0T\0r\0\x61\0\x63\0i\0n\0g\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x38\0\xff\xff\xff\xfb\0\0\0.\0L\0L\0\x45\0S\0\x65\0r\0v\0i\0\x63\0\x65\0M\0o\0\x64\0u\0l\0\x65\0s\0W\0i\0\x64\0g\0\x65\0t\0\0\0\0\0\xff\xff\xff\xff\0\0\0V\0\xff\xff\xff\xfb\0\0\0\x16\0I\0P\0\x43\0R\0\x65\0\x63\0o\0r\0\x64\0\x65\0r\0\0\0\0\0\xff\xff\xff\xff\0\0\0\xba\0\xff\xff\xff\0\0\x2\x39\0\0\0\xc2\0\0\0\x4\0\0\0\x4\0\0\0\b\0\0\0\b\xfc\0\0\0\0) -Updater\check_for_update_on_start=true -Updater\check_for_update_on_start\default=true -Updater\update_on_close=false -Updater\update_on_close\default=true -calloutFlags=0 -calloutFlags\default=true -confirmClose=true -confirmClose\default=true -displayTitleBars=true -displayTitleBars\default=true -enable_discord_presence=true -enable_discord_presence\default=true -firstStart=false -firstStart\default=false -fullscreen=true -fullscreen\default=false -hideInactiveMouse=false -hideInactiveMouse\default=true -muteWhenInBackground=false -muteWhenInBackground\default=true -pauseWhenInBackground=false -pauseWhenInBackground\default=true -saveStateWarning=false -saveStateWarning\default=false -screenshot_resolution_factor=0 -screenshot_resolution_factor\default=true -showConsole=false -showConsole\default=true -showFilterBar=true -showFilterBar\default=true -showStatusBar=true -showStatusBar\default=true -show_advanced_frametime_info=false -show_advanced_frametime_info\default=true -singleWindowMode=true -singleWindowMode\default=true -theme=default -theme\default=true - -[Utility] -async_custom_loading=true -async_custom_loading\default=true -custom_textures=false -custom_textures\default=true -dump_textures=false -dump_textures\default=true -preload_textures=false -preload_textures\default=true - -[VideoDumping] -audio_bitrate=64000 -audio_bitrate\default=true -audio_encoder=libvorbis -audio_encoder\default=true -audio_encoder_options= -audio_encoder_options\default=true -format_options= -output_format=webm -output_format\default=true -video_bitrate=2500000 -video_bitrate\default=true -video_encoder=libvpx-vp9 -video_encoder\default=true -video_encoder_options="quality:realtime,speed:6,tile-columns:4,frame-parallel:1,threads:8,row-mt:1" -video_encoder_options\default=true - -[WebService] -citra_token= -citra_username= -lime3ds_token= -lime3ds_username= -web_api_url=https://api.citra-emu.org -web_api_url\default=true diff --git a/projects/ROCKNIX/packages/emulators/standalone/azahar-sa/package.mk b/projects/ROCKNIX/packages/emulators/standalone/azahar-sa/package.mk index 979ee55d04..75d3d17f10 100644 --- a/projects/ROCKNIX/packages/emulators/standalone/azahar-sa/package.mk +++ b/projects/ROCKNIX/packages/emulators/standalone/azahar-sa/package.mk @@ -9,13 +9,18 @@ PKG_URL="${PKG_SITE}.git" PKG_DEPENDS_TARGET="toolchain ffmpeg mesa SDL2 boost zlib libusb boost zstd control-gen spirv-tools qt6" PKG_LONGDESC="Azahar - Nintendo 3DS emulator" PKG_TOOLCHAIN="cmake" +PKG_PATCH_DIRS="common" if [ ! "${OPENGL}" = "no" ]; then PKG_DEPENDS_TARGET+=" ${OPENGL} glu libglvnd" fi -if [ "${OPENGLES_SUPPORT}" = yes ]; then +if [ "${OPENGLES_SUPPORT}" = "yes" ]; then PKG_DEPENDS_TARGET+=" ${OPENGLES}" + + if [ "${PREFER_GLES}" = "yes" ]; then + PKG_PATCH_DIRS+=" prefer_gles" + fi fi if [ "${VULKAN_SUPPORT}" = "yes" ]; then @@ -29,8 +34,8 @@ PKG_CMAKE_OPTS_TARGET+=" -DENABLE_QT_TRANSLATION=OFF \ -DENABLE_TESTS=OFF \ -DENABLE_ROOM=OFF \ -DUSE_DISCORD_PRESENCE=OFF \ - -DENABLE_VULKAN=ON \ - -DENABLE_OPENGL=ON" + -DENABLE_OPENGL=ON \ + -DENABLE_VULKAN=ON" makeinstall_target() { mkdir -p ${INSTALL}/usr/bin diff --git a/projects/ROCKNIX/packages/emulators/standalone/azahar-sa/patches/common/0001-citra_qt-ToggleScreenLayout-remove-SeparateWindows-L.patch b/projects/ROCKNIX/packages/emulators/standalone/azahar-sa/patches/common/0001-citra_qt-ToggleScreenLayout-remove-SeparateWindows-L.patch new file mode 100644 index 0000000000..4473f2f05a --- /dev/null +++ b/projects/ROCKNIX/packages/emulators/standalone/azahar-sa/patches/common/0001-citra_qt-ToggleScreenLayout-remove-SeparateWindows-L.patch @@ -0,0 +1,28 @@ +From 6a80cce53323fefe3989839e101c22765141573f Mon Sep 17 00:00:00 2001 +From: John Williams +Date: Fri, 10 Oct 2025 09:36:57 +1100 +Subject: [PATCH 1/4] citra_qt - ToggleScreenLayout - remove SeparateWindows + LayoutOption + +--- + src/citra_qt/citra_qt.cpp | 4 ---- + 1 file changed, 4 deletions(-) + +diff --git a/src/citra_qt/citra_qt.cpp b/src/citra_qt/citra_qt.cpp +index 1216fa882..588b2836f 100644 +--- a/src/citra_qt/citra_qt.cpp ++++ b/src/citra_qt/citra_qt.cpp +@@ -2747,10 +2747,6 @@ void GMainWindow::ToggleScreenLayout() { + case Settings::LayoutOption::HybridScreen: + return Settings::LayoutOption::SideScreen; + case Settings::LayoutOption::SideScreen: +- return Settings::LayoutOption::SeparateWindows; +- case Settings::LayoutOption::SeparateWindows: +- return Settings::LayoutOption::CustomLayout; +- case Settings::LayoutOption::CustomLayout: + return Settings::LayoutOption::Default; + default: + LOG_ERROR(Frontend, "Unknown layout option {}", +-- +2.47.3 + diff --git a/projects/ROCKNIX/packages/emulators/standalone/azahar-sa/patches/common/0002-citra_sdl-emu_window-SDL_WINDOW_VULKAN-context.patch b/projects/ROCKNIX/packages/emulators/standalone/azahar-sa/patches/common/0002-citra_sdl-emu_window-SDL_WINDOW_VULKAN-context.patch new file mode 100644 index 0000000000..23b4e8c02d --- /dev/null +++ b/projects/ROCKNIX/packages/emulators/standalone/azahar-sa/patches/common/0002-citra_sdl-emu_window-SDL_WINDOW_VULKAN-context.patch @@ -0,0 +1,25 @@ +From f59729ba48bc6016876eaa425c059752ad2c8f81 Mon Sep 17 00:00:00 2001 +From: John Williams +Date: Fri, 10 Oct 2025 10:36:14 +1100 +Subject: [PATCH 2/4] citra_sdl - emu_window - SDL_WINDOW_VULKAN context + +--- + src/citra_sdl/emu_window/emu_window_sdl2_vk.cpp | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/citra_sdl/emu_window/emu_window_sdl2_vk.cpp b/src/citra_sdl/emu_window/emu_window_sdl2_vk.cpp +index b002c15bb..33b6a365f 100644 +--- a/src/citra_sdl/emu_window/emu_window_sdl2_vk.cpp ++++ b/src/citra_sdl/emu_window/emu_window_sdl2_vk.cpp +@@ -24,7 +24,7 @@ EmuWindow_SDL2_VK::EmuWindow_SDL2_VK(Core::System& system, bool fullscreen, bool + SDL_WINDOWPOS_UNDEFINED, // x position + SDL_WINDOWPOS_UNDEFINED, // y position + Core::kScreenTopWidth, Core::kScreenTopHeight + Core::kScreenBottomHeight, +- SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI); ++ SDL_WINDOW_VULKAN | SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI); + SDL_SysWMinfo wm; + SDL_VERSION(&wm.version); + if (SDL_GetWindowWMInfo(render_window, &wm) == SDL_FALSE) { +-- +2.47.3 + diff --git a/projects/ROCKNIX/packages/emulators/standalone/azahar-sa/patches/AzaharPlus-git.patch b/projects/ROCKNIX/packages/emulators/standalone/azahar-sa/patches/common/0003-common-file-paths.patch similarity index 58% rename from projects/ROCKNIX/packages/emulators/standalone/azahar-sa/patches/AzaharPlus-git.patch rename to projects/ROCKNIX/packages/emulators/standalone/azahar-sa/patches/common/0003-common-file-paths.patch index 6d831d783c..e047368d03 100644 --- a/projects/ROCKNIX/packages/emulators/standalone/azahar-sa/patches/AzaharPlus-git.patch +++ b/projects/ROCKNIX/packages/emulators/standalone/azahar-sa/patches/common/0003-common-file-paths.patch @@ -1,31 +1,13 @@ -diff --git a/src/citra_qt/citra_qt.cpp b/src/citra_qt/citra_qt.cpp -index 136989a67..a84e1498e 100644 ---- a/src/citra_qt/citra_qt.cpp -+++ b/src/citra_qt/citra_qt.cpp -@@ -2720,10 +2720,6 @@ void GMainWindow::ToggleScreenLayout() { - case Settings::LayoutOption::HybridScreen: - return Settings::LayoutOption::SideScreen; - case Settings::LayoutOption::SideScreen: -- return Settings::LayoutOption::SeparateWindows; -- case Settings::LayoutOption::SeparateWindows: -- return Settings::LayoutOption::CustomLayout; -- case Settings::LayoutOption::CustomLayout: - return Settings::LayoutOption::Default; - default: - LOG_ERROR(Frontend, "Unknown layout option {}", -diff --git a/src/citra_sdl/emu_window/emu_window_sdl2_vk.cpp b/src/citra_sdl/emu_window/emu_window_sdl2_vk.cpp -index b002c15bb..33b6a365f 100644 ---- a/src/citra_sdl/emu_window/emu_window_sdl2_vk.cpp -+++ b/src/citra_sdl/emu_window/emu_window_sdl2_vk.cpp -@@ -24,7 +24,7 @@ EmuWindow_SDL2_VK::EmuWindow_SDL2_VK(Core::System& system, bool fullscreen, bool - SDL_WINDOWPOS_UNDEFINED, // x position - SDL_WINDOWPOS_UNDEFINED, // y position - Core::kScreenTopWidth, Core::kScreenTopHeight + Core::kScreenBottomHeight, -- SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI); -+ SDL_WINDOW_VULKAN | SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI); - SDL_SysWMinfo wm; - SDL_VERSION(&wm.version); - if (SDL_GetWindowWMInfo(render_window, &wm) == SDL_FALSE) { +From dc5229925ce5383658888a8457bc45eee38d42b6 Mon Sep 17 00:00:00 2001 +From: John Williams +Date: Fri, 10 Oct 2025 09:41:10 +1100 +Subject: [PATCH 3/4] common - file paths + +--- + src/common/common_paths.h | 15 ++++++++------- + src/common/file_util.cpp | 4 ++-- + 2 files changed, 10 insertions(+), 9 deletions(-) + diff --git a/src/common/common_paths.h b/src/common/common_paths.h index 49155702a..166e8a6ea 100644 --- a/src/common/common_paths.h @@ -61,7 +43,7 @@ index 49155702a..166e8a6ea 100644 #define DLL_DIR "external_dlls" #define SHADER_DIR "shaders" diff --git a/src/common/file_util.cpp b/src/common/file_util.cpp -index 847cdad55..1e84c56a0 100644 +index c740e8416..dc5591713 100644 --- a/src/common/file_util.cpp +++ b/src/common/file_util.cpp @@ -866,7 +866,7 @@ void SetUserPath(const std::string& path) { @@ -82,3 +64,6 @@ index 847cdad55..1e84c56a0 100644 g_default_paths = g_paths; } +-- +2.47.3 + diff --git a/projects/ROCKNIX/packages/emulators/standalone/azahar-sa/patches/prefer_gles/0004-Enable-use_gles-for-OpenGL-ES-rendering.patch b/projects/ROCKNIX/packages/emulators/standalone/azahar-sa/patches/prefer_gles/0004-Enable-use_gles-for-OpenGL-ES-rendering.patch new file mode 100644 index 0000000000..1191facd0b --- /dev/null +++ b/projects/ROCKNIX/packages/emulators/standalone/azahar-sa/patches/prefer_gles/0004-Enable-use_gles-for-OpenGL-ES-rendering.patch @@ -0,0 +1,25 @@ +From 52bd8c1c93cb1bfb05e387e7ce8e42dfd53399cf Mon Sep 17 00:00:00 2001 +From: John Williams +Date: Fri, 10 Oct 2025 16:17:50 +1100 +Subject: [PATCH 4/4] Enable 'use_gles' for OpenGL ES rendering + +--- + src/common/settings.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/common/settings.h b/src/common/settings.h +index 77061db16..07f692aa1 100644 +--- a/src/common/settings.h ++++ b/src/common/settings.h +@@ -496,7 +496,7 @@ struct Values { + #endif + GraphicsAPI::Software, GraphicsAPI::Vulkan, "graphics_api"}; + SwitchableSetting physical_device{0, "physical_device"}; +- Setting use_gles{false, "use_gles"}; ++ Setting use_gles{true, "use_gles"}; + Setting renderer_debug{false, "renderer_debug"}; + Setting dump_command_buffers{false, "dump_command_buffers"}; + SwitchableSetting spirv_shader_gen{true, "spirv_shader_gen"}; +-- +2.47.3 + From fa5b1515e670ac457b37955bf90ae1cb7fd4e1a0 Mon Sep 17 00:00:00 2001 From: John Williams Date: Fri, 10 Oct 2025 22:51:32 +1100 Subject: [PATCH 04/11] wine - bump to 10.16 --- projects/ROCKNIX/packages/compat/wine/package.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/ROCKNIX/packages/compat/wine/package.mk b/projects/ROCKNIX/packages/compat/wine/package.mk index 0da2b4f85f..0831e5938e 100644 --- a/projects/ROCKNIX/packages/compat/wine/package.mk +++ b/projects/ROCKNIX/packages/compat/wine/package.mk @@ -2,7 +2,7 @@ # Copyright (C) 2024-present JELOS (https://github.com/JustEnoughLinuxOS) PKG_NAME="wine" -PKG_VERSION="10.15" +PKG_VERSION="10.16" PKG_LICENSE="MIT" PKG_SITE="https://github.com/Kron4ek/Wine-Builds" # Use the amd64 release as it supports running both 32-bit and 64-bit windows apps From 2b4294c3feb29673a845bcf5442a25d69bd75e78 Mon Sep 17 00:00:00 2001 From: John Williams Date: Sat, 11 Oct 2025 22:08:32 +1100 Subject: [PATCH 05/11] SM8550 - linux 6.17.1 kconfig olddefconfig --- .../devices/SM8550/linux/linux.aarch64.conf | 308 ++++++++++++------ 1 file changed, 212 insertions(+), 96 deletions(-) diff --git a/projects/ROCKNIX/devices/SM8550/linux/linux.aarch64.conf b/projects/ROCKNIX/devices/SM8550/linux/linux.aarch64.conf index e5226a52bf..d8937bf2e1 100644 --- a/projects/ROCKNIX/devices/SM8550/linux/linux.aarch64.conf +++ b/projects/ROCKNIX/devices/SM8550/linux/linux.aarch64.conf @@ -1,6 +1,6 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/arm64 6.16.9 Kernel Configuration +# Linux/arm64 6.17.1 Kernel Configuration # CONFIG_CC_VERSION_TEXT="aarch64-rocknix-linux-gnueabi-gcc-14.2.0 (GCC) 14.2.0" CONFIG_CC_IS_GCC=y @@ -11,18 +11,13 @@ CONFIG_AS_VERSION=24400 CONFIG_LD_IS_BFD=y CONFIG_LD_VERSION=24400 CONFIG_LLD_VERSION=0 -CONFIG_RUSTC_VERSION=108900 -CONFIG_RUSTC_LLVM_VERSION=200107 +CONFIG_RUSTC_VERSION=0 +CONFIG_RUSTC_LLVM_VERSION=0 CONFIG_CC_CAN_LINK=y -CONFIG_CC_HAS_ASM_GOTO_OUTPUT=y -CONFIG_CC_HAS_ASM_GOTO_TIED_OUTPUT=y CONFIG_TOOLS_SUPPORT_RELR=y CONFIG_CC_HAS_ASM_INLINE=y CONFIG_CC_HAS_NO_PROFILE_FN_ATTR=y CONFIG_LD_CAN_USE_KEEP_IN_OVERLAY=y -CONFIG_RUSTC_HAS_COERCE_POINTEE=y -CONFIG_RUSTC_HAS_SPAN_FILE=y -CONFIG_RUSTC_HAS_UNNECESSARY_TRANSMUTES=y CONFIG_PAHOLE_VERSION=0 CONFIG_IRQ_WORK=y CONFIG_BUILDTIME_TABLE_SORT=y @@ -94,6 +89,7 @@ CONFIG_NO_HZ_IDLE=y # CONFIG_NO_HZ_FULL is not set # CONFIG_NO_HZ is not set CONFIG_HIGH_RES_TIMERS=y +# CONFIG_POSIX_AUX_CLOCKS is not set # end of Timers subsystem CONFIG_BPF=y @@ -251,6 +247,7 @@ CONFIG_BUG=y CONFIG_ELF_CORE=y CONFIG_FUTEX=y CONFIG_FUTEX_PI=y +CONFIG_FUTEX_PRIVATE_HASH=y CONFIG_FUTEX_MPOL=y CONFIG_EPOLL=y CONFIG_SIGNALFD=y @@ -331,10 +328,12 @@ CONFIG_BUILTIN_RETURN_ADDRESS_STRIPS_PAC=y # CONFIG_ARCH_SUNXI is not set # CONFIG_ARCH_ALPINE is not set # CONFIG_ARCH_APPLE is not set +# CONFIG_ARCH_AXIADO is not set # CONFIG_ARCH_BCM is not set # CONFIG_ARCH_BERLIN is not set # CONFIG_ARCH_BITMAIN is not set # CONFIG_ARCH_BLAIZE is not set +# CONFIG_ARCH_CIX is not set # CONFIG_ARCH_EXYNOS is not set # CONFIG_ARCH_SPARX5 is not set # CONFIG_ARCH_K3 is not set @@ -343,6 +342,7 @@ CONFIG_BUILTIN_RETURN_ADDRESS_STRIPS_PAC=y # CONFIG_ARCH_KEEMBAY is not set # CONFIG_ARCH_MEDIATEK is not set # CONFIG_ARCH_MESON is not set +# CONFIG_ARCH_MMP is not set # CONFIG_ARCH_MVEBU is not set # CONFIG_ARCH_NXP is not set # CONFIG_ARCH_MA35 is not set @@ -354,6 +354,7 @@ CONFIG_ARCH_QCOM=y # CONFIG_ARCH_ROCKCHIP is not set # CONFIG_ARCH_SEATTLE is not set # CONFIG_ARCH_INTEL_SOCFPGA is not set +# CONFIG_ARCH_SOPHGO is not set # CONFIG_ARCH_STM32 is not set # CONFIG_ARCH_SYNQUACER is not set # CONFIG_ARCH_TEGRA is not set @@ -733,6 +734,7 @@ CONFIG_VIRTUALIZATION=y CONFIG_KVM=y # CONFIG_NVHE_EL2_DEBUG is not set # CONFIG_PTDUMP_STAGE2_DEBUGFS is not set +CONFIG_HAVE_LIVEPATCH=y CONFIG_CPU_MITIGATIONS=y # @@ -787,7 +789,7 @@ CONFIG_HAVE_ARCH_SECCOMP_FILTER=y CONFIG_SECCOMP=y CONFIG_SECCOMP_FILTER=y # CONFIG_SECCOMP_CACHE_DEBUG is not set -CONFIG_HAVE_ARCH_STACKLEAK=y +CONFIG_HAVE_ARCH_KSTACK_ERASE=y CONFIG_HAVE_STACKPROTECTOR=y CONFIG_STACKPROTECTOR=y CONFIG_STACKPROTECTOR_STRONG=y @@ -823,6 +825,7 @@ CONFIG_PAGE_SIZE_LESS_THAN_64KB=y CONFIG_PAGE_SIZE_LESS_THAN_256KB=y CONFIG_PAGE_SHIFT=12 CONFIG_ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT=y +CONFIG_HAVE_RELIABLE_STACKTRACE=y CONFIG_CLONE_BACKWARDS=y CONFIG_OLD_SIGSUSPEND3=y CONFIG_COMPAT_OLD_SIGACTION=y @@ -1056,13 +1059,12 @@ CONFIG_CMA=y # CONFIG_CMA_DEBUGFS is not set # CONFIG_CMA_SYSFS is not set CONFIG_CMA_AREAS=20 -CONFIG_PAGE_BLOCK_ORDER=10 +CONFIG_PAGE_BLOCK_MAX_ORDER=10 CONFIG_GENERIC_EARLY_IOREMAP=y # CONFIG_DEFERRED_STRUCT_PAGE_INIT is not set # CONFIG_IDLE_PAGE_TRACKING is not set CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y CONFIG_ARCH_HAS_CURRENT_STACK_POINTER=y -CONFIG_ARCH_HAS_PTE_DEVMAP=y CONFIG_ZONE_DMA=y CONFIG_ZONE_DMA32=y # CONFIG_ZONE_DEVICE is not set @@ -1196,7 +1198,6 @@ CONFIG_NF_CONNTRACK_EVENTS=y # CONFIG_NF_CONNTRACK_TIMEOUT is not set # CONFIG_NF_CONNTRACK_TIMESTAMP is not set # CONFIG_NF_CONNTRACK_LABELS is not set -CONFIG_NF_CT_PROTO_DCCP=y CONFIG_NF_CT_PROTO_SCTP=y CONFIG_NF_CT_PROTO_UDPLITE=y # CONFIG_NF_CONNTRACK_AMANDA is not set @@ -1215,6 +1216,7 @@ CONFIG_NF_NAT_MASQUERADE=y # CONFIG_NF_TABLES is not set CONFIG_NETFILTER_XTABLES=m # CONFIG_NETFILTER_XTABLES_COMPAT is not set +# CONFIG_NETFILTER_XTABLES_LEGACY is not set # # Xtables combined modules @@ -1226,11 +1228,8 @@ CONFIG_NETFILTER_XT_MARK=m # Xtables targets # # CONFIG_NETFILTER_XT_TARGET_AUDIT is not set -CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m # CONFIG_NETFILTER_XT_TARGET_CLASSIFY is not set # CONFIG_NETFILTER_XT_TARGET_CONNMARK is not set -# CONFIG_NETFILTER_XT_TARGET_DSCP is not set -# CONFIG_NETFILTER_XT_TARGET_HL is not set # CONFIG_NETFILTER_XT_TARGET_HMARK is not set # CONFIG_NETFILTER_XT_TARGET_IDLETIMER is not set # CONFIG_NETFILTER_XT_TARGET_LED is not set @@ -1244,9 +1243,7 @@ CONFIG_NETFILTER_XT_NAT=m # CONFIG_NETFILTER_XT_TARGET_REDIRECT is not set CONFIG_NETFILTER_XT_TARGET_MASQUERADE=m # CONFIG_NETFILTER_XT_TARGET_TEE is not set -# CONFIG_NETFILTER_XT_TARGET_TPROXY is not set # CONFIG_NETFILTER_XT_TARGET_TCPMSS is not set -# CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP is not set # # Xtables matches @@ -1350,7 +1347,6 @@ CONFIG_IP_VS_MH_TAB_INDEX=12 # IP: Netfilter Configuration # CONFIG_NF_DEFRAG_IPV4=m -CONFIG_IP_NF_IPTABLES_LEGACY=m # CONFIG_NF_SOCKET_IPV4 is not set # CONFIG_NF_TPROXY_IPV4 is not set # CONFIG_NF_DUP_IPV4 is not set @@ -1360,28 +1356,13 @@ CONFIG_NF_REJECT_IPV4=m CONFIG_IP_NF_IPTABLES=m # CONFIG_IP_NF_MATCH_AH is not set # CONFIG_IP_NF_MATCH_ECN is not set -# CONFIG_IP_NF_MATCH_RPFILTER is not set # CONFIG_IP_NF_MATCH_TTL is not set -CONFIG_IP_NF_FILTER=m -CONFIG_IP_NF_TARGET_REJECT=m # CONFIG_IP_NF_TARGET_SYNPROXY is not set -CONFIG_IP_NF_NAT=m -CONFIG_IP_NF_TARGET_MASQUERADE=m -# CONFIG_IP_NF_TARGET_NETMAP is not set -# CONFIG_IP_NF_TARGET_REDIRECT is not set -CONFIG_IP_NF_MANGLE=m -# CONFIG_IP_NF_TARGET_ECN is not set -# CONFIG_IP_NF_TARGET_TTL is not set -# CONFIG_IP_NF_RAW is not set -# CONFIG_IP_NF_SECURITY is not set -# CONFIG_IP_NF_ARPTABLES is not set -# CONFIG_IP_NF_ARPFILTER is not set # end of IP: Netfilter Configuration # # IPv6: Netfilter Configuration # -CONFIG_IP6_NF_IPTABLES_LEGACY=m # CONFIG_NF_SOCKET_IPV6 is not set # CONFIG_NF_TPROXY_IPV6 is not set # CONFIG_NF_DUP_IPV6 is not set @@ -1395,24 +1376,13 @@ CONFIG_IP6_NF_IPTABLES=m # CONFIG_IP6_NF_MATCH_HL is not set # CONFIG_IP6_NF_MATCH_IPV6HEADER is not set # CONFIG_IP6_NF_MATCH_MH is not set -# CONFIG_IP6_NF_MATCH_RPFILTER is not set # CONFIG_IP6_NF_MATCH_RT is not set # CONFIG_IP6_NF_MATCH_SRH is not set -# CONFIG_IP6_NF_TARGET_HL is not set -CONFIG_IP6_NF_FILTER=m -CONFIG_IP6_NF_TARGET_REJECT=m # CONFIG_IP6_NF_TARGET_SYNPROXY is not set -CONFIG_IP6_NF_MANGLE=m -# CONFIG_IP6_NF_RAW is not set -# CONFIG_IP6_NF_SECURITY is not set -CONFIG_IP6_NF_NAT=m -CONFIG_IP6_NF_TARGET_MASQUERADE=m -# CONFIG_IP6_NF_TARGET_NPT is not set # end of IPv6: Netfilter Configuration CONFIG_NF_DEFRAG_IPV6=m # CONFIG_NF_CONNTRACK_BRIDGE is not set -# CONFIG_BRIDGE_NF_EBTABLES_LEGACY is not set # CONFIG_BRIDGE_NF_EBTABLES is not set # CONFIG_IP_SCTP is not set # CONFIG_RDS is not set @@ -1468,6 +1438,7 @@ CONFIG_NET_SCH_MQPRIO=m CONFIG_NET_SCH_INGRESS=m # CONFIG_NET_SCH_PLUG is not set # CONFIG_NET_SCH_ETS is not set +# CONFIG_NET_SCH_DUALPI2 is not set # CONFIG_NET_SCH_DEFAULT is not set # @@ -1739,6 +1710,7 @@ CONFIG_PCIE_QCOM=y # CONFIG_PCI_ENDPOINT=y CONFIG_PCI_ENDPOINT_CONFIGFS=y +# CONFIG_PCI_ENDPOINT_MSI_DOORBELL is not set CONFIG_PCI_EPF_TEST=m # CONFIG_PCI_EPF_NTB is not set # end of PCI Endpoint @@ -1897,6 +1869,7 @@ CONFIG_EFI_EARLYCON=y CONFIG_EFI_CUSTOM_SSDT_OVERLAYS=y # CONFIG_EFI_DISABLE_RUNTIME is not set # CONFIG_EFI_COCO_SECRET is not set +# CONFIG_OVMF_DEBUG_LOG is not set CONFIG_EFI_SBAT_FILE="" # end of EFI (Extensible Firmware Interface) Support @@ -2117,7 +2090,6 @@ CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 # CONFIG_BLK_DEV_DRBD is not set # CONFIG_BLK_DEV_NBD is not set # CONFIG_BLK_DEV_RAM is not set -# CONFIG_CDROM_PKTCDVD is not set # CONFIG_ATA_OVER_ETH is not set CONFIG_VIRTIO_BLK=y # CONFIG_BLK_DEV_RBD is not set @@ -2194,6 +2166,7 @@ CONFIG_UACCE=m # CONFIG_GP_PCI1XXXX is not set # CONFIG_KEBA_CP500 is not set # CONFIG_AMD_SBRMI_I2C is not set +# CONFIG_MISC_RP1 is not set # end of Misc devices # @@ -2627,7 +2600,6 @@ CONFIG_INPUT_EVDEV=y CONFIG_INPUT_KEYBOARD=y CONFIG_KEYBOARD_ADC=m # CONFIG_KEYBOARD_ADP5588 is not set -# CONFIG_KEYBOARD_ADP5589 is not set CONFIG_KEYBOARD_ATKBD=y # CONFIG_KEYBOARD_QT1050 is not set # CONFIG_KEYBOARD_QT1070 is not set @@ -2835,6 +2807,8 @@ CONFIG_RMI4_F03_SERIO=y CONFIG_RMI4_2D_SENSOR=y CONFIG_RMI4_F11=y CONFIG_RMI4_F12=y +# CONFIG_RMI4_F1A is not set +# CONFIG_RMI4_F21 is not set CONFIG_RMI4_F30=y # CONFIG_RMI4_F34 is not set CONFIG_RMI4_F3A=y @@ -3189,6 +3163,13 @@ CONFIG_PTP_1588_CLOCK_VMCLOCK=y # CONFIG_PTP_1588_CLOCK_OCP is not set # end of PTP clock support +# +# DPLL device support +# +# CONFIG_ZL3073X_I2C is not set +# CONFIG_ZL3073X_SPI is not set +# end of DPLL device support + CONFIG_PINCTRL=y CONFIG_GENERIC_PINCTRL_GROUPS=y CONFIG_PINMUX=y @@ -3244,6 +3225,7 @@ CONFIG_PINCTRL_MSM=y # CONFIG_PINCTRL_SM6350 is not set # CONFIG_PINCTRL_SM6375 is not set # CONFIG_PINCTRL_SM7150 is not set +# CONFIG_PINCTRL_MILOS is not set # CONFIG_PINCTRL_SM8150 is not set # CONFIG_PINCTRL_SM8250 is not set # CONFIG_PINCTRL_SM8350 is not set @@ -3270,6 +3252,7 @@ CONFIG_PINCTRL_SM8550_LPASS_LPI=m # # end of Renesas pinctrl drivers +CONFIG_GPIOLIB_LEGACY=y CONFIG_GPIOLIB=y CONFIG_GPIOLIB_FASTPATH_LIMIT=512 CONFIG_OF_GPIO=y @@ -3726,10 +3709,12 @@ CONFIG_MFD_CORE=y # CONFIG_MFD_BCM590XX is not set # CONFIG_MFD_BD9571MWV is not set # CONFIG_MFD_AXP20X_I2C is not set +# CONFIG_MFD_CS40L50_I2C is not set +# CONFIG_MFD_CS40L50_SPI is not set # CONFIG_MFD_CS42L43_I2C is not set # CONFIG_MFD_CS42L43_SDW is not set +# CONFIG_MFD_LOCHNAGAR is not set # CONFIG_MFD_MADERA is not set -# CONFIG_MFD_MAX5970 is not set # CONFIG_PMIC_DA903X is not set # CONFIG_MFD_DA9052_SPI is not set # CONFIG_MFD_DA9052_I2C is not set @@ -3753,6 +3738,7 @@ CONFIG_MFD_CORE=y # CONFIG_MFD_88PM805 is not set # CONFIG_MFD_88PM860X is not set # CONFIG_MFD_88PM886_PMIC is not set +# CONFIG_MFD_MAX5970 is not set # CONFIG_MFD_MAX14577 is not set # CONFIG_MFD_MAX77541 is not set # CONFIG_MFD_MAX77620 is not set @@ -3821,7 +3807,6 @@ CONFIG_MFD_SYSCON=y # CONFIG_MFD_TC3589X is not set # CONFIG_MFD_TQMX86 is not set # CONFIG_MFD_VX855 is not set -# CONFIG_MFD_LOCHNAGAR is not set # CONFIG_MFD_ARIZONA_I2C is not set # CONFIG_MFD_ARIZONA_SPI is not set # CONFIG_MFD_WM8400 is not set @@ -3838,8 +3823,6 @@ CONFIG_MFD_SYSCON=y # CONFIG_MFD_WCD934X is not set # CONFIG_MFD_ATC260X_I2C is not set # CONFIG_MFD_QCOM_PM8008 is not set -# CONFIG_MFD_CS40L50_I2C is not set -# CONFIG_MFD_CS40L50_SPI is not set CONFIG_MFD_VEXPRESS_SYSREG=y # CONFIG_RAVE_SP_CORE is not set # CONFIG_MFD_INTEL_M10_BMC_SPI is not set @@ -3907,6 +3890,7 @@ CONFIG_REGULATOR_QCOM_SPMI=y CONFIG_REGULATOR_QCOM_USB_VBUS=y # CONFIG_REGULATOR_RAA215300 is not set # CONFIG_REGULATOR_RASPBERRYPI_TOUCHSCREEN_ATTINY is not set +# CONFIG_REGULATOR_RASPBERRYPI_TOUCHSCREEN_V2 is not set # CONFIG_REGULATOR_RT4801 is not set # CONFIG_REGULATOR_RT4803 is not set # CONFIG_REGULATOR_RT5190A is not set @@ -3937,6 +3921,7 @@ CONFIG_REGULATOR_VCTRL=m # CONFIG_REGULATOR_VQMMC_IPQ4019 is not set # CONFIG_REGULATOR_QCOM_LABIBB is not set # CONFIG_RC_CORE is not set +CONFIG_CEC_CORE=y # # CEC support @@ -4191,9 +4176,11 @@ CONFIG_DRM_DISPLAY_DP_AUX_CHARDEV=y CONFIG_DRM_DISPLAY_DP_HELPER=y CONFIG_DRM_DISPLAY_DSC_HELPER=y CONFIG_DRM_DISPLAY_HDMI_AUDIO_HELPER=y +CONFIG_DRM_DISPLAY_HDMI_CEC_HELPER=y CONFIG_DRM_DISPLAY_HDMI_HELPER=y CONFIG_DRM_DISPLAY_HDMI_STATE_HELPER=y CONFIG_DRM_EXEC=y +CONFIG_DRM_GPUVM=y CONFIG_DRM_GEM_SHMEM_HELPER=y CONFIG_DRM_SCHED=y @@ -4227,6 +4214,8 @@ CONFIG_DRM_SIMPLEDRM=y # CONFIG_DRM_VIRTIO_GPU is not set CONFIG_DRM_MSM=y CONFIG_DRM_MSM_GPU_STATE=y +CONFIG_DRM_MSM_KMS=y +CONFIG_DRM_MSM_KMS_FBDEV=y CONFIG_DRM_MSM_MDSS=y CONFIG_DRM_MSM_MDP4=y CONFIG_DRM_MSM_MDP5=y @@ -4270,6 +4259,7 @@ CONFIG_DRM_PANEL_LVDS=m # CONFIG_DRM_PANEL_HIMAX_HX8279 is not set # CONFIG_DRM_PANEL_HIMAX_HX83102 is not set # CONFIG_DRM_PANEL_HIMAX_HX83112A is not set +# CONFIG_DRM_PANEL_HIMAX_HX83112B is not set # CONFIG_DRM_PANEL_HIMAX_HX8394 is not set # CONFIG_DRM_PANEL_ILITEK_IL9322 is not set # CONFIG_DRM_PANEL_ILITEK_ILI9341 is not set @@ -4315,6 +4305,8 @@ CONFIG_DRM_PANEL_LVDS=m # CONFIG_DRM_PANEL_RAYDIUM_RM68200 is not set # CONFIG_DRM_PANEL_RAYDIUM_RM692E5 is not set # CONFIG_DRM_PANEL_RAYDIUM_RM69380 is not set +# CONFIG_DRM_PANEL_RENESAS_R61307 is not set +# CONFIG_DRM_PANEL_RENESAS_R69328 is not set # CONFIG_DRM_PANEL_RONBO_RB070D30 is not set # CONFIG_DRM_PANEL_SAMSUNG_AMS581VF01 is not set # CONFIG_DRM_PANEL_SAMSUNG_AMS639RQ08 is not set @@ -4485,7 +4477,6 @@ CONFIG_FB_EFI=y # CONFIG_FB_SM712 is not set CONFIG_FB_CORE=y CONFIG_FB_NOTIFY=y -# CONFIG_FIRMWARE_EDID is not set CONFIG_FB_DEVICE=y CONFIG_FB_CFB_FILLRECT=y CONFIG_FB_CFB_COPYAREA=y @@ -4550,6 +4541,7 @@ CONFIG_LOGO=y # CONFIG_LOGO_LINUX_MONO is not set # CONFIG_LOGO_LINUX_VGA16 is not set CONFIG_LOGO_LINUX_CLUT224=y +CONFIG_TRACE_GPU_MEM=y # end of Graphics support # CONFIG_DRM_ACCEL is not set @@ -4659,7 +4651,6 @@ CONFIG_SND_PCI=y # CONFIG_SND_HDA_ACPI is not set # end of HD-Audio -CONFIG_SND_HDA_PREALLOC_SIZE=64 # CONFIG_SND_SPI is not set CONFIG_SND_USB=y CONFIG_SND_USB_AUDIO=y @@ -4679,15 +4670,56 @@ CONFIG_SND_SOC_GENERIC_DMAENGINE_PCM=y CONFIG_SND_SOC_COMPRESS=y CONFIG_SND_SOC_TOPOLOGY=y # CONFIG_SND_SOC_USB is not set -# CONFIG_SND_SOC_ADI is not set -# CONFIG_SND_SOC_AMD_ACP is not set -# CONFIG_SND_AMD_ACP_CONFIG is not set -# CONFIG_SND_ATMEL_SOC is not set -# CONFIG_SND_BCM63XX_I2S_WHISTLER is not set -# CONFIG_SND_DESIGNWARE_I2S is not set # -# SoC Audio for Freescale CPUs +# Analog Devices +# +# CONFIG_SND_SOC_ADI_AXI_I2S is not set +# CONFIG_SND_SOC_ADI_AXI_SPDIF is not set +# end of Analog Devices + +# +# AMD +# +# CONFIG_SND_SOC_AMD_ACP is not set +# CONFIG_SND_AMD_ACP_CONFIG is not set +# end of AMD + +# +# Apple +# +# end of Apple + +# +# Atmel +# +# CONFIG_SND_SOC_MIKROE_PROTO is not set +# end of Atmel + +# +# Au1x +# +# end of Au1x + +# +# Broadcom +# +# CONFIG_SND_BCM63XX_I2S_WHISTLER is not set +# end of Broadcom + +# +# Cirrus Logic +# +# end of Cirrus Logic + +# +# DesignWare +# +# CONFIG_SND_DESIGNWARE_I2S is not set +# end of DesignWare + +# +# Freescale # # @@ -4706,18 +4738,51 @@ CONFIG_SND_SOC_FSL_EASRC=m CONFIG_SND_SOC_FSL_UTILS=m # CONFIG_SND_SOC_FSL_RPMSG is not set CONFIG_SND_SOC_IMX_AUDMUX=m -# end of SoC Audio for Freescale CPUs +# end of Freescale +# +# Google +# # CONFIG_SND_SOC_CHV3_I2S is not set +# end of Google + +# +# Hisilicon +# # CONFIG_SND_I2S_HI6210_I2S is not set +# end of Hisilicon # -# SoC Audio for Loongson CPUs +# JZ4740 # -# end of SoC Audio for Loongson CPUs +# end of JZ4740 -# CONFIG_SND_SOC_IMG is not set +# +# Kirkwood +# +# end of Kirkwood + +# +# Loongson +# +# end of Loongson + +# +# Intel +# +# end of Intel + +# +# Mediatek +# # CONFIG_SND_SOC_MTK_BTCVSD is not set +# end of Mediatek + +# +# PXA +# +# end of PXA + CONFIG_SND_SOC_QCOM=m CONFIG_SND_SOC_LPASS_CPU=m CONFIG_SND_SOC_LPASS_PLATFORM=m @@ -4748,23 +4813,53 @@ CONFIG_SND_SOC_SC8280XP=m # CONFIG_SND_SOC_SC7180 is not set # CONFIG_SND_SOC_SC7280 is not set # CONFIG_SND_SOC_X1E80100 is not set + +# +# SoundWire (SDCA) +# CONFIG_SND_SOC_SDCA_OPTIONAL=y +# end of SoundWire (SDCA) + +# +# ST SPEAr +# +# end of ST SPEAr + +# +# Spreadtrum +# +# end of Spreadtrum + +# +# STMicroelectronics STM32 +# +# end of STMicroelectronics STM32 + +# +# Tegra +# +# end of Tegra + +# +# Xilinx +# +# CONFIG_SND_SOC_XILINX_I2S is not set +# CONFIG_SND_SOC_XILINX_AUDIO_FORMATTER is not set +# CONFIG_SND_SOC_XILINX_SPDIF is not set +# end of Xilinx + +# +# Xtensa +# +# CONFIG_SND_SOC_XTFPGA_I2S is not set +# end of Xtensa + CONFIG_SND_SOC_SOF_TOPLEVEL=y # CONFIG_SND_SOC_SOF_PCI is not set # CONFIG_SND_SOC_SOF_ACPI is not set CONFIG_SND_SOC_SOF_OF=y # CONFIG_SND_SOC_SOF_IMX_TOPLEVEL is not set CONFIG_SND_SOC_SOF_MTK_TOPLEVEL=y - -# -# STMicroelectronics STM32 SOC audio support -# -# end of STMicroelectronics STM32 SOC audio support - -# CONFIG_SND_SOC_XILINX_I2S is not set -# CONFIG_SND_SOC_XILINX_AUDIO_FORMATTER is not set -# CONFIG_SND_SOC_XILINX_SPDIF is not set -# CONFIG_SND_SOC_XTFPGA_I2S is not set CONFIG_SND_SOC_I2C_AND_SPI=y # @@ -4906,6 +5001,7 @@ CONFIG_SND_SOC_HDMI_CODEC=y # CONFIG_SND_SOC_RT9120 is not set # CONFIG_SND_SOC_RT9123 is not set # CONFIG_SND_SOC_RT9123P is not set +# CONFIG_SND_SOC_RTQ9124 is not set # CONFIG_SND_SOC_RTQ9128 is not set # CONFIG_SND_SOC_SGTL5000 is not set CONFIG_SND_SOC_SIMPLE_AMPLIFIER=m @@ -5009,12 +5105,17 @@ CONFIG_SND_SOC_LPASS_RX_MACRO=m CONFIG_SND_SOC_LPASS_TX_MACRO=m # end of CODEC drivers +# +# Generic drivers +# CONFIG_SND_SIMPLE_CARD_UTILS=m CONFIG_SND_SIMPLE_CARD=m CONFIG_SND_AUDIO_GRAPH_CARD=m CONFIG_SND_AUDIO_GRAPH_CARD2=m # CONFIG_SND_AUDIO_GRAPH_CARD2_CUSTOM_SAMPLE is not set # CONFIG_SND_TEST_COMPONENT is not set +# end of Generic drivers + # CONFIG_SND_VIRTIO is not set CONFIG_HID_SUPPORT=y CONFIG_HID=y @@ -5646,7 +5747,6 @@ CONFIG_RTC_INTF_DEV=y # CONFIG_RTC_DRV_ISL12026 is not set # CONFIG_RTC_DRV_X1205 is not set # CONFIG_RTC_DRV_PCF8523 is not set -# CONFIG_RTC_DRV_PCF85063 is not set # CONFIG_RTC_DRV_PCF85363 is not set # CONFIG_RTC_DRV_PCF8563 is not set # CONFIG_RTC_DRV_PCF8583 is not set @@ -5689,6 +5789,7 @@ CONFIG_RTC_I2C_AND_SPI=y # # CONFIG_RTC_DRV_DS3232 is not set # CONFIG_RTC_DRV_PCF2127 is not set +# CONFIG_RTC_DRV_PCF85063 is not set # CONFIG_RTC_DRV_RV3029C2 is not set # CONFIG_RTC_DRV_RX6110 is not set @@ -5968,12 +6069,17 @@ CONFIG_QCOM_CLK_RPMH=y # CONFIG_MSM_MMCC_8998 is not set # CONFIG_QCM_GCC_2290 is not set # CONFIG_QCM_DISPCC_2290 is not set +# CONFIG_QCS_DISPCC_615 is not set +# CONFIG_QCS_CAMCC_615 is not set # CONFIG_QCS_GCC_404 is not set # CONFIG_SA_CAMCC_8775P is not set # CONFIG_QCS_GCC_8300 is not set # CONFIG_QCS_GCC_615 is not set +# CONFIG_QCS_GPUCC_615 is not set +# CONFIG_QCS_VIDEOCC_615 is not set # CONFIG_SC_CAMCC_7180 is not set # CONFIG_SC_CAMCC_7280 is not set +# CONFIG_SC_CAMCC_8180X is not set # CONFIG_SC_CAMCC_8280XP is not set # CONFIG_SA_DISPCC_8775P is not set # CONFIG_SC_DISPCC_7180 is not set @@ -6013,6 +6119,7 @@ CONFIG_QCOM_CLK_RPMH=y # CONFIG_SM_CAMCC_4450 is not set # CONFIG_SM_CAMCC_6350 is not set # CONFIG_SM_CAMCC_7150 is not set +# CONFIG_SM_CAMCC_MILOS is not set # CONFIG_SM_CAMCC_8150 is not set # CONFIG_SM_CAMCC_8250 is not set # CONFIG_SM_CAMCC_8450 is not set @@ -6025,6 +6132,7 @@ CONFIG_SM_DISPCC_8550=y # CONFIG_SM_GCC_6350 is not set # CONFIG_SM_GCC_6375 is not set # CONFIG_SM_GCC_7150 is not set +# CONFIG_SM_GCC_MILOS is not set # CONFIG_SM_GCC_8150 is not set # CONFIG_SM_GCC_8250 is not set # CONFIG_SM_GCC_8350 is not set @@ -6037,6 +6145,7 @@ CONFIG_SM_GCC_8550=y # CONFIG_SM_GPUCC_6125 is not set # CONFIG_SM_GPUCC_6375 is not set # CONFIG_SM_GPUCC_6350 is not set +# CONFIG_SM_GPUCC_MILOS is not set # CONFIG_SM_GPUCC_8150 is not set # CONFIG_SM_GPUCC_8250 is not set # CONFIG_SM_GPUCC_8350 is not set @@ -6048,7 +6157,9 @@ CONFIG_SM_TCSRCC_8550=y # CONFIG_SM_TCSRCC_8650 is not set # CONFIG_SM_TCSRCC_8750 is not set # CONFIG_SA_VIDEOCC_8775P is not set +# CONFIG_SM_VIDEOCC_6350 is not set # CONFIG_SM_VIDEOCC_7150 is not set +# CONFIG_SM_VIDEOCC_MILOS is not set # CONFIG_SM_VIDEOCC_8150 is not set # CONFIG_SM_VIDEOCC_8250 is not set # CONFIG_SM_VIDEOCC_8350 is not set @@ -6237,6 +6348,7 @@ CONFIG_QCOM_ICC_BWMON=y CONFIG_QCOM_PBS=y # end of Qualcomm SoC drivers +CONFIG_QCOM_UBWC_CONFIG=y # CONFIG_SOC_TI is not set # @@ -6291,6 +6403,7 @@ CONFIG_DEVFREQ_GOV_PASSIVE=m # # DEVFREQ Drivers # +# CONFIG_ARM_HISI_UNCORE_DEVFREQ is not set # CONFIG_PM_DEVFREQ_EVENT is not set CONFIG_EXTCON=y @@ -6380,7 +6493,9 @@ CONFIG_IIO_CONSUMERS_PER_TRIGGER=2 # # CONFIG_AD4000 is not set # CONFIG_AD4030 is not set +# CONFIG_AD4080 is not set # CONFIG_AD4130 is not set +# CONFIG_AD4170_4 is not set # CONFIG_AD4695 is not set # CONFIG_AD4851 is not set # CONFIG_AD7091R5 is not set @@ -6866,6 +6981,7 @@ CONFIG_QCOM_SPMI_ADC5=y # # Proximity and distance sensors # +# CONFIG_D3323AA is not set # CONFIG_HX9023S is not set # CONFIG_IRSD200 is not set # CONFIG_ISL29501 is not set @@ -6914,6 +7030,7 @@ CONFIG_QCOM_SPMI_ADC5=y # CONFIG_NTB is not set CONFIG_PWM=y # CONFIG_PWM_DEBUG is not set +# CONFIG_PWM_ARGON_FAN_HAT is not set # CONFIG_PWM_ATMEL_TCB is not set # CONFIG_PWM_CLK is not set # CONFIG_PWM_DWC is not set @@ -6932,7 +7049,9 @@ CONFIG_ARM_GIC=y CONFIG_ARM_GIC_MAX_NR=1 CONFIG_ARM_GIC_V2M=y CONFIG_ARM_GIC_V3=y +CONFIG_ARM_GIC_ITS_PARENT=y CONFIG_ARM_GIC_V3_ITS=y +CONFIG_ARM_GIC_V5=y CONFIG_IRQ_MSI_LIB=y # CONFIG_AL_FIC is not set # CONFIG_XILINX_INTC is not set @@ -6992,6 +7111,7 @@ CONFIG_PHY_QCOM_QUSB2=m CONFIG_PHY_QCOM_EUSB2_REPEATER=y CONFIG_PHY_QCOM_M31_USB=m # CONFIG_PHY_QCOM_UNIPHY_PCIE_28LP is not set +# CONFIG_PHY_QCOM_M31_EUSB is not set CONFIG_PHY_QCOM_USB_HS=m CONFIG_PHY_QCOM_USB_SNPS_FEMTO_V2=m # CONFIG_PHY_QCOM_USB_HSIC is not set @@ -7022,6 +7142,7 @@ CONFIG_ARM_DSU_PMU=m CONFIG_QCOM_L2_PMU=y CONFIG_QCOM_L3_PMU=y CONFIG_ARM_SPE_PMU=m +CONFIG_ARM64_BRBE=y CONFIG_ARM_DMC620_PMU=m # CONFIG_ALIBABA_UNCORE_DRW_PMU is not set CONFIG_HISI_PMU=y @@ -7042,7 +7163,6 @@ CONFIG_RAS=y # CONFIG_ANDROID_BINDER_IPC is not set # end of Android -CONFIG_TRACE_GPU_MEM=y # CONFIG_LIBNVDIMM is not set # CONFIG_DAX is not set CONFIG_NVMEM=y @@ -7131,6 +7251,7 @@ CONFIG_INTERCONNECT_QCOM_RPMH=y # CONFIG_INTERCONNECT_QCOM_SM6115 is not set # CONFIG_INTERCONNECT_QCOM_SM6350 is not set # CONFIG_INTERCONNECT_QCOM_SM7150 is not set +# CONFIG_INTERCONNECT_QCOM_MILOS is not set # CONFIG_INTERCONNECT_QCOM_SM8150 is not set # CONFIG_INTERCONNECT_QCOM_SM8250 is not set # CONFIG_INTERCONNECT_QCOM_SM8350 is not set @@ -7662,16 +7783,12 @@ CONFIG_CRYPTO_USER_API_RNG=y CONFIG_CRYPTO_USER_API_ENABLE_OBSOLETE=y # end of Userspace interface -CONFIG_CRYPTO_HASH_INFO=y # CONFIG_CRYPTO_NHPOLY1305_NEON is not set # # Accelerated Cryptographic Algorithms for CPU (arm64) # CONFIG_CRYPTO_GHASH_ARM64_CE=y -CONFIG_CRYPTO_SHA1_ARM64_CE=y -CONFIG_CRYPTO_SHA512_ARM64=y -CONFIG_CRYPTO_SHA512_ARM64_CE=y CONFIG_CRYPTO_SHA3_ARM64=m # CONFIG_CRYPTO_SM3_NEON is not set CONFIG_CRYPTO_SM3_ARM64_CE=m @@ -7764,10 +7881,21 @@ CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y CONFIG_ARCH_HAS_FAST_MULTIPLIER=y CONFIG_ARCH_USE_SYM_ANNOTATIONS=y CONFIG_INDIRECT_PIO=y +CONFIG_CRC7=y +CONFIG_CRC8=y +CONFIG_CRC16=y +CONFIG_CRC_ITU_T=y +CONFIG_CRC_T10DIF=y +CONFIG_CRC_T10DIF_ARCH=y +CONFIG_CRC32=y +CONFIG_CRC32_ARCH=y +CONFIG_CRC64=y +CONFIG_CRC_OPTIMIZATIONS=y # # Crypto library routines # +CONFIG_CRYPTO_HASH_INFO=y CONFIG_CRYPTO_LIB_UTILS=y CONFIG_CRYPTO_LIB_AES=y CONFIG_CRYPTO_LIB_ARC4=m @@ -7785,28 +7913,16 @@ CONFIG_CRYPTO_ARCH_HAVE_LIB_POLY1305=y CONFIG_CRYPTO_LIB_POLY1305=m CONFIG_CRYPTO_LIB_CHACHA20POLY1305=m CONFIG_CRYPTO_LIB_SHA1=y +CONFIG_CRYPTO_LIB_SHA1_ARCH=y CONFIG_CRYPTO_LIB_SHA256=y -CONFIG_CRYPTO_ARCH_HAVE_LIB_SHA256=y -CONFIG_CRYPTO_ARCH_HAVE_LIB_SHA256_SIMD=y -CONFIG_CRYPTO_LIB_SHA256_GENERIC=y +CONFIG_CRYPTO_LIB_SHA256_ARCH=y +CONFIG_CRYPTO_LIB_SHA512=y +CONFIG_CRYPTO_LIB_SHA512_ARCH=y CONFIG_CRYPTO_LIB_SM3=m CONFIG_CRYPTO_CHACHA20_NEON=m CONFIG_CRYPTO_POLY1305_NEON=m -CONFIG_CRYPTO_SHA256_ARM64=y # end of Crypto library routines -CONFIG_CRC16=y -CONFIG_CRC_T10DIF=y -CONFIG_ARCH_HAS_CRC_T10DIF=y -CONFIG_CRC_T10DIF_ARCH=y -CONFIG_CRC_ITU_T=y -CONFIG_CRC32=y -CONFIG_ARCH_HAS_CRC32=y -CONFIG_CRC32_ARCH=y -CONFIG_CRC64=y -CONFIG_CRC7=y -CONFIG_CRC8=y -CONFIG_CRC_OPTIMIZATIONS=y CONFIG_XXHASH=y CONFIG_AUDIT_GENERIC=y CONFIG_AUDIT_ARCH_COMPAT_GENERIC=y @@ -8115,8 +8231,8 @@ CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y CONFIG_HAVE_FUNCTION_GRAPH_FREGS=y CONFIG_HAVE_FTRACE_GRAPH_FUNC=y CONFIG_HAVE_DYNAMIC_FTRACE=y +CONFIG_HAVE_EXTRA_IPI_TRACEPOINTS=y CONFIG_HAVE_DYNAMIC_FTRACE_WITH_ARGS=y -CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y CONFIG_HAVE_SYSCALL_TRACEPOINTS=y CONFIG_HAVE_C_RECORDMCOUNT=y CONFIG_HAVE_BUILDTIME_MCOUNT_SORT=y From 739fa5352c1ea6db96b7b1b1697012421dfbe7b9 Mon Sep 17 00:00:00 2001 From: John Williams Date: Sat, 11 Oct 2025 22:10:07 +1100 Subject: [PATCH 06/11] SM8550 - linux 6.17.1 kconfig - enable NTSYNC --- projects/ROCKNIX/devices/SM8550/linux/linux.aarch64.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/ROCKNIX/devices/SM8550/linux/linux.aarch64.conf b/projects/ROCKNIX/devices/SM8550/linux/linux.aarch64.conf index d8937bf2e1..acbbd54e90 100644 --- a/projects/ROCKNIX/devices/SM8550/linux/linux.aarch64.conf +++ b/projects/ROCKNIX/devices/SM8550/linux/linux.aarch64.conf @@ -2134,7 +2134,7 @@ CONFIG_PCI_ENDPOINT_TEST=m # CONFIG_XILINX_SDFEC is not set # CONFIG_HISI_HIKEY_USB is not set # CONFIG_OPEN_DICE is not set -# CONFIG_NTSYNC is not set +CONFIG_NTSYNC=y # CONFIG_VCPU_STALL_DETECTOR is not set # CONFIG_NSM is not set # CONFIG_MCHP_LAN966X_PCI is not set From 86ed0c163ef8630cbd3041b4feda9dfd2b925854 Mon Sep 17 00:00:00 2001 From: John Williams Date: Sun, 12 Oct 2025 01:10:56 +1100 Subject: [PATCH 07/11] linux 6.12-LTS - add ntsync driver patch --- .../linux/patches/6.12-LTS/0013-ntsync.patch | 3038 +++++++++++++++++ 1 file changed, 3038 insertions(+) create mode 100644 projects/ROCKNIX/packages/linux/patches/6.12-LTS/0013-ntsync.patch diff --git a/projects/ROCKNIX/packages/linux/patches/6.12-LTS/0013-ntsync.patch b/projects/ROCKNIX/packages/linux/patches/6.12-LTS/0013-ntsync.patch new file mode 100644 index 0000000000..80db443801 --- /dev/null +++ b/projects/ROCKNIX/packages/linux/patches/6.12-LTS/0013-ntsync.patch @@ -0,0 +1,3038 @@ +From 2ac5ccc07581a184e2bfdd6e5a6c875aae9ee0e1 Mon Sep 17 00:00:00 2001 +From: Peter Jung +Date: Tue, 26 Aug 2025 15:42:14 +0200 +Subject: [PATCH 5/7] ntsync + +Signed-off-by: Peter Jung +--- + Documentation/userspace-api/index.rst | 1 + + Documentation/userspace-api/ntsync.rst | 385 +++++ + MAINTAINERS | 9 + + drivers/misc/Kconfig | 1 - + drivers/misc/ntsync.c | 993 +++++++++++- + include/uapi/linux/ntsync.h | 42 +- + tools/testing/selftests/Makefile | 1 + + .../selftests/drivers/ntsync/.gitignore | 1 + + .../testing/selftests/drivers/ntsync/Makefile | 7 + + tools/testing/selftests/drivers/ntsync/config | 1 + + .../testing/selftests/drivers/ntsync/ntsync.c | 1343 +++++++++++++++++ + 11 files changed, 2768 insertions(+), 16 deletions(-) + create mode 100644 Documentation/userspace-api/ntsync.rst + create mode 100644 tools/testing/selftests/drivers/ntsync/.gitignore + create mode 100644 tools/testing/selftests/drivers/ntsync/Makefile + create mode 100644 tools/testing/selftests/drivers/ntsync/config + create mode 100644 tools/testing/selftests/drivers/ntsync/ntsync.c + +diff --git a/Documentation/userspace-api/index.rst b/Documentation/userspace-api/index.rst +index 274cc7546efc..9c1b15cd89ab 100644 +--- a/Documentation/userspace-api/index.rst ++++ b/Documentation/userspace-api/index.rst +@@ -63,6 +63,7 @@ Everything else + vduse + futex2 + perf_ring_buffer ++ ntsync + + .. only:: subproject and html + +diff --git a/Documentation/userspace-api/ntsync.rst b/Documentation/userspace-api/ntsync.rst +new file mode 100644 +index 000000000000..25e7c4aef968 +--- /dev/null ++++ b/Documentation/userspace-api/ntsync.rst +@@ -0,0 +1,385 @@ ++=================================== ++NT synchronization primitive driver ++=================================== ++ ++This page documents the user-space API for the ntsync driver. ++ ++ntsync is a support driver for emulation of NT synchronization ++primitives by user-space NT emulators. It exists because implementation ++in user-space, using existing tools, cannot match Windows performance ++while offering accurate semantics. It is implemented entirely in ++software, and does not drive any hardware device. ++ ++This interface is meant as a compatibility tool only, and should not ++be used for general synchronization. Instead use generic, versatile ++interfaces such as futex(2) and poll(2). ++ ++Synchronization primitives ++========================== ++ ++The ntsync driver exposes three types of synchronization primitives: ++semaphores, mutexes, and events. ++ ++A semaphore holds a single volatile 32-bit counter, and a static 32-bit ++integer denoting the maximum value. It is considered signaled (that is, ++can be acquired without contention, or will wake up a waiting thread) ++when the counter is nonzero. The counter is decremented by one when a ++wait is satisfied. Both the initial and maximum count are established ++when the semaphore is created. ++ ++A mutex holds a volatile 32-bit recursion count, and a volatile 32-bit ++identifier denoting its owner. A mutex is considered signaled when its ++owner is zero (indicating that it is not owned). The recursion count is ++incremented when a wait is satisfied, and ownership is set to the given ++identifier. ++ ++A mutex also holds an internal flag denoting whether its previous owner ++has died; such a mutex is said to be abandoned. Owner death is not ++tracked automatically based on thread death, but rather must be ++communicated using ``NTSYNC_IOC_MUTEX_KILL``. An abandoned mutex is ++inherently considered unowned. ++ ++Except for the "unowned" semantics of zero, the actual value of the ++owner identifier is not interpreted by the ntsync driver at all. The ++intended use is to store a thread identifier; however, the ntsync ++driver does not actually validate that a calling thread provides ++consistent or unique identifiers. ++ ++An event is similar to a semaphore with a maximum count of one. It holds ++a volatile boolean state denoting whether it is signaled or not. There ++are two types of events, auto-reset and manual-reset. An auto-reset ++event is designaled when a wait is satisfied; a manual-reset event is ++not. The event type is specified when the event is created. ++ ++Unless specified otherwise, all operations on an object are atomic and ++totally ordered with respect to other operations on the same object. ++ ++Objects are represented by files. When all file descriptors to an ++object are closed, that object is deleted. ++ ++Char device ++=========== ++ ++The ntsync driver creates a single char device /dev/ntsync. Each file ++description opened on the device represents a unique instance intended ++to back an individual NT virtual machine. Objects created by one ntsync ++instance may only be used with other objects created by the same ++instance. ++ ++ioctl reference ++=============== ++ ++All operations on the device are done through ioctls. There are four ++structures used in ioctl calls:: ++ ++ struct ntsync_sem_args { ++ __u32 count; ++ __u32 max; ++ }; ++ ++ struct ntsync_mutex_args { ++ __u32 owner; ++ __u32 count; ++ }; ++ ++ struct ntsync_event_args { ++ __u32 signaled; ++ __u32 manual; ++ }; ++ ++ struct ntsync_wait_args { ++ __u64 timeout; ++ __u64 objs; ++ __u32 count; ++ __u32 owner; ++ __u32 index; ++ __u32 alert; ++ __u32 flags; ++ __u32 pad; ++ }; ++ ++Depending on the ioctl, members of the structure may be used as input, ++output, or not at all. ++ ++The ioctls on the device file are as follows: ++ ++.. c:macro:: NTSYNC_IOC_CREATE_SEM ++ ++ Create a semaphore object. Takes a pointer to struct ++ :c:type:`ntsync_sem_args`, which is used as follows: ++ ++ .. list-table:: ++ ++ * - ``count`` ++ - Initial count of the semaphore. ++ * - ``max`` ++ - Maximum count of the semaphore. ++ ++ Fails with ``EINVAL`` if ``count`` is greater than ``max``. ++ On success, returns a file descriptor the created semaphore. ++ ++.. c:macro:: NTSYNC_IOC_CREATE_MUTEX ++ ++ Create a mutex object. Takes a pointer to struct ++ :c:type:`ntsync_mutex_args`, which is used as follows: ++ ++ .. list-table:: ++ ++ * - ``count`` ++ - Initial recursion count of the mutex. ++ * - ``owner`` ++ - Initial owner of the mutex. ++ ++ If ``owner`` is nonzero and ``count`` is zero, or if ``owner`` is ++ zero and ``count`` is nonzero, the function fails with ``EINVAL``. ++ On success, returns a file descriptor the created mutex. ++ ++.. c:macro:: NTSYNC_IOC_CREATE_EVENT ++ ++ Create an event object. Takes a pointer to struct ++ :c:type:`ntsync_event_args`, which is used as follows: ++ ++ .. list-table:: ++ ++ * - ``signaled`` ++ - If nonzero, the event is initially signaled, otherwise ++ nonsignaled. ++ * - ``manual`` ++ - If nonzero, the event is a manual-reset event, otherwise ++ auto-reset. ++ ++ On success, returns a file descriptor the created event. ++ ++The ioctls on the individual objects are as follows: ++ ++.. c:macro:: NTSYNC_IOC_SEM_POST ++ ++ Post to a semaphore object. Takes a pointer to a 32-bit integer, ++ which on input holds the count to be added to the semaphore, and on ++ output contains its previous count. ++ ++ If adding to the semaphore's current count would raise the latter ++ past the semaphore's maximum count, the ioctl fails with ++ ``EOVERFLOW`` and the semaphore is not affected. If raising the ++ semaphore's count causes it to become signaled, eligible threads ++ waiting on this semaphore will be woken and the semaphore's count ++ decremented appropriately. ++ ++.. c:macro:: NTSYNC_IOC_MUTEX_UNLOCK ++ ++ Release a mutex object. Takes a pointer to struct ++ :c:type:`ntsync_mutex_args`, which is used as follows: ++ ++ .. list-table:: ++ ++ * - ``owner`` ++ - Specifies the owner trying to release this mutex. ++ * - ``count`` ++ - On output, contains the previous recursion count. ++ ++ If ``owner`` is zero, the ioctl fails with ``EINVAL``. If ``owner`` ++ is not the current owner of the mutex, the ioctl fails with ++ ``EPERM``. ++ ++ The mutex's count will be decremented by one. If decrementing the ++ mutex's count causes it to become zero, the mutex is marked as ++ unowned and signaled, and eligible threads waiting on it will be ++ woken as appropriate. ++ ++.. c:macro:: NTSYNC_IOC_SET_EVENT ++ ++ Signal an event object. Takes a pointer to a 32-bit integer, which on ++ output contains the previous state of the event. ++ ++ Eligible threads will be woken, and auto-reset events will be ++ designaled appropriately. ++ ++.. c:macro:: NTSYNC_IOC_RESET_EVENT ++ ++ Designal an event object. Takes a pointer to a 32-bit integer, which ++ on output contains the previous state of the event. ++ ++.. c:macro:: NTSYNC_IOC_PULSE_EVENT ++ ++ Wake threads waiting on an event object while leaving it in an ++ unsignaled state. Takes a pointer to a 32-bit integer, which on ++ output contains the previous state of the event. ++ ++ A pulse operation can be thought of as a set followed by a reset, ++ performed as a single atomic operation. If two threads are waiting on ++ an auto-reset event which is pulsed, only one will be woken. If two ++ threads are waiting a manual-reset event which is pulsed, both will ++ be woken. However, in both cases, the event will be unsignaled ++ afterwards, and a simultaneous read operation will always report the ++ event as unsignaled. ++ ++.. c:macro:: NTSYNC_IOC_READ_SEM ++ ++ Read the current state of a semaphore object. Takes a pointer to ++ struct :c:type:`ntsync_sem_args`, which is used as follows: ++ ++ .. list-table:: ++ ++ * - ``count`` ++ - On output, contains the current count of the semaphore. ++ * - ``max`` ++ - On output, contains the maximum count of the semaphore. ++ ++.. c:macro:: NTSYNC_IOC_READ_MUTEX ++ ++ Read the current state of a mutex object. Takes a pointer to struct ++ :c:type:`ntsync_mutex_args`, which is used as follows: ++ ++ .. list-table:: ++ ++ * - ``owner`` ++ - On output, contains the current owner of the mutex, or zero ++ if the mutex is not currently owned. ++ * - ``count`` ++ - On output, contains the current recursion count of the mutex. ++ ++ If the mutex is marked as abandoned, the function fails with ++ ``EOWNERDEAD``. In this case, ``count`` and ``owner`` are set to ++ zero. ++ ++.. c:macro:: NTSYNC_IOC_READ_EVENT ++ ++ Read the current state of an event object. Takes a pointer to struct ++ :c:type:`ntsync_event_args`, which is used as follows: ++ ++ .. list-table:: ++ ++ * - ``signaled`` ++ - On output, contains the current state of the event. ++ * - ``manual`` ++ - On output, contains 1 if the event is a manual-reset event, ++ and 0 otherwise. ++ ++.. c:macro:: NTSYNC_IOC_KILL_OWNER ++ ++ Mark a mutex as unowned and abandoned if it is owned by the given ++ owner. Takes an input-only pointer to a 32-bit integer denoting the ++ owner. If the owner is zero, the ioctl fails with ``EINVAL``. If the ++ owner does not own the mutex, the function fails with ``EPERM``. ++ ++ Eligible threads waiting on the mutex will be woken as appropriate ++ (and such waits will fail with ``EOWNERDEAD``, as described below). ++ ++.. c:macro:: NTSYNC_IOC_WAIT_ANY ++ ++ Poll on any of a list of objects, atomically acquiring at most one. ++ Takes a pointer to struct :c:type:`ntsync_wait_args`, which is ++ used as follows: ++ ++ .. list-table:: ++ ++ * - ``timeout`` ++ - Absolute timeout in nanoseconds. If ``NTSYNC_WAIT_REALTIME`` ++ is set, the timeout is measured against the REALTIME clock; ++ otherwise it is measured against the MONOTONIC clock. If the ++ timeout is equal to or earlier than the current time, the ++ function returns immediately without sleeping. If ``timeout`` ++ is U64_MAX, the function will sleep until an object is ++ signaled, and will not fail with ``ETIMEDOUT``. ++ * - ``objs`` ++ - Pointer to an array of ``count`` file descriptors ++ (specified as an integer so that the structure has the same ++ size regardless of architecture). If any object is ++ invalid, the function fails with ``EINVAL``. ++ * - ``count`` ++ - Number of objects specified in the ``objs`` array. ++ If greater than ``NTSYNC_MAX_WAIT_COUNT``, the function fails ++ with ``EINVAL``. ++ * - ``owner`` ++ - Mutex owner identifier. If any object in ``objs`` is a mutex, ++ the ioctl will attempt to acquire that mutex on behalf of ++ ``owner``. If ``owner`` is zero, the ioctl fails with ++ ``EINVAL``. ++ * - ``index`` ++ - On success, contains the index (into ``objs``) of the object ++ which was signaled. If ``alert`` was signaled instead, ++ this contains ``count``. ++ * - ``alert`` ++ - Optional event object file descriptor. If nonzero, this ++ specifies an "alert" event object which, if signaled, will ++ terminate the wait. If nonzero, the identifier must point to a ++ valid event. ++ * - ``flags`` ++ - Zero or more flags. Currently the only flag is ++ ``NTSYNC_WAIT_REALTIME``, which causes the timeout to be ++ measured against the REALTIME clock instead of MONOTONIC. ++ * - ``pad`` ++ - Unused, must be set to zero. ++ ++ This function attempts to acquire one of the given objects. If unable ++ to do so, it sleeps until an object becomes signaled, subsequently ++ acquiring it, or the timeout expires. In the latter case the ioctl ++ fails with ``ETIMEDOUT``. The function only acquires one object, even ++ if multiple objects are signaled. ++ ++ A semaphore is considered to be signaled if its count is nonzero, and ++ is acquired by decrementing its count by one. A mutex is considered ++ to be signaled if it is unowned or if its owner matches the ``owner`` ++ argument, and is acquired by incrementing its recursion count by one ++ and setting its owner to the ``owner`` argument. An auto-reset event ++ is acquired by designaling it; a manual-reset event is not affected ++ by acquisition. ++ ++ Acquisition is atomic and totally ordered with respect to other ++ operations on the same object. If two wait operations (with different ++ ``owner`` identifiers) are queued on the same mutex, only one is ++ signaled. If two wait operations are queued on the same semaphore, ++ and a value of one is posted to it, only one is signaled. ++ ++ If an abandoned mutex is acquired, the ioctl fails with ++ ``EOWNERDEAD``. Although this is a failure return, the function may ++ otherwise be considered successful. The mutex is marked as owned by ++ the given owner (with a recursion count of 1) and as no longer ++ abandoned, and ``index`` is still set to the index of the mutex. ++ ++ The ``alert`` argument is an "extra" event which can terminate the ++ wait, independently of all other objects. ++ ++ It is valid to pass the same object more than once, including by ++ passing the same event in the ``objs`` array and in ``alert``. If a ++ wakeup occurs due to that object being signaled, ``index`` is set to ++ the lowest index corresponding to that object. ++ ++ The function may fail with ``EINTR`` if a signal is received. ++ ++.. c:macro:: NTSYNC_IOC_WAIT_ALL ++ ++ Poll on a list of objects, atomically acquiring all of them. Takes a ++ pointer to struct :c:type:`ntsync_wait_args`, which is used ++ identically to ``NTSYNC_IOC_WAIT_ANY``, except that ``index`` is ++ always filled with zero on success if not woken via alert. ++ ++ This function attempts to simultaneously acquire all of the given ++ objects. If unable to do so, it sleeps until all objects become ++ simultaneously signaled, subsequently acquiring them, or the timeout ++ expires. In the latter case the ioctl fails with ``ETIMEDOUT`` and no ++ objects are modified. ++ ++ Objects may become signaled and subsequently designaled (through ++ acquisition by other threads) while this thread is sleeping. Only ++ once all objects are simultaneously signaled does the ioctl acquire ++ them and return. The entire acquisition is atomic and totally ordered ++ with respect to other operations on any of the given objects. ++ ++ If an abandoned mutex is acquired, the ioctl fails with ++ ``EOWNERDEAD``. Similarly to ``NTSYNC_IOC_WAIT_ANY``, all objects are ++ nevertheless marked as acquired. Note that if multiple mutex objects ++ are specified, there is no way to know which were marked as ++ abandoned. ++ ++ As with "any" waits, the ``alert`` argument is an "extra" event which ++ can terminate the wait. Critically, however, an "all" wait will ++ succeed if all members in ``objs`` are signaled, *or* if ``alert`` is ++ signaled. In the latter case ``index`` will be set to ``count``. As ++ with "any" waits, if both conditions are filled, the former takes ++ priority, and objects in ``objs`` will be acquired. ++ ++ Unlike ``NTSYNC_IOC_WAIT_ANY``, it is not valid to pass the same ++ object more than once, nor is it valid to pass the same object in ++ ``objs`` and in ``alert``. If this is attempted, the function fails ++ with ``EINVAL``. +diff --git a/MAINTAINERS b/MAINTAINERS +index 879f598ca34e..2c2d1066c035 100644 +--- a/MAINTAINERS ++++ b/MAINTAINERS +@@ -16494,6 +16494,15 @@ T: git https://github.com/Paragon-Software-Group/linux-ntfs3.git + F: Documentation/filesystems/ntfs3.rst + F: fs/ntfs3/ + ++NTSYNC SYNCHRONIZATION PRIMITIVE DRIVER ++M: Elizabeth Figura ++L: wine-devel@winehq.org ++S: Supported ++F: Documentation/userspace-api/ntsync.rst ++F: drivers/misc/ntsync.c ++F: include/uapi/linux/ntsync.h ++F: tools/testing/selftests/drivers/ntsync/ ++ + NUBUS SUBSYSTEM + M: Finn Thain + L: linux-m68k@lists.linux-m68k.org +diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig +index 3fe7e2a9bd29..6c8b999a5e08 100644 +--- a/drivers/misc/Kconfig ++++ b/drivers/misc/Kconfig +@@ -517,7 +517,6 @@ config OPEN_DICE + + config NTSYNC + tristate "NT synchronization primitive emulation" +- depends on BROKEN + help + This module provides kernel support for emulation of Windows NT + synchronization primitives. It is not a hardware driver. +diff --git a/drivers/misc/ntsync.c b/drivers/misc/ntsync.c +index 4954553b7baa..94b94c4cc579 100644 +--- a/drivers/misc/ntsync.c ++++ b/drivers/misc/ntsync.c +@@ -6,11 +6,17 @@ + */ + + #include ++#include + #include + #include ++#include ++#include + #include + #include ++#include + #include ++#include ++#include + #include + #include + #include +@@ -19,6 +25,8 @@ + + enum ntsync_type { + NTSYNC_TYPE_SEM, ++ NTSYNC_TYPE_MUTEX, ++ NTSYNC_TYPE_EVENT, + }; + + /* +@@ -30,10 +38,13 @@ enum ntsync_type { + * + * Both rely on struct file for reference counting. Individual + * ntsync_obj objects take a reference to the device when created. ++ * Wait operations take a reference to each object being waited on for ++ * the duration of the wait. + */ + + struct ntsync_obj { + spinlock_t lock; ++ int dev_locked; + + enum ntsync_type type; + +@@ -46,22 +57,344 @@ struct ntsync_obj { + __u32 count; + __u32 max; + } sem; ++ struct { ++ __u32 count; ++ pid_t owner; ++ bool ownerdead; ++ } mutex; ++ struct { ++ bool manual; ++ bool signaled; ++ } event; + } u; ++ ++ /* ++ * any_waiters is protected by the object lock, but all_waiters is ++ * protected by the device wait_all_lock. ++ */ ++ struct list_head any_waiters; ++ struct list_head all_waiters; ++ ++ /* ++ * Hint describing how many tasks are queued on this object in a ++ * wait-all operation. ++ * ++ * Any time we do a wake, we may need to wake "all" waiters as well as ++ * "any" waiters. In order to atomically wake "all" waiters, we must ++ * lock all of the objects, and that means grabbing the wait_all_lock ++ * below (and, due to lock ordering rules, before locking this object). ++ * However, wait-all is a rare operation, and grabbing the wait-all ++ * lock for every wake would create unnecessary contention. ++ * Therefore we first check whether all_hint is zero, and, if it is, ++ * we skip trying to wake "all" waiters. ++ * ++ * Since wait requests must originate from user-space threads, we're ++ * limited here by PID_MAX_LIMIT, so there's no risk of overflow. ++ */ ++ atomic_t all_hint; ++}; ++ ++struct ntsync_q_entry { ++ struct list_head node; ++ struct ntsync_q *q; ++ struct ntsync_obj *obj; ++ __u32 index; ++}; ++ ++struct ntsync_q { ++ struct task_struct *task; ++ __u32 owner; ++ ++ /* ++ * Protected via atomic_try_cmpxchg(). Only the thread that wins the ++ * compare-and-swap may actually change object states and wake this ++ * task. ++ */ ++ atomic_t signaled; ++ ++ bool all; ++ bool ownerdead; ++ __u32 count; ++ struct ntsync_q_entry entries[]; + }; + + struct ntsync_device { ++ /* ++ * Wait-all operations must atomically grab all objects, and be totally ++ * ordered with respect to each other and wait-any operations. ++ * If one thread is trying to acquire several objects, another thread ++ * cannot touch the object at the same time. ++ * ++ * This device-wide lock is used to serialize wait-for-all ++ * operations, and operations on an object that is involved in a ++ * wait-for-all. ++ */ ++ struct mutex wait_all_lock; ++ + struct file *file; + }; + ++/* ++ * Single objects are locked using obj->lock. ++ * ++ * Multiple objects are 'locked' while holding dev->wait_all_lock. ++ * In this case however, individual objects are not locked by holding ++ * obj->lock, but by setting obj->dev_locked. ++ * ++ * This means that in order to lock a single object, the sequence is slightly ++ * more complicated than usual. Specifically it needs to check obj->dev_locked ++ * after acquiring obj->lock, if set, it needs to drop the lock and acquire ++ * dev->wait_all_lock in order to serialize against the multi-object operation. ++ */ ++ ++static void dev_lock_obj(struct ntsync_device *dev, struct ntsync_obj *obj) ++{ ++ lockdep_assert_held(&dev->wait_all_lock); ++ lockdep_assert(obj->dev == dev); ++ spin_lock(&obj->lock); ++ /* ++ * By setting obj->dev_locked inside obj->lock, it is ensured that ++ * anyone holding obj->lock must see the value. ++ */ ++ obj->dev_locked = 1; ++ spin_unlock(&obj->lock); ++} ++ ++static void dev_unlock_obj(struct ntsync_device *dev, struct ntsync_obj *obj) ++{ ++ lockdep_assert_held(&dev->wait_all_lock); ++ lockdep_assert(obj->dev == dev); ++ spin_lock(&obj->lock); ++ obj->dev_locked = 0; ++ spin_unlock(&obj->lock); ++} ++ ++static void obj_lock(struct ntsync_obj *obj) ++{ ++ struct ntsync_device *dev = obj->dev; ++ ++ for (;;) { ++ spin_lock(&obj->lock); ++ if (likely(!obj->dev_locked)) ++ break; ++ ++ spin_unlock(&obj->lock); ++ mutex_lock(&dev->wait_all_lock); ++ spin_lock(&obj->lock); ++ /* ++ * obj->dev_locked should be set and released under the same ++ * wait_all_lock section, since we now own this lock, it should ++ * be clear. ++ */ ++ lockdep_assert(!obj->dev_locked); ++ spin_unlock(&obj->lock); ++ mutex_unlock(&dev->wait_all_lock); ++ } ++} ++ ++static void obj_unlock(struct ntsync_obj *obj) ++{ ++ spin_unlock(&obj->lock); ++} ++ ++static bool ntsync_lock_obj(struct ntsync_device *dev, struct ntsync_obj *obj) ++{ ++ bool all; ++ ++ obj_lock(obj); ++ all = atomic_read(&obj->all_hint); ++ if (unlikely(all)) { ++ obj_unlock(obj); ++ mutex_lock(&dev->wait_all_lock); ++ dev_lock_obj(dev, obj); ++ } ++ ++ return all; ++} ++ ++static void ntsync_unlock_obj(struct ntsync_device *dev, struct ntsync_obj *obj, bool all) ++{ ++ if (all) { ++ dev_unlock_obj(dev, obj); ++ mutex_unlock(&dev->wait_all_lock); ++ } else { ++ obj_unlock(obj); ++ } ++} ++ ++#define ntsync_assert_held(obj) \ ++ lockdep_assert((lockdep_is_held(&(obj)->lock) != LOCK_STATE_NOT_HELD) || \ ++ ((lockdep_is_held(&(obj)->dev->wait_all_lock) != LOCK_STATE_NOT_HELD) && \ ++ (obj)->dev_locked)) ++ ++static bool is_signaled(struct ntsync_obj *obj, __u32 owner) ++{ ++ ntsync_assert_held(obj); ++ ++ switch (obj->type) { ++ case NTSYNC_TYPE_SEM: ++ return !!obj->u.sem.count; ++ case NTSYNC_TYPE_MUTEX: ++ if (obj->u.mutex.owner && obj->u.mutex.owner != owner) ++ return false; ++ return obj->u.mutex.count < UINT_MAX; ++ case NTSYNC_TYPE_EVENT: ++ return obj->u.event.signaled; ++ } ++ ++ WARN(1, "bad object type %#x\n", obj->type); ++ return false; ++} ++ ++/* ++ * "locked_obj" is an optional pointer to an object which is already locked and ++ * should not be locked again. This is necessary so that changing an object's ++ * state and waking it can be a single atomic operation. ++ */ ++static void try_wake_all(struct ntsync_device *dev, struct ntsync_q *q, ++ struct ntsync_obj *locked_obj) ++{ ++ __u32 count = q->count; ++ bool can_wake = true; ++ int signaled = -1; ++ __u32 i; ++ ++ lockdep_assert_held(&dev->wait_all_lock); ++ if (locked_obj) ++ lockdep_assert(locked_obj->dev_locked); ++ ++ for (i = 0; i < count; i++) { ++ if (q->entries[i].obj != locked_obj) ++ dev_lock_obj(dev, q->entries[i].obj); ++ } ++ ++ for (i = 0; i < count; i++) { ++ if (!is_signaled(q->entries[i].obj, q->owner)) { ++ can_wake = false; ++ break; ++ } ++ } ++ ++ if (can_wake && atomic_try_cmpxchg(&q->signaled, &signaled, 0)) { ++ for (i = 0; i < count; i++) { ++ struct ntsync_obj *obj = q->entries[i].obj; ++ ++ switch (obj->type) { ++ case NTSYNC_TYPE_SEM: ++ obj->u.sem.count--; ++ break; ++ case NTSYNC_TYPE_MUTEX: ++ if (obj->u.mutex.ownerdead) ++ q->ownerdead = true; ++ obj->u.mutex.ownerdead = false; ++ obj->u.mutex.count++; ++ obj->u.mutex.owner = q->owner; ++ break; ++ case NTSYNC_TYPE_EVENT: ++ if (!obj->u.event.manual) ++ obj->u.event.signaled = false; ++ break; ++ } ++ } ++ wake_up_process(q->task); ++ } ++ ++ for (i = 0; i < count; i++) { ++ if (q->entries[i].obj != locked_obj) ++ dev_unlock_obj(dev, q->entries[i].obj); ++ } ++} ++ ++static void try_wake_all_obj(struct ntsync_device *dev, struct ntsync_obj *obj) ++{ ++ struct ntsync_q_entry *entry; ++ ++ lockdep_assert_held(&dev->wait_all_lock); ++ lockdep_assert(obj->dev_locked); ++ ++ list_for_each_entry(entry, &obj->all_waiters, node) ++ try_wake_all(dev, entry->q, obj); ++} ++ ++static void try_wake_any_sem(struct ntsync_obj *sem) ++{ ++ struct ntsync_q_entry *entry; ++ ++ ntsync_assert_held(sem); ++ lockdep_assert(sem->type == NTSYNC_TYPE_SEM); ++ ++ list_for_each_entry(entry, &sem->any_waiters, node) { ++ struct ntsync_q *q = entry->q; ++ int signaled = -1; ++ ++ if (!sem->u.sem.count) ++ break; ++ ++ if (atomic_try_cmpxchg(&q->signaled, &signaled, entry->index)) { ++ sem->u.sem.count--; ++ wake_up_process(q->task); ++ } ++ } ++} ++ ++static void try_wake_any_mutex(struct ntsync_obj *mutex) ++{ ++ struct ntsync_q_entry *entry; ++ ++ ntsync_assert_held(mutex); ++ lockdep_assert(mutex->type == NTSYNC_TYPE_MUTEX); ++ ++ list_for_each_entry(entry, &mutex->any_waiters, node) { ++ struct ntsync_q *q = entry->q; ++ int signaled = -1; ++ ++ if (mutex->u.mutex.count == UINT_MAX) ++ break; ++ if (mutex->u.mutex.owner && mutex->u.mutex.owner != q->owner) ++ continue; ++ ++ if (atomic_try_cmpxchg(&q->signaled, &signaled, entry->index)) { ++ if (mutex->u.mutex.ownerdead) ++ q->ownerdead = true; ++ mutex->u.mutex.ownerdead = false; ++ mutex->u.mutex.count++; ++ mutex->u.mutex.owner = q->owner; ++ wake_up_process(q->task); ++ } ++ } ++} ++ ++static void try_wake_any_event(struct ntsync_obj *event) ++{ ++ struct ntsync_q_entry *entry; ++ ++ ntsync_assert_held(event); ++ lockdep_assert(event->type == NTSYNC_TYPE_EVENT); ++ ++ list_for_each_entry(entry, &event->any_waiters, node) { ++ struct ntsync_q *q = entry->q; ++ int signaled = -1; ++ ++ if (!event->u.event.signaled) ++ break; ++ ++ if (atomic_try_cmpxchg(&q->signaled, &signaled, entry->index)) { ++ if (!event->u.event.manual) ++ event->u.event.signaled = false; ++ wake_up_process(q->task); ++ } ++ } ++} ++ + /* + * Actually change the semaphore state, returning -EOVERFLOW if it is made + * invalid. + */ +-static int post_sem_state(struct ntsync_obj *sem, __u32 count) ++static int release_sem_state(struct ntsync_obj *sem, __u32 count) + { + __u32 sum; + +- lockdep_assert_held(&sem->lock); ++ ntsync_assert_held(sem); + + if (check_add_overflow(sem->u.sem.count, count, &sum) || + sum > sem->u.sem.max) +@@ -71,11 +404,13 @@ static int post_sem_state(struct ntsync_obj *sem, __u32 count) + return 0; + } + +-static int ntsync_sem_post(struct ntsync_obj *sem, void __user *argp) ++static int ntsync_sem_release(struct ntsync_obj *sem, void __user *argp) + { ++ struct ntsync_device *dev = sem->dev; + __u32 __user *user_args = argp; + __u32 prev_count; + __u32 args; ++ bool all; + int ret; + + if (copy_from_user(&args, argp, sizeof(args))) +@@ -84,12 +419,17 @@ static int ntsync_sem_post(struct ntsync_obj *sem, void __user *argp) + if (sem->type != NTSYNC_TYPE_SEM) + return -EINVAL; + +- spin_lock(&sem->lock); ++ all = ntsync_lock_obj(dev, sem); + + prev_count = sem->u.sem.count; +- ret = post_sem_state(sem, args); ++ ret = release_sem_state(sem, args); ++ if (!ret) { ++ if (all) ++ try_wake_all_obj(dev, sem); ++ try_wake_any_sem(sem); ++ } + +- spin_unlock(&sem->lock); ++ ntsync_unlock_obj(dev, sem, all); + + if (!ret && put_user(prev_count, user_args)) + ret = -EFAULT; +@@ -97,6 +437,220 @@ static int ntsync_sem_post(struct ntsync_obj *sem, void __user *argp) + return ret; + } + ++/* ++ * Actually change the mutex state, returning -EPERM if not the owner. ++ */ ++static int unlock_mutex_state(struct ntsync_obj *mutex, ++ const struct ntsync_mutex_args *args) ++{ ++ ntsync_assert_held(mutex); ++ ++ if (mutex->u.mutex.owner != args->owner) ++ return -EPERM; ++ ++ if (!--mutex->u.mutex.count) ++ mutex->u.mutex.owner = 0; ++ return 0; ++} ++ ++static int ntsync_mutex_unlock(struct ntsync_obj *mutex, void __user *argp) ++{ ++ struct ntsync_mutex_args __user *user_args = argp; ++ struct ntsync_device *dev = mutex->dev; ++ struct ntsync_mutex_args args; ++ __u32 prev_count; ++ bool all; ++ int ret; ++ ++ if (copy_from_user(&args, argp, sizeof(args))) ++ return -EFAULT; ++ if (!args.owner) ++ return -EINVAL; ++ ++ if (mutex->type != NTSYNC_TYPE_MUTEX) ++ return -EINVAL; ++ ++ all = ntsync_lock_obj(dev, mutex); ++ ++ prev_count = mutex->u.mutex.count; ++ ret = unlock_mutex_state(mutex, &args); ++ if (!ret) { ++ if (all) ++ try_wake_all_obj(dev, mutex); ++ try_wake_any_mutex(mutex); ++ } ++ ++ ntsync_unlock_obj(dev, mutex, all); ++ ++ if (!ret && put_user(prev_count, &user_args->count)) ++ ret = -EFAULT; ++ ++ return ret; ++} ++ ++/* ++ * Actually change the mutex state to mark its owner as dead, ++ * returning -EPERM if not the owner. ++ */ ++static int kill_mutex_state(struct ntsync_obj *mutex, __u32 owner) ++{ ++ ntsync_assert_held(mutex); ++ ++ if (mutex->u.mutex.owner != owner) ++ return -EPERM; ++ ++ mutex->u.mutex.ownerdead = true; ++ mutex->u.mutex.owner = 0; ++ mutex->u.mutex.count = 0; ++ return 0; ++} ++ ++static int ntsync_mutex_kill(struct ntsync_obj *mutex, void __user *argp) ++{ ++ struct ntsync_device *dev = mutex->dev; ++ __u32 owner; ++ bool all; ++ int ret; ++ ++ if (get_user(owner, (__u32 __user *)argp)) ++ return -EFAULT; ++ if (!owner) ++ return -EINVAL; ++ ++ if (mutex->type != NTSYNC_TYPE_MUTEX) ++ return -EINVAL; ++ ++ all = ntsync_lock_obj(dev, mutex); ++ ++ ret = kill_mutex_state(mutex, owner); ++ if (!ret) { ++ if (all) ++ try_wake_all_obj(dev, mutex); ++ try_wake_any_mutex(mutex); ++ } ++ ++ ntsync_unlock_obj(dev, mutex, all); ++ ++ return ret; ++} ++ ++static int ntsync_event_set(struct ntsync_obj *event, void __user *argp, bool pulse) ++{ ++ struct ntsync_device *dev = event->dev; ++ __u32 prev_state; ++ bool all; ++ ++ if (event->type != NTSYNC_TYPE_EVENT) ++ return -EINVAL; ++ ++ all = ntsync_lock_obj(dev, event); ++ ++ prev_state = event->u.event.signaled; ++ event->u.event.signaled = true; ++ if (all) ++ try_wake_all_obj(dev, event); ++ try_wake_any_event(event); ++ if (pulse) ++ event->u.event.signaled = false; ++ ++ ntsync_unlock_obj(dev, event, all); ++ ++ if (put_user(prev_state, (__u32 __user *)argp)) ++ return -EFAULT; ++ ++ return 0; ++} ++ ++static int ntsync_event_reset(struct ntsync_obj *event, void __user *argp) ++{ ++ struct ntsync_device *dev = event->dev; ++ __u32 prev_state; ++ bool all; ++ ++ if (event->type != NTSYNC_TYPE_EVENT) ++ return -EINVAL; ++ ++ all = ntsync_lock_obj(dev, event); ++ ++ prev_state = event->u.event.signaled; ++ event->u.event.signaled = false; ++ ++ ntsync_unlock_obj(dev, event, all); ++ ++ if (put_user(prev_state, (__u32 __user *)argp)) ++ return -EFAULT; ++ ++ return 0; ++} ++ ++static int ntsync_sem_read(struct ntsync_obj *sem, void __user *argp) ++{ ++ struct ntsync_sem_args __user *user_args = argp; ++ struct ntsync_device *dev = sem->dev; ++ struct ntsync_sem_args args; ++ bool all; ++ ++ if (sem->type != NTSYNC_TYPE_SEM) ++ return -EINVAL; ++ ++ all = ntsync_lock_obj(dev, sem); ++ ++ args.count = sem->u.sem.count; ++ args.max = sem->u.sem.max; ++ ++ ntsync_unlock_obj(dev, sem, all); ++ ++ if (copy_to_user(user_args, &args, sizeof(args))) ++ return -EFAULT; ++ return 0; ++} ++ ++static int ntsync_mutex_read(struct ntsync_obj *mutex, void __user *argp) ++{ ++ struct ntsync_mutex_args __user *user_args = argp; ++ struct ntsync_device *dev = mutex->dev; ++ struct ntsync_mutex_args args; ++ bool all; ++ int ret; ++ ++ if (mutex->type != NTSYNC_TYPE_MUTEX) ++ return -EINVAL; ++ ++ all = ntsync_lock_obj(dev, mutex); ++ ++ args.count = mutex->u.mutex.count; ++ args.owner = mutex->u.mutex.owner; ++ ret = mutex->u.mutex.ownerdead ? -EOWNERDEAD : 0; ++ ++ ntsync_unlock_obj(dev, mutex, all); ++ ++ if (copy_to_user(user_args, &args, sizeof(args))) ++ return -EFAULT; ++ return ret; ++} ++ ++static int ntsync_event_read(struct ntsync_obj *event, void __user *argp) ++{ ++ struct ntsync_event_args __user *user_args = argp; ++ struct ntsync_device *dev = event->dev; ++ struct ntsync_event_args args; ++ bool all; ++ ++ if (event->type != NTSYNC_TYPE_EVENT) ++ return -EINVAL; ++ ++ all = ntsync_lock_obj(dev, event); ++ ++ args.manual = event->u.event.manual; ++ args.signaled = event->u.event.signaled; ++ ++ ntsync_unlock_obj(dev, event, all); ++ ++ if (copy_to_user(user_args, &args, sizeof(args))) ++ return -EFAULT; ++ return 0; ++} ++ + static int ntsync_obj_release(struct inode *inode, struct file *file) + { + struct ntsync_obj *obj = file->private_data; +@@ -114,8 +668,24 @@ static long ntsync_obj_ioctl(struct file *file, unsigned int cmd, + void __user *argp = (void __user *)parm; + + switch (cmd) { +- case NTSYNC_IOC_SEM_POST: +- return ntsync_sem_post(obj, argp); ++ case NTSYNC_IOC_SEM_RELEASE: ++ return ntsync_sem_release(obj, argp); ++ case NTSYNC_IOC_SEM_READ: ++ return ntsync_sem_read(obj, argp); ++ case NTSYNC_IOC_MUTEX_UNLOCK: ++ return ntsync_mutex_unlock(obj, argp); ++ case NTSYNC_IOC_MUTEX_KILL: ++ return ntsync_mutex_kill(obj, argp); ++ case NTSYNC_IOC_MUTEX_READ: ++ return ntsync_mutex_read(obj, argp); ++ case NTSYNC_IOC_EVENT_SET: ++ return ntsync_event_set(obj, argp, false); ++ case NTSYNC_IOC_EVENT_RESET: ++ return ntsync_event_reset(obj, argp); ++ case NTSYNC_IOC_EVENT_PULSE: ++ return ntsync_event_set(obj, argp, true); ++ case NTSYNC_IOC_EVENT_READ: ++ return ntsync_event_read(obj, argp); + default: + return -ENOIOCTLCMD; + } +@@ -140,6 +710,9 @@ static struct ntsync_obj *ntsync_alloc_obj(struct ntsync_device *dev, + obj->dev = dev; + get_file(dev->file); + spin_lock_init(&obj->lock); ++ INIT_LIST_HEAD(&obj->any_waiters); ++ INIT_LIST_HEAD(&obj->all_waiters); ++ atomic_set(&obj->all_hint, 0); + + return obj; + } +@@ -165,7 +738,6 @@ static int ntsync_obj_get_fd(struct ntsync_obj *obj) + + static int ntsync_create_sem(struct ntsync_device *dev, void __user *argp) + { +- struct ntsync_sem_args __user *user_args = argp; + struct ntsync_sem_args args; + struct ntsync_obj *sem; + int fd; +@@ -182,12 +754,398 @@ static int ntsync_create_sem(struct ntsync_device *dev, void __user *argp) + sem->u.sem.count = args.count; + sem->u.sem.max = args.max; + fd = ntsync_obj_get_fd(sem); +- if (fd < 0) { ++ if (fd < 0) + kfree(sem); +- return fd; ++ ++ return fd; ++} ++ ++static int ntsync_create_mutex(struct ntsync_device *dev, void __user *argp) ++{ ++ struct ntsync_mutex_args args; ++ struct ntsync_obj *mutex; ++ int fd; ++ ++ if (copy_from_user(&args, argp, sizeof(args))) ++ return -EFAULT; ++ ++ if (!args.owner != !args.count) ++ return -EINVAL; ++ ++ mutex = ntsync_alloc_obj(dev, NTSYNC_TYPE_MUTEX); ++ if (!mutex) ++ return -ENOMEM; ++ mutex->u.mutex.count = args.count; ++ mutex->u.mutex.owner = args.owner; ++ fd = ntsync_obj_get_fd(mutex); ++ if (fd < 0) ++ kfree(mutex); ++ ++ return fd; ++} ++ ++static int ntsync_create_event(struct ntsync_device *dev, void __user *argp) ++{ ++ struct ntsync_event_args args; ++ struct ntsync_obj *event; ++ int fd; ++ ++ if (copy_from_user(&args, argp, sizeof(args))) ++ return -EFAULT; ++ ++ event = ntsync_alloc_obj(dev, NTSYNC_TYPE_EVENT); ++ if (!event) ++ return -ENOMEM; ++ event->u.event.manual = args.manual; ++ event->u.event.signaled = args.signaled; ++ fd = ntsync_obj_get_fd(event); ++ if (fd < 0) ++ kfree(event); ++ ++ return fd; ++} ++ ++static struct ntsync_obj *get_obj(struct ntsync_device *dev, int fd) ++{ ++ struct file *file = fget(fd); ++ struct ntsync_obj *obj; ++ ++ if (!file) ++ return NULL; ++ ++ if (file->f_op != &ntsync_obj_fops) { ++ fput(file); ++ return NULL; + } + +- return put_user(fd, &user_args->sem); ++ obj = file->private_data; ++ if (obj->dev != dev) { ++ fput(file); ++ return NULL; ++ } ++ ++ return obj; ++} ++ ++static void put_obj(struct ntsync_obj *obj) ++{ ++ fput(obj->file); ++} ++ ++static int ntsync_schedule(const struct ntsync_q *q, const struct ntsync_wait_args *args) ++{ ++ ktime_t timeout = ns_to_ktime(args->timeout); ++ clockid_t clock = CLOCK_MONOTONIC; ++ ktime_t *timeout_ptr; ++ int ret = 0; ++ ++ timeout_ptr = (args->timeout == U64_MAX ? NULL : &timeout); ++ ++ if (args->flags & NTSYNC_WAIT_REALTIME) ++ clock = CLOCK_REALTIME; ++ ++ do { ++ if (signal_pending(current)) { ++ ret = -ERESTARTSYS; ++ break; ++ } ++ ++ set_current_state(TASK_INTERRUPTIBLE); ++ if (atomic_read(&q->signaled) != -1) { ++ ret = 0; ++ break; ++ } ++ ret = schedule_hrtimeout_range_clock(timeout_ptr, 0, HRTIMER_MODE_ABS, clock); ++ } while (ret < 0); ++ __set_current_state(TASK_RUNNING); ++ ++ return ret; ++} ++ ++/* ++ * Allocate and initialize the ntsync_q structure, but do not queue us yet. ++ */ ++static int setup_wait(struct ntsync_device *dev, ++ const struct ntsync_wait_args *args, bool all, ++ struct ntsync_q **ret_q) ++{ ++ int fds[NTSYNC_MAX_WAIT_COUNT + 1]; ++ const __u32 count = args->count; ++ struct ntsync_q *q; ++ __u32 total_count; ++ __u32 i, j; ++ ++ if (args->pad || (args->flags & ~NTSYNC_WAIT_REALTIME)) ++ return -EINVAL; ++ ++ if (args->count > NTSYNC_MAX_WAIT_COUNT) ++ return -EINVAL; ++ ++ total_count = count; ++ if (args->alert) ++ total_count++; ++ ++ if (copy_from_user(fds, u64_to_user_ptr(args->objs), ++ array_size(count, sizeof(*fds)))) ++ return -EFAULT; ++ if (args->alert) ++ fds[count] = args->alert; ++ ++ q = kmalloc(struct_size(q, entries, total_count), GFP_KERNEL); ++ if (!q) ++ return -ENOMEM; ++ q->task = current; ++ q->owner = args->owner; ++ atomic_set(&q->signaled, -1); ++ q->all = all; ++ q->ownerdead = false; ++ q->count = count; ++ ++ for (i = 0; i < total_count; i++) { ++ struct ntsync_q_entry *entry = &q->entries[i]; ++ struct ntsync_obj *obj = get_obj(dev, fds[i]); ++ ++ if (!obj) ++ goto err; ++ ++ if (all) { ++ /* Check that the objects are all distinct. */ ++ for (j = 0; j < i; j++) { ++ if (obj == q->entries[j].obj) { ++ put_obj(obj); ++ goto err; ++ } ++ } ++ } ++ ++ entry->obj = obj; ++ entry->q = q; ++ entry->index = i; ++ } ++ ++ *ret_q = q; ++ return 0; ++ ++err: ++ for (j = 0; j < i; j++) ++ put_obj(q->entries[j].obj); ++ kfree(q); ++ return -EINVAL; ++} ++ ++static void try_wake_any_obj(struct ntsync_obj *obj) ++{ ++ switch (obj->type) { ++ case NTSYNC_TYPE_SEM: ++ try_wake_any_sem(obj); ++ break; ++ case NTSYNC_TYPE_MUTEX: ++ try_wake_any_mutex(obj); ++ break; ++ case NTSYNC_TYPE_EVENT: ++ try_wake_any_event(obj); ++ break; ++ } ++} ++ ++static int ntsync_wait_any(struct ntsync_device *dev, void __user *argp) ++{ ++ struct ntsync_wait_args args; ++ __u32 i, total_count; ++ struct ntsync_q *q; ++ int signaled; ++ bool all; ++ int ret; ++ ++ if (copy_from_user(&args, argp, sizeof(args))) ++ return -EFAULT; ++ ++ ret = setup_wait(dev, &args, false, &q); ++ if (ret < 0) ++ return ret; ++ ++ total_count = args.count; ++ if (args.alert) ++ total_count++; ++ ++ /* queue ourselves */ ++ ++ for (i = 0; i < total_count; i++) { ++ struct ntsync_q_entry *entry = &q->entries[i]; ++ struct ntsync_obj *obj = entry->obj; ++ ++ all = ntsync_lock_obj(dev, obj); ++ list_add_tail(&entry->node, &obj->any_waiters); ++ ntsync_unlock_obj(dev, obj, all); ++ } ++ ++ /* ++ * Check if we are already signaled. ++ * ++ * Note that the API requires that normal objects are checked before ++ * the alert event. Hence we queue the alert event last, and check ++ * objects in order. ++ */ ++ ++ for (i = 0; i < total_count; i++) { ++ struct ntsync_obj *obj = q->entries[i].obj; ++ ++ if (atomic_read(&q->signaled) != -1) ++ break; ++ ++ all = ntsync_lock_obj(dev, obj); ++ try_wake_any_obj(obj); ++ ntsync_unlock_obj(dev, obj, all); ++ } ++ ++ /* sleep */ ++ ++ ret = ntsync_schedule(q, &args); ++ ++ /* and finally, unqueue */ ++ ++ for (i = 0; i < total_count; i++) { ++ struct ntsync_q_entry *entry = &q->entries[i]; ++ struct ntsync_obj *obj = entry->obj; ++ ++ all = ntsync_lock_obj(dev, obj); ++ list_del(&entry->node); ++ ntsync_unlock_obj(dev, obj, all); ++ ++ put_obj(obj); ++ } ++ ++ signaled = atomic_read(&q->signaled); ++ if (signaled != -1) { ++ struct ntsync_wait_args __user *user_args = argp; ++ ++ /* even if we caught a signal, we need to communicate success */ ++ ret = q->ownerdead ? -EOWNERDEAD : 0; ++ ++ if (put_user(signaled, &user_args->index)) ++ ret = -EFAULT; ++ } else if (!ret) { ++ ret = -ETIMEDOUT; ++ } ++ ++ kfree(q); ++ return ret; ++} ++ ++static int ntsync_wait_all(struct ntsync_device *dev, void __user *argp) ++{ ++ struct ntsync_wait_args args; ++ struct ntsync_q *q; ++ int signaled; ++ __u32 i; ++ int ret; ++ ++ if (copy_from_user(&args, argp, sizeof(args))) ++ return -EFAULT; ++ ++ ret = setup_wait(dev, &args, true, &q); ++ if (ret < 0) ++ return ret; ++ ++ /* queue ourselves */ ++ ++ mutex_lock(&dev->wait_all_lock); ++ ++ for (i = 0; i < args.count; i++) { ++ struct ntsync_q_entry *entry = &q->entries[i]; ++ struct ntsync_obj *obj = entry->obj; ++ ++ atomic_inc(&obj->all_hint); ++ ++ /* ++ * obj->all_waiters is protected by dev->wait_all_lock rather ++ * than obj->lock, so there is no need to acquire obj->lock ++ * here. ++ */ ++ list_add_tail(&entry->node, &obj->all_waiters); ++ } ++ if (args.alert) { ++ struct ntsync_q_entry *entry = &q->entries[args.count]; ++ struct ntsync_obj *obj = entry->obj; ++ ++ dev_lock_obj(dev, obj); ++ list_add_tail(&entry->node, &obj->any_waiters); ++ dev_unlock_obj(dev, obj); ++ } ++ ++ /* check if we are already signaled */ ++ ++ try_wake_all(dev, q, NULL); ++ ++ mutex_unlock(&dev->wait_all_lock); ++ ++ /* ++ * Check if the alert event is signaled, making sure to do so only ++ * after checking if the other objects are signaled. ++ */ ++ ++ if (args.alert) { ++ struct ntsync_obj *obj = q->entries[args.count].obj; ++ ++ if (atomic_read(&q->signaled) == -1) { ++ bool all = ntsync_lock_obj(dev, obj); ++ try_wake_any_obj(obj); ++ ntsync_unlock_obj(dev, obj, all); ++ } ++ } ++ ++ /* sleep */ ++ ++ ret = ntsync_schedule(q, &args); ++ ++ /* and finally, unqueue */ ++ ++ mutex_lock(&dev->wait_all_lock); ++ ++ for (i = 0; i < args.count; i++) { ++ struct ntsync_q_entry *entry = &q->entries[i]; ++ struct ntsync_obj *obj = entry->obj; ++ ++ /* ++ * obj->all_waiters is protected by dev->wait_all_lock rather ++ * than obj->lock, so there is no need to acquire it here. ++ */ ++ list_del(&entry->node); ++ ++ atomic_dec(&obj->all_hint); ++ ++ put_obj(obj); ++ } ++ ++ mutex_unlock(&dev->wait_all_lock); ++ ++ if (args.alert) { ++ struct ntsync_q_entry *entry = &q->entries[args.count]; ++ struct ntsync_obj *obj = entry->obj; ++ bool all; ++ ++ all = ntsync_lock_obj(dev, obj); ++ list_del(&entry->node); ++ ntsync_unlock_obj(dev, obj, all); ++ ++ put_obj(obj); ++ } ++ ++ signaled = atomic_read(&q->signaled); ++ if (signaled != -1) { ++ struct ntsync_wait_args __user *user_args = argp; ++ ++ /* even if we caught a signal, we need to communicate success */ ++ ret = q->ownerdead ? -EOWNERDEAD : 0; ++ ++ if (put_user(signaled, &user_args->index)) ++ ret = -EFAULT; ++ } else if (!ret) { ++ ret = -ETIMEDOUT; ++ } ++ ++ kfree(q); ++ return ret; + } + + static int ntsync_char_open(struct inode *inode, struct file *file) +@@ -198,6 +1156,8 @@ static int ntsync_char_open(struct inode *inode, struct file *file) + if (!dev) + return -ENOMEM; + ++ mutex_init(&dev->wait_all_lock); ++ + file->private_data = dev; + dev->file = file; + return nonseekable_open(inode, file); +@@ -219,8 +1179,16 @@ static long ntsync_char_ioctl(struct file *file, unsigned int cmd, + void __user *argp = (void __user *)parm; + + switch (cmd) { ++ case NTSYNC_IOC_CREATE_EVENT: ++ return ntsync_create_event(dev, argp); ++ case NTSYNC_IOC_CREATE_MUTEX: ++ return ntsync_create_mutex(dev, argp); + case NTSYNC_IOC_CREATE_SEM: + return ntsync_create_sem(dev, argp); ++ case NTSYNC_IOC_WAIT_ALL: ++ return ntsync_wait_all(dev, argp); ++ case NTSYNC_IOC_WAIT_ANY: ++ return ntsync_wait_any(dev, argp); + default: + return -ENOIOCTLCMD; + } +@@ -238,6 +1206,7 @@ static struct miscdevice ntsync_misc = { + .minor = MISC_DYNAMIC_MINOR, + .name = NTSYNC_NAME, + .fops = &ntsync_fops, ++ .mode = 0666, // Setting file permissions to 0666 + }; + + module_misc_device(ntsync_misc); +diff --git a/include/uapi/linux/ntsync.h b/include/uapi/linux/ntsync.h +index dcfa38fdc93c..6d06793512b1 100644 +--- a/include/uapi/linux/ntsync.h ++++ b/include/uapi/linux/ntsync.h +@@ -11,13 +11,49 @@ + #include + + struct ntsync_sem_args { +- __u32 sem; + __u32 count; + __u32 max; + }; + +-#define NTSYNC_IOC_CREATE_SEM _IOWR('N', 0x80, struct ntsync_sem_args) ++struct ntsync_mutex_args { ++ __u32 owner; ++ __u32 count; ++}; ++ ++struct ntsync_event_args { ++ __u32 manual; ++ __u32 signaled; ++}; ++ ++#define NTSYNC_WAIT_REALTIME 0x1 ++ ++struct ntsync_wait_args { ++ __u64 timeout; ++ __u64 objs; ++ __u32 count; ++ __u32 index; ++ __u32 flags; ++ __u32 owner; ++ __u32 alert; ++ __u32 pad; ++}; ++ ++#define NTSYNC_MAX_WAIT_COUNT 64 ++ ++#define NTSYNC_IOC_CREATE_SEM _IOW ('N', 0x80, struct ntsync_sem_args) ++#define NTSYNC_IOC_WAIT_ANY _IOWR('N', 0x82, struct ntsync_wait_args) ++#define NTSYNC_IOC_WAIT_ALL _IOWR('N', 0x83, struct ntsync_wait_args) ++#define NTSYNC_IOC_CREATE_MUTEX _IOW ('N', 0x84, struct ntsync_mutex_args) ++#define NTSYNC_IOC_CREATE_EVENT _IOW ('N', 0x87, struct ntsync_event_args) + +-#define NTSYNC_IOC_SEM_POST _IOWR('N', 0x81, __u32) ++#define NTSYNC_IOC_SEM_RELEASE _IOWR('N', 0x81, __u32) ++#define NTSYNC_IOC_MUTEX_UNLOCK _IOWR('N', 0x85, struct ntsync_mutex_args) ++#define NTSYNC_IOC_MUTEX_KILL _IOW ('N', 0x86, __u32) ++#define NTSYNC_IOC_EVENT_SET _IOR ('N', 0x88, __u32) ++#define NTSYNC_IOC_EVENT_RESET _IOR ('N', 0x89, __u32) ++#define NTSYNC_IOC_EVENT_PULSE _IOR ('N', 0x8a, __u32) ++#define NTSYNC_IOC_SEM_READ _IOR ('N', 0x8b, struct ntsync_sem_args) ++#define NTSYNC_IOC_MUTEX_READ _IOR ('N', 0x8c, struct ntsync_mutex_args) ++#define NTSYNC_IOC_EVENT_READ _IOR ('N', 0x8d, struct ntsync_event_args) + + #endif +diff --git a/tools/testing/selftests/Makefile b/tools/testing/selftests/Makefile +index 85c5f39131d3..6acf76df918a 100644 +--- a/tools/testing/selftests/Makefile ++++ b/tools/testing/selftests/Makefile +@@ -18,6 +18,7 @@ TARGETS += devices/error_logs + TARGETS += devices/probe + TARGETS += dmabuf-heaps + TARGETS += drivers/dma-buf ++TARGETS += drivers/ntsync + TARGETS += drivers/s390x/uvdevice + TARGETS += drivers/net + TARGETS += drivers/net/bonding +diff --git a/tools/testing/selftests/drivers/ntsync/.gitignore b/tools/testing/selftests/drivers/ntsync/.gitignore +new file mode 100644 +index 000000000000..848573a3d3ea +--- /dev/null ++++ b/tools/testing/selftests/drivers/ntsync/.gitignore +@@ -0,0 +1 @@ ++ntsync +diff --git a/tools/testing/selftests/drivers/ntsync/Makefile b/tools/testing/selftests/drivers/ntsync/Makefile +new file mode 100644 +index 000000000000..dbf2b055c0b2 +--- /dev/null ++++ b/tools/testing/selftests/drivers/ntsync/Makefile +@@ -0,0 +1,7 @@ ++# SPDX-LICENSE-IDENTIFIER: GPL-2.0-only ++TEST_GEN_PROGS := ntsync ++ ++CFLAGS += $(KHDR_INCLUDES) ++LDLIBS += -lpthread ++ ++include ../../lib.mk +diff --git a/tools/testing/selftests/drivers/ntsync/config b/tools/testing/selftests/drivers/ntsync/config +new file mode 100644 +index 000000000000..60539c826d06 +--- /dev/null ++++ b/tools/testing/selftests/drivers/ntsync/config +@@ -0,0 +1 @@ ++CONFIG_WINESYNC=y +diff --git a/tools/testing/selftests/drivers/ntsync/ntsync.c b/tools/testing/selftests/drivers/ntsync/ntsync.c +new file mode 100644 +index 000000000000..3aad311574c4 +--- /dev/null ++++ b/tools/testing/selftests/drivers/ntsync/ntsync.c +@@ -0,0 +1,1343 @@ ++// SPDX-License-Identifier: GPL-2.0-or-later ++/* ++ * Various unit tests for the "ntsync" synchronization primitive driver. ++ * ++ * Copyright (C) 2021-2022 Elizabeth Figura ++ */ ++ ++#define _GNU_SOURCE ++#include ++#include ++#include ++#include ++#include ++#include ++#include "../../kselftest_harness.h" ++ ++static int read_sem_state(int sem, __u32 *count, __u32 *max) ++{ ++ struct ntsync_sem_args args; ++ int ret; ++ ++ memset(&args, 0xcc, sizeof(args)); ++ ret = ioctl(sem, NTSYNC_IOC_SEM_READ, &args); ++ *count = args.count; ++ *max = args.max; ++ return ret; ++} ++ ++#define check_sem_state(sem, count, max) \ ++ ({ \ ++ __u32 __count, __max; \ ++ int ret = read_sem_state((sem), &__count, &__max); \ ++ EXPECT_EQ(0, ret); \ ++ EXPECT_EQ((count), __count); \ ++ EXPECT_EQ((max), __max); \ ++ }) ++ ++static int release_sem(int sem, __u32 *count) ++{ ++ return ioctl(sem, NTSYNC_IOC_SEM_RELEASE, count); ++} ++ ++static int read_mutex_state(int mutex, __u32 *count, __u32 *owner) ++{ ++ struct ntsync_mutex_args args; ++ int ret; ++ ++ memset(&args, 0xcc, sizeof(args)); ++ ret = ioctl(mutex, NTSYNC_IOC_MUTEX_READ, &args); ++ *count = args.count; ++ *owner = args.owner; ++ return ret; ++} ++ ++#define check_mutex_state(mutex, count, owner) \ ++ ({ \ ++ __u32 __count, __owner; \ ++ int ret = read_mutex_state((mutex), &__count, &__owner); \ ++ EXPECT_EQ(0, ret); \ ++ EXPECT_EQ((count), __count); \ ++ EXPECT_EQ((owner), __owner); \ ++ }) ++ ++static int unlock_mutex(int mutex, __u32 owner, __u32 *count) ++{ ++ struct ntsync_mutex_args args; ++ int ret; ++ ++ args.owner = owner; ++ args.count = 0xdeadbeef; ++ ret = ioctl(mutex, NTSYNC_IOC_MUTEX_UNLOCK, &args); ++ *count = args.count; ++ return ret; ++} ++ ++static int read_event_state(int event, __u32 *signaled, __u32 *manual) ++{ ++ struct ntsync_event_args args; ++ int ret; ++ ++ memset(&args, 0xcc, sizeof(args)); ++ ret = ioctl(event, NTSYNC_IOC_EVENT_READ, &args); ++ *signaled = args.signaled; ++ *manual = args.manual; ++ return ret; ++} ++ ++#define check_event_state(event, signaled, manual) \ ++ ({ \ ++ __u32 __signaled, __manual; \ ++ int ret = read_event_state((event), &__signaled, &__manual); \ ++ EXPECT_EQ(0, ret); \ ++ EXPECT_EQ((signaled), __signaled); \ ++ EXPECT_EQ((manual), __manual); \ ++ }) ++ ++static int wait_objs(int fd, unsigned long request, __u32 count, ++ const int *objs, __u32 owner, int alert, __u32 *index) ++{ ++ struct ntsync_wait_args args = {0}; ++ struct timespec timeout; ++ int ret; ++ ++ clock_gettime(CLOCK_MONOTONIC, &timeout); ++ ++ args.timeout = timeout.tv_sec * 1000000000 + timeout.tv_nsec; ++ args.count = count; ++ args.objs = (uintptr_t)objs; ++ args.owner = owner; ++ args.index = 0xdeadbeef; ++ args.alert = alert; ++ ret = ioctl(fd, request, &args); ++ *index = args.index; ++ return ret; ++} ++ ++static int wait_any(int fd, __u32 count, const int *objs, __u32 owner, __u32 *index) ++{ ++ return wait_objs(fd, NTSYNC_IOC_WAIT_ANY, count, objs, owner, 0, index); ++} ++ ++static int wait_all(int fd, __u32 count, const int *objs, __u32 owner, __u32 *index) ++{ ++ return wait_objs(fd, NTSYNC_IOC_WAIT_ALL, count, objs, owner, 0, index); ++} ++ ++static int wait_any_alert(int fd, __u32 count, const int *objs, ++ __u32 owner, int alert, __u32 *index) ++{ ++ return wait_objs(fd, NTSYNC_IOC_WAIT_ANY, ++ count, objs, owner, alert, index); ++} ++ ++static int wait_all_alert(int fd, __u32 count, const int *objs, ++ __u32 owner, int alert, __u32 *index) ++{ ++ return wait_objs(fd, NTSYNC_IOC_WAIT_ALL, ++ count, objs, owner, alert, index); ++} ++ ++TEST(semaphore_state) ++{ ++ struct ntsync_sem_args sem_args; ++ struct timespec timeout; ++ __u32 count, index; ++ int fd, ret, sem; ++ ++ clock_gettime(CLOCK_MONOTONIC, &timeout); ++ ++ fd = open("/dev/ntsync", O_CLOEXEC | O_RDONLY); ++ ASSERT_LE(0, fd); ++ ++ sem_args.count = 3; ++ sem_args.max = 2; ++ sem = ioctl(fd, NTSYNC_IOC_CREATE_SEM, &sem_args); ++ EXPECT_EQ(-1, sem); ++ EXPECT_EQ(EINVAL, errno); ++ ++ sem_args.count = 2; ++ sem_args.max = 2; ++ sem = ioctl(fd, NTSYNC_IOC_CREATE_SEM, &sem_args); ++ EXPECT_LE(0, sem); ++ check_sem_state(sem, 2, 2); ++ ++ count = 0; ++ ret = release_sem(sem, &count); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(2, count); ++ check_sem_state(sem, 2, 2); ++ ++ count = 1; ++ ret = release_sem(sem, &count); ++ EXPECT_EQ(-1, ret); ++ EXPECT_EQ(EOVERFLOW, errno); ++ check_sem_state(sem, 2, 2); ++ ++ ret = wait_any(fd, 1, &sem, 123, &index); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(0, index); ++ check_sem_state(sem, 1, 2); ++ ++ ret = wait_any(fd, 1, &sem, 123, &index); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(0, index); ++ check_sem_state(sem, 0, 2); ++ ++ ret = wait_any(fd, 1, &sem, 123, &index); ++ EXPECT_EQ(-1, ret); ++ EXPECT_EQ(ETIMEDOUT, errno); ++ ++ count = 3; ++ ret = release_sem(sem, &count); ++ EXPECT_EQ(-1, ret); ++ EXPECT_EQ(EOVERFLOW, errno); ++ check_sem_state(sem, 0, 2); ++ ++ count = 2; ++ ret = release_sem(sem, &count); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(0, count); ++ check_sem_state(sem, 2, 2); ++ ++ ret = wait_any(fd, 1, &sem, 123, &index); ++ EXPECT_EQ(0, ret); ++ ret = wait_any(fd, 1, &sem, 123, &index); ++ EXPECT_EQ(0, ret); ++ ++ count = 1; ++ ret = release_sem(sem, &count); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(0, count); ++ check_sem_state(sem, 1, 2); ++ ++ count = ~0u; ++ ret = release_sem(sem, &count); ++ EXPECT_EQ(-1, ret); ++ EXPECT_EQ(EOVERFLOW, errno); ++ check_sem_state(sem, 1, 2); ++ ++ close(sem); ++ ++ close(fd); ++} ++ ++TEST(mutex_state) ++{ ++ struct ntsync_mutex_args mutex_args; ++ __u32 owner, count, index; ++ struct timespec timeout; ++ int fd, ret, mutex; ++ ++ clock_gettime(CLOCK_MONOTONIC, &timeout); ++ ++ fd = open("/dev/ntsync", O_CLOEXEC | O_RDONLY); ++ ASSERT_LE(0, fd); ++ ++ mutex_args.owner = 123; ++ mutex_args.count = 0; ++ mutex = ioctl(fd, NTSYNC_IOC_CREATE_MUTEX, &mutex_args); ++ EXPECT_EQ(-1, mutex); ++ EXPECT_EQ(EINVAL, errno); ++ ++ mutex_args.owner = 0; ++ mutex_args.count = 2; ++ mutex = ioctl(fd, NTSYNC_IOC_CREATE_MUTEX, &mutex_args); ++ EXPECT_EQ(-1, mutex); ++ EXPECT_EQ(EINVAL, errno); ++ ++ mutex_args.owner = 123; ++ mutex_args.count = 2; ++ mutex = ioctl(fd, NTSYNC_IOC_CREATE_MUTEX, &mutex_args); ++ EXPECT_LE(0, mutex); ++ check_mutex_state(mutex, 2, 123); ++ ++ ret = unlock_mutex(mutex, 0, &count); ++ EXPECT_EQ(-1, ret); ++ EXPECT_EQ(EINVAL, errno); ++ ++ ret = unlock_mutex(mutex, 456, &count); ++ EXPECT_EQ(-1, ret); ++ EXPECT_EQ(EPERM, errno); ++ check_mutex_state(mutex, 2, 123); ++ ++ ret = unlock_mutex(mutex, 123, &count); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(2, count); ++ check_mutex_state(mutex, 1, 123); ++ ++ ret = unlock_mutex(mutex, 123, &count); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(1, count); ++ check_mutex_state(mutex, 0, 0); ++ ++ ret = unlock_mutex(mutex, 123, &count); ++ EXPECT_EQ(-1, ret); ++ EXPECT_EQ(EPERM, errno); ++ ++ ret = wait_any(fd, 1, &mutex, 456, &index); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(0, index); ++ check_mutex_state(mutex, 1, 456); ++ ++ ret = wait_any(fd, 1, &mutex, 456, &index); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(0, index); ++ check_mutex_state(mutex, 2, 456); ++ ++ ret = unlock_mutex(mutex, 456, &count); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(2, count); ++ check_mutex_state(mutex, 1, 456); ++ ++ ret = wait_any(fd, 1, &mutex, 123, &index); ++ EXPECT_EQ(-1, ret); ++ EXPECT_EQ(ETIMEDOUT, errno); ++ ++ owner = 0; ++ ret = ioctl(mutex, NTSYNC_IOC_MUTEX_KILL, &owner); ++ EXPECT_EQ(-1, ret); ++ EXPECT_EQ(EINVAL, errno); ++ ++ owner = 123; ++ ret = ioctl(mutex, NTSYNC_IOC_MUTEX_KILL, &owner); ++ EXPECT_EQ(-1, ret); ++ EXPECT_EQ(EPERM, errno); ++ check_mutex_state(mutex, 1, 456); ++ ++ owner = 456; ++ ret = ioctl(mutex, NTSYNC_IOC_MUTEX_KILL, &owner); ++ EXPECT_EQ(0, ret); ++ ++ memset(&mutex_args, 0xcc, sizeof(mutex_args)); ++ ret = ioctl(mutex, NTSYNC_IOC_MUTEX_READ, &mutex_args); ++ EXPECT_EQ(-1, ret); ++ EXPECT_EQ(EOWNERDEAD, errno); ++ EXPECT_EQ(0, mutex_args.count); ++ EXPECT_EQ(0, mutex_args.owner); ++ ++ memset(&mutex_args, 0xcc, sizeof(mutex_args)); ++ ret = ioctl(mutex, NTSYNC_IOC_MUTEX_READ, &mutex_args); ++ EXPECT_EQ(-1, ret); ++ EXPECT_EQ(EOWNERDEAD, errno); ++ EXPECT_EQ(0, mutex_args.count); ++ EXPECT_EQ(0, mutex_args.owner); ++ ++ ret = wait_any(fd, 1, &mutex, 123, &index); ++ EXPECT_EQ(-1, ret); ++ EXPECT_EQ(EOWNERDEAD, errno); ++ EXPECT_EQ(0, index); ++ check_mutex_state(mutex, 1, 123); ++ ++ owner = 123; ++ ret = ioctl(mutex, NTSYNC_IOC_MUTEX_KILL, &owner); ++ EXPECT_EQ(0, ret); ++ ++ memset(&mutex_args, 0xcc, sizeof(mutex_args)); ++ ret = ioctl(mutex, NTSYNC_IOC_MUTEX_READ, &mutex_args); ++ EXPECT_EQ(-1, ret); ++ EXPECT_EQ(EOWNERDEAD, errno); ++ EXPECT_EQ(0, mutex_args.count); ++ EXPECT_EQ(0, mutex_args.owner); ++ ++ ret = wait_any(fd, 1, &mutex, 123, &index); ++ EXPECT_EQ(-1, ret); ++ EXPECT_EQ(EOWNERDEAD, errno); ++ EXPECT_EQ(0, index); ++ check_mutex_state(mutex, 1, 123); ++ ++ close(mutex); ++ ++ mutex_args.owner = 0; ++ mutex_args.count = 0; ++ mutex = ioctl(fd, NTSYNC_IOC_CREATE_MUTEX, &mutex_args); ++ EXPECT_LE(0, mutex); ++ check_mutex_state(mutex, 0, 0); ++ ++ ret = wait_any(fd, 1, &mutex, 123, &index); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(0, index); ++ check_mutex_state(mutex, 1, 123); ++ ++ close(mutex); ++ ++ mutex_args.owner = 123; ++ mutex_args.count = ~0u; ++ mutex = ioctl(fd, NTSYNC_IOC_CREATE_MUTEX, &mutex_args); ++ EXPECT_LE(0, mutex); ++ check_mutex_state(mutex, ~0u, 123); ++ ++ ret = wait_any(fd, 1, &mutex, 123, &index); ++ EXPECT_EQ(-1, ret); ++ EXPECT_EQ(ETIMEDOUT, errno); ++ ++ close(mutex); ++ ++ close(fd); ++} ++ ++TEST(manual_event_state) ++{ ++ struct ntsync_event_args event_args; ++ __u32 index, signaled; ++ int fd, event, ret; ++ ++ fd = open("/dev/ntsync", O_CLOEXEC | O_RDONLY); ++ ASSERT_LE(0, fd); ++ ++ event_args.manual = 1; ++ event_args.signaled = 0; ++ event = ioctl(fd, NTSYNC_IOC_CREATE_EVENT, &event_args); ++ EXPECT_LE(0, event); ++ check_event_state(event, 0, 1); ++ ++ signaled = 0xdeadbeef; ++ ret = ioctl(event, NTSYNC_IOC_EVENT_SET, &signaled); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(0, signaled); ++ check_event_state(event, 1, 1); ++ ++ ret = ioctl(event, NTSYNC_IOC_EVENT_SET, &signaled); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(1, signaled); ++ check_event_state(event, 1, 1); ++ ++ ret = wait_any(fd, 1, &event, 123, &index); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(0, index); ++ check_event_state(event, 1, 1); ++ ++ signaled = 0xdeadbeef; ++ ret = ioctl(event, NTSYNC_IOC_EVENT_RESET, &signaled); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(1, signaled); ++ check_event_state(event, 0, 1); ++ ++ ret = ioctl(event, NTSYNC_IOC_EVENT_RESET, &signaled); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(0, signaled); ++ check_event_state(event, 0, 1); ++ ++ ret = wait_any(fd, 1, &event, 123, &index); ++ EXPECT_EQ(-1, ret); ++ EXPECT_EQ(ETIMEDOUT, errno); ++ ++ ret = ioctl(event, NTSYNC_IOC_EVENT_SET, &signaled); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(0, signaled); ++ ++ ret = ioctl(event, NTSYNC_IOC_EVENT_PULSE, &signaled); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(1, signaled); ++ check_event_state(event, 0, 1); ++ ++ ret = ioctl(event, NTSYNC_IOC_EVENT_PULSE, &signaled); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(0, signaled); ++ check_event_state(event, 0, 1); ++ ++ close(event); ++ ++ close(fd); ++} ++ ++TEST(auto_event_state) ++{ ++ struct ntsync_event_args event_args; ++ __u32 index, signaled; ++ int fd, event, ret; ++ ++ fd = open("/dev/ntsync", O_CLOEXEC | O_RDONLY); ++ ASSERT_LE(0, fd); ++ ++ event_args.manual = 0; ++ event_args.signaled = 1; ++ event = ioctl(fd, NTSYNC_IOC_CREATE_EVENT, &event_args); ++ EXPECT_LE(0, event); ++ ++ check_event_state(event, 1, 0); ++ ++ signaled = 0xdeadbeef; ++ ret = ioctl(event, NTSYNC_IOC_EVENT_SET, &signaled); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(1, signaled); ++ check_event_state(event, 1, 0); ++ ++ ret = wait_any(fd, 1, &event, 123, &index); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(0, index); ++ check_event_state(event, 0, 0); ++ ++ signaled = 0xdeadbeef; ++ ret = ioctl(event, NTSYNC_IOC_EVENT_RESET, &signaled); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(0, signaled); ++ check_event_state(event, 0, 0); ++ ++ ret = wait_any(fd, 1, &event, 123, &index); ++ EXPECT_EQ(-1, ret); ++ EXPECT_EQ(ETIMEDOUT, errno); ++ ++ ret = ioctl(event, NTSYNC_IOC_EVENT_SET, &signaled); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(0, signaled); ++ ++ ret = ioctl(event, NTSYNC_IOC_EVENT_PULSE, &signaled); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(1, signaled); ++ check_event_state(event, 0, 0); ++ ++ ret = ioctl(event, NTSYNC_IOC_EVENT_PULSE, &signaled); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(0, signaled); ++ check_event_state(event, 0, 0); ++ ++ close(event); ++ ++ close(fd); ++} ++ ++TEST(test_wait_any) ++{ ++ int objs[NTSYNC_MAX_WAIT_COUNT + 1], fd, ret; ++ struct ntsync_mutex_args mutex_args = {0}; ++ struct ntsync_sem_args sem_args = {0}; ++ __u32 owner, index, count, i; ++ struct timespec timeout; ++ ++ clock_gettime(CLOCK_MONOTONIC, &timeout); ++ ++ fd = open("/dev/ntsync", O_CLOEXEC | O_RDONLY); ++ ASSERT_LE(0, fd); ++ ++ sem_args.count = 2; ++ sem_args.max = 3; ++ objs[0] = ioctl(fd, NTSYNC_IOC_CREATE_SEM, &sem_args); ++ EXPECT_LE(0, objs[0]); ++ ++ mutex_args.owner = 0; ++ mutex_args.count = 0; ++ objs[1] = ioctl(fd, NTSYNC_IOC_CREATE_MUTEX, &mutex_args); ++ EXPECT_LE(0, objs[1]); ++ ++ ret = wait_any(fd, 2, objs, 123, &index); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(0, index); ++ check_sem_state(objs[0], 1, 3); ++ check_mutex_state(objs[1], 0, 0); ++ ++ ret = wait_any(fd, 2, objs, 123, &index); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(0, index); ++ check_sem_state(objs[0], 0, 3); ++ check_mutex_state(objs[1], 0, 0); ++ ++ ret = wait_any(fd, 2, objs, 123, &index); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(1, index); ++ check_sem_state(objs[0], 0, 3); ++ check_mutex_state(objs[1], 1, 123); ++ ++ count = 1; ++ ret = release_sem(objs[0], &count); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(0, count); ++ ++ ret = wait_any(fd, 2, objs, 123, &index); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(0, index); ++ check_sem_state(objs[0], 0, 3); ++ check_mutex_state(objs[1], 1, 123); ++ ++ ret = wait_any(fd, 2, objs, 123, &index); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(1, index); ++ check_sem_state(objs[0], 0, 3); ++ check_mutex_state(objs[1], 2, 123); ++ ++ ret = wait_any(fd, 2, objs, 456, &index); ++ EXPECT_EQ(-1, ret); ++ EXPECT_EQ(ETIMEDOUT, errno); ++ ++ owner = 123; ++ ret = ioctl(objs[1], NTSYNC_IOC_MUTEX_KILL, &owner); ++ EXPECT_EQ(0, ret); ++ ++ ret = wait_any(fd, 2, objs, 456, &index); ++ EXPECT_EQ(-1, ret); ++ EXPECT_EQ(EOWNERDEAD, errno); ++ EXPECT_EQ(1, index); ++ ++ ret = wait_any(fd, 2, objs, 456, &index); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(1, index); ++ ++ close(objs[1]); ++ ++ /* test waiting on the same object twice */ ++ ++ count = 2; ++ ret = release_sem(objs[0], &count); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(0, count); ++ ++ objs[1] = objs[0]; ++ ret = wait_any(fd, 2, objs, 456, &index); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(0, index); ++ check_sem_state(objs[0], 1, 3); ++ ++ ret = wait_any(fd, 0, NULL, 456, &index); ++ EXPECT_EQ(-1, ret); ++ EXPECT_EQ(ETIMEDOUT, errno); ++ ++ for (i = 1; i < NTSYNC_MAX_WAIT_COUNT + 1; ++i) ++ objs[i] = objs[0]; ++ ++ ret = wait_any(fd, NTSYNC_MAX_WAIT_COUNT, objs, 123, &index); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(0, index); ++ ++ ret = wait_any(fd, NTSYNC_MAX_WAIT_COUNT + 1, objs, 123, &index); ++ EXPECT_EQ(-1, ret); ++ EXPECT_EQ(EINVAL, errno); ++ ++ ret = wait_any(fd, -1, objs, 123, &index); ++ EXPECT_EQ(-1, ret); ++ EXPECT_EQ(EINVAL, errno); ++ ++ close(objs[0]); ++ ++ close(fd); ++} ++ ++TEST(test_wait_all) ++{ ++ struct ntsync_event_args event_args = {0}; ++ struct ntsync_mutex_args mutex_args = {0}; ++ struct ntsync_sem_args sem_args = {0}; ++ __u32 owner, index, count; ++ int objs[2], fd, ret; ++ ++ fd = open("/dev/ntsync", O_CLOEXEC | O_RDONLY); ++ ASSERT_LE(0, fd); ++ ++ sem_args.count = 2; ++ sem_args.max = 3; ++ objs[0] = ioctl(fd, NTSYNC_IOC_CREATE_SEM, &sem_args); ++ EXPECT_LE(0, objs[0]); ++ ++ mutex_args.owner = 0; ++ mutex_args.count = 0; ++ objs[1] = ioctl(fd, NTSYNC_IOC_CREATE_MUTEX, &mutex_args); ++ EXPECT_LE(0, objs[1]); ++ ++ ret = wait_all(fd, 2, objs, 123, &index); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(0, index); ++ check_sem_state(objs[0], 1, 3); ++ check_mutex_state(objs[1], 1, 123); ++ ++ ret = wait_all(fd, 2, objs, 456, &index); ++ EXPECT_EQ(-1, ret); ++ EXPECT_EQ(ETIMEDOUT, errno); ++ check_sem_state(objs[0], 1, 3); ++ check_mutex_state(objs[1], 1, 123); ++ ++ ret = wait_all(fd, 2, objs, 123, &index); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(0, index); ++ check_sem_state(objs[0], 0, 3); ++ check_mutex_state(objs[1], 2, 123); ++ ++ ret = wait_all(fd, 2, objs, 123, &index); ++ EXPECT_EQ(-1, ret); ++ EXPECT_EQ(ETIMEDOUT, errno); ++ check_sem_state(objs[0], 0, 3); ++ check_mutex_state(objs[1], 2, 123); ++ ++ count = 3; ++ ret = release_sem(objs[0], &count); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(0, count); ++ ++ ret = wait_all(fd, 2, objs, 123, &index); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(0, index); ++ check_sem_state(objs[0], 2, 3); ++ check_mutex_state(objs[1], 3, 123); ++ ++ owner = 123; ++ ret = ioctl(objs[1], NTSYNC_IOC_MUTEX_KILL, &owner); ++ EXPECT_EQ(0, ret); ++ ++ ret = wait_all(fd, 2, objs, 123, &index); ++ EXPECT_EQ(-1, ret); ++ EXPECT_EQ(EOWNERDEAD, errno); ++ check_sem_state(objs[0], 1, 3); ++ check_mutex_state(objs[1], 1, 123); ++ ++ close(objs[1]); ++ ++ event_args.manual = true; ++ event_args.signaled = true; ++ objs[1] = ioctl(fd, NTSYNC_IOC_CREATE_EVENT, &event_args); ++ EXPECT_LE(0, objs[1]); ++ ++ ret = wait_all(fd, 2, objs, 123, &index); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(0, index); ++ check_sem_state(objs[0], 0, 3); ++ check_event_state(objs[1], 1, 1); ++ ++ close(objs[1]); ++ ++ /* test waiting on the same object twice */ ++ objs[1] = objs[0]; ++ ret = wait_all(fd, 2, objs, 123, &index); ++ EXPECT_EQ(-1, ret); ++ EXPECT_EQ(EINVAL, errno); ++ ++ close(objs[0]); ++ ++ close(fd); ++} ++ ++struct wake_args { ++ int fd; ++ int obj; ++}; ++ ++struct wait_args { ++ int fd; ++ unsigned long request; ++ struct ntsync_wait_args *args; ++ int ret; ++ int err; ++}; ++ ++static void *wait_thread(void *arg) ++{ ++ struct wait_args *args = arg; ++ ++ args->ret = ioctl(args->fd, args->request, args->args); ++ args->err = errno; ++ return NULL; ++} ++ ++static __u64 get_abs_timeout(unsigned int ms) ++{ ++ struct timespec timeout; ++ clock_gettime(CLOCK_MONOTONIC, &timeout); ++ return (timeout.tv_sec * 1000000000) + timeout.tv_nsec + (ms * 1000000); ++} ++ ++static int wait_for_thread(pthread_t thread, unsigned int ms) ++{ ++ struct timespec timeout; ++ ++ clock_gettime(CLOCK_REALTIME, &timeout); ++ timeout.tv_nsec += ms * 1000000; ++ timeout.tv_sec += (timeout.tv_nsec / 1000000000); ++ timeout.tv_nsec %= 1000000000; ++ return pthread_timedjoin_np(thread, NULL, &timeout); ++} ++ ++TEST(wake_any) ++{ ++ struct ntsync_event_args event_args = {0}; ++ struct ntsync_mutex_args mutex_args = {0}; ++ struct ntsync_wait_args wait_args = {0}; ++ struct ntsync_sem_args sem_args = {0}; ++ struct wait_args thread_args; ++ __u32 count, index, signaled; ++ int objs[2], fd, ret; ++ pthread_t thread; ++ ++ fd = open("/dev/ntsync", O_CLOEXEC | O_RDONLY); ++ ASSERT_LE(0, fd); ++ ++ sem_args.count = 0; ++ sem_args.max = 3; ++ objs[0] = ioctl(fd, NTSYNC_IOC_CREATE_SEM, &sem_args); ++ EXPECT_LE(0, objs[0]); ++ ++ mutex_args.owner = 123; ++ mutex_args.count = 1; ++ objs[1] = ioctl(fd, NTSYNC_IOC_CREATE_MUTEX, &mutex_args); ++ EXPECT_LE(0, objs[1]); ++ ++ /* test waking the semaphore */ ++ ++ wait_args.timeout = get_abs_timeout(1000); ++ wait_args.objs = (uintptr_t)objs; ++ wait_args.count = 2; ++ wait_args.owner = 456; ++ wait_args.index = 0xdeadbeef; ++ thread_args.fd = fd; ++ thread_args.args = &wait_args; ++ thread_args.request = NTSYNC_IOC_WAIT_ANY; ++ ret = pthread_create(&thread, NULL, wait_thread, &thread_args); ++ EXPECT_EQ(0, ret); ++ ++ ret = wait_for_thread(thread, 100); ++ EXPECT_EQ(ETIMEDOUT, ret); ++ ++ count = 1; ++ ret = release_sem(objs[0], &count); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(0, count); ++ check_sem_state(objs[0], 0, 3); ++ ++ ret = wait_for_thread(thread, 100); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(0, thread_args.ret); ++ EXPECT_EQ(0, wait_args.index); ++ ++ /* test waking the mutex */ ++ ++ /* first grab it again for owner 123 */ ++ ret = wait_any(fd, 1, &objs[1], 123, &index); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(0, index); ++ ++ wait_args.timeout = get_abs_timeout(1000); ++ wait_args.owner = 456; ++ ret = pthread_create(&thread, NULL, wait_thread, &thread_args); ++ EXPECT_EQ(0, ret); ++ ++ ret = wait_for_thread(thread, 100); ++ EXPECT_EQ(ETIMEDOUT, ret); ++ ++ ret = unlock_mutex(objs[1], 123, &count); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(2, count); ++ ++ ret = pthread_tryjoin_np(thread, NULL); ++ EXPECT_EQ(EBUSY, ret); ++ ++ ret = unlock_mutex(objs[1], 123, &count); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(1, mutex_args.count); ++ check_mutex_state(objs[1], 1, 456); ++ ++ ret = wait_for_thread(thread, 100); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(0, thread_args.ret); ++ EXPECT_EQ(1, wait_args.index); ++ ++ close(objs[1]); ++ ++ /* test waking events */ ++ ++ event_args.manual = false; ++ event_args.signaled = false; ++ objs[1] = ioctl(fd, NTSYNC_IOC_CREATE_EVENT, &event_args); ++ EXPECT_LE(0, objs[1]); ++ ++ wait_args.timeout = get_abs_timeout(1000); ++ ret = pthread_create(&thread, NULL, wait_thread, &thread_args); ++ EXPECT_EQ(0, ret); ++ ++ ret = wait_for_thread(thread, 100); ++ EXPECT_EQ(ETIMEDOUT, ret); ++ ++ ret = ioctl(objs[1], NTSYNC_IOC_EVENT_SET, &signaled); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(0, signaled); ++ check_event_state(objs[1], 0, 0); ++ ++ ret = wait_for_thread(thread, 100); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(0, thread_args.ret); ++ EXPECT_EQ(1, wait_args.index); ++ ++ wait_args.timeout = get_abs_timeout(1000); ++ ret = pthread_create(&thread, NULL, wait_thread, &thread_args); ++ EXPECT_EQ(0, ret); ++ ++ ret = wait_for_thread(thread, 100); ++ EXPECT_EQ(ETIMEDOUT, ret); ++ ++ ret = ioctl(objs[1], NTSYNC_IOC_EVENT_PULSE, &signaled); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(0, signaled); ++ check_event_state(objs[1], 0, 0); ++ ++ ret = wait_for_thread(thread, 100); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(0, thread_args.ret); ++ EXPECT_EQ(1, wait_args.index); ++ ++ close(objs[1]); ++ ++ event_args.manual = true; ++ event_args.signaled = false; ++ objs[1] = ioctl(fd, NTSYNC_IOC_CREATE_EVENT, &event_args); ++ EXPECT_LE(0, objs[1]); ++ ++ wait_args.timeout = get_abs_timeout(1000); ++ ret = pthread_create(&thread, NULL, wait_thread, &thread_args); ++ EXPECT_EQ(0, ret); ++ ++ ret = wait_for_thread(thread, 100); ++ EXPECT_EQ(ETIMEDOUT, ret); ++ ++ ret = ioctl(objs[1], NTSYNC_IOC_EVENT_SET, &signaled); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(0, signaled); ++ check_event_state(objs[1], 1, 1); ++ ++ ret = wait_for_thread(thread, 100); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(0, thread_args.ret); ++ EXPECT_EQ(1, wait_args.index); ++ ++ ret = ioctl(objs[1], NTSYNC_IOC_EVENT_RESET, &signaled); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(1, signaled); ++ ++ wait_args.timeout = get_abs_timeout(1000); ++ ret = pthread_create(&thread, NULL, wait_thread, &thread_args); ++ EXPECT_EQ(0, ret); ++ ++ ret = wait_for_thread(thread, 100); ++ EXPECT_EQ(ETIMEDOUT, ret); ++ ++ ret = ioctl(objs[1], NTSYNC_IOC_EVENT_PULSE, &signaled); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(0, signaled); ++ check_event_state(objs[1], 0, 1); ++ ++ ret = wait_for_thread(thread, 100); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(0, thread_args.ret); ++ EXPECT_EQ(1, wait_args.index); ++ ++ /* delete an object while it's being waited on */ ++ ++ wait_args.timeout = get_abs_timeout(200); ++ wait_args.owner = 123; ++ ret = pthread_create(&thread, NULL, wait_thread, &thread_args); ++ EXPECT_EQ(0, ret); ++ ++ ret = wait_for_thread(thread, 100); ++ EXPECT_EQ(ETIMEDOUT, ret); ++ ++ close(objs[0]); ++ close(objs[1]); ++ ++ ret = wait_for_thread(thread, 200); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(-1, thread_args.ret); ++ EXPECT_EQ(ETIMEDOUT, thread_args.err); ++ ++ close(fd); ++} ++ ++TEST(wake_all) ++{ ++ struct ntsync_event_args manual_event_args = {0}; ++ struct ntsync_event_args auto_event_args = {0}; ++ struct ntsync_mutex_args mutex_args = {0}; ++ struct ntsync_wait_args wait_args = {0}; ++ struct ntsync_sem_args sem_args = {0}; ++ struct wait_args thread_args; ++ __u32 count, index, signaled; ++ int objs[4], fd, ret; ++ pthread_t thread; ++ ++ fd = open("/dev/ntsync", O_CLOEXEC | O_RDONLY); ++ ASSERT_LE(0, fd); ++ ++ sem_args.count = 0; ++ sem_args.max = 3; ++ objs[0] = ioctl(fd, NTSYNC_IOC_CREATE_SEM, &sem_args); ++ EXPECT_LE(0, objs[0]); ++ ++ mutex_args.owner = 123; ++ mutex_args.count = 1; ++ objs[1] = ioctl(fd, NTSYNC_IOC_CREATE_MUTEX, &mutex_args); ++ EXPECT_LE(0, objs[1]); ++ ++ manual_event_args.manual = true; ++ manual_event_args.signaled = true; ++ objs[2] = ioctl(fd, NTSYNC_IOC_CREATE_EVENT, &manual_event_args); ++ EXPECT_LE(0, objs[2]); ++ ++ auto_event_args.manual = false; ++ auto_event_args.signaled = true; ++ objs[3] = ioctl(fd, NTSYNC_IOC_CREATE_EVENT, &auto_event_args); ++ EXPECT_EQ(0, objs[3]); ++ ++ wait_args.timeout = get_abs_timeout(1000); ++ wait_args.objs = (uintptr_t)objs; ++ wait_args.count = 4; ++ wait_args.owner = 456; ++ thread_args.fd = fd; ++ thread_args.args = &wait_args; ++ thread_args.request = NTSYNC_IOC_WAIT_ALL; ++ ret = pthread_create(&thread, NULL, wait_thread, &thread_args); ++ EXPECT_EQ(0, ret); ++ ++ ret = wait_for_thread(thread, 100); ++ EXPECT_EQ(ETIMEDOUT, ret); ++ ++ count = 1; ++ ret = release_sem(objs[0], &count); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(0, count); ++ ++ ret = pthread_tryjoin_np(thread, NULL); ++ EXPECT_EQ(EBUSY, ret); ++ ++ check_sem_state(objs[0], 1, 3); ++ ++ ret = wait_any(fd, 1, &objs[0], 123, &index); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(0, index); ++ ++ ret = unlock_mutex(objs[1], 123, &count); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(1, count); ++ ++ ret = pthread_tryjoin_np(thread, NULL); ++ EXPECT_EQ(EBUSY, ret); ++ ++ check_mutex_state(objs[1], 0, 0); ++ ++ ret = ioctl(objs[2], NTSYNC_IOC_EVENT_RESET, &signaled); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(1, signaled); ++ ++ count = 2; ++ ret = release_sem(objs[0], &count); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(0, count); ++ check_sem_state(objs[0], 2, 3); ++ ++ ret = ioctl(objs[3], NTSYNC_IOC_EVENT_RESET, &signaled); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(1, signaled); ++ ++ ret = ioctl(objs[2], NTSYNC_IOC_EVENT_SET, &signaled); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(0, signaled); ++ ++ ret = ioctl(objs[3], NTSYNC_IOC_EVENT_SET, &signaled); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(0, signaled); ++ ++ check_sem_state(objs[0], 1, 3); ++ check_mutex_state(objs[1], 1, 456); ++ check_event_state(objs[2], 1, 1); ++ check_event_state(objs[3], 0, 0); ++ ++ ret = wait_for_thread(thread, 100); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(0, thread_args.ret); ++ ++ /* delete an object while it's being waited on */ ++ ++ wait_args.timeout = get_abs_timeout(200); ++ wait_args.owner = 123; ++ ret = pthread_create(&thread, NULL, wait_thread, &thread_args); ++ EXPECT_EQ(0, ret); ++ ++ ret = wait_for_thread(thread, 100); ++ EXPECT_EQ(ETIMEDOUT, ret); ++ ++ close(objs[0]); ++ close(objs[1]); ++ close(objs[2]); ++ close(objs[3]); ++ ++ ret = wait_for_thread(thread, 200); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(-1, thread_args.ret); ++ EXPECT_EQ(ETIMEDOUT, thread_args.err); ++ ++ close(fd); ++} ++ ++TEST(alert_any) ++{ ++ struct ntsync_event_args event_args = {0}; ++ struct ntsync_wait_args wait_args = {0}; ++ struct ntsync_sem_args sem_args = {0}; ++ __u32 index, count, signaled; ++ struct wait_args thread_args; ++ int objs[2], event, fd, ret; ++ pthread_t thread; ++ ++ fd = open("/dev/ntsync", O_CLOEXEC | O_RDONLY); ++ ASSERT_LE(0, fd); ++ ++ sem_args.count = 0; ++ sem_args.max = 2; ++ objs[0] = ioctl(fd, NTSYNC_IOC_CREATE_SEM, &sem_args); ++ EXPECT_LE(0, objs[0]); ++ ++ sem_args.count = 1; ++ sem_args.max = 2; ++ objs[1] = ioctl(fd, NTSYNC_IOC_CREATE_SEM, &sem_args); ++ EXPECT_LE(0, objs[1]); ++ ++ event_args.manual = true; ++ event_args.signaled = true; ++ event = ioctl(fd, NTSYNC_IOC_CREATE_EVENT, &event_args); ++ EXPECT_LE(0, event); ++ ++ ret = wait_any_alert(fd, 0, NULL, 123, event, &index); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(0, index); ++ ++ ret = ioctl(event, NTSYNC_IOC_EVENT_RESET, &signaled); ++ EXPECT_EQ(0, ret); ++ ++ ret = wait_any_alert(fd, 0, NULL, 123, event, &index); ++ EXPECT_EQ(-1, ret); ++ EXPECT_EQ(ETIMEDOUT, errno); ++ ++ ret = ioctl(event, NTSYNC_IOC_EVENT_SET, &signaled); ++ EXPECT_EQ(0, ret); ++ ++ ret = wait_any_alert(fd, 2, objs, 123, event, &index); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(1, index); ++ ++ ret = wait_any_alert(fd, 2, objs, 123, event, &index); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(2, index); ++ ++ /* test wakeup via alert */ ++ ++ ret = ioctl(event, NTSYNC_IOC_EVENT_RESET, &signaled); ++ EXPECT_EQ(0, ret); ++ ++ wait_args.timeout = get_abs_timeout(1000); ++ wait_args.objs = (uintptr_t)objs; ++ wait_args.count = 2; ++ wait_args.owner = 123; ++ wait_args.index = 0xdeadbeef; ++ wait_args.alert = event; ++ thread_args.fd = fd; ++ thread_args.args = &wait_args; ++ thread_args.request = NTSYNC_IOC_WAIT_ANY; ++ ret = pthread_create(&thread, NULL, wait_thread, &thread_args); ++ EXPECT_EQ(0, ret); ++ ++ ret = wait_for_thread(thread, 100); ++ EXPECT_EQ(ETIMEDOUT, ret); ++ ++ ret = ioctl(event, NTSYNC_IOC_EVENT_SET, &signaled); ++ EXPECT_EQ(0, ret); ++ ++ ret = wait_for_thread(thread, 100); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(0, thread_args.ret); ++ EXPECT_EQ(2, wait_args.index); ++ ++ close(event); ++ ++ /* test with an auto-reset event */ ++ ++ event_args.manual = false; ++ event_args.signaled = true; ++ event = ioctl(fd, NTSYNC_IOC_CREATE_EVENT, &event_args); ++ EXPECT_LE(0, event); ++ ++ count = 1; ++ ret = release_sem(objs[0], &count); ++ EXPECT_EQ(0, ret); ++ ++ ret = wait_any_alert(fd, 2, objs, 123, event, &index); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(0, index); ++ ++ ret = wait_any_alert(fd, 2, objs, 123, event, &index); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(2, index); ++ ++ ret = wait_any_alert(fd, 2, objs, 123, event, &index); ++ EXPECT_EQ(-1, ret); ++ EXPECT_EQ(ETIMEDOUT, errno); ++ ++ close(event); ++ ++ close(objs[0]); ++ close(objs[1]); ++ ++ close(fd); ++} ++ ++TEST(alert_all) ++{ ++ struct ntsync_event_args event_args = {0}; ++ struct ntsync_wait_args wait_args = {0}; ++ struct ntsync_sem_args sem_args = {0}; ++ struct wait_args thread_args; ++ __u32 index, count, signaled; ++ int objs[2], event, fd, ret; ++ pthread_t thread; ++ ++ fd = open("/dev/ntsync", O_CLOEXEC | O_RDONLY); ++ ASSERT_LE(0, fd); ++ ++ sem_args.count = 2; ++ sem_args.max = 2; ++ objs[0] = ioctl(fd, NTSYNC_IOC_CREATE_SEM, &sem_args); ++ EXPECT_LE(0, objs[0]); ++ ++ sem_args.count = 1; ++ sem_args.max = 2; ++ objs[1] = ioctl(fd, NTSYNC_IOC_CREATE_SEM, &sem_args); ++ EXPECT_LE(0, objs[1]); ++ ++ event_args.manual = true; ++ event_args.signaled = true; ++ event = ioctl(fd, NTSYNC_IOC_CREATE_EVENT, &event_args); ++ EXPECT_LE(0, event); ++ ++ ret = wait_all_alert(fd, 2, objs, 123, event, &index); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(0, index); ++ ++ ret = wait_all_alert(fd, 2, objs, 123, event, &index); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(2, index); ++ ++ /* test wakeup via alert */ ++ ++ ret = ioctl(event, NTSYNC_IOC_EVENT_RESET, &signaled); ++ EXPECT_EQ(0, ret); ++ ++ wait_args.timeout = get_abs_timeout(1000); ++ wait_args.objs = (uintptr_t)objs; ++ wait_args.count = 2; ++ wait_args.owner = 123; ++ wait_args.index = 0xdeadbeef; ++ wait_args.alert = event; ++ thread_args.fd = fd; ++ thread_args.args = &wait_args; ++ thread_args.request = NTSYNC_IOC_WAIT_ALL; ++ ret = pthread_create(&thread, NULL, wait_thread, &thread_args); ++ EXPECT_EQ(0, ret); ++ ++ ret = wait_for_thread(thread, 100); ++ EXPECT_EQ(ETIMEDOUT, ret); ++ ++ ret = ioctl(event, NTSYNC_IOC_EVENT_SET, &signaled); ++ EXPECT_EQ(0, ret); ++ ++ ret = wait_for_thread(thread, 100); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(0, thread_args.ret); ++ EXPECT_EQ(2, wait_args.index); ++ ++ close(event); ++ ++ /* test with an auto-reset event */ ++ ++ event_args.manual = false; ++ event_args.signaled = true; ++ event = ioctl(fd, NTSYNC_IOC_CREATE_EVENT, &event_args); ++ EXPECT_LE(0, event); ++ ++ count = 2; ++ ret = release_sem(objs[1], &count); ++ EXPECT_EQ(0, ret); ++ ++ ret = wait_all_alert(fd, 2, objs, 123, event, &index); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(0, index); ++ ++ ret = wait_all_alert(fd, 2, objs, 123, event, &index); ++ EXPECT_EQ(0, ret); ++ EXPECT_EQ(2, index); ++ ++ ret = wait_all_alert(fd, 2, objs, 123, event, &index); ++ EXPECT_EQ(-1, ret); ++ EXPECT_EQ(ETIMEDOUT, errno); ++ ++ close(event); ++ ++ close(objs[0]); ++ close(objs[1]); ++ ++ close(fd); ++} ++ ++#define STRESS_LOOPS 10000 ++#define STRESS_THREADS 4 ++ ++static unsigned int stress_counter; ++static int stress_device, stress_start_event, stress_mutex; ++ ++static void *stress_thread(void *arg) ++{ ++ struct ntsync_wait_args wait_args = {0}; ++ __u32 index, count, i; ++ int ret; ++ ++ wait_args.timeout = UINT64_MAX; ++ wait_args.count = 1; ++ wait_args.objs = (uintptr_t)&stress_start_event; ++ wait_args.owner = gettid(); ++ wait_args.index = 0xdeadbeef; ++ ++ ioctl(stress_device, NTSYNC_IOC_WAIT_ANY, &wait_args); ++ ++ wait_args.objs = (uintptr_t)&stress_mutex; ++ ++ for (i = 0; i < STRESS_LOOPS; ++i) { ++ ioctl(stress_device, NTSYNC_IOC_WAIT_ANY, &wait_args); ++ ++ ++stress_counter; ++ ++ unlock_mutex(stress_mutex, wait_args.owner, &count); ++ } ++ ++ return NULL; ++} ++ ++TEST(stress_wait) ++{ ++ struct ntsync_event_args event_args; ++ struct ntsync_mutex_args mutex_args; ++ pthread_t threads[STRESS_THREADS]; ++ __u32 signaled, i; ++ int ret; ++ ++ stress_device = open("/dev/ntsync", O_CLOEXEC | O_RDONLY); ++ ASSERT_LE(0, stress_device); ++ ++ mutex_args.owner = 0; ++ mutex_args.count = 0; ++ stress_mutex = ioctl(stress_device, NTSYNC_IOC_CREATE_MUTEX, &mutex_args); ++ EXPECT_LE(0, stress_mutex); ++ ++ event_args.manual = 1; ++ event_args.signaled = 0; ++ stress_start_event = ioctl(stress_device, NTSYNC_IOC_CREATE_EVENT, &event_args); ++ EXPECT_LE(0, stress_start_event); ++ ++ for (i = 0; i < STRESS_THREADS; ++i) ++ pthread_create(&threads[i], NULL, stress_thread, NULL); ++ ++ ret = ioctl(stress_start_event, NTSYNC_IOC_EVENT_SET, &signaled); ++ EXPECT_EQ(0, ret); ++ ++ for (i = 0; i < STRESS_THREADS; ++i) { ++ ret = pthread_join(threads[i], NULL); ++ EXPECT_EQ(0, ret); ++ } ++ ++ EXPECT_EQ(STRESS_LOOPS * STRESS_THREADS, stress_counter); ++ ++ close(stress_start_event); ++ close(stress_mutex); ++ close(stress_device); ++} ++ ++TEST_HARNESS_MAIN +-- +2.51.0 + From ba8b145ed97684dabbe53510424c9d7677ff0e26 Mon Sep 17 00:00:00 2001 From: John Williams Date: Sun, 12 Oct 2025 14:21:19 +1100 Subject: [PATCH 08/11] S922X / RK3326 - linux - enable ntsync --- projects/ROCKNIX/devices/RK3326/linux/linux.aarch64.conf | 6 +++--- projects/ROCKNIX/devices/S922X/linux/linux.aarch64.conf | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/projects/ROCKNIX/devices/RK3326/linux/linux.aarch64.conf b/projects/ROCKNIX/devices/RK3326/linux/linux.aarch64.conf index ceb9d36212..94acb3c01d 100644 --- a/projects/ROCKNIX/devices/RK3326/linux/linux.aarch64.conf +++ b/projects/ROCKNIX/devices/RK3326/linux/linux.aarch64.conf @@ -11,8 +11,8 @@ CONFIG_AS_VERSION=24400 CONFIG_LD_IS_BFD=y CONFIG_LD_VERSION=24400 CONFIG_LLD_VERSION=0 -CONFIG_RUSTC_VERSION=108900 -CONFIG_RUSTC_LLVM_VERSION=200107 +CONFIG_RUSTC_VERSION=0 +CONFIG_RUSTC_LLVM_VERSION=0 CONFIG_CC_CAN_LINK=y CONFIG_CC_CAN_LINK_STATIC=y CONFIG_CC_HAS_ASM_GOTO_OUTPUT=y @@ -21,7 +21,6 @@ CONFIG_TOOLS_SUPPORT_RELR=y CONFIG_CC_HAS_ASM_INLINE=y CONFIG_CC_HAS_NO_PROFILE_FN_ATTR=y CONFIG_LD_CAN_USE_KEEP_IN_OVERLAY=y -CONFIG_RUSTC_HAS_UNNECESSARY_TRANSMUTES=y CONFIG_PAHOLE_VERSION=0 CONFIG_IRQ_WORK=y CONFIG_BUILDTIME_TABLE_SORT=y @@ -1717,6 +1716,7 @@ CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 # CONFIG_XILINX_SDFEC is not set # CONFIG_HISI_HIKEY_USB is not set # CONFIG_OPEN_DICE is not set +CONFIG_NTSYNC=y # CONFIG_VCPU_STALL_DETECTOR is not set # CONFIG_C2PORT is not set diff --git a/projects/ROCKNIX/devices/S922X/linux/linux.aarch64.conf b/projects/ROCKNIX/devices/S922X/linux/linux.aarch64.conf index 836701f125..7784899df5 100644 --- a/projects/ROCKNIX/devices/S922X/linux/linux.aarch64.conf +++ b/projects/ROCKNIX/devices/S922X/linux/linux.aarch64.conf @@ -11,8 +11,8 @@ CONFIG_AS_VERSION=24400 CONFIG_LD_IS_BFD=y CONFIG_LD_VERSION=24400 CONFIG_LLD_VERSION=0 -CONFIG_RUSTC_VERSION=108900 -CONFIG_RUSTC_LLVM_VERSION=200107 +CONFIG_RUSTC_VERSION=0 +CONFIG_RUSTC_LLVM_VERSION=0 CONFIG_CC_CAN_LINK=y CONFIG_CC_CAN_LINK_STATIC=y CONFIG_CC_HAS_ASM_GOTO_OUTPUT=y @@ -21,7 +21,6 @@ CONFIG_TOOLS_SUPPORT_RELR=y CONFIG_CC_HAS_ASM_INLINE=y CONFIG_CC_HAS_NO_PROFILE_FN_ATTR=y CONFIG_LD_CAN_USE_KEEP_IN_OVERLAY=y -CONFIG_RUSTC_HAS_UNNECESSARY_TRANSMUTES=y CONFIG_PAHOLE_VERSION=0 CONFIG_IRQ_WORK=y CONFIG_BUILDTIME_TABLE_SORT=y @@ -1718,6 +1717,7 @@ CONFIG_BLK_DEV_RAM_SIZE=4096 # CONFIG_XILINX_SDFEC is not set # CONFIG_HISI_HIKEY_USB is not set # CONFIG_OPEN_DICE is not set +CONFIG_NTSYNC=y # CONFIG_VCPU_STALL_DETECTOR is not set # CONFIG_C2PORT is not set From b5ae6799461a517b6584f9bfeee35baaf2ea2098 Mon Sep 17 00:00:00 2001 From: John Williams Date: Sun, 12 Oct 2025 14:24:43 +1100 Subject: [PATCH 09/11] SM8250 - linux - enable ntsync --- projects/ROCKNIX/devices/SM8250/linux/linux.aarch64.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/ROCKNIX/devices/SM8250/linux/linux.aarch64.conf b/projects/ROCKNIX/devices/SM8250/linux/linux.aarch64.conf index 889a03c45b..8b40214430 100644 --- a/projects/ROCKNIX/devices/SM8250/linux/linux.aarch64.conf +++ b/projects/ROCKNIX/devices/SM8250/linux/linux.aarch64.conf @@ -2135,7 +2135,7 @@ CONFIG_PCI_ENDPOINT_TEST=m # CONFIG_XILINX_SDFEC is not set # CONFIG_HISI_HIKEY_USB is not set # CONFIG_OPEN_DICE is not set -# CONFIG_NTSYNC is not set +CONFIG_NTSYNC=y # CONFIG_VCPU_STALL_DETECTOR is not set # CONFIG_NSM is not set # CONFIG_MCHP_LAN966X_PCI is not set From 454a07495c2f19b391e04f8783e7da1d2ace9222 Mon Sep 17 00:00:00 2001 From: John Williams Date: Sun, 12 Oct 2025 14:28:00 +1100 Subject: [PATCH 10/11] H700 - linux - enable ntsync --- projects/ROCKNIX/devices/H700/linux/linux.aarch64.conf | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/projects/ROCKNIX/devices/H700/linux/linux.aarch64.conf b/projects/ROCKNIX/devices/H700/linux/linux.aarch64.conf index 39ca6cc7f0..6b631d74fa 100644 --- a/projects/ROCKNIX/devices/H700/linux/linux.aarch64.conf +++ b/projects/ROCKNIX/devices/H700/linux/linux.aarch64.conf @@ -11,8 +11,8 @@ CONFIG_AS_VERSION=24400 CONFIG_LD_IS_BFD=y CONFIG_LD_VERSION=24400 CONFIG_LLD_VERSION=0 -CONFIG_RUSTC_VERSION=108900 -CONFIG_RUSTC_LLVM_VERSION=200107 +CONFIG_RUSTC_VERSION=0 +CONFIG_RUSTC_LLVM_VERSION=0 CONFIG_CC_CAN_LINK=y CONFIG_CC_HAS_ASM_GOTO_OUTPUT=y CONFIG_CC_HAS_ASM_GOTO_TIED_OUTPUT=y @@ -20,9 +20,6 @@ CONFIG_TOOLS_SUPPORT_RELR=y CONFIG_CC_HAS_ASM_INLINE=y CONFIG_CC_HAS_NO_PROFILE_FN_ATTR=y CONFIG_LD_CAN_USE_KEEP_IN_OVERLAY=y -CONFIG_RUSTC_HAS_COERCE_POINTEE=y -CONFIG_RUSTC_HAS_SPAN_FILE=y -CONFIG_RUSTC_HAS_UNNECESSARY_TRANSMUTES=y CONFIG_PAHOLE_VERSION=0 CONFIG_IRQ_WORK=y CONFIG_BUILDTIME_TABLE_SORT=y @@ -2073,7 +2070,7 @@ CONFIG_SRAM=y # CONFIG_XILINX_SDFEC is not set # CONFIG_HISI_HIKEY_USB is not set # CONFIG_OPEN_DICE is not set -# CONFIG_NTSYNC is not set +CONFIG_NTSYNC=y # CONFIG_VCPU_STALL_DETECTOR is not set # CONFIG_NSM is not set # CONFIG_MCHP_LAN966X_PCI is not set From 1569a79091cc01a25041a84aef3e8c66c5827d90 Mon Sep 17 00:00:00 2001 From: spycat88 Date: Sun, 12 Oct 2025 16:06:31 +0100 Subject: [PATCH 11/11] emulationstation: bump package --- projects/ROCKNIX/packages/ui/emulationstation/package.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/ROCKNIX/packages/ui/emulationstation/package.mk b/projects/ROCKNIX/packages/ui/emulationstation/package.mk index 43868f6ecb..ac16123c11 100644 --- a/projects/ROCKNIX/packages/ui/emulationstation/package.mk +++ b/projects/ROCKNIX/packages/ui/emulationstation/package.mk @@ -2,7 +2,7 @@ # Copyright (C) 2024-present ROCKNIX (https://github.com/ROCKNIX) PKG_NAME="emulationstation" -PKG_VERSION="9c458a702e50f62e088e8734e71128bb071c7b4a" +PKG_VERSION="6e6911fab0eb4ed572dd5c5ac324bca193d35524" PKG_GIT_CLONE_BRANCH="master" PKG_LICENSE="GPL" PKG_SITE="https://github.com/ROCKNIX/emulationstation-next"