Commit Graph

59 Commits

Author SHA1 Message Date
Admiral H. Curtiss 526887899e
Config: Port BluetoothPassthrough settings to new config system. 2021-12-30 23:17:19 +01:00
Admiral H. Curtiss fe242f79ee
Core: Implement Wii NAND path redirects for Riivolution savegame patches. 2021-10-24 00:09:07 +02:00
Léo Lam ef98f209a2
IOS: Add missing writes of low MEM1 constants
On a real Wii, these constants are normally written by the system menu
(maybe even as part of common SDK code?)

However, they're cleared by IOS whenever a PPC title is launched.
IOS memsets 0x0-0x3fff and then manually writes some constants
in low MEM1. PR #4723 added most of the writes in the 0x31xx region
but left out the four writes to the legacy constant region.

Previously Dolphin didn't actually clear 0-0x3fff so those constants
would stick around after a system menu execution.
011f7789e0 exposed those missing writes.
2021-08-29 22:51:44 +02:00
Pierre Bourdon e149ad4f0a
treewide: convert GPLv2+ license info to SPDX tags
SPDX standardizes how source code conveys its copyright and licensing
information. See https://spdx.github.io/spdx-spec/1-rationale/ . SPDX
tags are adopted in many large projects, including things like the Linux
kernel.
2021-07-05 04:35:56 +02:00
JosJuice 3397f49a0a IOS: Don't let Kernel initialize WiiRoot if already initialized
The SaveToSYSCONF call in BootManager.cpp was unintentionally
overriding the temporary NAND set by the preceding
InitializeWiiRoot call. Fixes
https://bugs.dolphin-emu.org/issues/12500.
2021-05-02 10:30:32 +02:00
Léo Lam 391644dbb5
IOS/FS: Add a scoped FD class to make it harder to leak FDs
This changes FileSystemProxy::Open to return a file descriptor wrapper
that will ensure the FD is closed when it goes out of scope.

By using such a wrapper we make it more difficult to forget to close
file descriptors.

This fixes a leak in ReadBootContent. I should have added such a class
from the beginning... In practice, I don't think this would have caused
any obvious issue because ReadBootContent is only called after an IOS
relaunch -- which clears all FDs -- and most titles do not get close
to the FD limit.
2021-04-01 21:34:58 +02:00
Léo Lam 93f0d122c0
IOS: Hang PPC when reloading IOS for a PPC title launch
The PPC is supposed to be held in reset when another version of IOS is
in the process of being launched for a PPC title launch.

Probably doesn't matter in practice, though the inaccuracy was
definitely observable from the PPC.
2021-03-04 18:41:13 +01:00
Léo Lam 19667cb801
Fix symbol map being loaded too early during title changes
We should only try to load a symbol map for the new title *after* it
has been loaded into memory, not before. Likewise for applying HLE
patches and loading new custom textures.

In practice, loading/repatching too early was only a problem for
titles that are launched via ES_Launch. This commit fixes that.
2021-03-04 18:41:13 +01:00
Léo Lam a658cbce16
IOS: Emulate IOS boot timings 2021-03-04 18:41:13 +01:00
Léo Lam 820c4836d7
IOS: Simplify IPC initialisation
The extra IPC ack is triggered by a syscall that is invoked in ES's
main function; the syscall literally just sets Y2, IX1 and IX2 in
HW_IPC_ARMCTRL -- there is no complicated ack queue or anything.
2021-03-04 18:41:13 +01:00
Léo Lam 0da5ea86a3
IOS: Emulate ES boot timings 2021-03-04 18:41:13 +01:00
Léo Lam 688bd6141a
IOS: Emulate BootstrapPPC syscall delays
Reading the boot content from the NAND takes a non-negligible amount of
time and the PPC should be held in reset while the DOL is being read.
2021-03-04 18:41:12 +01:00
Léo Lam 011f7789e0
IOS: Clear 0-0x3fff when setting up low MEM1 constants
Low MEM1 is cleared by IOS before all the other constants are written.

This will overwrite the Gecko code handler but it should be fine
because HLE::Reload (which will set up the code handler hook again)
will be called after a title change is detected.
2021-03-04 18:41:12 +01:00
Léo Lam 5eca82a6f2
IOS/ES: Allow various utility functions to return timing info 2021-02-18 18:53:33 +01:00
Léo Lam be2cd2272d
Merge pull request #9507 from leoetlino/device-prepareforstate
IOS: Remove unnecessary and unused PrepareForState
2021-02-14 16:30:34 +01:00
Léo Lam d0136dd7c2
IOS: Clean up the way IPC replies are constructed
Instead of constructing IPCCommandResult with static member functions
in the Device class, we can just add the relevant constructors to the
reply struct itself. Makes more sense than putting it in Device
when the struct is used in the kernel code and doesn't use any Device
specific members...

This commit also changes the IPC command handlers to return an optional
IPCCommandResult rather than an IPCCommandResult. This removes the need
for a separate boolean that indicates whether the "result" is actually
a reply, and also avoids the need to set dummy result values and ticks.

It also makes it really obvious which commands can result in no reply
being generated.

Finally, this commit renames IPCCommandResult to IPCReply since the
struct is now only used for actual replies. This new name is less
verbose in my opinion.

The diff is quite large since this touches every command handler, but
the only functional change is that I fixed EnqueueIPCReply to
take a s64 for cycles_in_future to match IPCReply.
2021-02-13 20:15:30 +01:00
Léo Lam 6e8881a426
IOS: Remove unnecessary and unused PrepareForState
PrepareForState is now unnecessary with the new implementation of
HostFileSystem::DoState, which does what the old implementation
(CWII_IPC_HLE_Device_FileIO::PrepareForState) used to do.
2021-02-13 16:56:29 +01:00
Léo Lam 522cb6b137
IOS: Use less ambiguous names for classes
Some of the device names can be ambiguous and require fully or partly
qualifying the name (e.g. IOS::HLE::FS::) in a somewhat verbose way.

Additionally, insufficiently qualified names are prone to breaking.
Consider the example of IOS::HLE::FS:: (namespace) and
IOS::HLE::Device::FS (class). If we use FS::Foo in a file that doesn't
know about the class, everything will work fine. However, as soon as
Device::FS is declared via a header include or even just forward
declared, that code will cease to compile because FS:: now resolves
to Device::FS if FS::Foo was used in the Device namespace.

It also leads to having to write IOS::ES:: to access ES types and
utilities even for code that is already under the IOS namespace.

The fix for this is simple: rename the device classes and give them
a "device" suffix in their names if the existing ones may be ambiguous.
This makes it clear whether we're referring to the device class or to
something else.

This is not any longer to type, considering it lets us get rid of the
Device namespace, which is now wholly unnecessary.

There are no functional changes in this commit.

A future commit will fix unnecessarily qualified names.
2021-02-12 21:40:31 +01:00
Lioncash 0e91470828 IOS: Make use of insert_or_assign with AddDevice()
operator[] performs a default construction if an object at the given key
doesn't exist before overwriting it with the one we provide in operator=

insert_or_assign performs optimal insertion by avoiding the default
construction if an entry doesn't exist.

Not a game changer, but it is essentially a "free" change.
2020-12-29 19:32:18 -05:00
Lioncash ba0540b9c5 IOS: Allow for heterogenous name lookup
Allows lookups to be done with std::string_view or any other string
type. This allows for non-allocating strings to be used with the name
lookup without needing to construct a std::string.
2020-12-29 19:32:14 -05:00
Lioncash a8b0661fb0 Core: Make use of C++17 deduction guides with locks
C++17 allows omitting the mutex type, which makes for both less reading
and more flexibility (e.g. The mutex type can change and all occurrences
don't need to be updated).
2020-12-29 16:06:17 -05:00
Lioncash cbbf044064 Core: Convert logging over to fmt pt.3
Continues the migration over to fmt up to IOS' ES module.
2020-11-21 05:56:37 -05:00
Shawn Hoffman ccbc4c2d99 fix possible dangling shared_ptr ptr in ios 2020-08-23 13:57:05 -07:00
Minty-Meeo cc858c63b8 Configurable MEM1 and MEM2 sizes at runtime via Dolphin.ini
Changed several enums from Memmap.h to be static vars and implemented Get functions to query them. This seems to have boosted speed a bit in some titles? The new variables and some previously statically initialized items are now initialized via Memory::Init() and the new AddressSpace::Init(). s_ram_size_real and the new s_exram_size_real in particular are initialized from new OnionConfig values "MAIN_MEM1_SIZE" and "MAIN_MEM2_SIZE", only if "MAIN_RAM_OVERRIDE_ENABLE" is true.

GUI features have been added to Config > Advanced to adjust the new OnionConfig values.

A check has been added to State::doState to ensure savestates with memory configurations different from the current settings aren't loaded. The STATE_VERSION is now 115.

FIFO Files have been updated from version 4 to version 5, now including the MEM1 and MEM2 sizes from the time of DFF creation. FIFO Logs not using the new features (OnionConfig MAIN_RAM_OVERRIDE_ENABLE is false) are still backwards compatible. FIFO Logs that do use the new features have a MIN_LOADER_VERSION of 5. Thanks to the order of function calls, FIFO logs are able to automatically configure the new OnionConfig settings to match what is needed. This is a bit hacky, though, so I also threw in a failsafe for if the conditions that allow this to work ever go away.

I took the liberty of adding a log message to explain why the core fails to initialize if the MIN_LOADER_VERSION is too great.

Some IOS code has had the function "RAMOverrideForIOSMemoryValues" appended to it to recalculate IOS Memory Values from retail IOSes/apploaders to fit the extended memory sizes. Worry not, if MAIN_RAM_OVERRIDE_ENABLE is false, this function does absolutely nothing.

A hotfix in DolphinQt/MenuBar.cpp has been implemented for RAM Override.
2020-04-28 12:10:50 -05:00
Pokechu22 ef2fc5a49b Split /dev/di commands from DVDInterface
The various ioctls sometimes have different arguments than the DI command
registers, though they generally overlap.  There are also a bunch of ioctls
that don't even normally go into DVDInterface, just returning various data.
Some of the implemented ioctls are new to Dolphin.
2020-01-04 11:43:30 -08:00
Florian Bach 2d55a6b0b7 Add /dev/dolphin for homebrew to get information about Dolphin
Adds a /dev/dolphin interface that can be used by
Dolphin-aware software to get information like the
real system time and the Dolphin version.
2019-11-09 15:31:51 +01:00
Lioncash 32bacfa4bd Core: Use nested namespace specifiers where applicable
Same thing, less visual noise.
2019-06-17 16:32:30 -04:00
Filip Gawin 49fe9f5db1 Use empty instead of size 2019-02-13 00:03:49 +01:00
Léo Lam 9ee2654be6 ES: Use new filesystem interface in NandUtils 2018-05-06 23:16:35 +02:00
Lioncash ffcf107dd2 PowerPC: Make the PowerPCState's msr member variable a UReg_MSR instance
Gets rid of the need to construct UReg_MSR values around the the actual
member in order to query information from it (without using shifts and
masks). This makes it more concise in some areas, while helping with
readability in some other places (such as copying the ILE bit to the LE
bit in the exception checking functions).
2018-05-05 17:59:30 -04:00
Léo Lam 95aae11164 IOS: Do not manually close devices in destructor
This used to be necessary for properly cleaning up the FS state because
the old FS implementation used static state and only performed cleanup
in the close function, not in the destructor.

Now that the static state is gone, we do not need to close devices
manually anymore.
2018-04-12 22:16:10 +02:00
spycrab 40bb9974f2 Reformat all the things! 2018-04-12 21:28:39 +02:00
Léo Lam 5a7b966b6d IOS: Rewrite FS to use FileSystem
This is the large change in the branch.

This lets us use either the host filesystem or (in the future) a NAND
image exactly the same way, and make sure the IPC emulation code
behaves identically. Less duplicated code.

Note that "FileIO" and "FS" were merged, because it actually doesn't
make a lot of sense to split them: IOS handles requests for both
/dev/fs and files in the same resource manager, and as it turns out,
/dev/fs commands can *also* be sent to non /dev/fs file descriptors!
If we kept /dev/fs and files split, there would be no way to
emulate that correctly. I'm not aware of anything that does that (yet?)
but I think it's important to be correct.
2018-03-31 10:58:37 +02:00
Léo Lam fcfe4e2a26 IOS: Change GetFS() to return a FileSystem
Now that we have a proper filesystem interface, it makes more sense
to return it instead of the emulated IOS device (which isn't
really usable for any purpose other than emulated IPC).
2018-03-31 10:45:44 +02:00
Léo Lam a63aaeecee IOS: Fix "kernel FD table full" error code 2018-03-16 18:51:08 +01:00
Léo Lam d029f2a7b6 IPC: Clear X1 when acknowledging a reply
Hardware tests indicate that IOS clears X1 when it acknowledges
an IPC request.
2018-03-16 18:51:08 +01:00
Léo Lam 35e3775a77 IOS: Remove outdated comment 2018-03-16 18:51:08 +01:00
Léo Lam fa89614b07 IOS: Adjust IPC timing based on hardware tests
This adjusts IOS IPC timing to be closer to actual hardware:

* Emulate the IPC interrupt delay. On a real Wii, from the point of
  view of the PPC, the IPC interrupt appears to fire about 100 TB ticks
  after Y1/Y2 is seen.

* Fix the IPC acknowledgement delay. Dolphin was much, much too fast.

* Fix Device::GetDefaultReply to return more reasonable delays. Again,
  Dolphin was way too fast. We now use a more realistic, average reply
  time for most requests.

  Note: the previous result from https://dolp.in/pr6374 is flawed.
  GetTicketViews definitely takes more than 25µs to reply.
  The reason the reply delay was so low is because an invalid
  parameter was passed to the libogc wrapper, which causes it to
  immediately return an error code (-4100).

* Fix the response delay for various replies that come from the kernel:
  fd table full, unknown resource manager / device, invalid fd,
  unknown IPC command.

Source: https://github.com/leoetlino/hwtests/blob/af320e4/iostest/ipc_timing.cpp
2018-03-16 18:51:07 +01:00
Lioncash 50a476c371 Assert: Uppercase assertion macros
Macros should be all upper-cased. This is also kind of a wart that's
been sticking out for quite a while now (we avoid prefixing
underscores).
2018-03-14 22:03:12 -04:00
Léo Lam 4e014f996b IOS: Fix invalid FD being returned after an open
Fixes a regression introduced by 80b1bf13c2.

The return value for open replies should be overwritten with the new
file descriptor.
2018-02-28 15:56:03 +01:00
Léo Lam 80b1bf13c2 IOS: Change devices to always return IPCCommandResult
This commit changes devices to always return IPCCommandResult rather
than just a return code for Open() and Close() in order to be able
to better emulate reply timing.

In hindsight, I should have considered we would want to emulate
timing when I cleaned up the device interface, but alas.
This rectifies that mistake.
2018-02-27 21:12:07 +01:00
JosJuice b3b58b586c
Merge pull request #5943 from leoetlino/features
IOS: Check for available features when adding devices
2017-11-19 21:43:54 +01:00
Pierre Bourdon 169028e8f5 IOS: Warn on blocking IPC handlers.
This should help us identify them and figure out which ones need to be
fixed.
2017-11-15 15:34:10 +01:00
Léo Lam ff6b3eb9ac [Cleanup] IOS: Clean up the way ARM binaries are loaded
This commit removes the last usage of NANDContentManager in IOS code.

Another cleanup change is that loading ARM (IOS) binaries is now done
by the kernel in the BootIOS syscall, instead of being handled as a
special case in the MIOS code. This is more similar to how console
works and lets us easily extend the same logic to other IOS binaries
in the future, if we decide to actually load them.
2017-10-24 11:41:54 +02:00
Léo Lam 63a52fa707 [Cleanup] IOS/ES: Remove usages of NANDContentManager 2017-10-24 11:41:54 +02:00
Léo Lam e4ea4da782 IOS: Check for available features when adding devices
Prevents resource managers that shouldn't be visible from being exposed
to titles.

This adds a new function to get features for an IOS version, and also
moves the version checks from the modules themselves to VersionInfo.
This hopefully documents some of the differences between IOS better
and should be slightly cleaner than having random version checks.
2017-08-23 15:18:12 +02:00
Léo Lam 24e7b465be IOS: Rename MemoryValues to VersionInfo 2017-08-23 14:44:51 +02:00
Pierre Bourdon 425cf18bf7 USB: Add a stub HIDv5 implementation and use it for IOS59. 2017-08-15 22:35:45 +02:00
Léo Lam ff83b93949 Remove unnecessary WiiRoot inits/shutdowns
* IOS: WiiRoot shutdown was moved to HW.

* Movie: Don't call UpdateWantDeterminism() if we're not running yet,
  because this will automatically be done during the boot process.
  Not doing this will result in two NANDs being created.
2017-06-27 20:43:39 +02:00
Léo Lam f5ef060b21 Initialise WiiRoot once per emulation session
This removes unnecessary initialisations which would cause issues in
determinism mode.
2017-06-27 15:44:17 +02:00