Andreas Kling
feebe3f42e
UserspaceEmulator: Add partial support for the SHLD/SHRD instructions
...
We don't support all the addressing modes yet, but it won't be very
hard to add the rest of them when needed.
2020-07-15 18:47:45 +02:00
Andreas Kling
2da44dba44
UserspaceEmulator: Add support for shared buffers (shbuf)
...
We track these separately from regular mmap() regions, as they have
slightly different behaviors.
2020-07-15 18:47:45 +02:00
Andreas Kling
0ce4d3e942
UserspaceEmulator: Dump backtrace on FPU instruction
2020-07-15 18:47:45 +02:00
Andreas Kling
76b2a2789b
UserspaceEmulator: Implement MUL_RM32
2020-07-15 18:47:45 +02:00
Andreas Kling
029fe56d69
UserspaceEmulator: Implement the 32-bit BSWAP instruction :^)
2020-07-15 18:47:45 +02:00
Andreas Kling
339f12e8a2
UserspaceEmulator: Implement an assortment of system calls
...
Here goes mkdir(), unlink(), socket(), getsockopt(), fchmod()
bind(), connect(), listen(), select() and recvfrom().
They're not perfect but they seem to work. :^)
2020-07-15 18:47:45 +02:00
Andreas Kling
0781868092
UserspaceEmulator: Implement IDIV_RM32
2020-07-15 13:42:15 +02:00
Andreas Kling
400a252720
UserspaceEmulator: Implement the CBW/CDQ/CWD/CWDE instructions
2020-07-15 13:42:15 +02:00
Andreas Kling
6a926a8c61
LibX86+UserspaceEmulator: Don't store a32 in MemoryOrRegisterReference
...
The a32 bit tells us whether a memory address is 32-bit or not.
We already have this information in Instruction, so just plumb that
around instead of double-caching the bit.
2020-07-15 13:42:15 +02:00
Sergey Bugaev
e12b591509
UserspaceEmulator: Implement virt$pipe()
2020-07-15 13:41:46 +02:00
thankyouverycool
b2783a234a
LibGUI: Use enum for TextEditor modes & add new DisplayOnly mode
...
Adds a new, more restrictive read-only state to TextEditor which
forbids copying, selecting, editor cursors, and context menus.
Provides a unique appearance on focus which accomodates ComboBox
widgets. All TextEditor modes are now accessed by enum and
set_mode() which sets the editor to Editable, ReadOnly or
DisplayOnly. Updates applications still using set_readonly().
2020-07-15 13:19:44 +02:00
Andreas Kling
ef84865c8c
LibX86+UserspaceEmulator: Devirtualize and inline more instruction code
...
Use some template hacks to force GCC to inline more of the instruction
decoding stuff into the UserspaceEmulator main execution loop.
This is my last optimization for today, and we've gone from ~60 seconds
when running "UserspaceEmulator UserspaceEmulator id" to ~8 seconds :^)
2020-07-13 21:00:51 +02:00
Andreas Kling
f608b9d89a
UserspaceEmulator: Mark some generic instructions ALWAYS_INLINE :^)
2020-07-13 20:47:45 +02:00
Andreas Kling
2f81c20002
UserspaceEmulator: Move the SoftCPU stream virtuals to the header
...
They don't actually get inlined yet, but at least this devirtualizes
them which is nice.
2020-07-13 20:41:48 +02:00
Andreas Kling
a27473cbc2
UserspaceEmulator+LibX86: Turn on -O3 optimization for emulation code
...
Since this code is performance-sensitive, let's have the compiler do
whatever it can to help us with the most important files.
This yields a ~8% speedup.
2020-07-13 20:23:00 +02:00
Andreas Kling
8656835935
UserspaceEmulator: Add a very simple instruction fetch cache
...
To avoid MMU region lookup on every single instruction fetch, we now
cache a raw pointer to the current instruction. This gets automatically
invalidated when we jump somewhere, but as long as we're executing
sequentially, instruction fetches will hit the cache and bypass all
the region lookup stuff.
This is about a ~2x speedup. :^)
2020-07-13 20:14:14 +02:00
Andreas Kling
a83fe7f82d
UserspaceEmulator: Add the POPFD instruction
...
I'm not sure the mask I'm using here is completely correct, but it's
not terribly important since we're a userspace-only emulator anyway.
2020-07-13 13:50:22 +02:00
Andreas Kling
dba6f9b24b
UserspaceEmulator: Add the NOT instruction (with bonus: NOP!)
2020-07-13 13:50:22 +02:00
Andreas Kling
5ecbfd8451
UserspaceEmulator: Add the STC/CLC and STD/CLD instructions
2020-07-13 13:50:22 +02:00
Andreas Kling
9f293054e8
UserspaceEmulator: Implement the ADC instruction
2020-07-13 13:50:22 +02:00
Andreas Kling
6230c60296
UserspaceEmulator: Make SBB actually respect the SoftCPU carry flag
...
We were forgetting to set the host CPU's carry flag before executing
the SBB instruction. This made the result a bit unpredictable. :^)
2020-07-13 13:50:22 +02:00
Andreas Kling
a9f92e5d75
UserspaceEmulator: Remove an unnecessary step in some instructions
...
We don't need to move the result of shifts around like this, we can
just use inline assembly outputs to make it end up in the right place.
2020-07-13 13:50:22 +02:00
Andreas Kling
80d3306840
UserspaceEmulator: Fix wrong ESI/EDI step sizes in MOVSW and MOVSD
2020-07-13 13:50:22 +02:00
Andreas Kling
e0580e2975
UserspaceEmulator: Add some more syscalls
...
We can now unmap mapped memory, among other things. This is all very
ad-hoc as I'm trying to run UserspaceEmulator inside itself. :^)
2020-07-13 13:50:22 +02:00
Andreas Kling
9b6464010f
UserspaceEmulator: Add basic support for memory-mapped files
...
MmapRegion now supports using an mmap'ed file descriptor as backing.
2020-07-13 13:50:22 +02:00
Andreas Kling
63d3f5d19b
UserspaceEmulator: Implement the PUSHFD instruction
2020-07-13 13:50:22 +02:00
Andreas Kling
f6ad5edab0
UserspaceEmulator: Make mmap'ed memory track read/write protection
...
Here's the first time we get a taste of better information than the
real hardware can give us: unlike x86 CPUs, we can actually support
write-only memory, so now we do!
While this isn't immediately useful, it's still pretty cool. :^)
2020-07-13 13:50:22 +02:00
Andreas Kling
27c1690504
UserspaceEmulator: Pass arguments through to emulated process
...
Ultimately we'll want to support passing some options to the emulator
as well, but for now just pass all arguments (except argv[0] of course)
through to the emulated process.
This is still not perfect, but slightly better than what we had before.
2020-07-13 13:50:22 +02:00
Andreas Kling
3d42b85969
UserspaceEmulator: Move SimpleRegion to its own files
2020-07-13 13:50:22 +02:00
Andreas Kling
4d3787ae33
UserspaceEmulator: Support the fstat() and get_process_name() syscalls
...
For now, we just pretend that the process name is "EMULATED". We can
probably do better though. :^)
2020-07-13 13:50:22 +02:00
Andreas Kling
617655db0d
UserspaceEmulator: Move exit() syscall logging to debug output
...
We want the emulated program to appear without noise in the terminal.
2020-07-12 21:37:54 +02:00
Andreas Kling
1d32c66dde
UserspaceEmulator: Put some syscall logging behind DEBUG_SPAM
2020-07-12 21:37:54 +02:00
Andreas Kling
95a42efc62
UserspaceEmulator: Implement enough syscalls to get /bin/id running :^)
2020-07-12 21:37:54 +02:00
Andreas Kling
1b196df4c4
UserspaceEmulator: Implement/stub out various syscalls
...
Moving forward on getting /bin/id to run inside the emulator. :^)
2020-07-12 21:37:54 +02:00
Andreas Kling
56d3a949e6
UserspaceEmulator: Disable per-instruction trace dumps for now
...
With tracing turned on, it's just too slow when doing big operations
like initializing malloc freelists.
2020-07-12 21:37:54 +02:00
Andreas Kling
079021a607
UserspaceEmulator: Put the executable name in argv[0] :^)
...
The emulated program can now find its own name in argv[0]. Very cool!
2020-07-12 21:37:54 +02:00
Andreas Kling
ddf7b817df
UserspaceEmulator: Add Emulator::dump_backtrace()
...
This gives you a nice, symbolicated backtrace at the current EIP. :^)
2020-07-12 21:37:54 +02:00
Andreas Kling
584923445c
UserspaceEmulator: "Add" a couple of syscalls
...
This patch adds gettid() and stubs out pledge() and unveil() for now.
2020-07-12 21:37:54 +02:00
Andreas Kling
e461e3c8b0
UserspaceEmulator: Fix missing sign extension in PUSH_imm8
2020-07-12 17:44:14 +02:00
Andreas Kling
94f07660e9
UserspaceEmulator: Add some convenient SoftMMU APIs for copying data
...
We'll soon want to copy data in and out of the SoftMMU memory space.
2020-07-12 17:42:57 +02:00
Andreas Kling
274ac3c628
UserspaceEmulator: Implement the XADD instruction
2020-07-12 15:35:01 +02:00
Andreas Kling
04695957e2
UserspaceEmulator: Implement the MOVSX instruction
2020-07-12 15:33:29 +02:00
Andreas Kling
8940916232
UserspaceEmulator: Implement JMP_RM32
2020-07-12 14:54:30 +02:00
Andreas Kling
a424208399
UserspaceEmulator: Implement DIV_RM32
...
Not using inline assembly for this one since flags are undefined after
a DIV instruction anyway.
2020-07-12 14:53:19 +02:00
Andreas Kling
062e2f8614
UserspaceEmulator: Implement the XCHG instruction
2020-07-12 14:45:46 +02:00
Andreas Kling
536ca0f8c9
UserspaceEmulator: Implement some more MOV variants
2020-07-12 14:45:35 +02:00
Andreas Kling
2d44f4526a
UserspaceEmulator: Implement MOVSB/MOVSW/MOVSD
2020-07-12 14:45:02 +02:00
Andreas Kling
ed57efff4f
UserspaceEmulator: Implement the CMPXCHG instruction
2020-07-12 14:43:30 +02:00
Andreas Kling
6ec0a63af1
UserspaceEmulator: Fix broken MOV_RM8_reg8
2020-07-12 14:42:15 +02:00
Andreas Kling
bdf72a7c7a
UserspaceEmulator: Implement JMP_NEAR_imm
...
This is a full-width relative jump, when the 8-bit immediate variant
isn't large enough.
2020-07-12 01:36:45 +02:00