Commit Graph

160 Commits

Author SHA1 Message Date
Ray Redondo
58b0391a2c
update duct-tape/src/memory.c
Because I don't understand this and someone else does

Co-authored-by: Ariel Abreu <facekapow@outlook.com>
2022-06-18 20:44:33 -05:00
Ariel Abreu
a0115601ee
Call dtape_timer_fired within a microthread
This function calls other duct-taped functions that might need to wait
for a bit, so it needs to run in a microthread so it can do so.
2022-06-18 17:22:48 -04:00
Ariel Abreu
f2ad6c2cc2
Fix duct-tape timer scheduling
We were previously always updating the timer deadline. This meant that,
when a later deadline than the current one came along, we would update
the deadline to the later one. In effect, we were scheduling a timer for
the latest deadline available rather than the earliest.

The fix involves keeping track of the current deadline and not updating
it if the new deadline is later than the current one. There is an option
to override this behavior, however, because sometimes the timer_call code
changes the deadline on us to a later time and we *do* want to update it
when it tells us to do so explicitly. For example, the deadline returned
by timer_queue_expire is definitive: that's definitely the next deadline
we want. The deadline passed to timer_queue_assign, on the other hand,
is merely is a suggestion.
2022-06-18 16:51:59 -04:00
Ray Redondo
b37026af03 add mach_vm_msync 2022-06-17 23:18:21 -05:00
Ariel Abreu
814434f139
GetExecutablePath: Write the path out to the correct process
We were writing out the path to the target process (i.e. the one we're
looking up), but we should instead write it out to the process who made
the call.
2022-05-19 15:21:32 -04:00
Ariel Abreu
2d64a44c85
Schedule interrupts after pending calls if necessary
This resolves a race condition where we receive a call and then
immediately receive an interrupt while that call is still pending.
The new behavior is to go ahead and process the pending call, but we
trigger interrupt processing as soon as the call suspends.
2022-05-19 15:20:23 -04:00
Ariel Abreu
4f05ef945b
Defer kqchannel notifications until after read replies are sent
See DarlingServer::Kqchan::MachPort::_read() for why this is necessary.

This fixes crashes in libkqueue due to out-of-order kqchannel messages,
mainly visible in aslmanager.
2022-05-14 17:06:21 -04:00
Ariel Abreu
a4afa0cd29
Increase core limits on server startup
For some reason, the core limit is always set to 0 when the server
starts up, regardless of what the parent shell/program has it set to.
2022-05-14 16:57:42 -04:00
Ariel Abreu
2ba5a41c4e
Properly implement knote_vanish
This fixes some crashes with syslogd because the mqueue was vanishing
and calling knote_vanish, indicating its klist was going to be emptied.
However, since we weren't storing this flag in the knote,
filt_machportdetach thought the knote was still attached and tried to
detach it, causing a NULL pointer access.
2022-05-14 01:38:22 -04:00
Ariel Abreu
51f08430c9
Remove capabilities and libcap dependency
Together with the corresponding changes in mldr, darlingserver no longer
requires capabilities while running! The next step towards making
Darling completely unprivileged would be to remove SUID from the main
Darling binary, but that's a task for some other time.

I originally started doing this to see if some issues I was seeing with
LLDB were related to the capabilities in mldr, but it seems they're
unrelated.
2022-05-10 21:08:07 -04:00
Ariel Abreu
fdc3420249
Make sure processes stay alive until kqchannels die 2022-05-10 21:02:07 -04:00
Ariel Abreu
a46079444c
Report correct arch values in host_info
We're actually supposed to report plain x86, even on x86_64 processors.
2022-05-10 10:15:57 -04:00
Ariel Abreu
9123bad915
Handle thread and process death asynchronously
What this means is that we no longer release and destroy Thread and
Process instances when the threads and processes they manage die.
Instead, we keep them alive to perform some cleanup (like finishing
active calls).

This should fix the duct-tape panic where threads and tasks are still
referenced at death.

Best of all, there don't seem to be any leaks with this approach: for
each `process dying` or `thread dying` message in the log, there's a
`process being destroyed` or `thread being destroyed` message later
on. This means we're not leaking any processes or threads.
2022-04-08 10:38:36 -04:00
Ariel Abreu
7d6f0ed991
dtape: Forgot to unlock shared entry lock in special case for LLDB 2022-04-08 10:31:52 -04:00
Ariel Abreu
82892d3049
Move interrupter_enter processing to Thread class
This call needs to access lots of private thread members, so it's better
to provide a single private helper that handles the call in the Thread
class rather than have it all in a Call.
2022-04-08 10:27:53 -04:00
Ariel Abreu
80ab579ca2
Implement kernel runner queue scaling
This allows kernel runner threads to be created as necessary to process
the work that comes in through `kernelAsync` and `kernelSync`.

There's currently a hardcoded max of 10 permanent kernel runners.
However, if the workload is too much, temporary runners can be spawned;
each temporary worker processes a single work item and then exits. There
is no limit on the number of temporary workers that can be spawned.
2022-04-08 10:24:45 -04:00
Ariel Abreu
e17bdbb1e7
Merge pull request #1 from trungnt2910/main
feat: Manage executable path in darlingserver
2022-04-05 12:52:50 -04:00
Trung Nguyen
226610318c
chore: Address comments 2022-04-05 12:43:27 +07:00
Trung Nguyen
c5a32023f3
feat: Manage executable path in darlingserver 2022-04-05 09:25:23 +07:00
Ariel Abreu
761a292f11
Fix (rare) deadlock with process kqchannels 2022-04-04 17:39:40 -04:00
Ariel Abreu
7e1dd74cd2
Implement memory sharing (in mach_vm_remap)
This commit allows Darling processes to convert private memory in other
Darling processes into shared memory that they can access. This is
necessary, e.g. for LLDB.
2022-04-01 02:21:32 -04:00
Ariel Abreu
be203fd569
Allow threads to perform S2C calls at any time
This is possible now because we can signal threads with a real-time
signal that libsystem_kernel handles.
2022-04-01 02:11:17 -04:00
Ariel Abreu
b4fccbd6dd
Thread: Add mapFile call 2022-04-01 02:04:55 -04:00
Ariel Abreu
fe6df7af56
Add mprotect S2C call 2022-04-01 01:56:35 -04:00
Ariel Abreu
5b0bf0ff13
dtape: Safely stub thread_abort_safely 2022-04-01 01:51:31 -04:00
Ariel Abreu
e46c682d50
Add some dyld info debug messages and fix a typo in TASK_DYLD_INFO
I had forgotten to add `return KERN_SUCCESS`, so it was continuing into
TASK_VM_INFO and presumably failing with KERN_INVALID_ARGUMENT.
2022-03-28 14:19:14 -04:00
Ariel Abreu
f099fe3390
Fix mach_vm_region{,_recurse} to use the target task
They were using the current task, but that's not always the case.
LLDB, for example, calls mach_vm_region_recurse with the map of the task
it's debugging.
2022-03-28 14:17:48 -04:00
Ariel Abreu
8a28cb0dde
Fix Process::memoryRegionInfo and change how it returns info
std::stoul is base 10 by default, so we were trying to process hex
values as decimal values(producing incorrect values, as expected).

Also, memoryRegionInfo now returns a structure with the info rather than
having everything passed in as a reference, just like memoryInfo was
recently changed to do as well. This should make easier to add more info
fields later.
2022-03-28 14:16:00 -04:00
Ariel Abreu
71a247e51e
Add support for nested interrupts 2022-03-27 14:50:23 -04:00
Ariel Abreu
f5b97b9192
Implement mach_vm_region_recurse
This is only a subset of its actual behavior, but this is all that the
LKM supported and everything (read: LLDB) seemed to run fine with that,
so that should be enough for us as well.
2022-03-25 01:09:37 -04:00
Ariel Abreu
fd71ed2bfa
Implement task and thread suspension and resumption
These should be the final missing bits for sigexc from the LKM
2022-03-24 14:04:56 -04:00
Ariel Abreu
d5aa92fb5c
Add a thread_suspended call 2022-03-24 14:03:35 -04:00
Ariel Abreu
94c0528f72
Add a ptrace_thupdate call 2022-03-24 14:02:37 -04:00
Ariel Abreu
337935e64c
Add a ptrace_sigexc call 2022-03-24 14:02:08 -04:00
Ariel Abreu
be9afe1fa5
Add a tid_for_thread call 2022-03-24 13:58:45 -04:00
Ariel Abreu
a4364df97b
Add a stop_after_exec call 2022-03-24 13:58:18 -04:00
Ariel Abreu
f1ba799ba9
Add a set_dyld_info call 2022-03-24 13:57:07 -04:00
Ariel Abreu
8bb81313a0
Add a set_tracer call (and implement get_tracer) 2022-03-24 13:47:32 -04:00
Ariel Abreu
2b0ae0e30b
Turn DSERVER_SINGLE_THREADED on by default
This is just until I can work out the bugs specific to multi-threaded darlingserver.
2022-03-24 13:44:20 -04:00
Ariel Abreu
ffcd17e5a7
Implement TASK_VM_INFO 2022-03-24 13:42:04 -04:00
Ariel Abreu
69c5a1d7ed
Add a method and a hook to send a signal to a thread 2022-03-24 13:40:27 -04:00
Ariel Abreu
be6e1921d2
dtape: Add a basic condition variable implementation 2022-03-24 13:35:06 -04:00
Ariel Abreu
df94cff467
psynch: Log to the server log file rather than stdout 2022-03-24 13:06:37 -04:00
Ariel Abreu
11fc38e931
thread_block_parameter: Handle continuation when not waiting
This is actually a valid state for `thread_block_parameter` to enter.
If the caller gave us a continuation but we were unable to wait, we
should simply invoke the continuation with the wait result, much like
we would if we were returning the result.
2022-03-24 13:05:50 -04:00
Ariel Abreu
a82cff6069
RPC changes for better interrupt/signal handling 2022-03-21 00:29:29 -04:00
Ariel Abreu
aee29954e2
Minor fixes for interrupt/signal handling 2022-03-21 00:27:28 -04:00
Ariel Abreu
bf2dce949a
Mount procfs in child
procfs can only be mounted once we're in the container's PID namespace;
otherwise, it shows the old PID namespace.
2022-03-21 00:23:46 -04:00
Ariel Abreu
42f778c9d0
thread_policy and thread_policy_set are actually safe to stub 2022-03-21 00:20:34 -04:00
Ariel Abreu
e450df2d9d
dtape: Stub vm_stats in a less crash-y way 2022-03-21 00:20:09 -04:00
Ariel Abreu
127442f146
dtape: host_info: Fix how RAM size is reported
`basic_info->memory_size` is 32-bit; using it for `basic_info->max_mem`
truncates the actual value.
2022-03-21 00:19:24 -04:00