[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 &lt;commpage.h&gt;</span><br><span> #include \
&lt;cpu.h&gt;</span><br><span> #include &lt;debug.h&gt;</span><br><span style="color: \
hsl(120, 100%, 40%);">+#include &lt;generic_syscall.h&gt;</span><br><span> #include \
&lt;kernel.h&gt;</span><br><span> #include &lt;ksignal.h&gt;</span><br><span> \
#include &lt;int.h&gt;</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-&gt;user_local_storage);</span><br><span style="color: hsl(120, 100%, \
40%);">+	x86_write_msr(IA32_MSR_GS_BASE, \
thread-&gt;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-&gt;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> 			&quot;fxsaveq %0&quot;</span><br><span> 			:: &quot;m&quot; \
(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(&quot;thread&quot;, 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 &lt;danger_mail@list.ru&gt; \
</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