diff --git a/.gitignore b/.gitignore index ea17e28c8..a92ad9efe 100644 --- a/.gitignore +++ b/.gitignore @@ -60,6 +60,7 @@ gradle /gradlew.bat obj/ jniLibs/ +QEMU_VERSION jnilibs limbotest @@ -69,6 +70,5 @@ limbotest sync.sh gitsync.sh -/limbo-android-lib/src/main/jni/qemu.5.1.0 -/limbo-android-lib/src/main/jni/qemu.2.9.1 - +/limbo-android-lib/src/main/jni/qemu-2.9.1/ +/limbo-android-lib/src/main/jni/qemu-5.1.0/ diff --git a/README.developers b/README.developers index a5e765021..8e0d44605 100644 --- a/README.developers +++ b/README.developers @@ -14,13 +14,13 @@ https://github.com/limboemu/limbo 2. Requirements: Android SDK - Android NDK: r14b/gcc or r23/clang + Android NDK: r14b/gcc or r23b/clang Android Studio (3.1.1 preferred) Android device with Android OS 8.0 (Oreo) and above Linux Desktop pc (Ubuntu preferred) Make sure you have the following packages installed, if not run: sudo apt-get install make autoconf automake git python binutils - sudo apt-get install libtool-bin pkg-config flex bison gettext texinfo + sudo apt-get install libtool-bin pkg-config flex bison gettext texinfo rsync For development you can use your own editors Geany is highly recommended for editing the native code @@ -56,6 +56,10 @@ https://github.com/limboemu/limbo wget http://download.qemu-project.org/qemu-5.1.0.tar.xz -P /tmp/ tar -xJf /tmp/qemu-5.1.0.tar.xz mv qemu-5.1.0 qemu + # For QEMU version 2.9.1: + wget http://download.qemu-project.org/qemu-2.9.1.tar.xz -P /tmp/ + tar -xJf /tmp/qemu-2.9.1.tar.xz + mv qemu-2.9.1 qemu ##### GET glib wget https://ftp.gnome.org/pub/GNOME/sources/glib/2.56/glib-2.56.1.tar.xz -P /tmp/ @@ -97,6 +101,8 @@ https://github.com/limboemu/limbo # example for 5.1.0: cd ./limbo-android-lib/src/main/jni/qemu/ patch -p1 < ../patches/qemu-5.1.0.patch + # for 2.9.1: + patch -p1 < ../patches/qemu-2.9.1.patch ### Apply glib patch for Limbo: cd ./limbo-android-lib/src/main/jni/glib/ @@ -197,6 +203,16 @@ https://github.com/limboemu/limbo export BUILD_GUEST=x86_64-softmmu,aarch64-softmmu make limbo + 8) To build limbo for older devices with gcc set the following options: + export NDK_ROOT=/home/dev/tools/ndk/android-ndk-r14b + export USE_GCC=true + export BUILD_HOST=armeabi-v7a + export BUILD_GUEST=x86_64-softmmu + export USE_QEMU_VERSION=2.9.1 + export USE_AAUDIO=false + + For more options see android-limbo-config.mak + You should now have the following libraries in these 2 folders: limbo-android-lib/src/main/jniLibs// @@ -297,6 +313,7 @@ https://github.com/limboemu/limbo [core] eol = true autocrlf = input + fileMode = false =============================================================================== 10. Run diff --git a/README.md b/README.md index 6b176adb4..4874d7a8b 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # Limbo Emulator (QEMU) for Android # -# For APK Downloads, Guides, and Help visit the Limbo Wiki: -# https://github.com/limboemu/limbo/wiki +# For APK Downloads, Guides, and Help visit: +# https://virtualmachinery.weebly.com Limbo is a QEMU-based emulator for Android supports emulation for these architectures: x86/x86_64 diff --git a/VERSION b/VERSION index 01fdd2d8f..6f68e2ea5 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -501.00 +600.01 diff --git a/limbo-android-arm/build.gradle b/limbo-android-arm/build.gradle index 4eecde126..02efb6958 100644 --- a/limbo-android-arm/build.gradle +++ b/limbo-android-arm/build.gradle @@ -6,7 +6,7 @@ android { defaultConfig { applicationId "com.limbo.emu.main.arm" - minSdkVersion 26 + minSdkVersion 21 targetSdkVersion 29 ndk { abiFilters "armeabi-v7a","arm64-v8a", "x86", "x86_64" } } diff --git a/limbo-android-arm/src/main/AndroidManifest.xml b/limbo-android-arm/src/main/AndroidManifest.xml index 15ac0eaf2..0823c2de1 100644 --- a/limbo-android-arm/src/main/AndroidManifest.xml +++ b/limbo-android-arm/src/main/AndroidManifest.xml @@ -1,75 +1,24 @@ - + - - - - - - - - - - - - + android:versionCode="60001" + android:versionName="6.0.1-arm"> + > - - - - - - - - - - - - - - - - diff --git a/limbo-android-arm/src/main/java/com/limbo/emu/main/arm/LimboEmuActivity.java b/limbo-android-arm/src/main/java/com/limbo/emu/main/arm/LimboEmuActivity.java index 52e6864f4..144a62718 100644 --- a/limbo-android-arm/src/main/java/com/limbo/emu/main/arm/LimboEmuActivity.java +++ b/limbo-android-arm/src/main/java/com/limbo/emu/main/arm/LimboEmuActivity.java @@ -26,11 +26,10 @@ public void onCreate(Bundle bundle){ getString(R.string.DebianArmLinuxDescr), "https://github.com/limboemu/limbo/wiki/Debian-ARM-Linux", LinksManager.LinkType.ISO)); - Config.ideInterfaceType = "scsi"; super.onCreate(bundle); //TODO: change location to something that the user will have access outside of limbo // like internal storage - Logger.setupLogFile(LimboApplication.getInstance().getCacheDir() + "/limbo/limbo-arm-log.txt"); + Logger.setupLogFile("/limbo/limbo-arm-log.txt"); } protected void loadQEMULib(){ diff --git a/limbo-android-lib/build.gradle b/limbo-android-lib/build.gradle index 28e0de26a..b8bc5fa66 100644 --- a/limbo-android-lib/build.gradle +++ b/limbo-android-lib/build.gradle @@ -5,7 +5,7 @@ android { buildToolsVersion '29.0.3' defaultConfig{ - minSdkVersion 26 + minSdkVersion 21 targetSdkVersion 29 } buildTypes { diff --git a/limbo-android-lib/src/main/AndroidManifest.xml b/limbo-android-lib/src/main/AndroidManifest.xml index ef5a2a2ea..85fbc7c67 100644 --- a/limbo-android-lib/src/main/AndroidManifest.xml +++ b/limbo-android-lib/src/main/AndroidManifest.xml @@ -1,11 +1,12 @@ + > + @@ -16,6 +17,38 @@ - - \ No newline at end of file + + + + + + + + + + + + diff --git a/limbo-android-lib/src/main/assets/CHANGELOG b/limbo-android-lib/src/main/assets/CHANGELOG index c00ac3e6c..cc584ebff 100644 --- a/limbo-android-lib/src/main/assets/CHANGELOG +++ b/limbo-android-lib/src/main/assets/CHANGELOG @@ -1,33 +1,40 @@ +* Limbo Legacy v6.0.1 +Added qemu disk cache option +Added qemu hdd interfaces (tap on the disk icon) +Added ignore breakpoint tb invalidation option +Apply acceleration option after extra params +Added option for importing custom BIOS +Fixed update checker dialog box +Fixed crash when no machine is loaded +Fixed problem not saving edit text when machine starts +Fixed legacy file manager +Fixed old ndk/gcc support + * Limbo Legacy v6.0.0 -Using QEMU 2.9.1 for better performance! -WARNING: - This is version much faster than 5.x but very old and behind many security patches! - Make sure you trust the virtual images and any software you install within the vm! -Changed minimum SDK version to 26 (Oreo and above). -You can still build with Android API 21 without Aaudio option. -Added Android Aaudio native audio interface for lower latency, see settings. -Using 22050 sample rate instead of 44199 for better audio with lesser clicking. -Fixed crashing when resuming due to audio buffer writing. -Fixed android notification not dismissing. -Removed internal VNC client you should check the Wiki for alternative VNC clients. +Built both variants for QEMU 5.1.0 for stability and 2.9.1 for better performance. +WARNING: QEMU 2.9.1 version is much faster than 5.1.0 but very old and +behind many security patches! Install only virtual images and software you trust! Fixed SDL resizing after rotating and resuming application. SDL user interface can now disconnect and resume. -VNC Password and Allow External VNC clients are now under settings. -Moved Screen options to settings. -New Pause button for pausing when started VNC user interface. -Machine architecture was not needed so it is now removed, use cpu instead. Added support for changin idle refresh rate for SDL. Created KeyMapper for mapping keys and mouse buttons for gaming, see Wiki for info. +Removed internal VNC client you should check the Wiki for alternative VNC clients. +VNC Password and Allow External VNC clients are now under settings. +New Pause button for pausing when started VNC user interface. Mouse enhancements for Touchscreen and External Mouse. Absolute mouse devices support only guests that have usb-tablet drivers installed. Added new out of bounds prevention option for mouse. Added new Key and Mouse delay options. +Global screen options are now moved to Menu Settings. +Machine architecture was not needed so it is now removed. Removed Shared Folder because it is buggy. -Internal redesign of the ui dispatching and interface with native code. +Added Android Aaudio native audio interface for lower latency (Oreo and above only). +Using 22050 sample rate instead of 44199 for better audio with lesser clicking. +Fixed crashing when resuming due to audio buffer writing. +Internal redesign of the Android user interface. Better build environment for development. -Fixed clang support with ndk r23 -Upgraded libraries to ffi ver 3.3 and pixman ver 0.40.0 -Removed patch for QEMU 4.0.0 the only versions currently support are 2.9.1 and 5.1.0. +Building with ndk r23 clang by default, r14b gcc is also supported. +Upgraded libraries: ffi 3.3 and pixman 0.40.0 * Limbo v5.1.0 diff --git a/limbo-android-lib/src/main/java/com/max2idea/android/limbo/files/FileUtils.java b/limbo-android-lib/src/main/java/com/max2idea/android/limbo/files/FileUtils.java index c45900f71..229f83bb8 100644 --- a/limbo-android-lib/src/main/java/com/max2idea/android/limbo/files/FileUtils.java +++ b/limbo-android-lib/src/main/java/com/max2idea/android/limbo/files/FileUtils.java @@ -190,6 +190,7 @@ public static boolean fileValid(String path) { return false; } else { File file = new File(path); + file.setWritable(true); return file.exists(); } return true; @@ -370,18 +371,18 @@ public void run() { t.start(); } - public static String LoadFile(Activity activity, String fileName, boolean loadFromRawFolder) throws IOException { + public static String LoadFile(Context context, String fileName, boolean loadFromRawFolder) throws IOException { // Create a InputStream to read the file into InputStream iS; if (loadFromRawFolder) { // get the resource id from the file name - int rID = activity.getResources().getIdentifier(activity.getClass().getPackage().getName() + ":raw/" + fileName, + int rID = context.getResources().getIdentifier(LimboApplication.getInstance().getClass().getPackage().getName() + ":raw/" + fileName, null, null); // get the file as a stream - iS = activity.getResources().openRawResource(rID); + iS = context.getResources().openRawResource(rID); } else { // get the file as a stream - iS = activity.getResources().getAssets().open(fileName); + iS = context.getResources().getAssets().open(fileName); } ByteArrayOutputStream oS = new ByteArrayOutputStream(); diff --git a/limbo-android-lib/src/main/java/com/max2idea/android/limbo/help/Help.java b/limbo-android-lib/src/main/java/com/max2idea/android/limbo/help/Help.java index a4125e686..0c19bf23d 100644 --- a/limbo-android-lib/src/main/java/com/max2idea/android/limbo/help/Help.java +++ b/limbo-android-lib/src/main/java/com/max2idea/android/limbo/help/Help.java @@ -40,11 +40,10 @@ public class Help { private static final String TAG = "Help"; public static void showHelp(final Activity activity) { - PackageInfo pInfo = LimboApplication.getPackageInfo(); - final AlertDialog alertDialog; alertDialog = new AlertDialog.Builder(activity).create(); - alertDialog.setTitle(Config.APP_NAME + " v" + pInfo.versionName + " (" + Config.emuVersion.name().replace("_", ".") + ")"); + alertDialog.setTitle(Config.APP_NAME + " " + LimboApplication.getLimboVersionString() + + " " + "QEMU" + " " + LimboApplication.getQemuVersionString() ); LinearLayout mLayout = new LinearLayout(activity); mLayout.setOrientation(LinearLayout.VERTICAL); @@ -66,7 +65,7 @@ public void onCheckedChanged(CompoundButton compoundButton, boolean b) { LimboSettingsManager.setPromptUpdateVersion(activity, b); } }); - checkUpdates.setChecked(true); + checkUpdates.setChecked(LimboSettingsManager.getPromptUpdateVersion(activity)); mLayout.addView(checkUpdates); alertDialog.setView(mLayout); alertDialog.setButton(DialogInterface.BUTTON_POSITIVE, activity.getString(R.string.GoToWiki), diff --git a/limbo-android-lib/src/main/java/com/max2idea/android/limbo/jni/VMExecutor.java b/limbo-android-lib/src/main/java/com/max2idea/android/limbo/jni/VMExecutor.java index 8afd69b6c..5206e32ac 100644 --- a/limbo-android-lib/src/main/java/com/max2idea/android/limbo/jni/VMExecutor.java +++ b/limbo-android-lib/src/main/java/com/max2idea/android/limbo/jni/VMExecutor.java @@ -95,6 +95,8 @@ private native String start(String storage_dir, String base_dir, public native int getSDLRefreshRateIdle(); + public native void nativeIgnoreBreakpointInvalidate(int value); + public native void nativeMouseEvent(int button, int action, int relative, int x, int y); public native void nativeMouseBounds(int xmin, int xmax, int ymin, int ymax); @@ -103,7 +105,7 @@ private native String start(String storage_dir, String base_dir, public native void nativeRefreshScreen(int value); - public native void nativeEnableAaudio(int value); + public native void nativeEnableAaudio(int value, String aaudioLibName, String aaudioLibPath); /** * Prints parameters in qemu format @@ -167,6 +169,7 @@ private String[] prepareParams(Context context) throws Exception { addGenericOptions(context, paramsList); addStateOptions(paramsList); addAdvancedOptions(paramsList); + addAccelerationOptions(paramsList); return paramsList.toArray(new String[0]); } @@ -284,7 +287,7 @@ private void addGenericOptions(Context context, ArrayList paramsList) { paramsList.add(Config.tbSize); //Don't increase it crashes } - if (Config.emuVersion.ordinal() <= Config.EMU_VERSION.QEMUv2_9_1.ordinal()) { + if (LimboApplication.getQemuVersion() == 20901) { paramsList.add("-realtime"); paramsList.add("mlock=off"); } else { @@ -346,7 +349,14 @@ else if (LimboApplication.arch == Config.Arch.x86_64) paramsList.add("-m"); paramsList.add(getMachine().getMemory() + ""); + } + + + private void addAccelerationOptions(ArrayList paramsList) { + // XXX: we add the acceleration options after the extra params + // this is due to QEMU applying the first instance of this option + // so the extra params cannot override it. if (getMachine().getEnableKVM() != 0) { paramsList.add("-enable-kvm"); } else { @@ -524,14 +534,18 @@ public String getDriveFilePath(String driveFilePath) { } public void addDrives(ArrayList paramsList) { - addHardDisk(paramsList, getDriveFilePath(getMachine().getHdaImagePath()), 0); - addHardDisk(paramsList, getDriveFilePath(getMachine().getHdbImagePath()), 1); - addHardDisk(paramsList, getDriveFilePath(getMachine().getHdcImagePath()), 2); - addHardDisk(paramsList, getDriveFilePath(getMachine().getHddImagePath()), 3); + addHardDisk(paramsList, getDriveFilePath(getMachine().getHdaImagePath()), + 0, getMachine().getHdaInterface()); + addHardDisk(paramsList, getDriveFilePath(getMachine().getHdbImagePath()), + 1, getMachine().getHdbInterface()); + addHardDisk(paramsList, getDriveFilePath(getMachine().getHdcImagePath()), + 2, getMachine().getHdcInterface()); + addHardDisk(paramsList, getDriveFilePath(getMachine().getHddImagePath()), + 3, getMachine().getHddInterface()); addSharedFolder(paramsList, getDriveFilePath(getMachine().getSharedFolderPath())); } - public void addHardDisk(ArrayList paramsList, String imagePath, int index) { + public void addHardDisk(ArrayList paramsList, String imagePath, int index, String hdInterface) { if (imagePath != null && !imagePath.trim().equals("")) { if (Config.legacyDrives) { switch (index) { @@ -552,35 +566,27 @@ public void addHardDisk(ArrayList paramsList, String imagePath, int inde } else { paramsList.add("-drive"); String param = "index=" + index; - if (Config.enableIDEInterface) { - param += ",if="; - param += Config.ideInterfaceType; - } else if (Config.enableVirtioInterface && index > 0) { - param += ",if="; - param += Config.virtioInterfaceType; - } + param += ",if="; + param += hdInterface; param += ",media=disk"; if (!imagePath.equals("")) { param += ",file=" + imagePath; } + String cache = LimboSettingsManager.getDiskCache(LimboApplication.getInstance()); + if(cache != null && !cache.equals("default")) + param += ",cache=" + cache; paramsList.add(param); } - - } } - public void addSharedFolder(ArrayList paramsList, String sharedFolderPath) { if (Config.enableSharedFolder && sharedFolderPath != null) { //XXX; We use hdd to mount any virtual fat drives paramsList.add("-drive"); //empty String driveParams = "index=3"; driveParams += ",media=disk"; - if (Config.enableIDEInterface) { - driveParams += ",if="; - driveParams += Config.ideInterfaceType; - } + driveParams += ",if=ide"; driveParams += ",format=raw"; driveParams += ",file=fat:"; driveParams += "rw:"; //Always Read/Write @@ -599,10 +605,8 @@ public void addRemovableDrives(ArrayList paramsList) { } else { paramsList.add("-drive"); //empty String param = "index=2"; - if (Config.enableIDEInterface) { - param += ",if="; - param += Config.ideInterfaceType; - } + param += ",if="; + param += getMachine().getCDInterface(); param += ",media=cdrom"; if (!cdImagePath.equals("")) { param += ",file=" + cdImagePath; @@ -733,6 +737,8 @@ public String start() { if (MachineController.getInstance().isVNCEnabled() && LimboSettingsManager.getVNCEnablePassword(LimboApplication.getInstance())) { changeVncPass(LimboApplication.getInstance(), 2000); } + + ignoreBreakpointInvalidation(LimboSettingsManager.getIgnoreBreakpointInvalidation(LimboApplication.getInstance())?1:0, 2000); QmpClient.setExternal(LimboSettingsManager.getEnableExternalQMP(LimboApplication.getInstance())); String libFilename = getQemuLibrary(); res = start(Config.storagedir, LimboApplication.getBasefileDir(), @@ -861,7 +867,28 @@ public void setFullscreen() { @Override public void enableAaudio(int value) { - nativeEnableAaudio(value); + nativeEnableAaudio(value, Config.aaudioLibName, + FileUtils.getNativeLibDir(LimboApplication.getInstance()) + + "/" + Config.aaudioLibName); + } + + @Override + public void ignoreBreakpointInvalidation(int value){ + ignoreBreakpointInvalidation(value, 0); + } + + private void ignoreBreakpointInvalidation(final int value, final long delay) { + new Thread(new Runnable() { + @Override + public void run() { + try { + Thread.sleep(delay); + } catch (InterruptedException e) { + e.printStackTrace(); + } + nativeIgnoreBreakpointInvalidate(value); + } + }).start(); } //TODO: re-enable getting status from the vm diff --git a/limbo-android-lib/src/main/java/com/max2idea/android/limbo/keymapper/KeyMapManager.java b/limbo-android-lib/src/main/java/com/max2idea/android/limbo/keymapper/KeyMapManager.java index 3031839c6..01b11ccbf 100644 --- a/limbo-android-lib/src/main/java/com/max2idea/android/limbo/keymapper/KeyMapManager.java +++ b/limbo-android-lib/src/main/java/com/max2idea/android/limbo/keymapper/KeyMapManager.java @@ -88,6 +88,7 @@ public class KeyMapManager { private SimpleAdapter keyMapperAdapter; private EditText mKeyMapperName; private HashMap selectedMap; + private int lastOrientation = -1; public KeyMapManager(Activity activity, View view, int rows, int cols) throws Exception { this.activity = activity; @@ -125,10 +126,12 @@ public boolean toggleKeyMapper() { mapperEditLayout.setVisibility(View.GONE); mapperButtons.setVisibility(View.GONE); clearKeyMapper(); + ScreenUtils.updateOrientation(activity, lastOrientation); shown = false; } else { mapperEditLayout.setVisibility(View.VISIBLE); mapperButtons.setVisibility(View.VISIBLE); + lastOrientation = activity.getResources().getConfiguration().orientation; shown = true; } return shown; @@ -481,7 +484,7 @@ public void useKeyMapper() { KeyboardUtils.hideKeyboard(activity, view); mapperEditLayout.setVisibility(View.GONE); mapperButtons.setVisibility(View.VISIBLE); - ScreenUtils.updateOrientation(activity); + ScreenUtils.updateOrientation(activity, lastOrientation); new Handler(Looper.getMainLooper()).postDelayed(new Runnable() { @Override public void run() { diff --git a/limbo-android-lib/src/main/java/com/max2idea/android/limbo/machine/BIOSImporter.java b/limbo-android-lib/src/main/java/com/max2idea/android/limbo/machine/BIOSImporter.java new file mode 100644 index 000000000..2063761c8 --- /dev/null +++ b/limbo-android-lib/src/main/java/com/max2idea/android/limbo/machine/BIOSImporter.java @@ -0,0 +1,143 @@ +/* +Copyright (C) Max Kastanas 2012 + + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +package com.max2idea.android.limbo.machine; + +import android.app.Activity; +import android.app.AlertDialog; +import android.content.DialogInterface; +import android.util.Log; +import android.view.View; +import android.widget.LinearLayout; +import android.widget.TextView; + +import androidx.documentfile.provider.DocumentFile; + +import com.limbo.emu.lib.R; +import com.max2idea.android.limbo.files.FileUtils; +import com.max2idea.android.limbo.install.Installer; +import com.max2idea.android.limbo.machine.Machine.FileType; +import com.max2idea.android.limbo.main.Config; +import com.max2idea.android.limbo.main.LimboActivity; +import com.max2idea.android.limbo.main.LimboApplication; +import com.max2idea.android.limbo.main.LimboFileManager; +import com.max2idea.android.limbo.toast.ToastUtils; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.Hashtable; + +public class BIOSImporter { + private static final String TAG = "BIOSImporter"; + + public static void promptImportBIOSFile(final Activity activity) { + final AlertDialog alertDialog; + alertDialog = new AlertDialog.Builder(activity).create(); + alertDialog.setTitle(activity.getString(R.string.ImportBIOSFile)); + + LinearLayout mLayout = new LinearLayout(activity); + mLayout.setOrientation(LinearLayout.VERTICAL); + mLayout.setPadding(20, 20, 20, 20); + + TextView imageNameView = new TextView(activity); + imageNameView.setVisibility(View.VISIBLE); + imageNameView.setText(activity.getResources().getString(R.string.importBIOSInstructions)); + + LinearLayout.LayoutParams searchViewParams = new LinearLayout.LayoutParams( + LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT); + mLayout.addView(imageNameView, searchViewParams); + alertDialog.setView(mLayout); + + alertDialog.setButton(DialogInterface.BUTTON_POSITIVE, activity.getString(R.string.Ok), + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + promptForImportBIOSFile(activity); + } + }); + alertDialog.setButton(DialogInterface.BUTTON_NEGATIVE, activity.getString(R.string.Cancel), + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + alertDialog.dismiss(); + } + }); + alertDialog.setOnCancelListener(new DialogInterface.OnCancelListener() { + @Override + public void onCancel(DialogInterface dialog) { + alertDialog.dismiss(); + } + }); + alertDialog.show(); + } + + private static void promptForImportBIOSFile(final Activity activity) { + new Thread(new Runnable() { + @Override + public void run() { + LimboFileManager.browse(activity, FileType.IMPORT_BIOS_FILE, Config.OPEN_IMPORT_BIOS_FILE_REQUEST_CODE); + } + }).start(); + + } + + public static void importBIOSFile(Activity activity, String importFilePath) { + InputStream stream = null; + FileOutputStream targetStream = null; + try { + stream = FileUtils.getStreamFromFilePath(importFilePath); + File target = new File(LimboApplication.getBasefileDir(), FileUtils.getFilenameFromPath(importFilePath)); + targetStream = new FileOutputStream(target); + byte[] buffer = new byte[32768]; + int bytesRead = 0; + int totalBytes = 0; + while ((bytesRead = stream.read(buffer, 0, buffer.length)) > 0) { + targetStream.write(buffer, 0, bytesRead); + totalBytes += bytesRead; + if(totalBytes > 100 * 1024 * 1024){ + throw new Exception("File too large"); + } + } + targetStream.flush(); + } catch (Exception ex) { + ToastUtils.toastShort(activity, ex.getMessage()); + ex.printStackTrace(); + } finally { + if(stream!=null) { + try { + stream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if(targetStream!=null) { + try { + targetStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + } + +} diff --git a/limbo-android-lib/src/main/java/com/max2idea/android/limbo/machine/Dispatcher.java b/limbo-android-lib/src/main/java/com/max2idea/android/limbo/machine/Dispatcher.java index 6f2873bb3..146932e75 100644 --- a/limbo-android-lib/src/main/java/com/max2idea/android/limbo/machine/Dispatcher.java +++ b/limbo-android-lib/src/main/java/com/max2idea/android/limbo/machine/Dispatcher.java @@ -142,6 +142,8 @@ private void requestFieldChange(MachineProperty property, Object value) { case REMOVABLE_DRIVE: setDrive(value); break; + case MEDIA_INTERFACE: + setDriveMediaInterface(value); case SOUNDCARD: getMachine().setSoundCard(convertString(property, value)); break; @@ -160,6 +162,9 @@ private void requestFieldChange(MachineProperty property, Object value) { case INITRD: getMachine().setInitRd(convertString(property, value)); break; + case APPEND: + getMachine().setAppend(convertString(property, value)); + break; case BOOT_CONFIG: getMachine().setBootDevice(convertString(property, value)); break; @@ -215,6 +220,29 @@ private void requestFieldChange(MachineProperty property, Object value) { } } + private void setDriveMediaInterface(Object value) { + Object[] params = (Object[]) value; + MachineProperty driveName = (MachineProperty) params[0]; + String driveInterface = (String) params[1]; + switch(driveName) { + case HDA: + getMachine().setHdaInterface(driveInterface); + break; + case HDB: + getMachine().setHdbInterface(driveInterface); + break; + case HDC: + getMachine().setHdcInterface(driveInterface); + break; + case HDD: + getMachine().setHddInterface(driveInterface); + break; + case CDROM: + getMachine().setCdInterface(driveInterface); + break; + } + } + private void setDriveEnabled(Object value) { Object[] params = (Object[]) value; MachineProperty machineDriveName = (MachineProperty) params[0]; @@ -317,6 +345,9 @@ private void requestAction(MachineAction action, Object value) { case FULLSCREEN: MachineController.getInstance().setFullscreen(); break; + case IGNORE_BREAKPOINT_INVALIDATION: + MachineController.getInstance().ignoreBreakpointInvalidation(convertBoolean(action, value)); + break; } } diff --git a/limbo-android-lib/src/main/java/com/max2idea/android/limbo/machine/Machine.java b/limbo-android-lib/src/main/java/com/max2idea/android/limbo/machine/Machine.java index 6bbb888a1..f753faf73 100644 --- a/limbo-android-lib/src/main/java/com/max2idea/android/limbo/machine/Machine.java +++ b/limbo-android-lib/src/main/java/com/max2idea/android/limbo/machine/Machine.java @@ -50,6 +50,12 @@ public class Machine extends Observable { private String hdbImagePath; private String hdcImagePath; private String hddImagePath; + // HDD interface + private String hdaInterface = "ide"; + private String hdbInterface = "ide"; + private String hdcInterface = "ide"; + private String hddInterface = "ide"; + private String sharedFolderPath; //Removable devices private boolean enableCDROM; @@ -60,6 +66,7 @@ public class Machine extends Observable { private String fdaImagePath; private String fdbImagePath; private String sdImagePath; + private String cdInterface = "ide"; // Default Settings private String bootDevice = "Default"; private String kernel; @@ -278,6 +285,54 @@ void setHddImagePath(String hddImagePath) { } + public String getHdaInterface() { + return hdaInterface; + } + + void setHdaInterface(String hdInterface) { + if (this.hdaInterface == null || !this.hdaInterface.equals(hdInterface)) { + this.hdaInterface = hdInterface; + setChanged(); + notifyChanged(MachineProperty.HDA_INTERFACE, hdInterface); + } + } + + public String getHdbInterface() { + return hdbInterface; + } + + void setHdbInterface(String hdInterface) { + if (this.hdbInterface == null || !this.hdbInterface.equals(hdInterface)) { + this.hdbInterface = hdInterface; + setChanged(); + notifyChanged(MachineProperty.HDB_INTERFACE, hdInterface); + } + } + + public String getHdcInterface() { + return hdcInterface; + } + + void setHdcInterface(String hdInterface) { + if (this.hdcInterface == null || !this.hdcInterface.equals(hdInterface)) { + this.hdcInterface = hdInterface; + setChanged(); + notifyChanged(MachineProperty.HDC_INTERFACE, hdInterface); + } + } + + public String getHddInterface() { + return hddInterface; + } + + void setHddInterface(String hdInterface) { + if (this.hddInterface == null || !this.hddInterface.equals(hdInterface)) { + this.hddInterface = hdInterface; + setChanged(); + notifyChanged(MachineProperty.HDD_INTERFACE, hdInterface); + } + } + public String getSharedFolderPath() { return sharedFolderPath; } @@ -393,6 +448,18 @@ void setSdImagePath(String sdImagePath) { } + public String getCDInterface() { + return cdInterface; + } + + void setCdInterface(String mediaInterface) { + if (this.cdInterface == null || !this.cdInterface.equals(mediaInterface)) { + this.cdInterface = mediaInterface; + setChanged(); + notifyChanged(MachineProperty.CDROM_INTERFACE, mediaInterface); + } + } + public String getBootDevice() { return bootDevice; } @@ -635,7 +702,7 @@ public enum FileType { CDROM, FDA, FDB, SD, HDA, HDB, HDC, HDD, SHARED_DIR, KERNEL, INITRD, - EXPORT_DIR, IMAGE_DIR, LOG_DIR, IMPORT_FILE + EXPORT_DIR, IMAGE_DIR, LOG_DIR, IMPORT_FILE, IMPORT_BIOS_FILE } } diff --git a/limbo-android-lib/src/main/java/com/max2idea/android/limbo/machine/MachineAction.java b/limbo-android-lib/src/main/java/com/max2idea/android/limbo/machine/MachineAction.java index 86202534d..d262ed860 100644 --- a/limbo-android-lib/src/main/java/com/max2idea/android/limbo/machine/MachineAction.java +++ b/limbo-android-lib/src/main/java/com/max2idea/android/limbo/machine/MachineAction.java @@ -21,5 +21,5 @@ public enum MachineAction { STOP_VM, IMPORT_VMS, LOAD_VM, CONTINUE_VM, RESET_VM, START_VM, SET_SDL_REFRESH_RATE, SEND_MOUSE_EVENT, PAUSE_VM, DELETE_VM, INSERT_FAV, UPDATE_NOTIFICATION, DISPLAY_CHANGED, - FULLSCREEN, ENABLE_AAUDIO, CREATE_VM + FULLSCREEN, ENABLE_AAUDIO, IGNORE_BREAKPOINT_INVALIDATION, CREATE_VM } diff --git a/limbo-android-lib/src/main/java/com/max2idea/android/limbo/machine/MachineController.java b/limbo-android-lib/src/main/java/com/max2idea/android/limbo/machine/MachineController.java index 3cf3ae79d..4c4370aca 100644 --- a/limbo-android-lib/src/main/java/com/max2idea/android/limbo/machine/MachineController.java +++ b/limbo-android-lib/src/main/java/com/max2idea/android/limbo/machine/MachineController.java @@ -406,6 +406,10 @@ public void enableAaudio(int value) { machineExecutor.enableAaudio(value); } + public void ignoreBreakpointInvalidation(boolean value) { + machineExecutor.ignoreBreakpointInvalidation(value?1:0); + } + public enum MachineStatus { Ready, Stopped, Saving, Paused, SaveCompleted, SaveFailed, Unknown, Running } diff --git a/limbo-android-lib/src/main/java/com/max2idea/android/limbo/machine/MachineExecutor.java b/limbo-android-lib/src/main/java/com/max2idea/android/limbo/machine/MachineExecutor.java index 07def2c6b..fb34e1b1c 100644 --- a/limbo-android-lib/src/main/java/com/max2idea/android/limbo/machine/MachineExecutor.java +++ b/limbo-android-lib/src/main/java/com/max2idea/android/limbo/machine/MachineExecutor.java @@ -66,4 +66,6 @@ protected void onResolutionChanged(int vm_width, int vm_height) { public abstract void updateDisplay(int width, int height, int orientation); public abstract void setFullscreen(); + + public abstract void ignoreBreakpointInvalidation(int value); } diff --git a/limbo-android-lib/src/main/java/com/max2idea/android/limbo/machine/MachineImporter.java b/limbo-android-lib/src/main/java/com/max2idea/android/limbo/machine/MachineImporter.java index fb56fe0d9..11e76b360 100644 --- a/limbo-android-lib/src/main/java/com/max2idea/android/limbo/machine/MachineImporter.java +++ b/limbo-android-lib/src/main/java/com/max2idea/android/limbo/machine/MachineImporter.java @@ -134,6 +134,22 @@ private static ArrayList getVMsFromFile(String importFilePath) { mach.setSdImagePath(machineAttr[i].replace("\"", "")); break; + case "HDA_INTERFACE": + mach.setHdaInterface(machineAttr[i].replace("\"", "")); + break; + case "HDB_INTERFACE": + mach.setHdbInterface(machineAttr[i].replace("\"", "")); + break; + case "HDC_INTERFACE": + mach.setHdcInterface(machineAttr[i].replace("\"", "")); + break; + case "HDD_INTERFACE": + mach.setHddInterface(machineAttr[i].replace("\"", "")); + break; + case "CDROM_INTERFACE": + mach.setCdInterface(machineAttr[i].replace("\"", "")); + break; + // Misc case "VGA": mach.setVga(machineAttr[i].replace("\"", "")); diff --git a/limbo-android-lib/src/main/jni/limbo/limbo.h b/limbo-android-lib/src/main/java/com/max2idea/android/limbo/machine/MachineMediaInterface.java similarity index 84% rename from limbo-android-lib/src/main/jni/limbo/limbo.h rename to limbo-android-lib/src/main/java/com/max2idea/android/limbo/machine/MachineMediaInterface.java index b0b7dada4..8740156c6 100644 --- a/limbo-android-lib/src/main/jni/limbo/limbo.h +++ b/limbo-android-lib/src/main/java/com/max2idea/android/limbo/machine/MachineMediaInterface.java @@ -1,5 +1,5 @@ /* - Copyright (C) Max Kastanas 2012 +Copyright (C) Max Kastanas 2012 * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,10 +16,8 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ +package com.max2idea.android.limbo.machine; -#ifndef LIMBO_H -#define LIMBO_H - -#include - -#endif +public enum MachineMediaInterface { + IDE, SCSI, VIRTIO +} diff --git a/limbo-android-lib/src/main/java/com/max2idea/android/limbo/machine/MachineOpenHelper.java b/limbo-android-lib/src/main/java/com/max2idea/android/limbo/machine/MachineOpenHelper.java index c9dd6964f..c697ef618 100644 --- a/limbo-android-lib/src/main/java/com/max2idea/android/limbo/machine/MachineOpenHelper.java +++ b/limbo-android-lib/src/main/java/com/max2idea/android/limbo/machine/MachineOpenHelper.java @@ -40,7 +40,7 @@ public class MachineOpenHelper extends SQLiteOpenHelper implements IMachineDatabase, Observer { private static final String TAG = "MachineOpenHelper"; - private static final int DATABASE_VERSION = 15; + private static final int DATABASE_VERSION = 16; private static final String DATABASE_NAME = "LIMBO"; private static final String MACHINE_TABLE_NAME = "machines"; @@ -54,7 +54,9 @@ public class MachineOpenHelper extends SQLiteOpenHelper implements IMachineDatab + " INTEGER, " + MachineProperty.MACHINETYPE.name() + " TEXT, " + MachineProperty.DISABLE_FD_BOOT_CHK.name() + " INTEGER, " + MachineProperty.SD.name() + " TEXT, " + MachineProperty.PAUSED.name() + " INTEGER, " + MachineProperty.SHARED_FOLDER.name() + " TEXT, " + MachineProperty.SHARED_FOLDER_MODE.name() + " INTEGER, " + MachineProperty.EXTRA_PARAMS.name() + " TEXT, " + MachineProperty.HOSTFWD.name() + " TEXT, " + MachineProperty.GUESTFWD.name() + " TEXT, " + MachineProperty.UI.name() + " TEXT, " + MachineProperty.DISABLE_TSC.name() + " INTEGER, " - + MachineProperty.MOUSE.name() + " TEXT, " + MachineProperty.KEYBOARD.name() + " TEXT, " + MachineProperty.ENABLE_MTTCG.name() + " INTEGER, " + MachineProperty.ENABLE_KVM.name() + " INTEGER " + + MachineProperty.MOUSE.name() + " TEXT, " + MachineProperty.KEYBOARD.name() + " TEXT, " + MachineProperty.ENABLE_MTTCG.name() + " INTEGER, " + MachineProperty.ENABLE_KVM.name() + " INTEGER , " + + MachineProperty.HDA_INTERFACE.name() + " TEXT, " + MachineProperty.HDB_INTERFACE.name() + " TEXT, " + MachineProperty.HDC_INTERFACE.name() + " TEXT, " + MachineProperty.HDD_INTERFACE.name() + " TEXT , " + + MachineProperty.CDROM_INTERFACE.name() + " TEXT " + ");"; private static MachineOpenHelper sInstance; @@ -149,6 +151,14 @@ public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("ALTER TABLE " + MACHINE_TABLE_NAME + " ADD COLUMN " + MachineProperty.ENABLE_MTTCG + " INTEGER;"); db.execSQL("ALTER TABLE " + MACHINE_TABLE_NAME + " ADD COLUMN " + MachineProperty.ENABLE_KVM + " INTEGER;"); } + + if (newVersion >= 16 && oldVersion <= 15) { + db.execSQL("ALTER TABLE " + MACHINE_TABLE_NAME + " ADD COLUMN " + MachineProperty.HDA_INTERFACE + " TEXT;"); + db.execSQL("ALTER TABLE " + MACHINE_TABLE_NAME + " ADD COLUMN " + MachineProperty.HDB_INTERFACE + " TEXT;"); + db.execSQL("ALTER TABLE " + MACHINE_TABLE_NAME + " ADD COLUMN " + MachineProperty.HDC_INTERFACE + " TEXT;"); + db.execSQL("ALTER TABLE " + MACHINE_TABLE_NAME + " ADD COLUMN " + MachineProperty.HDD_INTERFACE + " TEXT;"); + db.execSQL("ALTER TABLE " + MACHINE_TABLE_NAME + " ADD COLUMN " + MachineProperty.CDROM_INTERFACE + " TEXT;"); + } } public synchronized int insertMachine(Machine machine) { @@ -162,10 +172,15 @@ public synchronized int insertMachine(Machine machine) { stateValues.put(MachineProperty.CPUNUM.name(), machine.getCpuNum()); stateValues.put(MachineProperty.MEMORY.name(), machine.getMemory()); stateValues.put(MachineProperty.HDA.name(), machine.getHdaImagePath()); + stateValues.put(MachineProperty.HDA_INTERFACE.name(), machine.getHdaInterface()); stateValues.put(MachineProperty.HDB.name(), machine.getHdbImagePath()); + stateValues.put(MachineProperty.HDB_INTERFACE.name(), machine.getHdbInterface()); stateValues.put(MachineProperty.HDC.name(), machine.getHdcImagePath()); + stateValues.put(MachineProperty.HDC_INTERFACE.name(), machine.getHdcInterface()); stateValues.put(MachineProperty.HDD.name(), machine.getHddImagePath()); + stateValues.put(MachineProperty.HDD_INTERFACE.name(), machine.getHddInterface()); stateValues.put(MachineProperty.CDROM.name(), machine.getCdImagePath()); + stateValues.put(MachineProperty.CDROM_INTERFACE.name(), machine.getCDInterface()); stateValues.put(MachineProperty.FDA.name(), machine.getFdaImagePath()); stateValues.put(MachineProperty.FDB.name(), machine.getFdbImagePath()); stateValues.put(MachineProperty.SHARED_FOLDER.name(), machine.getSharedFolderPath()); @@ -250,7 +265,9 @@ public Machine getMachine(String machine) { + MachineProperty.DISABLE_FD_BOOT_CHK + " , " + MachineProperty.ARCH + " , " + MachineProperty.PAUSED + " , " + MachineProperty.SD + " , " + MachineProperty.SHARED_FOLDER + " , " + MachineProperty.SHARED_FOLDER_MODE + " , " + MachineProperty.EXTRA_PARAMS + " , " + MachineProperty.HOSTFWD + " , " + MachineProperty.GUESTFWD + " , " + MachineProperty.UI + ", " + MachineProperty.DISABLE_TSC + ", " - + MachineProperty.MOUSE + ", " + MachineProperty.KEYBOARD + ", " + MachineProperty.ENABLE_MTTCG + ", " + MachineProperty.ENABLE_KVM + + MachineProperty.MOUSE + ", " + MachineProperty.KEYBOARD + ", " + MachineProperty.ENABLE_MTTCG + ", " + MachineProperty.ENABLE_KVM + ", " + + MachineProperty.HDA_INTERFACE + ", " + MachineProperty.HDB_INTERFACE + ", " + MachineProperty.HDC_INTERFACE + ", " + MachineProperty.HDD_INTERFACE + ", " + + MachineProperty.CDROM_INTERFACE + " " + " from " + MACHINE_TABLE_NAME + " where " + MachineProperty.STATUS + " in ( " + Config.STATUS_CREATED + " , " + Config.STATUS_PAUSED + " " + " ) " + " and " + MachineProperty.MACHINE_NAME + "=\"" + machine + "\"" + ";"; @@ -313,6 +330,11 @@ public Machine getMachine(String machine) { myMachine.setKeyboard(cur.getString(37)); myMachine.setEnableMTTCG(cur.getInt(38)); myMachine.setEnableKVM(cur.getInt(39)); + myMachine.setHdaInterface(cur.getString(40)); + myMachine.setHdbInterface(cur.getString(41)); + myMachine.setHdcInterface(cur.getString(42)); + myMachine.setHddInterface(cur.getString(43)); + myMachine.setCdInterface(cur.getString(44)); } cur.close(); @@ -360,7 +382,9 @@ String exportMachines() { + MachineProperty.DISABLE_FD_BOOT_CHK + " , " + MachineProperty.ARCH + " , " + MachineProperty.PAUSED + " , " + MachineProperty.SD + " , " + MachineProperty.SHARED_FOLDER + " , " + MachineProperty.SHARED_FOLDER_MODE + " , " + MachineProperty.EXTRA_PARAMS + " , " + MachineProperty.HOSTFWD + " , " + MachineProperty.GUESTFWD + " , " + MachineProperty.UI + ", " + MachineProperty.DISABLE_TSC + ", " - + MachineProperty.MOUSE + ", " + MachineProperty.KEYBOARD + ", " + MachineProperty.ENABLE_MTTCG + ", " + MachineProperty.ENABLE_KVM + + MachineProperty.MOUSE + ", " + MachineProperty.KEYBOARD + ", " + MachineProperty.ENABLE_MTTCG + ", " + MachineProperty.ENABLE_KVM +", " + + MachineProperty.HDA_INTERFACE + ", " + MachineProperty.HDB_INTERFACE + ", " + MachineProperty.HDC_INTERFACE + ", " + MachineProperty.HDD_INTERFACE + " " + + MachineProperty.CDROM_INTERFACE +" " // Table + " from " + MACHINE_TABLE_NAME + " order by 1; "; diff --git a/limbo-android-lib/src/main/java/com/max2idea/android/limbo/machine/MachineProperty.java b/limbo-android-lib/src/main/java/com/max2idea/android/limbo/machine/MachineProperty.java index 81e0acf4a..f9dcfb99e 100644 --- a/limbo-android-lib/src/main/java/com/max2idea/android/limbo/machine/MachineProperty.java +++ b/limbo-android-lib/src/main/java/com/max2idea/android/limbo/machine/MachineProperty.java @@ -26,8 +26,10 @@ public enum MachineProperty { DISABLE_ACPI, DISABLE_HPET, DISABLE_TSC, DISABLE_FD_BOOT_CHK, HDA, HDB, HDC, HDD, SHARED_FOLDER, SHARED_FOLDER_MODE, HDCONFIG, CDROM, FDA, FDB, SD, + MEDIA_INTERFACE, HDA_INTERFACE, HDB_INTERFACE, HDC_INTERFACE, HDD_INTERFACE, CDROM_INTERFACE, BOOT_CONFIG, KERNEL, INITRD, APPEND, VGA, SOUNDCARD, NETCONFIG, HOSTFWD, GUESTFWD, NICCONFIG, NON_REMOVABLE_DRIVE, REMOVABLE_DRIVE, DRIVE_ENABLED, EXTRA_PARAMS, OTHER } + diff --git a/limbo-android-lib/src/main/java/com/max2idea/android/limbo/main/Config.java b/limbo-android-lib/src/main/java/com/max2idea/android/limbo/main/Config.java index 30f1a1944..fe1db8672 100644 --- a/limbo-android-lib/src/main/java/com/max2idea/android/limbo/main/Config.java +++ b/limbo-android-lib/src/main/java/com/max2idea/android/limbo/main/Config.java @@ -27,11 +27,6 @@ */ public class Config { - public enum EMU_VERSION { - QEMUv2_9_1, QEMUv5_1_0 - } - public static final EMU_VERSION emuVersion = EMU_VERSION.QEMUv2_9_1; - // Constants public static final int SDL_MOUSE_LEFT = 1; public static final int SDL_MOUSE_MIDDLE = 2; @@ -60,6 +55,9 @@ public enum EMU_VERSION { public static final int OPEN_LOG_FILE_DIR_REQUEST_CODE = 2011; public static final int OPEN_LOG_FILE_DIR_ASF_REQUEST_CODE = 2012; + public static final int OPEN_IMPORT_BIOS_FILE_REQUEST_CODE = 2013; + public static final int OPEN_IMPORT_BIOS_FILE_ASF_REQUEST_CODE = 2014; + public static final int STATUS_NULL = -1; public static final int STATUS_CREATED = 1000; public static final int STATUS_PAUSED = 1001; @@ -102,6 +100,8 @@ public enum EMU_VERSION { // stack size to remove an issue with SDL Audio public static long stackSize = 10 * 1024 * 1024; + // native alternative to audio track + public static String aaudioLibName = "libcompat-SDL2-addons.so"; // if you don't want to enable software updates set to false public static boolean enableSoftwareUpdates = true; @@ -172,15 +172,9 @@ public enum Arch { public static LinkedHashMap osImages = new LinkedHashMap<>(); public static boolean processMouseHistoricalEvents = false; - //specify hd interface, alternative we don't need it right now - public static boolean enableIDEInterface = false; - public static String ideInterfaceType = "ide"; - // specify virtio, you can always add it in the extra params - public static boolean enableVirtioInterface = false; - public static String virtioInterfaceType = "virtio"; //Change to true in prod if you want to be notified by default for new versions - public static boolean defaultCheckNewVersion = true; + public static boolean defaultCheckNewVersion = false; //enable tracing // make sure you have access to the dir/files below diff --git a/limbo-android-lib/src/main/java/com/max2idea/android/limbo/main/LimboActivity.java b/limbo-android-lib/src/main/java/com/max2idea/android/limbo/main/LimboActivity.java index ea393bd68..5d253f04f 100644 --- a/limbo-android-lib/src/main/java/com/max2idea/android/limbo/main/LimboActivity.java +++ b/limbo-android-lib/src/main/java/com/max2idea/android/limbo/main/LimboActivity.java @@ -24,9 +24,9 @@ import android.content.Context; import android.content.DialogInterface; import android.content.Intent; -import android.content.pm.PackageInfo; import android.content.res.Configuration; import android.graphics.Point; +import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.Looper; @@ -68,6 +68,7 @@ import com.max2idea.android.limbo.links.LinksManager; import com.max2idea.android.limbo.log.Logger; import com.max2idea.android.limbo.machine.ArchDefinitions; +import com.max2idea.android.limbo.machine.BIOSImporter; import com.max2idea.android.limbo.machine.Machine; import com.max2idea.android.limbo.machine.Machine.FileType; import com.max2idea.android.limbo.machine.MachineAction; @@ -109,6 +110,7 @@ public class LimboActivity extends AppCompatActivity private static final int DISCARD_VM_STATE = 11; private static final int SETTINGS = 13; private static final int TOOLS = 14; + private static final int IMPORT_BIOS_FILE = 15; // disk mapping private static final Hashtable diskMapping = new Hashtable<>(); @@ -132,9 +134,13 @@ public class LimboActivity extends AppCompatActivity private Spinner mKernel; private Spinner mInitrd; // HDD + private ImageView mHDAOptions; private Spinner mHDA; + private ImageView mHDBOptions; private Spinner mHDB; + private ImageView mHDCOptions; private Spinner mHDC; + private ImageView mHDDOptions; private Spinner mHDD; private Spinner mSharedFolder; @@ -147,6 +153,7 @@ public class LimboActivity extends AppCompatActivity private CheckBox mFDAenable; private CheckBox mFDBenable; private CheckBox mSDenable; + private ImageView mCDOptions; // misc private Spinner mRamSize; @@ -274,13 +281,14 @@ private void disableRemovableDiskListener(CheckBox enableDrive, Spinner spinner) } private void enableRemovableDiskListeners() { - enableRemovableDiskListener(mCD, mCDenable, MachineProperty.CDROM, FileType.CDROM); - enableRemovableDiskListener(mFDA, mFDAenable, MachineProperty.FDA, FileType.FDA); - enableRemovableDiskListener(mFDB, mFDBenable, MachineProperty.FDB, FileType.FDB); - enableRemovableDiskListener(mSD, mSDenable, MachineProperty.SD, FileType.SD); + enableRemovableDiskListener(mCD, mCDenable, mCDOptions, MachineProperty.CDROM, FileType.CDROM); + enableRemovableDiskListener(mFDA, mFDAenable, null, MachineProperty.FDA, FileType.FDA); + enableRemovableDiskListener(mFDB, mFDBenable, null, MachineProperty.FDB, FileType.FDB); + enableRemovableDiskListener(mSD, mSDenable, null, MachineProperty.SD, FileType.SD); } private void enableRemovableDiskListener(final Spinner spinner, final CheckBox driveEnable, + final ImageView driveOptions, final MachineProperty driveName, final FileType fileType) { spinner.setOnItemSelectedListener(new OnItemSelectedListener() { @@ -310,6 +318,15 @@ public void onCheckedChanged(CompoundButton viewButton, boolean isChecked) { } ); + if(driveOptions!=null) { + driveOptions.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + if(driveEnable.isChecked()) + promptDriveInterface(driveName); + } + }); + } } @@ -746,14 +763,14 @@ public void onClick(DialogInterface dialog, int which) { } private void setupNonRemovableDiskListeners() { - setupNonRemovableDiskListener(mHDA, MachineProperty.HDA, FileType.HDA); - setupNonRemovableDiskListener(mHDB, MachineProperty.HDB, FileType.HDB); - setupNonRemovableDiskListener(mHDC, MachineProperty.HDC, FileType.HDC); - setupNonRemovableDiskListener(mHDD, MachineProperty.HDD, FileType.HDD); + setupNonRemovableDiskListener(mHDA, mHDAOptions, MachineProperty.HDA, FileType.HDA); + setupNonRemovableDiskListener(mHDB, mHDBOptions, MachineProperty.HDB, FileType.HDB); + setupNonRemovableDiskListener(mHDC, mHDCOptions, MachineProperty.HDC, FileType.HDC); + setupNonRemovableDiskListener(mHDD, mHDDOptions, MachineProperty.HDD, FileType.HDD); setupSharedFolderDisk(); } - private void setupNonRemovableDiskListener(final Spinner diskSpinner, + private void setupNonRemovableDiskListener(final Spinner diskSpinner, final ImageView diskImage, final MachineProperty machineDriveName, final FileType diskFileType) { diskSpinner.setOnItemSelectedListener(new OnItemSelectedListener() { @@ -777,8 +794,63 @@ public void onItemSelected(AdapterView parentView, View selectedItemView, int public void onNothingSelected(AdapterView parentView) { } }); + + diskImage.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + promptDriveInterface(machineDriveName); + } + }); } + private void promptDriveInterface(final MachineProperty machineDriveName) { + if(getMachine() == null) + return; + + final String[] items = { + "ide", + "scsi", + "virtio" + }; + final AlertDialog.Builder mBuilder = new AlertDialog.Builder(this); + mBuilder.setTitle(machineDriveName + " " + getString(R.string.Interface)); + int driveInterface = getMachineInterface(machineDriveName, items); + mBuilder.setSingleChoiceItems(items, driveInterface, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int i) { + notifyFieldChange(MachineProperty.MEDIA_INTERFACE, new Object[] {machineDriveName, items[i]}); + dialog.dismiss(); + } + }); + final AlertDialog alertDialog = mBuilder.create(); + alertDialog.show(); + } + + private int getMachineInterface(MachineProperty machineDriveName, String[] items) { + String hdInterfaceStr = null; + switch(machineDriveName) { + case HDA: + hdInterfaceStr = getMachine().getHdaInterface(); + break; + case HDB: + hdInterfaceStr = getMachine().getHdbInterface(); + break; + case HDC: + hdInterfaceStr = getMachine().getHdcInterface(); + break; + case HDD: + hdInterfaceStr = getMachine().getHddInterface(); + break; + case CDROM: + hdInterfaceStr = getMachine().getCDInterface(); + break; + } + for(int i=0; i= 26) + System.loadLibrary("compat-SDL2-addons"); System.loadLibrary("SDL2"); } @@ -1257,14 +1330,15 @@ public void importMachines(String importFilePath) { notifyAction(MachineAction.IMPORT_VMS, importFilePath); } + private void promptLicense() { - final PackageInfo finalPInfo = LimboApplication.getPackageInfo(); runOnUiThread(new Runnable() { @Override public void run() { try { - LimboActivityCommon.promptLicense(LimboActivity.this, Config.APP_NAME + " v" + finalPInfo.versionName - + " (" + Config.emuVersion.name().replace("_", ".") + ")", + LimboActivityCommon.promptLicense(LimboActivity.this, + Config.APP_NAME + " " + LimboApplication.getLimboVersionString() + + " " + "QEMU" + " " + LimboApplication.getQemuVersionString() , FileUtils.LoadFile(LimboActivity.this, "LICENSE", false)); } catch (IOException e) { @@ -1290,7 +1364,6 @@ private void unlockRemovableDevices(boolean flag) { } private void enableRemovableDeviceOptions(boolean flag) { - unlockRemovableDevices(flag); enableRemovableDiskValues(flag); } @@ -1321,9 +1394,13 @@ private void enableNonRemovableDeviceOptions(boolean flag) { //drives mHDA.setEnabled(flag); + mHDAOptions.setEnabled(flag); mHDB.setEnabled(flag); + mHDBOptions.setEnabled(flag); mHDC.setEnabled(flag); + mHDCOptions.setEnabled(flag); mHDD.setEnabled(flag); + mHDDOptions.setEnabled(flag); mSharedFolder.setEnabled(flag); //boot @@ -1365,6 +1442,9 @@ private void onStartButton() { ToastUtils.toastShort(LimboActivity.this, getString(R.string.SelectOrCreateVirtualMachineFirst)); return; } + // focus out of edit texts to make sure they are applied to the db + mStart.requestFocus(); + if (!validateFiles()) { return; } @@ -1516,10 +1596,14 @@ public void setupWidgets() { mDisableTSC = findViewById(R.id.tscval); //disks - mHDA = findViewById(R.id.hdimgval); + mHDA = findViewById(R.id.hdaimgval); + mHDAOptions = findViewById(R.id.hdaoptions); mHDB = findViewById(R.id.hdbimgval); + mHDBOptions = findViewById(R.id.hdboptions); mHDC = findViewById(R.id.hdcimgval); + mHDCOptions = findViewById(R.id.hdcoptions); mHDD = findViewById(R.id.hddimgval); + mHDDOptions = findViewById(R.id.hddoptions); LinearLayout sharedFolderLayout = findViewById(R.id.sharedfolderl); if (!Config.enableSharedFolder) @@ -1530,6 +1614,7 @@ public void setupWidgets() { mCD = findViewById(R.id.cdromimgval); mFDA = findViewById(R.id.floppyimgval); mFDB = findViewById(R.id.floppybimgval); + mCDOptions = findViewById(R.id.cdromoptions); if (!Config.enableEmulatedFloppy) { LinearLayout mFDALayout = findViewById(R.id.floppyimgl); mFDALayout.setVisibility(View.GONE); @@ -2278,8 +2363,16 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (file != null) { FileUtils.saveLogToFile(LimboActivity.this, file); } + } else if (requestCode == Config.OPEN_IMPORT_BIOS_FILE_REQUEST_CODE || requestCode == Config.OPEN_IMPORT_BIOS_FILE_ASF_REQUEST_CODE) { + String file; + if (requestCode == Config.OPEN_IMPORT_BIOS_FILE_ASF_REQUEST_CODE) { + file = FileUtils.getFileUriFromIntent(this, data, false); + } else { + file = FileUtils.getFilePathFromIntent(this, data); + } + if (file != null) + BIOSImporter.importBIOSFile(this, file); } - } private void updateDrive(FileType fileType, String diskValue) { @@ -2541,6 +2634,7 @@ public boolean onPrepareOptionsMenu(Menu menu) { menu.add(0, EXPORT, 0, R.string.ExportMachines).setIcon(R.drawable.exportvms); menu.add(0, IMPORT, 0, R.string.ImportMachines).setIcon(R.drawable.importvms); } + menu.add(0, IMPORT_BIOS_FILE, 0, R.string.ImportBIOSFile).setIcon(R.drawable.importvms); menu.add(0, SETTINGS, 0, R.string.Settings).setIcon(R.drawable.settings); menu.add(0, TOOLS, 0, R.string.advancedTools).setIcon(R.drawable.advanced); menu.add(0, VIEWLOG, 0, R.string.ViewLog).setIcon(android.R.drawable.ic_menu_view); @@ -2575,6 +2669,8 @@ public boolean onOptionsItemSelected(final MenuItem item) { MachineExporter.promptExport(this); } else if (item.getItemId() == IMPORT) { MachineImporter.promptImportMachines(this); + } else if (item.getItemId() == IMPORT_BIOS_FILE) { + BIOSImporter.promptImportBIOSFile(this); } else if (item.getItemId() == HELP) { Help.showHelp(this); } else if (item.getItemId() == VIEWLOG) { @@ -2642,6 +2738,8 @@ public void onResume() { @Override public void run() { updateValues(); + if(libLoaded) + notifyAction(MachineAction.IGNORE_BREAKPOINT_INVALIDATION, LimboSettingsManager.getIgnoreBreakpointInvalidation(LimboActivity.this)); } }, 1000); diff --git a/limbo-android-lib/src/main/java/com/max2idea/android/limbo/main/LimboApplication.java b/limbo-android-lib/src/main/java/com/max2idea/android/limbo/main/LimboApplication.java index b603ef711..0031550eb 100644 --- a/limbo-android-lib/src/main/java/com/max2idea/android/limbo/main/LimboApplication.java +++ b/limbo-android-lib/src/main/java/com/max2idea/android/limbo/main/LimboApplication.java @@ -27,11 +27,14 @@ import android.os.Environment; import android.util.Log; +import com.max2idea.android.limbo.files.FileUtils; import com.max2idea.android.limbo.machine.Dispatcher; import com.max2idea.android.limbo.machine.FavOpenHelper; import com.max2idea.android.limbo.machine.MachineOpenHelper; +import com.max2idea.android.limbo.toast.ToastUtils; import java.io.File; +import java.io.IOException; /** * We use the application context for the initiliazation of some of the Storage and @@ -42,22 +45,34 @@ public class LimboApplication extends Application { //Do not update these directly, see inherited project java files public static Config.Arch arch; private static Context sInstance; - private static PackageInfo packageInfo; + private static String qemuVersionString; + private static int qemuVersion; + private static String limboVersionString; + private static int limboVersion; public static Context getInstance() { return sInstance; } - public static PackageInfo getPackageInfo() { - return packageInfo; - } - - public static void setupPackageInfo(Context context) { + public static void setupEnv(Context context) { try { - packageInfo = context.getPackageManager().getPackageInfo(context.getClass().getPackage().getName(), + PackageInfo packageInfo = context.getPackageManager().getPackageInfo(context.getClass().getPackage().getName(), PackageManager.GET_META_DATA); - } catch (PackageManager.NameNotFoundException e) { + limboVersion = packageInfo.versionCode; + limboVersionString = packageInfo.versionName; + Log.d(TAG, "Limbo Version: " + limboVersion); + Log.d(TAG, "Limbo Version Code: " + limboVersionString); + + qemuVersionString = FileUtils.LoadFile(context, "QEMU_VERSION", false); + String [] qemuVersionParts = qemuVersionString.trim().split("\\."); + qemuVersion = Integer.parseInt(qemuVersionParts[0]) * 10000 + + Integer.parseInt(qemuVersionParts[1]) * 100 + + Integer.parseInt(qemuVersionParts[2]); + Log.d(TAG, "Qemu Version: " + qemuVersionString); + Log.d(TAG, "Qemu Version Number: " + qemuVersion); + } catch (Exception e) { e.printStackTrace(); + ToastUtils.toastShort(context, "Could not load version information: " + e); } } @@ -135,6 +150,22 @@ public static String getLocalQMPSocketPath() { return getInstance().getCacheDir() + "/qmpsocket"; } + public static String getQemuVersionString() { + return qemuVersionString; + } + + public static int getQemuVersion() { + return qemuVersion; + } + + public static String getLimboVersionString() { + return limboVersionString; + } + + public static int getLimboVersion() { + return limboVersion; + } + @Override public void onCreate() { super.onCreate(); diff --git a/limbo-android-lib/src/main/java/com/max2idea/android/limbo/main/LimboFileManager.java b/limbo-android-lib/src/main/java/com/max2idea/android/limbo/main/LimboFileManager.java index d2581280f..9640f375c 100644 --- a/limbo-android-lib/src/main/java/com/max2idea/android/limbo/main/LimboFileManager.java +++ b/limbo-android-lib/src/main/java/com/max2idea/android/limbo/main/LimboFileManager.java @@ -73,21 +73,21 @@ public class LimboFileManager extends ListActivity { private final int SELECT_DIR = 1; private final int CREATE_DIR = 2; private final int CANCEL = 3; - public Comparator comparator = new Comparator() { + public Comparator comparator = new Comparator() { - public int compare(String object1, String object2) { - if (object1.startsWith("..")) + public int compare(File object1, File object2) { + if (object1.getName().startsWith("..")) return -1; - else if (object2.startsWith("..")) + else if (object2.getName().startsWith("..")) return 1; - else if (object1.endsWith("/") && !object2.endsWith("/")) + else if (object1.getName().endsWith("/") && !object2.getName().endsWith("/")) return -1; - else if (!object1.endsWith("/") && object2.endsWith("/")) + else if (!object1.getName().endsWith("/") && object2.getName().endsWith("/")) return 1; return object1.toString().compareToIgnoreCase(object2.toString()); } }; - private ArrayList items = null; + private ArrayList items = null; private File currdir = new File(Environment.getExternalStorageDirectory().getAbsolutePath()); private File file; private TextView currentDir; @@ -146,6 +146,8 @@ private static int getASFFileManagerRequestCode(int requestCode) { return Config.OPEN_EXPORT_DIR_ASF_REQUEST_CODE; case Config.OPEN_IMPORT_FILE_REQUEST_CODE: return Config.OPEN_IMPORT_FILE_ASF_REQUEST_CODE; + case Config.OPEN_IMPORT_BIOS_FILE_REQUEST_CODE: + return Config.OPEN_IMPORT_BIOS_FILE_ASF_REQUEST_CODE; case Config.OPEN_LOG_FILE_DIR_REQUEST_CODE: return Config.OPEN_LOG_FILE_DIR_ASF_REQUEST_CODE; default: @@ -342,18 +344,16 @@ private void fill(File[] files) { items = new ArrayList<>(); - items.add(".. (Parent Directory)"); + items.add(new File(".. (Parent Directory)")); if (files != null) { for (File file1 : files) { if (file1 != null) { - String filename = file1.getName(); - if (filename != null && file1.isFile() - && filter(file1) + if (file1.isFile() && filter(file1) ) { - items.add(filename); - } else if (filename != null && file1.isDirectory()) { - items.add(filename + "/"); + items.add(file1); + } else if (file1.isDirectory()) { + items.add(file1); } } } @@ -374,7 +374,7 @@ protected void onListItemClick(ListView l, View v, int position, long id) { fillWithParent(); } else { - file = new File(currdir.getPath() + "/" + items.get(selectionRowID)); + file = items.get(selectionRowID); if (file == null) { ToastUtils.toastShort(this, getString(R.string.AccessDeniedCannotRetrieveDirectory)); } else if (!file.isDirectory() && selectionMode == SelectionMode.DIRECTORY) { @@ -504,11 +504,11 @@ public enum SelectionMode { FILE } - public class FileAdapter extends ArrayAdapter { + public static class FileAdapter extends ArrayAdapter { private final Context context; - private final ArrayList files; + private final ArrayList files; - public FileAdapter(Context context, int layout, ArrayList files) { + public FileAdapter(Context context, int layout, ArrayList files) { super(context, layout, files); this.context = context; this.files = files; @@ -522,13 +522,13 @@ public View getView(int position, View convertView, ViewGroup parent) { View rowView = inflater.inflate(R.layout.dir_row, parent, false); TextView textView = (TextView) rowView.findViewById(R.id.FILE_NAME); ImageView imageView = (ImageView) rowView.findViewById(R.id.FILE_ICON); - textView.setText(files.get(position)); + textView.setText(files.get(position).getName()); int iconRes = 0; - if (files.get(position).startsWith("..") || files.get(position).endsWith("/")) + if (files.get(position).getName().startsWith("..") || files.get(position).isDirectory()) imageView.setImageResource(R.drawable.folder); else { - iconRes = FileUtils.getIconForFile(files.get(position)); + iconRes = FileUtils.getIconForFile(files.get(position).getName()); imageView.setImageResource(iconRes); } return rowView; diff --git a/limbo-android-lib/src/main/java/com/max2idea/android/limbo/main/LimboSDLActivity.java b/limbo-android-lib/src/main/java/com/max2idea/android/limbo/main/LimboSDLActivity.java index 043de1b42..6ebb8d821 100644 --- a/limbo-android-lib/src/main/java/com/max2idea/android/limbo/main/LimboSDLActivity.java +++ b/limbo-android-lib/src/main/java/com/max2idea/android/limbo/main/LimboSDLActivity.java @@ -29,9 +29,11 @@ import android.media.AudioManager; import android.media.AudioRecord; import android.media.AudioTrack; +import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.Looper; +import android.os.PowerManager; import android.util.Log; import android.view.KeyCharacterMap; import android.view.KeyEvent; @@ -320,7 +322,7 @@ public void onClick(DialogInterface dialog, int i) { protected void setTrackpadMode() { try { - ScreenUtils.updateOrientation(this); + ScreenUtils.updateOrientation(this, -1); mouseMode = MouseMode.Trackpad; invalidateOptionsMenu(); ((LimboSDLSurface) mSurface).refreshSurfaceView(); @@ -485,7 +487,7 @@ protected void onCreate(Bundle savedInstanceState) { setupListeners(); setupToolBar(); showHints(); - ScreenUtils.updateOrientation(this); + ScreenUtils.updateOrientation(this, -1); checkPendingActions(); setupUserInterface(); setupAudio(); @@ -501,6 +503,11 @@ private void setupScreen() { getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); } + PowerManager pm = (PowerManager) getApplicationContext().getSystemService(Context.POWER_SERVICE); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + if(pm.isSustainedPerformanceModeSupported()) + getWindow().setSustainedPerformanceMode(true); + } } private void setupListeners() { @@ -559,9 +566,6 @@ private void toggleKeyMapper() { //XXX: force portrait when key mapper is on edit mode setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); toggleKeyboardFlag = KeyboardUtils.showKeyboard(LimboSDLActivity.this, false, mSurface); - } else { - // restore - ScreenUtils.updateOrientation(this); } } diff --git a/limbo-android-lib/src/main/java/com/max2idea/android/limbo/main/LimboSettingsManager.java b/limbo-android-lib/src/main/java/com/max2idea/android/limbo/main/LimboSettingsManager.java index 8bdfb84d6..068c25d64 100644 --- a/limbo-android-lib/src/main/java/com/max2idea/android/limbo/main/LimboSettingsManager.java +++ b/limbo-android-lib/src/main/java/com/max2idea/android/limbo/main/LimboSettingsManager.java @@ -173,16 +173,14 @@ public static void setExitCode(Context context, int exitCode) { } public static boolean isFirstLaunch(Context context) { - PackageInfo pInfo = LimboApplication.getPackageInfo(); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); - return prefs.getBoolean("firstTime" + pInfo.versionName, true); + return prefs.getBoolean("firstTime" + LimboApplication.getLimboVersionString(), true); } public static void setFirstLaunch(Context context) { - PackageInfo pInfo = LimboApplication.getPackageInfo(); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); SharedPreferences.Editor edit = prefs.edit(); - edit.putBoolean("firstTime" + pInfo.versionName, false); + edit.putBoolean("firstTime" + LimboApplication.getLimboVersionString(), false); edit.apply(); } @@ -262,6 +260,11 @@ public static boolean getEnableAaudio(Context activity) { return prefs.getBoolean("enableAaudio", false); } + public static String getDiskCache(Context context) { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + return prefs.getString("diskCachePref", context.getString(R.string.Default)); + } + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -385,4 +388,9 @@ public static boolean getPreventMouseOutOfBounds(Context context) { return prefs.getBoolean("preventMouseOutOfBounds", false); } + public static boolean getIgnoreBreakpointInvalidation(Context context) { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + return prefs.getBoolean("ignoreBreakpointInvalidation", false); + } + } diff --git a/limbo-android-lib/src/main/java/com/max2idea/android/limbo/screen/ScreenUtils.java b/limbo-android-lib/src/main/java/com/max2idea/android/limbo/screen/ScreenUtils.java index 0e4e7ad8b..fd0045af4 100644 --- a/limbo-android-lib/src/main/java/com/max2idea/android/limbo/screen/ScreenUtils.java +++ b/limbo-android-lib/src/main/java/com/max2idea/android/limbo/screen/ScreenUtils.java @@ -29,10 +29,12 @@ */ public class ScreenUtils { private static final String TAG = "ScreenUtils"; - public static void updateOrientation(Activity activity) { + public static void updateOrientation(Activity activity, int lastOrientation) { int orientation = LimboSettingsManager.getOrientationSetting(activity); switch (orientation) { case 0: + if(lastOrientation >= 0) + activity.setRequestedOrientation(lastOrientation); activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); break; case 1: diff --git a/limbo-android-lib/src/main/java/com/max2idea/android/limbo/updates/UpdateChecker.java b/limbo-android-lib/src/main/java/com/max2idea/android/limbo/updates/UpdateChecker.java index 0915cc18d..b950707a4 100644 --- a/limbo-android-lib/src/main/java/com/max2idea/android/limbo/updates/UpdateChecker.java +++ b/limbo-android-lib/src/main/java/com/max2idea/android/limbo/updates/UpdateChecker.java @@ -30,6 +30,7 @@ import com.limbo.emu.lib.R; import com.max2idea.android.limbo.main.Config; +import com.max2idea.android.limbo.main.LimboApplication; import com.max2idea.android.limbo.main.LimboSettingsManager; import com.max2idea.android.limbo.network.NetworkUtils; @@ -49,10 +50,8 @@ public static void checkNewVersion(final Activity activity) { float version = Float.parseFloat(versionStr); String versionName = getVersionName(versionStr); - PackageInfo pInfo = activity.getPackageManager().getPackageInfo(activity.getPackageName(), - PackageManager.GET_META_DATA); int versionCheck = (int) (version * 100); - if (versionCheck > pInfo.versionCode) { + if (versionCheck > LimboApplication.getLimboVersion()) { final String finalVersionName = versionName; new Handler(Looper.getMainLooper()).post(new Runnable() { @Override diff --git a/limbo-android-lib/src/main/jni/Android.mk b/limbo-android-lib/src/main/jni/Android.mk index 2179b6730..be6596b51 100644 --- a/limbo-android-lib/src/main/jni/Android.mk +++ b/limbo-android-lib/src/main/jni/Android.mk @@ -3,7 +3,10 @@ #dep libs include $(NDK_PROJECT_PATH)/jni/compat/musl/Android.mk include $(NDK_PROJECT_PATH)/jni/compat/Android.mk -include $(NDK_PROJECT_PATH)/jni/compat/sdl-addons/Android.mk +ifeq ($(USE_AAUDIO),true) + include $(NDK_PROJECT_PATH)/jni/compat/sdl-addons/Android.mk +endif + ifeq ($(USE_SDL),true) include $(NDK_PROJECT_PATH)/jni/SDL2/Android.mk endif diff --git a/limbo-android-lib/src/main/jni/Application.mk b/limbo-android-lib/src/main/jni/Application.mk index f0bb55ece..96ebf7b44 100644 --- a/limbo-android-lib/src/main/jni/Application.mk +++ b/limbo-android-lib/src/main/jni/Application.mk @@ -13,12 +13,11 @@ else endif #Don't remove this -APP_CFLAGS += $(ARCH_CFLAGS) -APP_CFLAGS += $(ARCH_EXTRA_CFLAGS) -APP_LDFLAGS += $(ARCH_LD_FLAGS) - -#FIXME: we should use memmove for the utils also -#APP_CFLAGS += -include $(FIXUTILS) +APP_CFLAGS += -include $(LOGUTILS) +APP_LDFLAGS += -llog +ifeq ($(USE_GCC),true) + APP_CFLAGS +=-std=gnu99 +endif APP_ARM_MODE=$(ARM_MODE) diff --git a/limbo-android-lib/src/main/jni/Makefile b/limbo-android-lib/src/main/jni/Makefile index 307eb03f5..a236117a9 100644 --- a/limbo-android-lib/src/main/jni/Makefile +++ b/limbo-android-lib/src/main/jni/Makefile @@ -86,6 +86,7 @@ COPY_ROMS=-mkdir -p ../assets/roms && cp -rf ./qemu/pc-bios/*.rom \ ../assets/roms/ COPY_KEYMAPS=cp -rf ./qemu/pc-bios/keymaps ../assets/roms/ +COPY_QEMU_VERSION=cp -f ./qemu/VERSION ../assets/QEMU_VERSION COPY_RESOLV_CONF=mkdir -p ../assets/roms/etc/ && printf "nameserver 8.8.8.8\n\n" > ../assets/roms/etc/resolv.conf COPY_ASSETS_X86=mkdir -p ../../../../limbo-android-x86/src/main/assets/ && \ @@ -257,6 +258,7 @@ _build-qemu: ndk $(RENAME_PARPROUTED) $(COPY_ROMS) $(COPY_KEYMAPS) + $(COPY_QEMU_VERSION) $(COPY_RESOLV_CONF) qemu: ndk diff --git a/limbo-android-lib/src/main/jni/android-config/android-device-config/android-armv7a-softfp.mak b/limbo-android-lib/src/main/jni/android-config/android-device-config/android-armv7a-softfp.mak index 5ed4f0e40..b7b33250d 100644 --- a/limbo-android-lib/src/main/jni/android-config/android-device-config/android-armv7a-softfp.mak +++ b/limbo-android-lib/src/main/jni/android-config/android-device-config/android-armv7a-softfp.mak @@ -5,8 +5,9 @@ ARCH_CFLAGS += -D__ANDROID_API__=$(NDK_PLATFORM_API) #CLANG ONLY ifeq ($(NDK_TOOLCHAIN_VERSION),clang) + TARGET_PREFIX = armv7-none-linux-androideabi # ARCH_CLANG_FLAGS += -gcc-toolchain $(TOOLCHAIN_DIR) - ARCH_CLANG_FLAGS += -target armv7-none-linux-androideabi$(NDK_PLATFORM_API) + ARCH_CLANG_FLAGS += -target $(TARGET_PREFIX)$(NDK_PLATFORM_API) ARCH_CFLAGS += $(ARCH_CLANG_FLAGS) -D__ANDROID_API__=$(NDK_PLATFORM_API) # ARCH_CFLAGS += -fno-integrated-as ARCH_LD_FLAGS += -Wc,-target -Wc,armv7-none-linux-androideabi$(NDK_PLATFORM_API) diff --git a/limbo-android-lib/src/main/jni/android-config/android-device-config/android-armv8.mak b/limbo-android-lib/src/main/jni/android-config/android-device-config/android-armv8.mak index 0bc2713f0..e26093cdc 100644 --- a/limbo-android-lib/src/main/jni/android-config/android-device-config/android-armv8.mak +++ b/limbo-android-lib/src/main/jni/android-config/android-device-config/android-armv8.mak @@ -5,8 +5,9 @@ ARCH_CFLAGS += -D__ANDROID_API__=$(NDK_PLATFORM_API) #CLANG ONLY ifeq ($(NDK_TOOLCHAIN_VERSION),clang) + TARGET_PREFIX = aarch64-none-linux-android # ARCH_CLANG_FLAGS += -gcc-toolchain $(TOOLCHAIN_DIR) - ARCH_CLANG_FLAGS += -target aarch64-none-linux-android$(NDK_PLATFORM_API) + ARCH_CLANG_FLAGS += -target $(TARGET_PREFIX)$(NDK_PLATFORM_API) ARCH_CFLAGS += $(ARCH_CLANG_FLAGS) -D__ANDROID_API__=$(NDK_PLATFORM_API) # ARCH_CFLAGS += -fno-integrated-as ARCH_LD_FLAGS += -Wc,-target -Wc,aarch64-none-linux-android$(NDK_PLATFORM_API) diff --git a/limbo-android-lib/src/main/jni/android-config/android-device-config/android-generic.mak b/limbo-android-lib/src/main/jni/android-config/android-device-config/android-generic.mak index 20a4fb658..d65697f99 100644 --- a/limbo-android-lib/src/main/jni/android-config/android-device-config/android-generic.mak +++ b/limbo-android-lib/src/main/jni/android-config/android-device-config/android-generic.mak @@ -27,7 +27,6 @@ ARCH_LD_FLAGS += -lc -lm -llog # add aaudio ifeq ($(USE_AAUDIO),true) ARCH_CFLAGS += -D__ENABLE_AAUDIO__ - ARCH_LD_FLAGS += -laaudio endif # Suppress some warnings diff --git a/limbo-android-lib/src/main/jni/android-config/android-device-config/android-x86.mak b/limbo-android-lib/src/main/jni/android-config/android-device-config/android-x86.mak index a23a98c4a..6af7bb6af 100644 --- a/limbo-android-lib/src/main/jni/android-config/android-device-config/android-x86.mak +++ b/limbo-android-lib/src/main/jni/android-config/android-device-config/android-x86.mak @@ -6,8 +6,9 @@ ARCH_LD_FLAGS += -latomic #CLANG ONLY ifeq ($(NDK_TOOLCHAIN_VERSION),clang) + TARGET_PREFIX = i686-none-linux-android # ARCH_CLANG_FLAGS += -gcc-toolchain $(TOOLCHAIN_DIR) - ARCH_CLANG_FLAGS += -target i686-none-linux-android$(NDK_PLATFORM_API) + ARCH_CLANG_FLAGS += -target $(TARGET_PREFIX)$(NDK_PLATFORM_API) ARCH_CFLAGS += $(ARCH_CLANG_FLAGS) -D__ANDROID_API__=$(NDK_PLATFORM_API) #ARCH_CFLAGS += -fno-integrated-as ARCH_LD_FLAGS += -Wc,-target -Wc,i686-none-linux-android$(NDK_PLATFORM_API) diff --git a/limbo-android-lib/src/main/jni/android-config/android-device-config/android-x86_64.mak b/limbo-android-lib/src/main/jni/android-config/android-device-config/android-x86_64.mak index da3dfa677..8b12dc9a3 100644 --- a/limbo-android-lib/src/main/jni/android-config/android-device-config/android-x86_64.mak +++ b/limbo-android-lib/src/main/jni/android-config/android-device-config/android-x86_64.mak @@ -6,8 +6,9 @@ ARCH_LD_FLAGS += -latomic #CLANG ONLY ifeq ($(NDK_TOOLCHAIN_VERSION),clang) + TARGET_PREFIX = x86_64-none-linux-android # ARCH_CLANG_FLAGS += -gcc-toolchain $(TOOLCHAIN_DIR) - ARCH_CLANG_FLAGS += -target x86_64-none-linux-android$(NDK_PLATFORM_API) + ARCH_CLANG_FLAGS += -target $(TARGET_PREFIX)$(NDK_PLATFORM_API) ARCH_CFLAGS += $(ARCH_CLANG_FLAGS) -D__ANDROID_API__=$(NDK_PLATFORM_API) # ARCH_CFLAGS += -fno-integrated-as ARCH_LD_FLAGS += -Wc,-target -Wc,x86_64-none-linux-android$(NDK_PLATFORM_API) diff --git a/limbo-android-lib/src/main/jni/android-config/android-limbo-config.mak b/limbo-android-lib/src/main/jni/android-config/android-limbo-config.mak index c1c59d226..511f07596 100644 --- a/limbo-android-lib/src/main/jni/android-config/android-limbo-config.mak +++ b/limbo-android-lib/src/main/jni/android-config/android-limbo-config.mak @@ -6,17 +6,17 @@ #NDK_ROOT = /home/dev/tools/ndk/android-ndk-r14b #USE_GCC?=true # Or use r23 with clang -NDK_ROOT ?= /home/dev/tools/ndk/android-ndk-r23 +NDK_ROOT ?= /home/dev/tools/ndk/android-ndk-r23b USE_GCC?=false ### the ndk api should be the same as the minSdkVersion in your AndroidManifest.xml -NDK_PLATFORM_API=26 +NDK_PLATFORM_API=21 # Set to true if you use platform-21 or above USE_NDK_PLATFORM21 ?= true # Set to true if you use platform-26 or above -USE_NDK_PLATFORM26 ?= true +USE_NDK_PLATFORM26 ?= false # Optimization, generally it is better set to false when debugging USE_OPTIMIZATION ?= true @@ -49,7 +49,7 @@ BUILD_GUEST?=x86_64-softmmu # QEMU Version # values: 2.9.1, 5.1.0 -USE_QEMU_VERSION ?= 2.9.1 +USE_QEMU_VERSION ?= 5.1.0 # If you want to use SDL interface USE_SDL ?= true diff --git a/limbo-android-lib/src/main/jni/compat/limbo_compat.h b/limbo-android-lib/src/main/jni/compat/limbo_compat.h index 802a6c01f..c43c75563 100644 --- a/limbo-android-lib/src/main/jni/compat/limbo_compat.h +++ b/limbo-android-lib/src/main/jni/compat/limbo_compat.h @@ -11,9 +11,6 @@ extern pthread_mutex_t fd_lock; extern const char * storage_base_dir; extern const char * limbo_base_dir; -#ifdef __cplusplus -extern "C" { -#endif void set_jni(JNIEnv* env, jobject obj1, jclass jclass1, const char * storage_dir, const char * limbo_dir); void * valloc (size_t size); @@ -21,10 +18,5 @@ void * valloc (size_t size); const char* strchrnul(const char* s, int c); #endif -#ifdef __cplusplus -} -#endif - - #endif diff --git a/limbo-android-lib/src/main/jni/compat/limbo_compat_filesystem.h b/limbo-android-lib/src/main/jni/compat/limbo_compat_filesystem.h index 21dc150c4..560ef161f 100644 --- a/limbo-android-lib/src/main/jni/compat/limbo_compat_filesystem.h +++ b/limbo-android-lib/src/main/jni/compat/limbo_compat_filesystem.h @@ -27,17 +27,11 @@ void *get_fd_thread(void *t); int create_thread_get_fd(const char * filepath); #endif -#ifdef __cplusplus -extern "C" { -#endif FILE* android_fopen(const char *path, const char * mode); int android_open(const char *path, int flags, ...); //int android_close(int fd); int android_stat(const char*, struct stat*); int android_mkstemp(char * path); int lockf(int fd, int cmd, off_t len); -#ifdef __cplusplus -} -#endif #endif diff --git a/limbo-android-lib/src/main/jni/compat/limbo_compat_qemu.h b/limbo-android-lib/src/main/jni/compat/limbo_compat_qemu.h index 4ab426b39..2b5efc6ff 100644 --- a/limbo-android-lib/src/main/jni/compat/limbo_compat_qemu.h +++ b/limbo-android-lib/src/main/jni/compat/limbo_compat_qemu.h @@ -8,12 +8,6 @@ typedef struct sdl_res_t { int height; } sdl_res_t; -#ifdef __cplusplus -extern "C" { -#endif void Android_JNI_SetVMResolution(int width, int height); -#ifdef __cplusplus -} -#endif #endif diff --git a/limbo-android-lib/src/main/jni/compat/limbo_logutils.h b/limbo-android-lib/src/main/jni/compat/limbo_logutils.h index 342d5ca7b..0f98e192e 100644 --- a/limbo-android-lib/src/main/jni/compat/limbo_logutils.h +++ b/limbo-android-lib/src/main/jni/compat/limbo_logutils.h @@ -19,10 +19,6 @@ #ifndef _LIMBO_LOGUTILS_H #define _LIMBO_LOGUTILS_H -#ifdef __cplusplus -extern "C" { -#endif - #include #include #include @@ -122,9 +118,5 @@ static inline int limbo_vfprintf(FILE *stream, const char *format, va_list ap){ #endif //end DEBUG_OUTPUT -#ifdef __cplusplus - } -#endif - #endif /* _LIMBO_LOGUTILS_H */ diff --git a/limbo-android-lib/src/main/jni/compat/sdl-addons/Android.mk b/limbo-android-lib/src/main/jni/compat/sdl-addons/Android.mk index b31b5a32c..9428664b9 100644 --- a/limbo-android-lib/src/main/jni/compat/sdl-addons/Android.mk +++ b/limbo-android-lib/src/main/jni/compat/sdl-addons/Android.mk @@ -2,10 +2,13 @@ LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) -LOCAL_MODULE := compat-SDL2-addons +# We override the target platform +LOCAL_CFLAGS += -target $(TARGET_PREFIX)26 +LOCAL_LDFLAGS += -target $(TARGET_PREFIX)26 + +LOCAL_LDLIBS += -laaudio +LOCAL_MODULE := compat-SDL2-addons LOCAL_SRC_FILES := SDL_limboaudio.c -LOCAL_C_INCLUDES := include $(BUILD_SHARED_LIBRARY) - diff --git a/limbo-android-lib/src/main/jni/compat/sdl-addons/SDL_limboaudio.c b/limbo-android-lib/src/main/jni/compat/sdl-addons/SDL_limboaudio.c index 8c235e744..e6430d545 100644 --- a/limbo-android-lib/src/main/jni/compat/sdl-addons/SDL_limboaudio.c +++ b/limbo-android-lib/src/main/jni/compat/sdl-addons/SDL_limboaudio.c @@ -17,8 +17,6 @@ Copyright (C) Max Kastanas 2012 * */ -// Requires minSdkVersion 26+ -#if defined(__ENABLE_AAUDIO__) #include #include #include @@ -36,8 +34,6 @@ float aaudioResampleRate = 22050.0; // we drop the frames you can use 0 to do a median filter instead int aaudioDropFrames = 1; -int enableAaudio = 0; - // FIXME: buggy int enableAaudioHighPriority = 0; @@ -68,10 +64,6 @@ int aaudioResampleFrames = 0; sem_t mutex; -int isAaudioEnabled() { - return enableAaudio; -} - // FIXME: this is buggy, though since the aaudio write function is // fast enough we don't bother for now aaudio_data_callback_result_t aaudio_callback( @@ -309,12 +301,3 @@ void writeAaudioQueue() { void* getAaudioBuffer() { return aaudioMidBuffer; } - -JNIEXPORT void JNICALL Java_com_max2idea_android_limbo_jni_VMExecutor_nativeEnableAaudio( - JNIEnv* env, jobject thiz, - int value) { - printf("set enable aaudio: %d\n", value); - enableAaudio = value; -} - -#endif diff --git a/limbo-android-lib/src/main/jni/compat/sdl-extensions/SDL_limbomouse.c b/limbo-android-lib/src/main/jni/compat/sdl-extensions/SDL_limbomouse.c index d7d982391..6aef584a5 100644 --- a/limbo-android-lib/src/main/jni/compat/sdl-extensions/SDL_limbomouse.c +++ b/limbo-android-lib/src/main/jni/compat/sdl-extensions/SDL_limbomouse.c @@ -110,9 +110,9 @@ JNIEXPORT void JNICALL Java_com_max2idea_android_limbo_jni_VMExecutor_nativeMous JNIEXPORT void JNICALL Java_com_max2idea_android_limbo_jni_VMExecutor_nativeMouseBounds( JNIEnv* env, jobject thiz, int xmin, int xmax, int ymin, int ymax) { checkBounds = true; - x_min = xmin; - x_max = xmax; - y_min = ymin; - y_max = ymax; + x_min = xmin+1; + x_max = xmax-1; + y_min = ymin+1; + y_max = ymax-1; } diff --git a/limbo-android-lib/src/main/jni/limbo/Android.mk b/limbo-android-lib/src/main/jni/limbo/Android.mk index 23ddfce17..62f1256be 100644 --- a/limbo-android-lib/src/main/jni/limbo/Android.mk +++ b/limbo-android-lib/src/main/jni/limbo/Android.mk @@ -5,7 +5,7 @@ include $(CLEAR_VARS) LOCAL_ARM_MODE:= $(APP_ARM_MODE) LOCAL_SRC_FILES := \ - vm-executor-jni.cpp + vm-executor-jni.c LOCAL_MODULE := limbo diff --git a/limbo-android-lib/src/main/jni/limbo/vm-executor-jni.cpp b/limbo-android-lib/src/main/jni/limbo/vm-executor-jni.c similarity index 83% rename from limbo-android-lib/src/main/jni/limbo/vm-executor-jni.cpp rename to limbo-android-lib/src/main/jni/limbo/vm-executor-jni.c index 0445a69c8..f50227f8e 100644 --- a/limbo-android-lib/src/main/jni/limbo/vm-executor-jni.cpp +++ b/limbo-android-lib/src/main/jni/limbo/vm-executor-jni.c @@ -45,6 +45,7 @@ void * loadLib(const char* lib_filename, const char * lib_path_str) { void *ldhandle = dlopen(lib_filename, RTLD_LAZY); if(ldhandle == NULL) { // try with the lib path + printf("trying loading with full path: %s\n", lib_path_str); ldhandle = dlopen(lib_path_str, RTLD_LAZY); } return ldhandle; @@ -57,46 +58,44 @@ void setup_jni(JNIEnv* env, jobject thiz, jstring storage_dir, jstring base_dir) const char *storage_dir_str = NULL; if (base_dir != NULL) - base_dir_str = env->GetStringUTFChars(base_dir, 0); + base_dir_str = (*env)->GetStringUTFChars(env, base_dir, 0); if (storage_dir != NULL) - storage_dir_str = env->GetStringUTFChars(storage_dir, 0); + storage_dir_str = (*env)->GetStringUTFChars(env, storage_dir, 0); - jclass c = env->GetObjectClass(thiz); + jclass c = (*env)->GetObjectClass(env, thiz); set_jni(env, thiz, c, storage_dir_str, base_dir_str); } int get_qemu_var(JNIEnv* env, jobject thiz, const char * var) { char res_msg[MSG_BUFSIZE + 1] = { 0 }; - + dlerror(); - void * obj = dlsym (handle, var); const char *dlsym_error = dlerror(); if (dlsym_error) { LOGE("Cannot load symbol %s: %s\n", var, dlsym_error); return -1; } - int * var_ptr = (int *) obj; - //LOGD("Set Var %s: %s, %d\n", var, dlsym_error, *var_ptr); - return *var_ptr; } void set_qemu_var(JNIEnv* env, jobject thiz, const char * var, jint jvalue){ + int value_int = (jint) jvalue; dlerror(); - - int value_int = (jint) jvalue; - //LOGI("change var: %s = %d\n", var, value_int); void * obj = dlsym (handle, var); + const char *dlsym_error = dlerror(); + if (dlsym_error) { + LOGE("Cannot load symbol %s: %s\n", var, dlsym_error); + return; + } int * var_ptr = (int *) obj; *var_ptr = value_int; } JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *pvt) { - printf("* JNI_OnLoad called\n"); return JNI_VERSION_1_2; } @@ -151,6 +150,14 @@ JNIEXPORT jint JNICALL Java_com_max2idea_android_limbo_jni_VMExecutor_getvncrefr return res; } +JNIEXPORT void JNICALL Java_com_max2idea_android_limbo_jni_VMExecutor_nativeIgnoreBreakpointInvalidate( + JNIEnv* env, jobject thiz, jint jvalue) { + if(handle == NULL) { + return; + } + set_qemu_var(env, thiz, "limbo_ignore_breakpoint_invalidate", jvalue); +} + JNIEXPORT jstring JNICALL Java_com_max2idea_android_limbo_jni_VMExecutor_start( JNIEnv* env, jobject thiz, jstring storage_dir, jstring base_dir, @@ -163,7 +170,7 @@ JNIEXPORT jstring JNICALL Java_com_max2idea_android_limbo_jni_VMExecutor_start( if (started) { sprintf(res_msg, "VM Already started"); LOGV("%s", res_msg); - return env->NewStringUTF(res_msg); + return (*env)->NewStringUTF(env, res_msg); } LOGV("Processing params"); @@ -172,38 +179,32 @@ JNIEXPORT jstring JNICALL Java_com_max2idea_android_limbo_jni_VMExecutor_start( int argc = 0; char ** argv; - //params - argc = env->GetArrayLength(params); - //LOGV("Params = %d", argc); + argc = (*env)->GetArrayLength(env, params); argv = (char **) malloc((argc + 1) * sizeof(*argv)); for (int i = 0; i < argc; i++) { - jstring string = (jstring)(env->GetObjectArrayElement(params, i)); - const char *param_str = env->GetStringUTFChars(string, 0); + jstring string = (jstring)((*env)->GetObjectArrayElement(env, params, i)); + const char *param_str = (*env)->GetStringUTFChars(env, string, 0); int length = strlen(param_str)+1; argv[i] = (char *) malloc(length * sizeof(char)); strcpy(argv[i], param_str); - env->ReleaseStringUTFChars(string, param_str); + (*env)->ReleaseStringUTFChars(env, string, param_str); } //XXX: Do not remove argv[argc] = NULL; - for (int k = 0; k < argc; k++) { - //LOGV("param[%d]=%s", k, argv[k]); - } - - printf("Starting VM..."); + printf("Starting VM"); started = 1; //LOAD LIB const char *lib_filename_str = NULL; if (lib_filename!= NULL) - lib_filename_str = env->GetStringUTFChars(lib_filename, 0); + lib_filename_str = (*env)->GetStringUTFChars(env, lib_filename, 0); const char *lib_path_str = NULL; if (lib_path != NULL) - lib_path_str = env->GetStringUTFChars(lib_path, 0); + lib_path_str = (*env)->GetStringUTFChars(env, lib_path, 0); if (handle == NULL) { handle = loadLib(lib_filename_str, lib_path_str); @@ -212,14 +213,12 @@ JNIEXPORT jstring JNICALL Java_com_max2idea_android_limbo_jni_VMExecutor_start( if (!handle) { sprintf(res_msg, "Error opening lib: %s :%s", lib_path_str, dlerror()); LOGV("%s", res_msg); - return env->NewStringUTF(res_msg); + return (*env)->NewStringUTF(env, res_msg); } setup_jni(env, thiz, storage_dir, base_dir); - set_qemu_var(env, thiz, "limbo_sdl_scale_hint", sdl_scale_hint); - LOGV("Loading symbol main...\n"); typedef void (*main_t)(int argc, char **argv, char **envp); typedef void (*qemu_main_loop_t)(); typedef void (*qemu_cleanup_t)(); @@ -227,7 +226,6 @@ JNIEXPORT jstring JNICALL Java_com_max2idea_android_limbo_jni_VMExecutor_start( qemu_main_loop_t qemu_main_loop = NULL; qemu_cleanup_t qemu_cleanup = NULL; - // reset errors dlerror(); main_t qemu_main = (main_t) dlsym(handle, "qemu_init"); const char *dlsym_error = dlerror(); @@ -239,7 +237,7 @@ JNIEXPORT jstring JNICALL Java_com_max2idea_android_limbo_jni_VMExecutor_start( LOGE("Cannot find qemu symbol 'qemu_init' or 'main': %s\n", dlsym_error); dlclose(handle); handle = NULL; - return env->NewStringUTF(dlsym_error); + return (*env)->NewStringUTF(env, dlsym_error); } qemu_main(argc, argv, NULL); } else { // new versions of qemu @@ -249,7 +247,7 @@ JNIEXPORT jstring JNICALL Java_com_max2idea_android_limbo_jni_VMExecutor_start( LOGE("Cannot find qemu symbol 'qemu_main_loop': %s\n", dlsym_error); dlclose(handle); handle = NULL; - return env->NewStringUTF(dlsym_error); + return (*env)->NewStringUTF(env, dlsym_error); } qemu_cleanup = (qemu_cleanup_t) dlsym(handle, "qemu_cleanup"); @@ -258,7 +256,7 @@ JNIEXPORT jstring JNICALL Java_com_max2idea_android_limbo_jni_VMExecutor_start( LOGE("Cannot find qemu symbol 'qemu_cleanup': %s\n", dlsym_error); dlclose(handle); handle = NULL; - return env->NewStringUTF(dlsym_error); + return (*env)->NewStringUTF(env, dlsym_error); } qemu_main(argc, argv, NULL); @@ -266,18 +264,17 @@ JNIEXPORT jstring JNICALL Java_com_max2idea_android_limbo_jni_VMExecutor_start( qemu_cleanup(); } - //UNLOAD LIB sprintf(res_msg, "Closing lib: %s", lib_path_str); LOGV("%s", res_msg); dlclose(handle); handle = NULL; started = 0; - env->ReleaseStringUTFChars(lib_path, lib_path_str); + (*env)->ReleaseStringUTFChars(env, lib_path, lib_path_str); sprintf(res_msg, "VM shutdown"); LOGV("%s", res_msg); - return env->NewStringUTF(res_msg); + return (*env)->NewStringUTF(env, res_msg); } @@ -294,7 +291,7 @@ JNIEXPORT jstring JNICALL Java_com_max2idea_android_limbo_jni_VMExecutor_stop( const char *dlsym_error = dlerror(); if (dlsym_error) { LOGE("Cannot load symbol 'qemu_system_reset_request': %s\n", dlsym_error); - return env->NewStringUTF(res_msg); + return (*env)->NewStringUTF(env, res_msg); } qemu_system_reset_request(6); //SHUTDOWN_CAUSE_GUEST_RESET sprintf(res_msg, "VM Restart Request"); @@ -305,7 +302,7 @@ JNIEXPORT jstring JNICALL Java_com_max2idea_android_limbo_jni_VMExecutor_stop( const char *dlsym_error = dlerror(); if (dlsym_error) { LOGE("Cannot load symbol 'qemu_system_shutdown_request': %s\n", dlsym_error); - return env->NewStringUTF(res_msg); + return (*env)->NewStringUTF(env, res_msg); } qemu_system_shutdown_request(3); //SHUTDOWN_CAUSE_HOST_SIGNAL sprintf(res_msg, "VM Stop Request"); @@ -315,7 +312,7 @@ JNIEXPORT jstring JNICALL Java_com_max2idea_android_limbo_jni_VMExecutor_stop( started = restart_int; - return env->NewStringUTF(res_msg); + return (*env)->NewStringUTF(env, res_msg); } // JNI End diff --git a/limbo-android-lib/src/main/jni/limbo/vm-executor-jni.h b/limbo-android-lib/src/main/jni/limbo/vm-executor-jni.h index 5fc317958..5ffdfce3e 100644 --- a/limbo-android-lib/src/main/jni/limbo/vm-executor-jni.h +++ b/limbo-android-lib/src/main/jni/limbo/vm-executor-jni.h @@ -36,8 +36,6 @@ int get_qemu_var(JNIEnv* env, jobject thiz, const char * var); void set_qemu_var(JNIEnv* env, jobject thiz, const char * var, jint jvalue); -extern "C" { - JNIEXPORT void JNICALL Java_com_max2idea_android_limbo_jni_VMExecutor_nativeRefreshScreen( JNIEnv* env, jobject thiz, jint jvalue); @@ -59,6 +57,9 @@ JNIEXPORT jint JNICALL Java_com_max2idea_android_limbo_jni_VMExecutor_getSDLRefr JNIEXPORT jint JNICALL Java_com_max2idea_android_limbo_jni_VMExecutor_getvncrefreshrate( JNIEnv* env, jobject thiz); +JNIEXPORT void JNICALL Java_com_max2idea_android_limbo_jni_VMExecutor_nativeIgnoreBreakpointInvalidate( + JNIEnv* env, jobject thiz, jint jvalue); + JNIEXPORT jstring JNICALL Java_com_max2idea_android_limbo_jni_VMExecutor_start( JNIEnv* env, jobject thiz, jstring storage_dir, jstring base_dir, @@ -69,7 +70,5 @@ JNIEXPORT jstring JNICALL Java_com_max2idea_android_limbo_jni_VMExecutor_start( JNIEXPORT jstring JNICALL Java_com_max2idea_android_limbo_jni_VMExecutor_stop( JNIEnv* env, jobject thiz, jint jint_restart); -} - #endif diff --git a/limbo-android-lib/src/main/jni/patches/qemu-2.9.1.patch b/limbo-android-lib/src/main/jni/patches/qemu-2.9.1.patch index 633432a46..5689853fd 100644 --- a/limbo-android-lib/src/main/jni/patches/qemu-2.9.1.patch +++ b/limbo-android-lib/src/main/jni/patches/qemu-2.9.1.patch @@ -1,6 +1,6 @@ diff -ru --no-dereference /tmp/qemu-2.9.1/audio/audio.c ./audio/audio.c ---- /tmp/qemu-2.9.1/audio/audio.c 2017-09-07 19:28:14.000000000 +0300 -+++ ./audio/audio.c 2021-09-19 22:13:54.255212688 +0300 +--- /tmp/qemu-2.9.1/audio/audio.c 2017-09-07 12:28:14.000000000 -0400 ++++ ./audio/audio.c 2022-03-03 07:53:17.683428743 -0500 @@ -76,7 +76,11 @@ .nb_voices = 1, .greedy = 1, @@ -26,8 +26,8 @@ diff -ru --no-dereference /tmp/qemu-2.9.1/audio/audio.c ./audio/audio.c .fmt = AUD_FMT_S16, .endianness = AUDIO_HOST_ENDIANNESS, diff -ru --no-dereference /tmp/qemu-2.9.1/configure ./configure ---- /tmp/qemu-2.9.1/configure 2017-09-07 19:28:14.000000000 +0300 -+++ ./configure 2021-09-12 11:46:06.150323416 +0300 +--- /tmp/qemu-2.9.1/configure 2017-09-07 12:28:14.000000000 -0400 ++++ ./configure 2022-03-03 07:53:17.683428743 -0500 @@ -1831,7 +1831,8 @@ # pkg-config probe @@ -105,9 +105,33 @@ diff -ru --no-dereference /tmp/qemu-2.9.1/configure ./configure fi ########################################## +diff -ru --no-dereference /tmp/qemu-2.9.1/exec.c ./exec.c +--- /tmp/qemu-2.9.1/exec.c 2017-09-07 12:28:14.000000000 -0400 ++++ ./exec.c 2022-03-03 07:56:02.835432622 -0500 +@@ -725,6 +725,10 @@ + #endif + } + ++#ifdef __LIMBO__ ++int limbo_ignore_breakpoint_invalidate = 0; ++#endif ++ + static void breakpoint_invalidate(CPUState *cpu, target_ulong pc) + { + /* Flush the whole TB as this will not have race conditions +@@ -732,6 +736,9 @@ + * Ideally we would just invalidate the TBs for the + * specified PC. + */ ++#ifdef __LIMBO__ ++ if(!limbo_ignore_breakpoint_invalidate) ++#endif + tb_flush(cpu); + } + diff -ru --no-dereference /tmp/qemu-2.9.1/hw/display/vga.c ./hw/display/vga.c ---- /tmp/qemu-2.9.1/hw/display/vga.c 2017-09-07 19:28:14.000000000 +0300 -+++ ./hw/display/vga.c 2021-09-15 19:04:07.231208893 +0300 +--- /tmp/qemu-2.9.1/hw/display/vga.c 2017-09-07 12:28:14.000000000 -0400 ++++ ./hw/display/vga.c 2022-03-03 07:53:17.735428744 -0500 @@ -1449,6 +1449,12 @@ memory_region_set_log(&s->vram, false, DIRTY_MEMORY_VGA); } @@ -144,8 +168,8 @@ diff -ru --no-dereference /tmp/qemu-2.9.1/hw/display/vga.c ./hw/display/vga.c /* reset modified pages */ if (page_max >= page_min) { diff -ru --no-dereference /tmp/qemu-2.9.1/include/ui/console.h ./include/ui/console.h ---- /tmp/qemu-2.9.1/include/ui/console.h 2017-09-07 19:28:14.000000000 +0300 -+++ ./include/ui/console.h 2021-09-19 15:39:26.512726435 +0300 +--- /tmp/qemu-2.9.1/include/ui/console.h 2017-09-07 12:28:14.000000000 -0400 ++++ ./include/ui/console.h 2022-03-03 07:53:17.755428745 -0500 @@ -27,8 +27,16 @@ #define QEMU_CAPS_LOCK_LED (1 << 2) @@ -164,8 +188,8 @@ diff -ru --no-dereference /tmp/qemu-2.9.1/include/ui/console.h ./include/ui/cons /* Color number is match to standard vga palette */ enum qemu_color_names { diff -ru --no-dereference /tmp/qemu-2.9.1/kvm-all.c ./kvm-all.c ---- /tmp/qemu-2.9.1/kvm-all.c 2017-09-07 19:28:14.000000000 +0300 -+++ ./kvm-all.c 2021-09-12 11:46:06.158323341 +0300 +--- /tmp/qemu-2.9.1/kvm-all.c 2017-09-07 12:28:14.000000000 -0400 ++++ ./kvm-all.c 2022-03-03 07:53:17.759428745 -0500 @@ -1601,7 +1601,12 @@ s->vmfd = -1; s->fd = qemu_open("/dev/kvm", O_RDWR); @@ -180,8 +204,8 @@ diff -ru --no-dereference /tmp/qemu-2.9.1/kvm-all.c ./kvm-all.c goto err; } diff -ru --no-dereference /tmp/qemu-2.9.1/Makefile ./Makefile ---- /tmp/qemu-2.9.1/Makefile 2017-09-07 19:28:14.000000000 +0300 -+++ ./Makefile 2021-09-12 11:46:06.158323341 +0300 +--- /tmp/qemu-2.9.1/Makefile 2017-09-07 12:28:14.000000000 -0400 ++++ ./Makefile 2022-03-03 07:53:17.759428745 -0500 @@ -203,7 +203,7 @@ LIBS+=-lz $(LIBS_TOOLS) @@ -210,8 +234,8 @@ diff -ru --no-dereference /tmp/qemu-2.9.1/Makefile ./Makefile fsdev/virtfs-proxy-helper$(EXESUF): fsdev/virtfs-proxy-helper.o fsdev/9p-marshal.o fsdev/9p-iov-marshal.o $(COMMON_LDADDS) fsdev/virtfs-proxy-helper$(EXESUF): LIBS += -lcap diff -ru --no-dereference /tmp/qemu-2.9.1/Makefile.target ./Makefile.target ---- /tmp/qemu-2.9.1/Makefile.target 2017-09-07 19:28:14.000000000 +0300 -+++ ./Makefile.target 2021-09-12 11:46:06.162323303 +0300 +--- /tmp/qemu-2.9.1/Makefile.target 2017-09-07 12:28:14.000000000 -0400 ++++ ./Makefile.target 2022-03-03 07:53:17.759428745 -0500 @@ -204,8 +204,10 @@ COMMON_LDADDS = $(trace-obj-y) ../libqemuutil.a ../libqemustub.a @@ -226,8 +250,8 @@ diff -ru --no-dereference /tmp/qemu-2.9.1/Makefile.target ./Makefile.target $(call quiet-command,Rez -append $(SRC_PATH)/pc-bios/qemu.rsrc -o $@,"REZ","$(TARGET_DIR)$@") $(call quiet-command,SetFile -a C $@,"SETFILE","$(TARGET_DIR)$@") diff -ru --no-dereference /tmp/qemu-2.9.1/monitor.c ./monitor.c ---- /tmp/qemu-2.9.1/monitor.c 2017-09-07 19:28:14.000000000 +0300 -+++ ./monitor.c 2021-09-12 11:46:06.174323190 +0300 +--- /tmp/qemu-2.9.1/monitor.c 2017-09-07 12:28:14.000000000 -0400 ++++ ./monitor.c 2022-03-03 07:53:17.759428745 -0500 @@ -1869,6 +1869,14 @@ { mon_fd_t *monfd; @@ -244,8 +268,8 @@ diff -ru --no-dereference /tmp/qemu-2.9.1/monitor.c ./monitor.c int fd; diff -ru --no-dereference /tmp/qemu-2.9.1/slirp/misc.c ./slirp/misc.c ---- /tmp/qemu-2.9.1/slirp/misc.c 2017-09-07 19:28:14.000000000 +0300 -+++ ./slirp/misc.c 2021-09-12 11:46:06.178323152 +0300 +--- /tmp/qemu-2.9.1/slirp/misc.c 2017-09-07 12:28:14.000000000 -0400 ++++ ./slirp/misc.c 2022-03-03 07:53:17.775428745 -0500 @@ -60,7 +60,7 @@ } @@ -256,8 +280,8 @@ diff -ru --no-dereference /tmp/qemu-2.9.1/slirp/misc.c ./slirp/misc.c int fork_exec(struct socket *so, const char *ex, int do_pty) diff -ru --no-dereference /tmp/qemu-2.9.1/ui/console.c ./ui/console.c ---- /tmp/qemu-2.9.1/ui/console.c 2017-09-07 19:28:14.000000000 +0300 -+++ ./ui/console.c 2021-09-19 22:12:34.299175702 +0300 +--- /tmp/qemu-2.9.1/ui/console.c 2017-09-07 12:28:14.000000000 -0400 ++++ ./ui/console.c 2022-03-03 07:53:17.863428747 -0500 @@ -34,6 +34,11 @@ #define DEFAULT_BACKSCROLL 512 #define CONSOLE_CURSOR_PERIOD 500 @@ -271,8 +295,8 @@ diff -ru --no-dereference /tmp/qemu-2.9.1/ui/console.c ./ui/console.c uint8_t fgcol:4; uint8_t bgcol:4; diff -ru --no-dereference /tmp/qemu-2.9.1/ui/sdl2-2d.c ./ui/sdl2-2d.c ---- /tmp/qemu-2.9.1/ui/sdl2-2d.c 2017-09-07 19:28:14.000000000 +0300 -+++ ./ui/sdl2-2d.c 2021-09-15 19:47:25.910989528 +0300 +--- /tmp/qemu-2.9.1/ui/sdl2-2d.c 2017-09-07 12:28:14.000000000 -0400 ++++ ./ui/sdl2-2d.c 2022-03-03 07:53:17.867428748 -0500 @@ -66,7 +66,15 @@ SDL_UpdateTexture(scon->texture, NULL, surface_data(surf), @@ -304,8 +328,8 @@ diff -ru --no-dereference /tmp/qemu-2.9.1/ui/sdl2-2d.c ./ui/sdl2-2d.c void sdl2_2d_refresh(DisplayChangeListener *dcl) diff -ru --no-dereference /tmp/qemu-2.9.1/ui/sdl2.c ./ui/sdl2.c ---- /tmp/qemu-2.9.1/ui/sdl2.c 2017-09-07 19:28:14.000000000 +0300 -+++ ./ui/sdl2.c 2021-09-15 18:55:37.466911654 +0300 +--- /tmp/qemu-2.9.1/ui/sdl2.c 2017-09-07 12:28:14.000000000 -0400 ++++ ./ui/sdl2.c 2022-03-03 07:53:17.891428748 -0500 @@ -90,7 +90,15 @@ surface_width(scon->surface), surface_height(scon->surface), @@ -322,40 +346,42 @@ diff -ru --no-dereference /tmp/qemu-2.9.1/ui/sdl2.c ./ui/sdl2.c if (scon->opengl) { scon->winctx = SDL_GL_GetCurrentContext(); } -@@ -284,6 +292,12 @@ +@@ -268,6 +276,13 @@ + }; + static uint32_t prev_state; + ++#ifdef __LIMBO__ ++// LIMBO: the console can be NULL when the mouse moves outside of the window ++// and it crashes the app ++ if(scon==NULL) ++ return; ++#endif ++ + if (prev_state != state) { + qemu_input_update_buttons(scon->dcl.con, bmap, prev_state, state); + prev_state = state; +@@ -284,6 +299,12 @@ struct sdl2_console *thiscon = &sdl2_console[i]; if (thiscon->real_window && thiscon->surface) { SDL_GetWindowSize(thiscon->real_window, &scr_w, &scr_h); +#ifdef __LIMBO__ +// New versions of limbo we don't use the whole screen so +// we cap one the actual surface -+ max_w = surface_width(scon->surface); -+ max_h = surface_height(scon->surface); ++ max_w = surface_width(scon->surface) - 2; ++ max_h = surface_height(scon->surface) - 2; +#else cur_off_x = thiscon->x; cur_off_y = thiscon->y; if (scr_w + cur_off_x > max_w) { -@@ -296,9 +310,10 @@ +@@ -296,6 +317,7 @@ off_x = cur_off_x; off_y = cur_off_y; } +#endif //LIMBO } } -- qemu_input_queue_abs(scon->dcl.con, INPUT_AXIS_X, off_x + x, max_w); -+ qemu_input_queue_abs(scon->dcl.con, INPUT_AXIS_X, off_x + x, max_w); - qemu_input_queue_abs(scon->dcl.con, INPUT_AXIS_Y, off_y + y, max_h); - } else { - if (guest_cursor) { -@@ -309,6 +324,7 @@ - dx = x; - dy = y; - } -+ - qemu_input_queue_rel(scon->dcl.con, INPUT_AXIS_X, dx); - qemu_input_queue_rel(scon->dcl.con, INPUT_AXIS_Y, dy); - } -@@ -595,6 +611,10 @@ + qemu_input_queue_abs(scon->dcl.con, INPUT_AXIS_X, off_x + x, max_w); +@@ -595,6 +617,10 @@ } while (SDL_PollEvent(ev)) { @@ -366,7 +392,7 @@ diff -ru --no-dereference /tmp/qemu-2.9.1/ui/sdl2.c ./ui/sdl2.c switch (ev->type) { case SDL_KEYDOWN: idle = 0; -@@ -756,6 +776,10 @@ +@@ -756,6 +782,10 @@ } } @@ -377,7 +403,7 @@ diff -ru --no-dereference /tmp/qemu-2.9.1/ui/sdl2.c ./ui/sdl2.c void sdl_display_init(DisplayState *ds, int full_screen, int no_frame) { int flags; -@@ -768,6 +792,7 @@ +@@ -768,6 +798,7 @@ gui_noframe = 1; } @@ -385,7 +411,7 @@ diff -ru --no-dereference /tmp/qemu-2.9.1/ui/sdl2.c ./ui/sdl2.c #ifdef __linux__ /* on Linux, SDL may use fbcon|directfb|svgalib when run without * accessible $DISPLAY to open X11 window. This is often the case -@@ -780,6 +805,12 @@ +@@ -780,6 +811,12 @@ */ setenv("SDL_VIDEODRIVER", "x11", 0); #endif @@ -399,8 +425,8 @@ diff -ru --no-dereference /tmp/qemu-2.9.1/ui/sdl2.c ./ui/sdl2.c flags = SDL_INIT_VIDEO | SDL_INIT_NOPARACHUTE; if (SDL_Init(flags)) { diff -ru --no-dereference /tmp/qemu-2.9.1/ui/vnc.c ./ui/vnc.c ---- /tmp/qemu-2.9.1/ui/vnc.c 2017-09-07 19:28:14.000000000 +0300 -+++ ./ui/vnc.c 2021-09-12 14:31:14.102083548 +0300 +--- /tmp/qemu-2.9.1/ui/vnc.c 2017-09-07 12:28:14.000000000 -0400 ++++ ./ui/vnc.c 2022-03-03 07:53:17.891428748 -0500 @@ -47,8 +47,19 @@ #include "qemu/cutils.h" #include "io/dns-resolver.h" @@ -434,7 +460,7 @@ diff -ru --no-dereference /tmp/qemu-2.9.1/ui/vnc.c ./ui/vnc.c + + if ((sym >= 123 && sym <= 126) + || (sym >= 33 && sym <= 38) -+ || (sym >= 40 && sym <= 44) ++ || (sym >= 40 && sym < 44) + || (sym >= 62 && sym <= 64) + || (sym >= 94 && sym <= 95) + || sym == 58 || sym == 60) { @@ -474,8 +500,8 @@ diff -ru --no-dereference /tmp/qemu-2.9.1/ui/vnc.c ./ui/vnc.c } diff -ru --no-dereference /tmp/qemu-2.9.1/util/qemu-openpty.c ./util/qemu-openpty.c ---- /tmp/qemu-2.9.1/util/qemu-openpty.c 2017-09-07 19:28:14.000000000 +0300 -+++ ./util/qemu-openpty.c 2021-09-12 11:46:06.194323001 +0300 +--- /tmp/qemu-2.9.1/util/qemu-openpty.c 2017-09-07 12:28:14.000000000 -0400 ++++ ./util/qemu-openpty.c 2022-03-03 07:53:17.899428748 -0500 @@ -107,7 +107,9 @@ termios_p->c_cc[VTIME] = 0; } diff --git a/limbo-android-lib/src/main/jni/patches/qemu-5.1.0.patch b/limbo-android-lib/src/main/jni/patches/qemu-5.1.0.patch index f988368bb..1eef3ef96 100644 --- a/limbo-android-lib/src/main/jni/patches/qemu-5.1.0.patch +++ b/limbo-android-lib/src/main/jni/patches/qemu-5.1.0.patch @@ -1,6 +1,6 @@ diff -ru --no-dereference /tmp/qemu-5.1.0/accel/kvm/kvm-all.c ./accel/kvm/kvm-all.c ---- /tmp/qemu-5.1.0/accel/kvm/kvm-all.c 2020-08-11 22:17:15.000000000 +0300 -+++ ./accel/kvm/kvm-all.c 2021-09-20 13:04:04.425663294 +0300 +--- /tmp/qemu-5.1.0/accel/kvm/kvm-all.c 2020-08-11 15:17:15.000000000 -0400 ++++ ./accel/kvm/kvm-all.c 2022-03-05 17:53:47.698530009 -0500 @@ -2015,7 +2015,12 @@ s->vmfd = -1; s->fd = qemu_open("/dev/kvm", O_RDWR); @@ -15,8 +15,8 @@ diff -ru --no-dereference /tmp/qemu-5.1.0/accel/kvm/kvm-all.c ./accel/kvm/kvm-al goto err; } diff -ru --no-dereference /tmp/qemu-5.1.0/audio/audio.c ./audio/audio.c ---- /tmp/qemu-5.1.0/audio/audio.c 2020-08-11 22:17:15.000000000 +0300 -+++ ./audio/audio.c 2021-09-20 13:26:15.776197453 +0300 +--- /tmp/qemu-5.1.0/audio/audio.c 2020-08-11 15:17:15.000000000 -0400 ++++ ./audio/audio.c 2022-03-05 17:53:47.718530383 -0500 @@ -2005,7 +2005,11 @@ if (!pdo->has_frequency) { @@ -30,8 +30,8 @@ diff -ru --no-dereference /tmp/qemu-5.1.0/audio/audio.c ./audio/audio.c if (!pdo->has_channels) { pdo->has_channels = true; diff -ru --no-dereference /tmp/qemu-5.1.0/audio/audio_legacy.c ./audio/audio_legacy.c ---- /tmp/qemu-5.1.0/audio/audio_legacy.c 2020-08-11 22:17:15.000000000 +0300 -+++ ./audio/audio_legacy.c 2021-09-20 13:25:43.048526424 +0300 +--- /tmp/qemu-5.1.0/audio/audio_legacy.c 2020-08-11 15:17:15.000000000 -0400 ++++ ./audio/audio_legacy.c 2022-03-05 17:53:47.718530383 -0500 @@ -105,7 +105,11 @@ static uint32_t frames_to_usecs(uint32_t frames, AudiodevPerDirectionOptions *pdo) @@ -45,8 +45,8 @@ diff -ru --no-dereference /tmp/qemu-5.1.0/audio/audio_legacy.c ./audio/audio_leg } diff -ru --no-dereference /tmp/qemu-5.1.0/configure ./configure ---- /tmp/qemu-5.1.0/configure 2020-08-11 22:17:15.000000000 +0300 -+++ ./configure 2021-09-20 13:04:04.429663315 +0300 +--- /tmp/qemu-5.1.0/configure 2020-08-11 15:17:15.000000000 -0400 ++++ ./configure 2022-03-05 17:53:47.746530904 -0500 @@ -2501,7 +2501,8 @@ # pkg-config probe @@ -171,9 +171,32 @@ diff -ru --no-dereference /tmp/qemu-5.1.0/configure ./configure ########################################## # checks for sanitizers +diff -ru --no-dereference /tmp/qemu-5.1.0/exec.c ./exec.c +--- /tmp/qemu-5.1.0/exec.c 2022-03-05 15:50:10.824886801 -0500 ++++ ./exec.c 2022-03-05 17:56:20.141302931 -0500 +@@ -1003,6 +1003,9 @@ + tb_invalidate_phys_page_range(ram_addr, ram_addr + 1); + } + ++#ifdef __LIMBO__ ++int limbo_ignore_breakpoint_invalidate = 0; ++#endif + static void breakpoint_invalidate(CPUState *cpu, target_ulong pc) + { + /* +@@ -1011,6 +1014,9 @@ + * Flush the whole TB cache to force re-translation of such TBs. + * This is heavyweight, but we're debugging anyway. + */ ++#ifdef __LIMBO__ ++ if(!limbo_ignore_breakpoint_invalidate) ++#endif + tb_flush(cpu); + } + #endif diff -ru --no-dereference /tmp/qemu-5.1.0/hw/display/vga.c ./hw/display/vga.c ---- /tmp/qemu-5.1.0/hw/display/vga.c 2020-08-11 22:17:14.000000000 +0300 -+++ ./hw/display/vga.c 2021-09-20 15:01:40.680915173 +0300 +--- /tmp/qemu-5.1.0/hw/display/vga.c 2020-08-11 15:17:14.000000000 -0400 ++++ ./hw/display/vga.c 2022-03-05 17:53:47.774531425 -0500 @@ -1458,6 +1458,12 @@ memory_region_set_log(&s->vram, false, DIRTY_MEMORY_VGA); } @@ -210,8 +233,8 @@ diff -ru --no-dereference /tmp/qemu-5.1.0/hw/display/vga.c ./hw/display/vga.c g_free(snap); memset(s->invalidated_y_table, 0, sizeof(s->invalidated_y_table)); diff -ru --no-dereference /tmp/qemu-5.1.0/include/qemu/osdep.h ./include/qemu/osdep.h ---- /tmp/qemu-5.1.0/include/qemu/osdep.h 2020-08-11 22:17:15.000000000 +0300 -+++ ./include/qemu/osdep.h 2021-09-20 13:04:04.433663335 +0300 +--- /tmp/qemu-5.1.0/include/qemu/osdep.h 2020-08-11 15:17:15.000000000 -0400 ++++ ./include/qemu/osdep.h 2022-03-05 17:53:47.790531723 -0500 @@ -36,6 +36,10 @@ #include "qemu/compiler.h" @@ -224,8 +247,8 @@ diff -ru --no-dereference /tmp/qemu-5.1.0/include/qemu/osdep.h ./include/qemu/os * stdlib.h unless we define these macros before first inclusion of * that system header. diff -ru --no-dereference /tmp/qemu-5.1.0/include/ui/console.h ./include/ui/console.h ---- /tmp/qemu-5.1.0/include/ui/console.h 2020-08-11 22:17:14.000000000 +0300 -+++ ./include/ui/console.h 2021-09-20 13:31:45.612676664 +0300 +--- /tmp/qemu-5.1.0/include/ui/console.h 2020-08-11 15:17:14.000000000 -0400 ++++ ./include/ui/console.h 2022-03-05 17:53:47.806532021 -0500 @@ -26,8 +26,16 @@ #define QEMU_CAPS_LOCK_LED (1 << 2) @@ -244,8 +267,8 @@ diff -ru --no-dereference /tmp/qemu-5.1.0/include/ui/console.h ./include/ui/cons /* Color number is match to standard vga palette */ enum qemu_color_names { diff -ru --no-dereference /tmp/qemu-5.1.0/Makefile ./Makefile ---- /tmp/qemu-5.1.0/Makefile 2020-08-11 22:17:15.000000000 +0300 -+++ ./Makefile 2021-09-20 13:04:04.437663356 +0300 +--- /tmp/qemu-5.1.0/Makefile 2020-08-11 15:17:15.000000000 -0400 ++++ ./Makefile 2022-03-05 17:53:47.822532318 -0500 @@ -338,7 +338,8 @@ vhost-user-json-y = HELPERS-y = $(HELPERS) @@ -277,8 +300,8 @@ diff -ru --no-dereference /tmp/qemu-5.1.0/Makefile ./Makefile qemu-keymap$(EXESUF): qemu-keymap.o ui/input-keymap.o $(COMMON_LDADDS) diff -ru --no-dereference /tmp/qemu-5.1.0/Makefile.target ./Makefile.target ---- /tmp/qemu-5.1.0/Makefile.target 2020-08-11 22:17:15.000000000 +0300 -+++ ./Makefile.target 2021-09-20 13:04:04.437663356 +0300 +--- /tmp/qemu-5.1.0/Makefile.target 2020-08-11 15:17:15.000000000 -0400 ++++ ./Makefile.target 2022-03-05 17:53:47.830532468 -0500 @@ -18,6 +18,12 @@ QEMU_CFLAGS+=-iquote $(SRC_PATH)/include @@ -306,8 +329,8 @@ diff -ru --no-dereference /tmp/qemu-5.1.0/Makefile.target ./Makefile.target $(call quiet-command,Rez -append $(SRC_PATH)/pc-bios/qemu.rsrc -o $@,"REZ","$(TARGET_DIR)$@") $(call quiet-command,SetFile -a C $@,"SETFILE","$(TARGET_DIR)$@") diff -ru --no-dereference /tmp/qemu-5.1.0/monitor/misc.c ./monitor/misc.c ---- /tmp/qemu-5.1.0/monitor/misc.c 2020-08-11 22:17:15.000000000 +0300 -+++ ./monitor/misc.c 2021-09-20 13:04:04.437663356 +0300 +--- /tmp/qemu-5.1.0/monitor/misc.c 2020-08-11 15:17:15.000000000 -0400 ++++ ./monitor/misc.c 2022-03-05 17:53:47.838532616 -0500 @@ -1299,6 +1299,14 @@ { mon_fd_t *monfd; @@ -324,8 +347,8 @@ diff -ru --no-dereference /tmp/qemu-5.1.0/monitor/misc.c ./monitor/misc.c QLIST_FOREACH(monfd, &mon->fds, next) { int fd; diff -ru --no-dereference /tmp/qemu-5.1.0/ui/console.c ./ui/console.c ---- /tmp/qemu-5.1.0/ui/console.c 2020-08-11 22:17:15.000000000 +0300 -+++ ./ui/console.c 2021-09-20 15:30:03.249218610 +0300 +--- /tmp/qemu-5.1.0/ui/console.c 2020-08-11 15:17:15.000000000 -0400 ++++ ./ui/console.c 2022-03-05 17:53:47.854532914 -0500 @@ -38,6 +38,11 @@ #define DEFAULT_BACKSCROLL 512 #define CONSOLE_CURSOR_PERIOD 500 @@ -339,8 +362,8 @@ diff -ru --no-dereference /tmp/qemu-5.1.0/ui/console.c ./ui/console.c uint8_t fgcol:4; uint8_t bgcol:4; diff -ru --no-dereference /tmp/qemu-5.1.0/ui/sdl2-2d.c ./ui/sdl2-2d.c ---- /tmp/qemu-5.1.0/ui/sdl2-2d.c 2020-08-11 22:17:15.000000000 +0300 -+++ ./ui/sdl2-2d.c 2021-09-20 13:04:04.445663397 +0300 +--- /tmp/qemu-5.1.0/ui/sdl2-2d.c 2020-08-11 15:17:15.000000000 -0400 ++++ ./ui/sdl2-2d.c 2022-03-05 17:53:47.862533063 -0500 @@ -125,6 +125,12 @@ surface_width(new_surface), surface_height(new_surface)); @@ -355,8 +378,8 @@ diff -ru --no-dereference /tmp/qemu-5.1.0/ui/sdl2-2d.c ./ui/sdl2-2d.c void sdl2_2d_refresh(DisplayChangeListener *dcl) diff -ru --no-dereference /tmp/qemu-5.1.0/ui/sdl2.c ./ui/sdl2.c ---- /tmp/qemu-5.1.0/ui/sdl2.c 2020-08-11 22:17:15.000000000 +0300 -+++ ./ui/sdl2.c 2021-09-20 13:34:49.496562679 +0300 +--- /tmp/qemu-5.1.0/ui/sdl2.c 2020-08-11 15:17:15.000000000 -0400 ++++ ./ui/sdl2.c 2022-03-05 17:53:47.878533361 -0500 @@ -89,7 +89,16 @@ surface_width(scon->surface), surface_height(scon->surface), @@ -375,7 +398,21 @@ diff -ru --no-dereference /tmp/qemu-5.1.0/ui/sdl2.c ./ui/sdl2.c if (scon->opengl) { scon->winctx = SDL_GL_GetCurrentContext(); } -@@ -627,6 +636,10 @@ +@@ -272,6 +281,13 @@ + }; + static uint32_t prev_state; + ++#ifdef __LIMBO__ ++// LIMBO: the console can be NULL when the mouse moves outside of the window ++// and it crashes the app ++ if(scon==NULL) ++ return; ++#endif ++ + if (prev_state != state) { + qemu_input_update_buttons(scon->dcl.con, bmap, prev_state, state); + prev_state = state; +@@ -627,6 +643,10 @@ } while (SDL_PollEvent(ev)) { @@ -386,7 +423,7 @@ diff -ru --no-dereference /tmp/qemu-5.1.0/ui/sdl2.c ./ui/sdl2.c switch (ev->type) { case SDL_KEYDOWN: idle = 0; -@@ -789,6 +802,10 @@ +@@ -789,6 +809,10 @@ } } @@ -397,7 +434,7 @@ diff -ru --no-dereference /tmp/qemu-5.1.0/ui/sdl2.c ./ui/sdl2.c static void sdl2_display_init(DisplayState *ds, DisplayOptions *o) { uint8_t data = 0; -@@ -798,6 +815,7 @@ +@@ -798,6 +822,7 @@ assert(o->type == DISPLAY_TYPE_SDL); @@ -405,7 +442,7 @@ diff -ru --no-dereference /tmp/qemu-5.1.0/ui/sdl2.c ./ui/sdl2.c #ifdef __linux__ /* on Linux, SDL may use fbcon|directfb|svgalib when run without * accessible $DISPLAY to open X11 window. This is often the case -@@ -810,6 +828,12 @@ +@@ -810,6 +835,12 @@ */ g_setenv("SDL_VIDEODRIVER", "x11", 0); #endif @@ -419,8 +456,8 @@ diff -ru --no-dereference /tmp/qemu-5.1.0/ui/sdl2.c ./ui/sdl2.c if (SDL_Init(SDL_INIT_VIDEO)) { fprintf(stderr, "Could not initialize SDL(%s) - exiting\n", diff -ru --no-dereference /tmp/qemu-5.1.0/ui/vnc.c ./ui/vnc.c ---- /tmp/qemu-5.1.0/ui/vnc.c 2020-08-11 22:17:15.000000000 +0300 -+++ ./ui/vnc.c 2021-09-20 13:04:04.445663397 +0300 +--- /tmp/qemu-5.1.0/ui/vnc.c 2020-08-11 15:17:15.000000000 -0400 ++++ ./ui/vnc.c 2022-03-05 17:53:47.882533435 -0500 @@ -51,8 +51,19 @@ #include "qemu/cutils.h" #include "io/dns-resolver.h" @@ -454,7 +491,7 @@ diff -ru --no-dereference /tmp/qemu-5.1.0/ui/vnc.c ./ui/vnc.c + + if ((sym >= 123 && sym <= 126) + || (sym >= 33 && sym <= 38) -+ || (sym >= 40 && sym <= 44) ++ || (sym >= 40 && sym < 44) + || (sym >= 62 && sym <= 64) + || (sym >= 94 && sym <= 95) + || sym == 58 || sym == 60) { @@ -507,8 +544,8 @@ diff -ru --no-dereference /tmp/qemu-5.1.0/ui/vnc.c ./ui/vnc.c trace_vnc_key_event_ext(down, sym, keycode, code2name(keycode)); do_key_event(vs, down, keycode, sym); diff -ru --no-dereference /tmp/qemu-5.1.0/util/Makefile.objs ./util/Makefile.objs ---- /tmp/qemu-5.1.0/util/Makefile.objs 2020-08-11 22:17:15.000000000 +0300 -+++ ./util/Makefile.objs 2021-09-20 13:04:04.449663418 +0300 +--- /tmp/qemu-5.1.0/util/Makefile.objs 2020-08-11 15:17:15.000000000 -0400 ++++ ./util/Makefile.objs 2022-03-05 17:53:47.894533659 -0500 @@ -39,7 +39,8 @@ util-obj-y += range.o util-obj-y += stats64.o @@ -520,8 +557,8 @@ diff -ru --no-dereference /tmp/qemu-5.1.0/util/Makefile.objs ./util/Makefile.obj util-obj-$(CONFIG_GIO) += dbus.o dbus.o-cflags = $(GIO_CFLAGS) diff -ru --no-dereference /tmp/qemu-5.1.0/util/qemu-openpty.c ./util/qemu-openpty.c ---- /tmp/qemu-5.1.0/util/qemu-openpty.c 2020-08-11 22:17:15.000000000 +0300 -+++ ./util/qemu-openpty.c 2021-09-20 13:04:04.449663418 +0300 +--- /tmp/qemu-5.1.0/util/qemu-openpty.c 2020-08-11 15:17:15.000000000 -0400 ++++ ./util/qemu-openpty.c 2022-03-05 17:53:47.902533807 -0500 @@ -111,6 +111,9 @@ } #endif diff --git a/limbo-android-lib/src/main/jni/patches/sdl2-2.0.8.patch b/limbo-android-lib/src/main/jni/patches/sdl2-2.0.8.patch index a4e801cdb..74547eb3c 100644 --- a/limbo-android-lib/src/main/jni/patches/sdl2-2.0.8.patch +++ b/limbo-android-lib/src/main/jni/patches/sdl2-2.0.8.patch @@ -1,50 +1,117 @@ diff -ru --no-dereference /tmp/SDL2-2.0.8/Android.mk ./Android.mk ---- /tmp/SDL2-2.0.8/Android.mk 2018-03-01 18:34:41.000000000 +0200 -+++ ./Android.mk 2021-09-19 22:52:44.403970089 +0300 -@@ -51,6 +51,10 @@ +--- /tmp/SDL2-2.0.8/Android.mk 2018-03-01 11:34:41.000000000 -0500 ++++ ./Android.mk 2022-03-03 05:05:48.223192739 -0500 +@@ -51,6 +51,14 @@ LOCAL_CFLAGS += -DGL_GLEXT_PROTOTYPES LOCAL_LDLIBS := -ldl -lGLESv1_CM -lGLESv2 -llog -landroid -+# LIMBO: extend to our audio library -+LOCAL_C_INCLUDES += $(LOCAL_PATH)/../compat/sdl-addons -+LOCAL_SHARED_LIBRARIES += compat-SDL2-addons ++# LIMBO: ++LOCAL_CFLAGS += -D__LIMBO__ ++ifeq ($(USE_AAUDIO),true) ++ LOCAL_CFLAGS += -D__ENABLE_AAUDIO__ ++endif ++LOCAL_LDLIBS += -llog +#LIMBO ++ cmd-strip := include $(BUILD_SHARED_LIBRARY) diff -ru --no-dereference /tmp/SDL2-2.0.8/src/core/android/SDL_android.c ./src/core/android/SDL_android.c ---- /tmp/SDL2-2.0.8/src/core/android/SDL_android.c 2018-03-01 18:34:42.000000000 +0200 -+++ ./src/core/android/SDL_android.c 2021-09-19 23:15:28.204809157 +0300 -@@ -1001,8 +1001,23 @@ +--- /tmp/SDL2-2.0.8/src/core/android/SDL_android.c 2018-03-01 11:34:42.000000000 -0500 ++++ ./src/core/android/SDL_android.c 2022-03-02 17:18:20.593569237 -0500 +@@ -1001,8 +1001,86 @@ static jboolean captureBuffer16Bit = JNI_FALSE; static jobject captureBuffer = NULL; +#if defined(__LIMBO__) && defined(__ENABLE_AAUDIO__) -+#include "SDL_limboaudio.h" -+extern int isAaudioEnabled(); -+extern void createAAudioDevice(int sampleRate, int channelCount, int desiredBufferFrames); -+extern void destroyAaudioDevice(); -+extern void writeAaudio() ; -+extern void* getAaudioBuffer(); ++#include ++int enableAaudio = 0; ++typedef void (*createAAudioDevice_t)(int, int, int); ++createAAudioDevice_t createAAudioDevice = NULL; ++typedef void (*destroyAaudioDevice_t)(void); ++destroyAaudioDevice_t destroyAaudioDevice = NULL; ++typedef int (*writeAaudio_t)(void); ++writeAaudio_t writeAaudio = NULL; ++typedef void* (*getAaudioBuffer_t)(void); ++getAaudioBuffer_t getAaudioBuffer = NULL; ++void *ldhandle = NULL; ++const char *aaudioLib = NULL; ++const char *aaudioLibPath = NULL; ++const char *dlsym_error = NULL; ++ ++void* loadLib() { ++ dlerror(); ++ void* handle = dlopen(aaudioLib, RTLD_LAZY); ++ if(handle == NULL) { ++ printf("trying loading with full path: %s\n", aaudioLibPath); ++ handle = dlopen(aaudioLibPath, RTLD_LAZY); ++ } ++ dlsym_error = dlerror(); ++ if (dlsym_error) { ++ printf("Cannot load library %s: %s\n", aaudioLib, dlsym_error); ++ return NULL; ++ } ++ return handle; ++} ++ ++void* loadSymbol(const char *sym) { ++ dlerror(); ++ void *sym_func = dlsym(ldhandle, sym); ++ dlsym_error = dlerror(); ++ if (dlsym_error) { ++ LOGE("Cannot load symbol %s: %s\n", sym, dlsym_error); ++ return NULL; ++ } ++ return sym_func; ++} ++ ++void loadSymbols() { ++ createAAudioDevice = (createAAudioDevice_t) loadSymbol("createAAudioDevice"); ++ destroyAaudioDevice = (destroyAaudioDevice_t) loadSymbol("destroyAaudioDevice"); ++ writeAaudio = (writeAaudio_t) loadSymbol("writeAaudio"); ++ getAaudioBuffer = (getAaudioBuffer_t) loadSymbol("getAaudioBuffer"); ++} ++ ++JNIEXPORT void JNICALL Java_com_max2idea_android_limbo_jni_VMExecutor_nativeEnableAaudio( ++ JNIEnv* env, jobject thiz, ++ int value, jstring aaudioLibName, jstring aaudioLibFullpath) { ++ printf("set enable aaudio: %d\n", value); ++ if (aaudioLibName != NULL) ++ aaudioLib = (*env)->GetStringUTFChars(env, aaudioLibName, 0); ++ ++ if (aaudioLibFullpath != NULL) ++ aaudioLibPath = (*env)->GetStringUTFChars(env, aaudioLibFullpath, 0); ++ ++ enableAaudio = value; ++} ++ +#endif // LIMBO + int Android_JNI_OpenAudioDevice(int iscapture, int sampleRate, int is16Bit, int channelCount, int desiredBufferFrames) { +#if defined(__LIMBO__) && defined(__ENABLE_AAUDIO__) -+ if(isAaudioEnabled()) { -+ createAAudioDevice(sampleRate, channelCount, desiredBufferFrames); -+ return desiredBufferFrames; ++ if(enableAaudio) { ++ ldhandle = loadLib(); ++ if(ldhandle != NULL) { ++ loadSymbols(); ++ if(createAAudioDevice != NULL) { ++ createAAudioDevice(sampleRate, channelCount, desiredBufferFrames); ++ return desiredBufferFrames; ++ } ++ } ++ enableAaudio = 0; ++ printf("Aaudio could not be loaded%d\n"); + } +#endif jboolean audioBufferStereo; int audioBufferFrames; jobject jbufobj = NULL; -@@ -1119,11 +1134,28 @@ +@@ -1119,11 +1197,28 @@ void * Android_JNI_GetAudioBuffer(void) { +#if defined(__LIMBO__) && defined(__ENABLE_AAUDIO__) -+ if(isAaudioEnabled()) ++ if(enableAaudio && getAaudioBuffer != NULL) + return getAaudioBuffer(); +#endif return audioBufferPinned; @@ -53,7 +120,7 @@ diff -ru --no-dereference /tmp/SDL2-2.0.8/src/core/android/SDL_android.c ./src/c void Android_JNI_WriteAudioBuffer(void) { +#if defined(__LIMBO__) && defined(__ENABLE_AAUDIO__) -+ if(isAaudioEnabled()) { ++ if(enableAaudio && writeAaudio != NULL) { + writeAaudio(); + return; + } @@ -68,19 +135,20 @@ diff -ru --no-dereference /tmp/SDL2-2.0.8/src/core/android/SDL_android.c ./src/c JNIEnv *mAudioEnv = Android_JNI_GetEnv(); if (audioBuffer16Bit) { -@@ -1203,6 +1235,9 @@ +@@ -1203,6 +1298,10 @@ audioBufferPinned = NULL; } } +#if defined(__LIMBO__) && defined(__ENABLE_AAUDIO__) -+ destroyAaudioDevice(); ++ if(enableAaudio && destroyAaudioDevice!=NULL) ++ destroyAaudioDevice(); +#endif } /* Test for an exception and call SDL_SetError with its detail if one occurs */ diff -ru --no-dereference /tmp/SDL2-2.0.8/src/events/SDL_mouse.c ./src/events/SDL_mouse.c ---- /tmp/SDL2-2.0.8/src/events/SDL_mouse.c 2018-03-01 18:34:42.000000000 +0200 -+++ ./src/events/SDL_mouse.c 2021-09-14 13:04:17.955954017 +0300 +--- /tmp/SDL2-2.0.8/src/events/SDL_mouse.c 2018-03-01 11:34:42.000000000 -0500 ++++ ./src/events/SDL_mouse.c 2022-03-02 17:18:20.597569238 -0500 @@ -655,6 +655,10 @@ void SDL_WarpMouseInWindow(SDL_Window * window, int x, int y) diff --git a/limbo-android-lib/src/main/res/layout/removable_storage_layout.xml b/limbo-android-lib/src/main/res/layout/removable_storage_layout.xml index 563988eca..eca968b12 100644 --- a/limbo-android-lib/src/main/res/layout/removable_storage_layout.xml +++ b/limbo-android-lib/src/main/res/layout/removable_storage_layout.xml @@ -72,6 +72,7 @@ android:paddingRight="5dp" /> 3 4 + + + default + none + writethrough + writeback + directsync + unsafe + + + default + none + writethrough + writeback + directsync + unsafe + \ No newline at end of file diff --git a/limbo-android-lib/src/main/res/values/strings.xml b/limbo-android-lib/src/main/res/values/strings.xml index 623d2f633..4bf959975 100644 --- a/limbo-android-lib/src/main/res/values/strings.xml +++ b/limbo-android-lib/src/main/res/values/strings.xml @@ -96,6 +96,7 @@ Help Drives Volume + default Hide Toolbar View Log Display Refresh Rate @@ -364,4 +365,11 @@ Machine: Enable Aaudio Aaudio is an alternative native sound streamer library for better audio performance. Needs app restart! + Interface + Disk Cache + Disk Cache might not work with Legacy Manager! If you encounter issues set to Default + Ignore Breakpoint Invalidation + Ignore Breakpoint Invalidation + Import BIOS + Select a BIOS file (bin, rom, etc..) to import. diff --git a/limbo-android-lib/src/main/res/xml/settings.xml b/limbo-android-lib/src/main/res/xml/settings.xml index 6d457bad9..3c029194b 100644 --- a/limbo-android-lib/src/main/res/xml/settings.xml +++ b/limbo-android-lib/src/main/res/xml/settings.xml @@ -107,4 +107,21 @@ + + + + + + + \ No newline at end of file diff --git a/limbo-android-lib/src/main/res/xml/software_updates.xml b/limbo-android-lib/src/main/res/xml/software_updates.xml index 2017d19e3..cab1256c7 100644 --- a/limbo-android-lib/src/main/res/xml/software_updates.xml +++ b/limbo-android-lib/src/main/res/xml/software_updates.xml @@ -1,7 +1,7 @@ diff --git a/limbo-android-ppc/build.gradle b/limbo-android-ppc/build.gradle index e43c6c444..ee9de3ec9 100644 --- a/limbo-android-ppc/build.gradle +++ b/limbo-android-ppc/build.gradle @@ -6,7 +6,7 @@ android { defaultConfig { applicationId "com.limbo.emu.main.ppc" - minSdkVersion 26 + minSdkVersion 21 targetSdkVersion 29 ndk { abiFilters "armeabi-v7a","arm64-v8a", "x86", "x86_64" } } diff --git a/limbo-android-ppc/src/main/AndroidManifest.xml b/limbo-android-ppc/src/main/AndroidManifest.xml index a75c14e53..8c312321f 100644 --- a/limbo-android-ppc/src/main/AndroidManifest.xml +++ b/limbo-android-ppc/src/main/AndroidManifest.xml @@ -1,76 +1,24 @@ - + - - - - - - - - - - - - - + android:versionCode="60001" + android:versionName="6.0.1-ppc"> + > - - - - - - - - - - - - - - - - diff --git a/limbo-android-ppc/src/main/java/com/limbo/emu/main/ppc/LimboEmuActivity.java b/limbo-android-ppc/src/main/java/com/limbo/emu/main/ppc/LimboEmuActivity.java index 2691b4427..b7aa6e089 100644 --- a/limbo-android-ppc/src/main/java/com/limbo/emu/main/ppc/LimboEmuActivity.java +++ b/limbo-android-ppc/src/main/java/com/limbo/emu/main/ppc/LimboEmuActivity.java @@ -20,7 +20,6 @@ public void onCreate(Bundle bundle){ else Config.enableMTTCG = false; Config.enableEmulatedSDCard = false; - Config.ideInterfaceType = "scsi"; Config.machineFolder = Config.machineFolder + "other/ppc_machines/"; Config.osImages.put(getString(R.string.DebianPowerPCLinux), new LinksManager.LinkInfo(getString(R.string.DebianPowerPCLinux), getString(R.string.DebianPowerPCLinuxDescr), diff --git a/limbo-android-sparc/build.gradle b/limbo-android-sparc/build.gradle index 3fdca50cf..03c9a2a91 100644 --- a/limbo-android-sparc/build.gradle +++ b/limbo-android-sparc/build.gradle @@ -6,7 +6,7 @@ android { defaultConfig { applicationId "com.limbo.emu.main.sparc" - minSdkVersion 26 + minSdkVersion 21 targetSdkVersion 29 ndk { abiFilters "armeabi-v7a","arm64-v8a", "x86", "x86_64" } } diff --git a/limbo-android-sparc/src/main/AndroidManifest.xml b/limbo-android-sparc/src/main/AndroidManifest.xml index b91120120..de9beaaab 100644 --- a/limbo-android-sparc/src/main/AndroidManifest.xml +++ b/limbo-android-sparc/src/main/AndroidManifest.xml @@ -1,76 +1,24 @@ - + - - - - - - - - - - - - + android:versionCode="60001" + android:versionName="6.0.1-sparc"> + tools:replace="android:label" + android:label="Limbo SPARC Emulator" + > - - - - - - - - - - - - - - - - - diff --git a/limbo-android-sparc/src/main/java/com/limbo/emu/main/sparc/LimboEmuActivity.java b/limbo-android-sparc/src/main/java/com/limbo/emu/main/sparc/LimboEmuActivity.java index d4364c0a8..72779b105 100644 --- a/limbo-android-sparc/src/main/java/com/limbo/emu/main/sparc/LimboEmuActivity.java +++ b/limbo-android-sparc/src/main/java/com/limbo/emu/main/sparc/LimboEmuActivity.java @@ -21,7 +21,6 @@ public void onCreate(Bundle bundle) { Config.enableKVM = false; //XXX: sparc emulators are not mttcg capable (yet) Config.enableMTTCG = false; - Config.ideInterfaceType = "scsi"; Config.enableSDLSound = false; Config.enableEmulatedSDCard = false; Config.machineFolder = Config.machineFolder + "other/sparc_machines/"; diff --git a/limbo-android-x86/build.gradle b/limbo-android-x86/build.gradle index 532b6e206..651e2a16e 100644 --- a/limbo-android-x86/build.gradle +++ b/limbo-android-x86/build.gradle @@ -6,7 +6,7 @@ android { defaultConfig { applicationId "com.limbo.emu.main" - minSdkVersion 26 + minSdkVersion 21 targetSdkVersion 29 ndk { abiFilters "armeabi-v7a","arm64-v8a", "x86", "x86_64" } } diff --git a/limbo-android-x86/src/main/AndroidManifest.xml b/limbo-android-x86/src/main/AndroidManifest.xml index d5d0e8506..0b795fb3e 100644 --- a/limbo-android-x86/src/main/AndroidManifest.xml +++ b/limbo-android-x86/src/main/AndroidManifest.xml @@ -1,78 +1,24 @@ - - - - - - - - - - - - + android:versionCode="60001" + android:versionName="6.0.1-x86"> - - - - - - - - - - - - - - - - -