[prev in list] [next in list] [prev in thread] [next in thread]
List: haiku-commits
Subject: [haiku-commits] Change in haiku[master]: kernel: add ability to set GS segmant base from userland
From: Gerrit <review () review ! haiku-os ! org>
Date: 2021-12-30 23:03:15
Message-ID: b2a344a788be6a84a4b6c928055257c537a942a1-HTML () review ! haiku-os ! org
[Download RAW message or body]
From X512 <danger_mail@list.ru>:
X512 has uploaded this change for review. ( \
https://review.haiku-os.org/c/haiku/+/4839 )
Change subject: kernel: add ability to set GS segmant base from userland
......................................................................
kernel: add ability to set GS segmant base from userland
Needed for Wine.
Change-Id: I13f6a5802fce04fd2ebb4cc01ecd2f12c90830db
---
M headers/private/kernel/arch/x86/arch_thread_types.h
M src/system/kernel/arch/x86/64/thread.cpp
2 files changed, 26 insertions(+), 0 deletions(-)
git pull ssh://git.haiku-os.org:22/haiku refs/changes/39/4839/1
diff --git a/headers/private/kernel/arch/x86/arch_thread_types.h \
b/headers/private/kernel/arch/x86/arch_thread_types.h index 5f124bd..d92b43d 100644
--- a/headers/private/kernel/arch/x86/arch_thread_types.h
+++ b/headers/private/kernel/arch/x86/arch_thread_types.h
@@ -48,6 +48,8 @@
uintptr_t* current_stack;
uintptr_t instruction_pointer;
+
+ uint64 gs_base;
#else
struct farcall current_stack;
struct farcall interrupt_stack;
diff --git a/src/system/kernel/arch/x86/64/thread.cpp \
b/src/system/kernel/arch/x86/64/thread.cpp index 25df19b..79ce4a1 100644
--- a/src/system/kernel/arch/x86/64/thread.cpp
+++ b/src/system/kernel/arch/x86/64/thread.cpp
@@ -16,6 +16,7 @@
#include <commpage.h>
#include <cpu.h>
#include <debug.h>
+#include <generic_syscall.h>
#include <kernel.h>
#include <ksignal.h>
#include <int.h>
@@ -96,6 +97,7 @@
{
// Set FS segment base address to the TLS segment.
x86_write_msr(IA32_MSR_FS_BASE, thread->user_local_storage);
+ x86_write_msr(IA32_MSR_GS_BASE, thread->arch_info.gs_base);
}
@@ -135,6 +137,25 @@
}
+enum {
+ THREAD_SET_GS_BASE = 1,
+};
+
+
+static status_t
+arch_thread_control(const char* subsystem, uint32 function, void* buffer,
+ size_t bufferSize)
+{
+ switch (function) {
+ case THREAD_SET_GS_BASE: {
+ Thread* thread = thread_get_current_thread();
+ thread->arch_info.gs_base = (addr_t)buffer;
+ return B_OK;
+ }
+ }
+ return B_BAD_HANDLER;
+}
+
// #pragma mark -
@@ -172,6 +193,9 @@
"fxsaveq %0"
:: "m" (sInitialState.fpu_state));
}
+
+ register_generic_syscall("thread", arch_thread_control, 1, 0);
+
return B_OK;
}
--
To view, visit https://review.haiku-os.org/c/haiku/+/4839
To unsubscribe, or for help writing mail filters, visit \
https://review.haiku-os.org/settings
Gerrit-Project: haiku
Gerrit-Branch: master
Gerrit-Change-Id: I13f6a5802fce04fd2ebb4cc01ecd2f12c90830db
Gerrit-Change-Number: 4839
Gerrit-PatchSet: 1
Gerrit-Owner: X512 <danger_mail@list.ru>
Gerrit-MessageType: newchange
[Attachment #3 (text/html)]
<p>X512 has uploaded this change for <strong>review</strong>.</p><p><a \
href="https://review.haiku-os.org/c/haiku/+/4839">View Change</a></p><pre \
style="font-family: monospace,monospace; white-space: pre-wrap;">kernel: add ability \
to set GS segmant base from userland<br><br>Needed for Wine.<br><br>Change-Id: \
I13f6a5802fce04fd2ebb4cc01ecd2f12c90830db<br>---<br>M \
headers/private/kernel/arch/x86/arch_thread_types.h<br>M \
src/system/kernel/arch/x86/64/thread.cpp<br>2 files changed, 26 insertions(+), 0 \
deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: \
pre-wrap;">git pull ssh://git.haiku-os.org:22/haiku refs/changes/39/4839/1</pre><pre \
style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git \
a/headers/private/kernel/arch/x86/arch_thread_types.h \
b/headers/private/kernel/arch/x86/arch_thread_types.h</span><br><span>index \
5f124bd..d92b43d 100644</span><br><span>--- \
a/headers/private/kernel/arch/x86/arch_thread_types.h</span><br><span>+++ \
b/headers/private/kernel/arch/x86/arch_thread_types.h</span><br><span>@@ -48,6 +48,8 \
@@</span><br><span> </span><br><span> uintptr_t* current_stack;</span><br><span> \
uintptr_t instruction_pointer;</span><br><span style="color: hsl(120, 100%, \
40%);">+</span><br><span style="color: hsl(120, 100%, \
40%);">+ uint64 gs_base;</span><br><span> #else</span><br><span> struct \
farcall current_stack;</span><br><span> struct \
farcall interrupt_stack;</span><br><span>diff --git \
a/src/system/kernel/arch/x86/64/thread.cpp \
b/src/system/kernel/arch/x86/64/thread.cpp</span><br><span>index 25df19b..79ce4a1 \
100644</span><br><span>--- \
a/src/system/kernel/arch/x86/64/thread.cpp</span><br><span>+++ \
b/src/system/kernel/arch/x86/64/thread.cpp</span><br><span>@@ -16,6 +16,7 \
@@</span><br><span> #include <commpage.h></span><br><span> #include \
<cpu.h></span><br><span> #include <debug.h></span><br><span style="color: \
hsl(120, 100%, 40%);">+#include <generic_syscall.h></span><br><span> #include \
<kernel.h></span><br><span> #include <ksignal.h></span><br><span> \
#include <int.h></span><br><span>@@ -96,6 +97,7 @@</span><br><span> \
{</span><br><span> // Set FS segment base address to the TLS \
segment.</span><br><span> x86_write_msr(IA32_MSR_FS_BASE, \
thread->user_local_storage);</span><br><span style="color: hsl(120, 100%, \
40%);">+ x86_write_msr(IA32_MSR_GS_BASE, \
thread->arch_info.gs_base);</span><br><span> }</span><br><span> </span><br><span> \
</span><br><span>@@ -135,6 +137,25 @@</span><br><span> }</span><br><span> \
</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+enum \
{</span><br><span style="color: hsl(120, 100%, 40%);">+ THREAD_SET_GS_BASE = \
1,</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span \
style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, \
40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static \
status_t</span><br><span style="color: hsl(120, 100%, \
40%);">+arch_thread_control(const char* subsystem, uint32 function, void* \
buffer,</span><br><span style="color: hsl(120, 100%, 40%);">+ size_t \
bufferSize)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span \
style="color: hsl(120, 100%, 40%);">+ switch (function) {</span><br><span \
style="color: hsl(120, 100%, 40%);">+ case THREAD_SET_GS_BASE: {</span><br><span \
style="color: hsl(120, 100%, 40%);">+ Thread* thread = \
thread_get_current_thread();</span><br><span style="color: hsl(120, 100%, \
40%);">+ thread->arch_info.gs_base = (addr_t)buffer;</span><br><span \
style="color: hsl(120, 100%, 40%);">+ return B_OK;</span><br><span style="color: \
hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, \
40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ return \
B_BAD_HANDLER;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span \
style="color: hsl(120, 100%, 40%);">+</span><br><span> // #pragma mark \
-</span><br><span> </span><br><span> </span><br><span>@@ -172,6 +193,9 \
@@</span><br><span> "fxsaveq %0"</span><br><span> :: "m" \
(sInitialState.fpu_state));</span><br><span> }</span><br><span style="color: \
hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, \
40%);">+ register_generic_syscall("thread", arch_thread_control, 1, \
0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> return \
B_OK;</span><br><span> }</span><br><span> </span><br><span></span><br></pre><p>To \
view, visit <a href="https://review.haiku-os.org/c/haiku/+/4839">change 4839</a>. To \
unsubscribe, or for help writing mail filters, visit <a \
href="https://review.haiku-os.org/settings">settings</a>.</p><div itemscope \
itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" \
itemtype="http://schema.org/ViewAction"><link itemprop="url" \
href="https://review.haiku-os.org/c/haiku/+/4839"/><meta itemprop="name" \
content="View Change"/></div></div>
<div style="display:none"> Gerrit-Project: haiku </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: \
I13f6a5802fce04fd2ebb4cc01ecd2f12c90830db </div> <div style="display:none"> \
Gerrit-Change-Number: 4839 </div> <div style="display:none"> Gerrit-PatchSet: 1 \
</div> <div style="display:none"> Gerrit-Owner: X512 <danger_mail@list.ru> \
</div> <div style="display:none"> Gerrit-MessageType: newchange </div>
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic