Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-cw
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-cw
Commits
e07d536d
Commit
e07d536d
authored
Nov 20, 2023
by
Alexandre Julliard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
ntdll: Add a syscall_cfa member to the ARM64 syscall frame.
parent
df181df8
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
74 additions
and
17 deletions
+74
-17
signal_arm64.c
dlls/ntdll/unix/signal_arm64.c
+74
-17
No files found.
dlls/ntdll/unix/signal_arm64.c
View file @
e07d536d
...
...
@@ -137,7 +137,7 @@ struct syscall_frame
ULONG
cpsr
;
/* 108 */
ULONG
restore_flags
;
/* 10c */
struct
syscall_frame
*
prev_frame
;
/* 110 */
void
*
unused
;
/* 118 */
void
*
syscall_cfa
;
/* 118 */
ULONG64
align
;
/* 120 */
ULONG
fpcr
;
/* 128 */
ULONG
fpsr
;
/* 12c */
...
...
@@ -1111,12 +1111,26 @@ extern NTSTATUS call_user_mode_callback( ULONG id, void *args, ULONG len, void *
ULONG
*
ret_len
,
void
*
func
,
TEB
*
teb
);
__ASM_GLOBAL_FUNC
(
call_user_mode_callback
,
"stp x29, x30, [sp,#-0xc0]!
\n\t
"
__ASM_CFI
(
".cfi_def_cfa_offset 0xc0
\n\t
"
)
__ASM_CFI
(
".cfi_offset 29,-0xc0
\n\t
"
)
__ASM_CFI
(
".cfi_offset 30,-0xb8
\n\t
"
)
"mov x29, sp
\n\t
"
__ASM_CFI
(
".cfi_def_cfa_register 29
\n\t
"
)
"stp x19, x20, [x29, #0x10]
\n\t
"
__ASM_CFI
(
".cfi_rel_offset 19,0x10
\n\t
"
)
__ASM_CFI
(
".cfi_rel_offset 20,0x18
\n\t
"
)
"stp x21, x22, [x29, #0x20]
\n\t
"
__ASM_CFI
(
".cfi_rel_offset 21,0x20
\n\t
"
)
__ASM_CFI
(
".cfi_rel_offset 22,0x28
\n\t
"
)
"stp x23, x24, [x29, #0x30]
\n\t
"
__ASM_CFI
(
".cfi_rel_offset 23,0x30
\n\t
"
)
__ASM_CFI
(
".cfi_rel_offset 24,0x38
\n\t
"
)
"stp x25, x26, [x29, #0x40]
\n\t
"
__ASM_CFI
(
".cfi_rel_offset 25,0x40
\n\t
"
)
__ASM_CFI
(
".cfi_rel_offset 26,0x48
\n\t
"
)
"stp x27, x28, [x29, #0x50]
\n\t
"
__ASM_CFI
(
".cfi_rel_offset 27,0x50
\n\t
"
)
__ASM_CFI
(
".cfi_rel_offset 28,0x58
\n\t
"
)
"stp d8, d9, [x29, #0x60]
\n\t
"
"stp d10, d11, [x29, #0x70]
\n\t
"
"stp d12, d13, [x29, #0x80]
\n\t
"
...
...
@@ -1132,9 +1146,10 @@ __ASM_GLOBAL_FUNC( call_user_mode_callback,
"ldr x7, [x18, #0x2f8]
\n\t
"
/* arm64_thread_data()->syscall_frame */
"sub x3, sp, #0x330
\n\t
"
/* sizeof(struct syscall_frame) */
"str x3, [x18, #0x2f8]
\n\t
"
/* arm64_thread_data()->syscall_frame */
"add x8, x29, #0xc0
\n\t
"
"stp x7, x8, [x3, #0x110]
\n\t
"
/* frame->prev_frame,syscall_cfa */
/* switch to user stack */
"mov sp, x1
\n\t
"
/* stack */
"str x7, [x3, #0x110]
\n\t
"
/* frame->prev_frame */
"br x5"
)
...
...
@@ -1145,19 +1160,42 @@ extern void DECLSPEC_NORETURN user_mode_callback_return( void *ret_ptr, ULONG re
NTSTATUS
status
,
TEB
*
teb
);
__ASM_GLOBAL_FUNC
(
user_mode_callback_return
,
"ldr x4, [x3, #0x2f8]
\n\t
"
/* arm64_thread_data()->syscall_frame */
"ld
r x5, [x4, #0x110]
\n\t
"
/* prev_frame
*/
"ld
p x5, x29, [x4,#0x110]
\n\t
"
/* prev_frame,syscall_cfa
*/
"str x5, [x3, #0x2f8]
\n\t
"
/* arm64_thread_data()->syscall_frame */
"add x29, x4, #0x330
\n\t
"
/* sizeof(struct syscall_frame) */
"sub x29, x29, #0xc0
\n\t
"
__ASM_CFI
(
".cfi_def_cfa_register 29
\n\t
"
)
__ASM_CFI
(
".cfi_rel_offset 29,0x00
\n\t
"
)
__ASM_CFI
(
".cfi_rel_offset 30,0x08
\n\t
"
)
__ASM_CFI
(
".cfi_rel_offset 19,0x10
\n\t
"
)
__ASM_CFI
(
".cfi_rel_offset 20,0x18
\n\t
"
)
__ASM_CFI
(
".cfi_rel_offset 21,0x20
\n\t
"
)
__ASM_CFI
(
".cfi_rel_offset 22,0x28
\n\t
"
)
__ASM_CFI
(
".cfi_rel_offset 23,0x30
\n\t
"
)
__ASM_CFI
(
".cfi_rel_offset 24,0x38
\n\t
"
)
__ASM_CFI
(
".cfi_rel_offset 25,0x40
\n\t
"
)
__ASM_CFI
(
".cfi_rel_offset 26,0x48
\n\t
"
)
__ASM_CFI
(
".cfi_rel_offset 27,0x50
\n\t
"
)
__ASM_CFI
(
".cfi_rel_offset 28,0x58
\n\t
"
)
"ldp x5, x6, [x29, #0xb0]
\n\t
"
"str x6, [x3]
\n\t
"
/* teb->Tib.ExceptionList */
"msr fpcr, x5
\n\t
"
"lsr x5, x5, #32
\n\t
"
"msr fpsr, x5
\n\t
"
"ldp x19, x20, [x29, #0x10]
\n\t
"
__ASM_CFI
(
".cfi_same_value 19
\n\t
"
)
__ASM_CFI
(
".cfi_same_value 20
\n\t
"
)
"ldp x21, x22, [x29, #0x20]
\n\t
"
__ASM_CFI
(
".cfi_same_value 21
\n\t
"
)
__ASM_CFI
(
".cfi_same_value 22
\n\t
"
)
"ldp x23, x24, [x29, #0x30]
\n\t
"
__ASM_CFI
(
".cfi_same_value 23
\n\t
"
)
__ASM_CFI
(
".cfi_same_value 24
\n\t
"
)
"ldp x25, x26, [x29, #0x40]
\n\t
"
__ASM_CFI
(
".cfi_same_value 25
\n\t
"
)
__ASM_CFI
(
".cfi_same_value 26
\n\t
"
)
"ldp x27, x28, [x29, #0x50]
\n\t
"
__ASM_CFI
(
".cfi_same_value 27
\n\t
"
)
__ASM_CFI
(
".cfi_same_value 28
\n\t
"
)
"ldp d8, d9, [x29, #0x60]
\n\t
"
"ldp d10, d11, [x29, #0x70]
\n\t
"
"ldp d12, d13, [x29, #0x80]
\n\t
"
...
...
@@ -1604,10 +1642,9 @@ void syscall_dispatcher_return_slowpath(void)
/***********************************************************************
* call_init_thunk
*/
void
call_init_thunk
(
LPTHREAD_START_ROUTINE
entry
,
void
*
arg
,
BOOL
suspend
,
TEB
*
teb
)
void
call_init_thunk
(
LPTHREAD_START_ROUTINE
entry
,
void
*
arg
,
BOOL
suspend
,
TEB
*
teb
,
struct
syscall_frame
*
frame
,
void
*
syscall_cfa
)
{
struct
arm64_thread_data
*
thread_data
=
(
struct
arm64_thread_data
*
)
&
teb
->
GdiTebBatch
;
struct
syscall_frame
*
frame
=
thread_data
->
syscall_frame
;
CONTEXT
*
ctx
,
context
=
{
CONTEXT_ALL
};
I386_CONTEXT
*
i386_context
;
ARM_CONTEXT
*
arm_context
;
...
...
@@ -1659,8 +1696,8 @@ void call_init_thunk( LPTHREAD_START_ROUTINE entry, void *arg, BOOL suspend, TEB
frame
->
pc
=
(
ULONG64
)
pLdrInitializeThunk
;
frame
->
x
[
0
]
=
(
ULONG64
)
ctx
;
frame
->
x
[
18
]
=
(
ULONG64
)
teb
;
frame
->
prev_frame
=
NULL
;
frame
->
restore_flags
|=
CONTEXT_INTEGER
;
frame
->
syscall_cfa
=
syscall_cfa
;
syscall_frame_fixup_for_fastpath
(
frame
);
pthread_sigmask
(
SIG_UNBLOCK
,
&
server_block_set
,
NULL
);
...
...
@@ -1672,29 +1709,49 @@ void call_init_thunk( LPTHREAD_START_ROUTINE entry, void *arg, BOOL suspend, TEB
* signal_start_thread
*/
__ASM_GLOBAL_FUNC
(
signal_start_thread
,
"stp x29, x30, [sp,#-16]!
\n\t
"
/* store exit frame */
"stp x29, x30, [sp,#-0xc0]!
\n\t
"
__ASM_CFI
(
".cfi_def_cfa_offset 0xc0
\n\t
"
)
__ASM_CFI
(
".cfi_offset 29,-0xc0
\n\t
"
)
__ASM_CFI
(
".cfi_offset 30,-0xb8
\n\t
"
)
"mov x29, sp
\n\t
"
__ASM_CFI
(
".cfi_def_cfa_register 29
\n\t
"
)
"stp x19, x20, [x29, #0x10]
\n\t
"
__ASM_CFI
(
".cfi_rel_offset 19,0x10
\n\t
"
)
__ASM_CFI
(
".cfi_rel_offset 20,0x18
\n\t
"
)
"stp x21, x22, [x29, #0x20]
\n\t
"
__ASM_CFI
(
".cfi_rel_offset 21,0x20
\n\t
"
)
__ASM_CFI
(
".cfi_rel_offset 22,0x28
\n\t
"
)
"stp x23, x24, [x29, #0x30]
\n\t
"
__ASM_CFI
(
".cfi_rel_offset 23,0x30
\n\t
"
)
__ASM_CFI
(
".cfi_rel_offset 24,0x38
\n\t
"
)
"stp x25, x26, [x29, #0x40]
\n\t
"
__ASM_CFI
(
".cfi_rel_offset 25,0x40
\n\t
"
)
__ASM_CFI
(
".cfi_rel_offset 26,0x48
\n\t
"
)
"stp x27, x28, [x29, #0x50]
\n\t
"
__ASM_CFI
(
".cfi_rel_offset 27,0x50
\n\t
"
)
__ASM_CFI
(
".cfi_rel_offset 28,0x58
\n\t
"
)
"add x5, x29, #0xc0
\n\t
"
/* syscall_cfa */
/* store exit frame */
"str x29, [x3, #0x2f0]
\n\t
"
/* arm64_thread_data()->exit_frame */
/* set syscall frame */
"ldr x
8
, [x3, #0x2f8]
\n\t
"
/* arm64_thread_data()->syscall_frame */
"cbnz x
8
, 1f
\n\t
"
"sub x
8
, sp, #0x330
\n\t
"
/* sizeof(struct syscall_frame) */
"str x
8
, [x3, #0x2f8]
\n\t
"
/* arm64_thread_data()->syscall_frame */
"ldr x
4
, [x3, #0x2f8]
\n\t
"
/* arm64_thread_data()->syscall_frame */
"cbnz x
4
, 1f
\n\t
"
"sub x
4
, sp, #0x330
\n\t
"
/* sizeof(struct syscall_frame) */
"str x
4
, [x3, #0x2f8]
\n\t
"
/* arm64_thread_data()->syscall_frame */
/* switch to kernel stack */
"1:
\t
mov sp, x
8
\n\t
"
"1:
\t
mov sp, x
4
\n\t
"
"bl "
__ASM_NAME
(
"call_init_thunk"
)
)
/***********************************************************************
* signal_exit_thread
*/
__ASM_GLOBAL_FUNC
(
signal_exit_thread
,
"stp x29, x30, [sp,#-
16
]!
\n\t
"
"stp x29, x30, [sp,#-
0xc0
]!
\n\t
"
"ldr x3, [x2, #0x2f0]
\n\t
"
/* arm64_thread_data()->exit_frame */
"str xzr, [x2, #0x2f0]
\n\t
"
"cbz x3, 1f
\n\t
"
"mov sp, x3
\n
"
"1:
\t
ldp x29, x30, [sp], #
16
\n\t
"
"1:
\t
ldp x29, x30, [sp], #
0xc0
\n\t
"
"br x1"
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment