mirror of
https://github.com/darlinghq/darling-newlkm.git
synced 2024-12-02 09:06:38 +00:00
8f105c7be5
All the files that were building with the previous version of XNU are now building again (with Clang), however, the module does not link yet (due to missing symbols; *lots* of them). A lot of them are probably new additions to XNU, but some of them are probably from me not knowing the `ifdef` certain things that should be. Also, I completely overhauled the Makefile to make it simpler to manage settings and flags across files, folders, modules, and Linux/KBuild versions. I didn't add this feature (because I don't need it yet), but it can be easily extended to easily allow per-compiler flags Full list of all missing symbols reported by `MODPOST`: task_is_driver thread_get_state_to_user machine_exception catch_mach_exception_raise_state_identity turnstile_has_waiters mach_vm_allocate_kernel processor_start_from_user catch_mach_exception_raise_state task_violated_guard hw_atomic_test_and_set32 task_is_importance_donor catch_mach_exception_raise ipc_importance_task_reference work_interval_port_notify random_bool_init os_ref_retain_try_internal mach_zone_info_for_zone processor_exit_from_user pqueue_pair_meld mach_vm_page_range_query turnstile_complete mach_vm_wire_external mach_vm_allocate_external vm_allocate_kernel ux_handler_init uext_server turnstile_waitq_add_thread_priority_queue thread_depress_abort_from_user turnstile_deallocate _Block_object_assign turnstile_cleanup turnstile_kernel_update_inheritor_on_wake_locked _pthread_priority_normalize_for_ipc filt_ipc_kqueue_turnstile lck_spin_assert IOTaskHasEntitlement thread_get_requested_qos task_watchport_elem_deallocate os_ref_init_count_internal lck_mtx_lock_spin_always turnstile_update_inheritor_complete task_inspect thread_bootstrap_return thread_setstatus_from_user turnstile_recompute_priority_locked mach_vm_remap_external zone_require thread_getstatus_to_user turnstile_hash_bucket_unlock _NSConcreteGlobalBlock filt_machport_kqueue_has_turnstile mach_continuous_time ipc_importance_init turnstile_update_inheritor_locked turnstile_alloc ipc_importance_send ipc_importance_thread_call_init bank_get_bank_ledger_thread_group_and_persona turnstile_hash_bucket_lock filt_machport_turnstile_prepare_lazily turnstile_deallocate_safe os_ref_release_barrier_internal turnstile_reference vm_map_wire_kernel thread_deallocate_safe turnstile_stats_update thread_set_pending_block_hint task_info_from_user thread_inspect_deallocate catch_exc_subsystem ux_handler_stop lck_mtx_assert mach_vm_map_external filt_machport_stash_port ipc_importance_task_hold_internal_assertion lck_spin_lock_grp _Block_object_dispose ipc_importance_check_circularity task_restartable_subsystem ipc_importance_task_drop_internal_assertion random_bool_gen_bits turnstile_update_inheritor lck_spin_try_lock_grp ipc_importance_task_release kdp_lck_spin_is_acquired ipc_importance_receive os_ref_retain_internal task_inspect_deallocate _NSConcreteStackBlock task_get_exc_guard_behavior pid_from_task sched_thread_unpromote_reason memory_entry_subsystem turnstile_prepare act_get_state_to_user sched_thread_promote_reason task_set_exc_guard_behavior ipc_importance_task_is_any_receiver_type knote_vanish thread_user_promotion_qos_for_pri
100 lines
2.4 KiB
C
100 lines
2.4 KiB
C
/*
|
|
* Darling Mach Linux Kernel Module
|
|
* Copyright (C) 2015-2018 Lubos Dolezel
|
|
*
|
|
* 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
*/
|
|
|
|
#include "pthread_kill.h"
|
|
#include <asm/siginfo.h>
|
|
#include <linux/uaccess.h>
|
|
#include <linux/version.h>
|
|
|
|
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,11,0)
|
|
#include <linux/signal_types.h>
|
|
#else
|
|
#include <linux/signal.h>
|
|
#endif
|
|
|
|
#include <asm/siginfo.h>
|
|
#include <linux/rcupdate.h>
|
|
#include <linux/sched.h>
|
|
#include <duct/duct.h>
|
|
#include <duct/duct_pre_xnu.h>
|
|
#include <osfmk/kern/ipc_tt.h>
|
|
#include <duct/duct_post_xnu.h>
|
|
|
|
#define current linux_current
|
|
|
|
int pthread_kill_trap(task_t task,
|
|
struct pthread_kill_args* in_args)
|
|
{
|
|
struct pthread_kill_args args;
|
|
int ret;
|
|
pid_t tid;
|
|
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,20,0)
|
|
struct kernel_siginfo info;
|
|
#else
|
|
struct siginfo info;
|
|
#endif
|
|
struct task_struct *t;
|
|
thread_t thread;
|
|
|
|
if (copy_from_user(&args, in_args, sizeof(args)))
|
|
return -LINUX_EFAULT;
|
|
|
|
thread = port_name_to_thread(args.thread_port, PORT_TO_THREAD_NONE);
|
|
|
|
if (thread == THREAD_NULL || !thread->linux_task)
|
|
return -LINUX_ESRCH;
|
|
|
|
rcu_read_lock();
|
|
t = pid_task(find_pid_ns(thread->linux_task->pid, &init_pid_ns), PIDTYPE_PID);
|
|
|
|
if (t == NULL)
|
|
{
|
|
rcu_read_unlock();
|
|
ret = -LINUX_ESRCH;
|
|
goto err;
|
|
}
|
|
|
|
if (args.sig > 0)
|
|
{
|
|
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,16,0)
|
|
clear_siginfo(&info);
|
|
#else
|
|
info.si_errno = 0;
|
|
#endif
|
|
info.si_signo = args.sig;
|
|
info.si_code = SI_TKILL;
|
|
info.linux_si_pid = task_tgid_vnr(current);
|
|
info.linux_si_uid = from_kuid_munged(current_user_ns(), current_uid());
|
|
|
|
ret = send_sig_info(args.sig, &info, t);
|
|
}
|
|
else if (args.sig < 0)
|
|
ret = -LINUX_EINVAL;
|
|
else
|
|
ret = 0;
|
|
|
|
rcu_read_unlock();
|
|
|
|
err:
|
|
thread_deallocate(thread);
|
|
|
|
return ret;
|
|
}
|
|
|