sched: enforce ref-counting on current task/thread pointers

This commit is contained in:
2026-04-01 18:17:05 +01:00
parent 15c2207ab9
commit 512356ac2d
28 changed files with 364 additions and 103 deletions
+13 -6
View File
@@ -95,25 +95,30 @@ kern_status_t ml_thread_config_set(
const void *ptr,
size_t len)
{
struct thread *self = get_current_thread();
kern_status_t status = KERN_OK;
switch (key) {
case THREAD_CFG_FSBASE:
if (len != sizeof(thread->tr_ml.tr_fsbase)) {
return KERN_INVALID_ARGUMENT;
status = KERN_INVALID_ARGUMENT;
break;
}
thread->tr_ml.tr_fsbase = *(virt_addr_t *)ptr;
if (thread == current_thread()) {
if (thread == self) {
wrmsr(MSR_FS_BASE, thread->tr_ml.tr_fsbase);
}
break;
case THREAD_CFG_GSBASE:
if (len != sizeof(thread->tr_ml.tr_gsbase)) {
return KERN_INVALID_ARGUMENT;
status = KERN_INVALID_ARGUMENT;
break;
}
thread->tr_ml.tr_gsbase = *(virt_addr_t *)ptr;
if (thread == current_thread()) {
if (thread == self) {
/* we're in the kernel right now, so the user and kernel
* gs-base registers are swapped. when we return to
* usermode, this value will be swapped back into
@@ -123,8 +128,10 @@ kern_status_t ml_thread_config_set(
break;
default:
return KERN_INVALID_ARGUMENT;
status = KERN_INVALID_ARGUMENT;
break;
}
return KERN_OK;
put_current_thread(self);
return status;
}