Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
759de58f
Commit
759de58f
authored
May 27, 2020
by
Al Viro
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
arm64: switch to ->regset_get()
Signed-off-by:
Al Viro
<
viro@zeniv.linux.org.uk
>
parent
a0faf966
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
62 additions
and
163 deletions
+62
-163
arch/arm64/kernel/ptrace.c
arch/arm64/kernel/ptrace.c
+62
-163
No files found.
arch/arm64/kernel/ptrace.c
View file @
759de58f
...
@@ -474,11 +474,10 @@ static int ptrace_hbp_set_addr(unsigned int note_type,
...
@@ -474,11 +474,10 @@ static int ptrace_hbp_set_addr(unsigned int note_type,
static
int
hw_break_get
(
struct
task_struct
*
target
,
static
int
hw_break_get
(
struct
task_struct
*
target
,
const
struct
user_regset
*
regset
,
const
struct
user_regset
*
regset
,
unsigned
int
pos
,
unsigned
int
count
,
struct
membuf
to
)
void
*
kbuf
,
void
__user
*
ubuf
)
{
{
unsigned
int
note_type
=
regset
->
core_note_type
;
unsigned
int
note_type
=
regset
->
core_note_type
;
int
ret
,
idx
=
0
,
offset
,
limit
;
int
ret
,
idx
=
0
;
u32
info
,
ctrl
;
u32
info
,
ctrl
;
u64
addr
;
u64
addr
;
...
@@ -487,49 +486,21 @@ static int hw_break_get(struct task_struct *target,
...
@@ -487,49 +486,21 @@ static int hw_break_get(struct task_struct *target,
if
(
ret
)
if
(
ret
)
return
ret
;
return
ret
;
ret
=
user_regset_copyout
(
&
pos
,
&
count
,
&
kbuf
,
&
ubuf
,
&
info
,
0
,
membuf_write
(
&
to
,
&
info
,
sizeof
(
info
));
sizeof
(
info
));
membuf_zero
(
&
to
,
sizeof
(
u32
));
if
(
ret
)
return
ret
;
/* Pad */
offset
=
offsetof
(
struct
user_hwdebug_state
,
pad
);
ret
=
user_regset_copyout_zero
(
&
pos
,
&
count
,
&
kbuf
,
&
ubuf
,
offset
,
offset
+
PTRACE_HBP_PAD_SZ
);
if
(
ret
)
return
ret
;
/* (address, ctrl) registers */
/* (address, ctrl) registers */
offset
=
offsetof
(
struct
user_hwdebug_state
,
dbg_regs
);
while
(
to
.
left
)
{
limit
=
regset
->
n
*
regset
->
size
;
while
(
count
&&
offset
<
limit
)
{
ret
=
ptrace_hbp_get_addr
(
note_type
,
target
,
idx
,
&
addr
);
ret
=
ptrace_hbp_get_addr
(
note_type
,
target
,
idx
,
&
addr
);
if
(
ret
)
if
(
ret
)
return
ret
;
return
ret
;
ret
=
user_regset_copyout
(
&
pos
,
&
count
,
&
kbuf
,
&
ubuf
,
&
addr
,
offset
,
offset
+
PTRACE_HBP_ADDR_SZ
);
if
(
ret
)
return
ret
;
offset
+=
PTRACE_HBP_ADDR_SZ
;
ret
=
ptrace_hbp_get_ctrl
(
note_type
,
target
,
idx
,
&
ctrl
);
ret
=
ptrace_hbp_get_ctrl
(
note_type
,
target
,
idx
,
&
ctrl
);
if
(
ret
)
if
(
ret
)
return
ret
;
return
ret
;
ret
=
user_regset_copyout
(
&
pos
,
&
count
,
&
kbuf
,
&
ubuf
,
&
ctrl
,
membuf_store
(
&
to
,
addr
);
offset
,
offset
+
PTRACE_HBP_CTRL_SZ
);
membuf_store
(
&
to
,
ctrl
);
if
(
ret
)
membuf_zero
(
&
to
,
sizeof
(
u32
));
return
ret
;
offset
+=
PTRACE_HBP_CTRL_SZ
;
ret
=
user_regset_copyout_zero
(
&
pos
,
&
count
,
&
kbuf
,
&
ubuf
,
offset
,
offset
+
PTRACE_HBP_PAD_SZ
);
if
(
ret
)
return
ret
;
offset
+=
PTRACE_HBP_PAD_SZ
;
idx
++
;
idx
++
;
}
}
return
0
;
return
0
;
}
}
...
@@ -589,11 +560,10 @@ static int hw_break_set(struct task_struct *target,
...
@@ -589,11 +560,10 @@ static int hw_break_set(struct task_struct *target,
static
int
gpr_get
(
struct
task_struct
*
target
,
static
int
gpr_get
(
struct
task_struct
*
target
,
const
struct
user_regset
*
regset
,
const
struct
user_regset
*
regset
,
unsigned
int
pos
,
unsigned
int
count
,
struct
membuf
to
)
void
*
kbuf
,
void
__user
*
ubuf
)
{
{
struct
user_pt_regs
*
uregs
=
&
task_pt_regs
(
target
)
->
user_regs
;
struct
user_pt_regs
*
uregs
=
&
task_pt_regs
(
target
)
->
user_regs
;
return
user_regset_copyout
(
&
pos
,
&
count
,
&
kbuf
,
&
ubuf
,
uregs
,
0
,
-
1
);
return
membuf_write
(
&
to
,
uregs
,
sizeof
(
*
uregs
)
);
}
}
static
int
gpr_set
(
struct
task_struct
*
target
,
const
struct
user_regset
*
regset
,
static
int
gpr_set
(
struct
task_struct
*
target
,
const
struct
user_regset
*
regset
,
...
@@ -626,8 +596,7 @@ static int fpr_active(struct task_struct *target, const struct user_regset *regs
...
@@ -626,8 +596,7 @@ static int fpr_active(struct task_struct *target, const struct user_regset *regs
*/
*/
static
int
__fpr_get
(
struct
task_struct
*
target
,
static
int
__fpr_get
(
struct
task_struct
*
target
,
const
struct
user_regset
*
regset
,
const
struct
user_regset
*
regset
,
unsigned
int
pos
,
unsigned
int
count
,
struct
membuf
to
)
void
*
kbuf
,
void
__user
*
ubuf
,
unsigned
int
start_pos
)
{
{
struct
user_fpsimd_state
*
uregs
;
struct
user_fpsimd_state
*
uregs
;
...
@@ -635,13 +604,11 @@ static int __fpr_get(struct task_struct *target,
...
@@ -635,13 +604,11 @@ static int __fpr_get(struct task_struct *target,
uregs
=
&
target
->
thread
.
uw
.
fpsimd_state
;
uregs
=
&
target
->
thread
.
uw
.
fpsimd_state
;
return
user_regset_copyout
(
&
pos
,
&
count
,
&
kbuf
,
&
ubuf
,
uregs
,
return
membuf_write
(
&
to
,
uregs
,
sizeof
(
*
uregs
));
start_pos
,
start_pos
+
sizeof
(
*
uregs
));
}
}
static
int
fpr_get
(
struct
task_struct
*
target
,
const
struct
user_regset
*
regset
,
static
int
fpr_get
(
struct
task_struct
*
target
,
const
struct
user_regset
*
regset
,
unsigned
int
pos
,
unsigned
int
count
,
struct
membuf
to
)
void
*
kbuf
,
void
__user
*
ubuf
)
{
{
if
(
!
system_supports_fpsimd
())
if
(
!
system_supports_fpsimd
())
return
-
EINVAL
;
return
-
EINVAL
;
...
@@ -649,7 +616,7 @@ static int fpr_get(struct task_struct *target, const struct user_regset *regset,
...
@@ -649,7 +616,7 @@ static int fpr_get(struct task_struct *target, const struct user_regset *regset,
if
(
target
==
current
)
if
(
target
==
current
)
fpsimd_preserve_current_state
();
fpsimd_preserve_current_state
();
return
__fpr_get
(
target
,
regset
,
pos
,
count
,
kbuf
,
ubuf
,
0
);
return
__fpr_get
(
target
,
regset
,
to
);
}
}
static
int
__fpr_set
(
struct
task_struct
*
target
,
static
int
__fpr_set
(
struct
task_struct
*
target
,
...
@@ -699,15 +666,12 @@ static int fpr_set(struct task_struct *target, const struct user_regset *regset,
...
@@ -699,15 +666,12 @@ static int fpr_set(struct task_struct *target, const struct user_regset *regset,
}
}
static
int
tls_get
(
struct
task_struct
*
target
,
const
struct
user_regset
*
regset
,
static
int
tls_get
(
struct
task_struct
*
target
,
const
struct
user_regset
*
regset
,
unsigned
int
pos
,
unsigned
int
count
,
struct
membuf
to
)
void
*
kbuf
,
void
__user
*
ubuf
)
{
{
unsigned
long
*
tls
=
&
target
->
thread
.
uw
.
tp_value
;
if
(
target
==
current
)
if
(
target
==
current
)
tls_preserve_current_state
();
tls_preserve_current_state
();
return
user_regset_copyout
(
&
pos
,
&
count
,
&
kbuf
,
&
ubuf
,
tls
,
0
,
-
1
);
return
membuf_store
(
&
to
,
target
->
thread
.
uw
.
tp_value
);
}
}
static
int
tls_set
(
struct
task_struct
*
target
,
const
struct
user_regset
*
regset
,
static
int
tls_set
(
struct
task_struct
*
target
,
const
struct
user_regset
*
regset
,
...
@@ -727,13 +691,9 @@ static int tls_set(struct task_struct *target, const struct user_regset *regset,
...
@@ -727,13 +691,9 @@ static int tls_set(struct task_struct *target, const struct user_regset *regset,
static
int
system_call_get
(
struct
task_struct
*
target
,
static
int
system_call_get
(
struct
task_struct
*
target
,
const
struct
user_regset
*
regset
,
const
struct
user_regset
*
regset
,
unsigned
int
pos
,
unsigned
int
count
,
struct
membuf
to
)
void
*
kbuf
,
void
__user
*
ubuf
)
{
{
int
syscallno
=
task_pt_regs
(
target
)
->
syscallno
;
return
membuf_store
(
&
to
,
task_pt_regs
(
target
)
->
syscallno
);
return
user_regset_copyout
(
&
pos
,
&
count
,
&
kbuf
,
&
ubuf
,
&
syscallno
,
0
,
-
1
);
}
}
static
int
system_call_set
(
struct
task_struct
*
target
,
static
int
system_call_set
(
struct
task_struct
*
target
,
...
@@ -794,10 +754,8 @@ static unsigned int sve_get_size(struct task_struct *target,
...
@@ -794,10 +754,8 @@ static unsigned int sve_get_size(struct task_struct *target,
static
int
sve_get
(
struct
task_struct
*
target
,
static
int
sve_get
(
struct
task_struct
*
target
,
const
struct
user_regset
*
regset
,
const
struct
user_regset
*
regset
,
unsigned
int
pos
,
unsigned
int
count
,
struct
membuf
to
)
void
*
kbuf
,
void
__user
*
ubuf
)
{
{
int
ret
;
struct
user_sve_header
header
;
struct
user_sve_header
header
;
unsigned
int
vq
;
unsigned
int
vq
;
unsigned
long
start
,
end
;
unsigned
long
start
,
end
;
...
@@ -809,10 +767,7 @@ static int sve_get(struct task_struct *target,
...
@@ -809,10 +767,7 @@ static int sve_get(struct task_struct *target,
sve_init_header_from_task
(
&
header
,
target
);
sve_init_header_from_task
(
&
header
,
target
);
vq
=
sve_vq_from_vl
(
header
.
vl
);
vq
=
sve_vq_from_vl
(
header
.
vl
);
ret
=
user_regset_copyout
(
&
pos
,
&
count
,
&
kbuf
,
&
ubuf
,
&
header
,
membuf_write
(
&
to
,
&
header
,
sizeof
(
header
));
0
,
sizeof
(
header
));
if
(
ret
)
return
ret
;
if
(
target
==
current
)
if
(
target
==
current
)
fpsimd_preserve_current_state
();
fpsimd_preserve_current_state
();
...
@@ -821,26 +776,18 @@ static int sve_get(struct task_struct *target,
...
@@ -821,26 +776,18 @@ static int sve_get(struct task_struct *target,
BUILD_BUG_ON
(
SVE_PT_FPSIMD_OFFSET
!=
sizeof
(
header
));
BUILD_BUG_ON
(
SVE_PT_FPSIMD_OFFSET
!=
sizeof
(
header
));
if
((
header
.
flags
&
SVE_PT_REGS_MASK
)
==
SVE_PT_REGS_FPSIMD
)
if
((
header
.
flags
&
SVE_PT_REGS_MASK
)
==
SVE_PT_REGS_FPSIMD
)
return
__fpr_get
(
target
,
regset
,
pos
,
count
,
kbuf
,
ubuf
,
return
__fpr_get
(
target
,
regset
,
to
);
SVE_PT_FPSIMD_OFFSET
);
/* Otherwise: full SVE case */
/* Otherwise: full SVE case */
BUILD_BUG_ON
(
SVE_PT_SVE_OFFSET
!=
sizeof
(
header
));
BUILD_BUG_ON
(
SVE_PT_SVE_OFFSET
!=
sizeof
(
header
));
start
=
SVE_PT_SVE_OFFSET
;
start
=
SVE_PT_SVE_OFFSET
;
end
=
SVE_PT_SVE_FFR_OFFSET
(
vq
)
+
SVE_PT_SVE_FFR_SIZE
(
vq
);
end
=
SVE_PT_SVE_FFR_OFFSET
(
vq
)
+
SVE_PT_SVE_FFR_SIZE
(
vq
);
ret
=
user_regset_copyout
(
&
pos
,
&
count
,
&
kbuf
,
&
ubuf
,
membuf_write
(
&
to
,
target
->
thread
.
sve_state
,
end
-
start
);
target
->
thread
.
sve_state
,
start
,
end
);
if
(
ret
)
return
ret
;
start
=
end
;
start
=
end
;
end
=
SVE_PT_SVE_FPSR_OFFSET
(
vq
);
end
=
SVE_PT_SVE_FPSR_OFFSET
(
vq
);
ret
=
user_regset_copyout_zero
(
&
pos
,
&
count
,
&
kbuf
,
&
ubuf
,
membuf_zero
(
&
to
,
end
-
start
);
start
,
end
);
if
(
ret
)
return
ret
;
/*
/*
* Copy fpsr, and fpcr which must follow contiguously in
* Copy fpsr, and fpcr which must follow contiguously in
...
@@ -848,16 +795,11 @@ static int sve_get(struct task_struct *target,
...
@@ -848,16 +795,11 @@ static int sve_get(struct task_struct *target,
*/
*/
start
=
end
;
start
=
end
;
end
=
SVE_PT_SVE_FPCR_OFFSET
(
vq
)
+
SVE_PT_SVE_FPCR_SIZE
;
end
=
SVE_PT_SVE_FPCR_OFFSET
(
vq
)
+
SVE_PT_SVE_FPCR_SIZE
;
ret
=
user_regset_copyout
(
&
pos
,
&
count
,
&
kbuf
,
&
ubuf
,
membuf_write
(
&
to
,
&
target
->
thread
.
uw
.
fpsimd_state
.
fpsr
,
end
-
start
);
&
target
->
thread
.
uw
.
fpsimd_state
.
fpsr
,
start
,
end
);
if
(
ret
)
return
ret
;
start
=
end
;
start
=
end
;
end
=
sve_size_from_header
(
&
header
);
end
=
sve_size_from_header
(
&
header
);
return
user_regset_copyout_zero
(
&
pos
,
&
count
,
&
kbuf
,
&
ubuf
,
return
membuf_zero
(
&
to
,
end
-
start
);
start
,
end
);
}
}
static
int
sve_set
(
struct
task_struct
*
target
,
static
int
sve_set
(
struct
task_struct
*
target
,
...
@@ -961,8 +903,7 @@ static int sve_set(struct task_struct *target,
...
@@ -961,8 +903,7 @@ static int sve_set(struct task_struct *target,
#ifdef CONFIG_ARM64_PTR_AUTH
#ifdef CONFIG_ARM64_PTR_AUTH
static
int
pac_mask_get
(
struct
task_struct
*
target
,
static
int
pac_mask_get
(
struct
task_struct
*
target
,
const
struct
user_regset
*
regset
,
const
struct
user_regset
*
regset
,
unsigned
int
pos
,
unsigned
int
count
,
struct
membuf
to
)
void
*
kbuf
,
void
__user
*
ubuf
)
{
{
/*
/*
* The PAC bits can differ across data and instruction pointers
* The PAC bits can differ across data and instruction pointers
...
@@ -978,7 +919,7 @@ static int pac_mask_get(struct task_struct *target,
...
@@ -978,7 +919,7 @@ static int pac_mask_get(struct task_struct *target,
if
(
!
system_supports_address_auth
())
if
(
!
system_supports_address_auth
())
return
-
EINVAL
;
return
-
EINVAL
;
return
user_regset_copyout
(
&
pos
,
&
count
,
&
kbuf
,
&
ubuf
,
&
uregs
,
0
,
-
1
);
return
membuf_write
(
&
to
,
&
uregs
,
sizeof
(
uregs
)
);
}
}
#ifdef CONFIG_CHECKPOINT_RESTORE
#ifdef CONFIG_CHECKPOINT_RESTORE
...
@@ -1017,8 +958,7 @@ static void pac_address_keys_from_user(struct ptrauth_keys_user *keys,
...
@@ -1017,8 +958,7 @@ static void pac_address_keys_from_user(struct ptrauth_keys_user *keys,
static
int
pac_address_keys_get
(
struct
task_struct
*
target
,
static
int
pac_address_keys_get
(
struct
task_struct
*
target
,
const
struct
user_regset
*
regset
,
const
struct
user_regset
*
regset
,
unsigned
int
pos
,
unsigned
int
count
,
struct
membuf
to
)
void
*
kbuf
,
void
__user
*
ubuf
)
{
{
struct
ptrauth_keys_user
*
keys
=
&
target
->
thread
.
keys_user
;
struct
ptrauth_keys_user
*
keys
=
&
target
->
thread
.
keys_user
;
struct
user_pac_address_keys
user_keys
;
struct
user_pac_address_keys
user_keys
;
...
@@ -1028,8 +968,7 @@ static int pac_address_keys_get(struct task_struct *target,
...
@@ -1028,8 +968,7 @@ static int pac_address_keys_get(struct task_struct *target,
pac_address_keys_to_user
(
&
user_keys
,
keys
);
pac_address_keys_to_user
(
&
user_keys
,
keys
);
return
user_regset_copyout
(
&
pos
,
&
count
,
&
kbuf
,
&
ubuf
,
return
membuf_write
(
&
to
,
&
user_keys
,
sizeof
(
user_keys
));
&
user_keys
,
0
,
-
1
);
}
}
static
int
pac_address_keys_set
(
struct
task_struct
*
target
,
static
int
pac_address_keys_set
(
struct
task_struct
*
target
,
...
@@ -1068,8 +1007,7 @@ static void pac_generic_keys_from_user(struct ptrauth_keys_user *keys,
...
@@ -1068,8 +1007,7 @@ static void pac_generic_keys_from_user(struct ptrauth_keys_user *keys,
static
int
pac_generic_keys_get
(
struct
task_struct
*
target
,
static
int
pac_generic_keys_get
(
struct
task_struct
*
target
,
const
struct
user_regset
*
regset
,
const
struct
user_regset
*
regset
,
unsigned
int
pos
,
unsigned
int
count
,
struct
membuf
to
)
void
*
kbuf
,
void
__user
*
ubuf
)
{
{
struct
ptrauth_keys_user
*
keys
=
&
target
->
thread
.
keys_user
;
struct
ptrauth_keys_user
*
keys
=
&
target
->
thread
.
keys_user
;
struct
user_pac_generic_keys
user_keys
;
struct
user_pac_generic_keys
user_keys
;
...
@@ -1079,8 +1017,7 @@ static int pac_generic_keys_get(struct task_struct *target,
...
@@ -1079,8 +1017,7 @@ static int pac_generic_keys_get(struct task_struct *target,
pac_generic_keys_to_user
(
&
user_keys
,
keys
);
pac_generic_keys_to_user
(
&
user_keys
,
keys
);
return
user_regset_copyout
(
&
pos
,
&
count
,
&
kbuf
,
&
ubuf
,
return
membuf_write
(
&
to
,
&
user_keys
,
sizeof
(
user_keys
));
&
user_keys
,
0
,
-
1
);
}
}
static
int
pac_generic_keys_set
(
struct
task_struct
*
target
,
static
int
pac_generic_keys_set
(
struct
task_struct
*
target
,
...
@@ -1134,7 +1071,7 @@ static const struct user_regset aarch64_regsets[] = {
...
@@ -1134,7 +1071,7 @@ static const struct user_regset aarch64_regsets[] = {
.
n
=
sizeof
(
struct
user_pt_regs
)
/
sizeof
(
u64
),
.
n
=
sizeof
(
struct
user_pt_regs
)
/
sizeof
(
u64
),
.
size
=
sizeof
(
u64
),
.
size
=
sizeof
(
u64
),
.
align
=
sizeof
(
u64
),
.
align
=
sizeof
(
u64
),
.
get
=
gpr_get
,
.
regset_
get
=
gpr_get
,
.
set
=
gpr_set
.
set
=
gpr_set
},
},
[
REGSET_FPR
]
=
{
[
REGSET_FPR
]
=
{
...
@@ -1147,7 +1084,7 @@ static const struct user_regset aarch64_regsets[] = {
...
@@ -1147,7 +1084,7 @@ static const struct user_regset aarch64_regsets[] = {
.
size
=
sizeof
(
u32
),
.
size
=
sizeof
(
u32
),
.
align
=
sizeof
(
u32
),
.
align
=
sizeof
(
u32
),
.
active
=
fpr_active
,
.
active
=
fpr_active
,
.
get
=
fpr_get
,
.
regset_
get
=
fpr_get
,
.
set
=
fpr_set
.
set
=
fpr_set
},
},
[
REGSET_TLS
]
=
{
[
REGSET_TLS
]
=
{
...
@@ -1155,7 +1092,7 @@ static const struct user_regset aarch64_regsets[] = {
...
@@ -1155,7 +1092,7 @@ static const struct user_regset aarch64_regsets[] = {
.
n
=
1
,
.
n
=
1
,
.
size
=
sizeof
(
void
*
),
.
size
=
sizeof
(
void
*
),
.
align
=
sizeof
(
void
*
),
.
align
=
sizeof
(
void
*
),
.
get
=
tls_get
,
.
regset_
get
=
tls_get
,
.
set
=
tls_set
,
.
set
=
tls_set
,
},
},
#ifdef CONFIG_HAVE_HW_BREAKPOINT
#ifdef CONFIG_HAVE_HW_BREAKPOINT
...
@@ -1164,7 +1101,7 @@ static const struct user_regset aarch64_regsets[] = {
...
@@ -1164,7 +1101,7 @@ static const struct user_regset aarch64_regsets[] = {
.
n
=
sizeof
(
struct
user_hwdebug_state
)
/
sizeof
(
u32
),
.
n
=
sizeof
(
struct
user_hwdebug_state
)
/
sizeof
(
u32
),
.
size
=
sizeof
(
u32
),
.
size
=
sizeof
(
u32
),
.
align
=
sizeof
(
u32
),
.
align
=
sizeof
(
u32
),
.
get
=
hw_break_get
,
.
regset_
get
=
hw_break_get
,
.
set
=
hw_break_set
,
.
set
=
hw_break_set
,
},
},
[
REGSET_HW_WATCH
]
=
{
[
REGSET_HW_WATCH
]
=
{
...
@@ -1172,7 +1109,7 @@ static const struct user_regset aarch64_regsets[] = {
...
@@ -1172,7 +1109,7 @@ static const struct user_regset aarch64_regsets[] = {
.
n
=
sizeof
(
struct
user_hwdebug_state
)
/
sizeof
(
u32
),
.
n
=
sizeof
(
struct
user_hwdebug_state
)
/
sizeof
(
u32
),
.
size
=
sizeof
(
u32
),
.
size
=
sizeof
(
u32
),
.
align
=
sizeof
(
u32
),
.
align
=
sizeof
(
u32
),
.
get
=
hw_break_get
,
.
regset_
get
=
hw_break_get
,
.
set
=
hw_break_set
,
.
set
=
hw_break_set
,
},
},
#endif
#endif
...
@@ -1181,7 +1118,7 @@ static const struct user_regset aarch64_regsets[] = {
...
@@ -1181,7 +1118,7 @@ static const struct user_regset aarch64_regsets[] = {
.
n
=
1
,
.
n
=
1
,
.
size
=
sizeof
(
int
),
.
size
=
sizeof
(
int
),
.
align
=
sizeof
(
int
),
.
align
=
sizeof
(
int
),
.
get
=
system_call_get
,
.
regset_
get
=
system_call_get
,
.
set
=
system_call_set
,
.
set
=
system_call_set
,
},
},
#ifdef CONFIG_ARM64_SVE
#ifdef CONFIG_ARM64_SVE
...
@@ -1191,7 +1128,7 @@ static const struct user_regset aarch64_regsets[] = {
...
@@ -1191,7 +1128,7 @@ static const struct user_regset aarch64_regsets[] = {
SVE_VQ_BYTES
),
SVE_VQ_BYTES
),
.
size
=
SVE_VQ_BYTES
,
.
size
=
SVE_VQ_BYTES
,
.
align
=
SVE_VQ_BYTES
,
.
align
=
SVE_VQ_BYTES
,
.
get
=
sve_get
,
.
regset_
get
=
sve_get
,
.
set
=
sve_set
,
.
set
=
sve_set
,
.
get_size
=
sve_get_size
,
.
get_size
=
sve_get_size
,
},
},
...
@@ -1202,7 +1139,7 @@ static const struct user_regset aarch64_regsets[] = {
...
@@ -1202,7 +1139,7 @@ static const struct user_regset aarch64_regsets[] = {
.
n
=
sizeof
(
struct
user_pac_mask
)
/
sizeof
(
u64
),
.
n
=
sizeof
(
struct
user_pac_mask
)
/
sizeof
(
u64
),
.
size
=
sizeof
(
u64
),
.
size
=
sizeof
(
u64
),
.
align
=
sizeof
(
u64
),
.
align
=
sizeof
(
u64
),
.
get
=
pac_mask_get
,
.
regset_
get
=
pac_mask_get
,
/* this cannot be set dynamically */
/* this cannot be set dynamically */
},
},
#ifdef CONFIG_CHECKPOINT_RESTORE
#ifdef CONFIG_CHECKPOINT_RESTORE
...
@@ -1211,7 +1148,7 @@ static const struct user_regset aarch64_regsets[] = {
...
@@ -1211,7 +1148,7 @@ static const struct user_regset aarch64_regsets[] = {
.
n
=
sizeof
(
struct
user_pac_address_keys
)
/
sizeof
(
__uint128_t
),
.
n
=
sizeof
(
struct
user_pac_address_keys
)
/
sizeof
(
__uint128_t
),
.
size
=
sizeof
(
__uint128_t
),
.
size
=
sizeof
(
__uint128_t
),
.
align
=
sizeof
(
__uint128_t
),
.
align
=
sizeof
(
__uint128_t
),
.
get
=
pac_address_keys_get
,
.
regset_
get
=
pac_address_keys_get
,
.
set
=
pac_address_keys_set
,
.
set
=
pac_address_keys_set
,
},
},
[
REGSET_PACG_KEYS
]
=
{
[
REGSET_PACG_KEYS
]
=
{
...
@@ -1219,7 +1156,7 @@ static const struct user_regset aarch64_regsets[] = {
...
@@ -1219,7 +1156,7 @@ static const struct user_regset aarch64_regsets[] = {
.
n
=
sizeof
(
struct
user_pac_generic_keys
)
/
sizeof
(
__uint128_t
),
.
n
=
sizeof
(
struct
user_pac_generic_keys
)
/
sizeof
(
__uint128_t
),
.
size
=
sizeof
(
__uint128_t
),
.
size
=
sizeof
(
__uint128_t
),
.
align
=
sizeof
(
__uint128_t
),
.
align
=
sizeof
(
__uint128_t
),
.
get
=
pac_generic_keys_get
,
.
regset_
get
=
pac_generic_keys_get
,
.
set
=
pac_generic_keys_set
,
.
set
=
pac_generic_keys_set
,
},
},
#endif
#endif
...
@@ -1255,39 +1192,13 @@ static inline compat_ulong_t compat_get_user_reg(struct task_struct *task, int i
...
@@ -1255,39 +1192,13 @@ static inline compat_ulong_t compat_get_user_reg(struct task_struct *task, int i
static
int
compat_gpr_get
(
struct
task_struct
*
target
,
static
int
compat_gpr_get
(
struct
task_struct
*
target
,
const
struct
user_regset
*
regset
,
const
struct
user_regset
*
regset
,
unsigned
int
pos
,
unsigned
int
count
,
struct
membuf
to
)
void
*
kbuf
,
void
__user
*
ubuf
)
{
{
int
ret
=
0
;
int
i
=
0
;
unsigned
int
i
,
start
,
num_regs
;
/* Calculate the number of AArch32 registers contained in count */
num_regs
=
count
/
regset
->
size
;
/* Convert pos into an register number */
start
=
pos
/
regset
->
size
;
if
(
start
+
num_regs
>
regset
->
n
)
return
-
EIO
;
for
(
i
=
0
;
i
<
num_regs
;
++
i
)
{
compat_ulong_t
reg
=
compat_get_user_reg
(
target
,
start
+
i
);
if
(
kbuf
)
{
memcpy
(
kbuf
,
&
reg
,
sizeof
(
reg
));
kbuf
+=
sizeof
(
reg
);
}
else
{
ret
=
copy_to_user
(
ubuf
,
&
reg
,
sizeof
(
reg
));
if
(
ret
)
{
ret
=
-
EFAULT
;
break
;
}
ubuf
+=
sizeof
(
reg
);
while
(
to
.
left
)
}
membuf_store
(
&
to
,
compat_get_user_reg
(
target
,
i
++
));
}
return
0
;
return
ret
;
}
}
static
int
compat_gpr_set
(
struct
task_struct
*
target
,
static
int
compat_gpr_set
(
struct
task_struct
*
target
,
...
@@ -1354,12 +1265,10 @@ static int compat_gpr_set(struct task_struct *target,
...
@@ -1354,12 +1265,10 @@ static int compat_gpr_set(struct task_struct *target,
static
int
compat_vfp_get
(
struct
task_struct
*
target
,
static
int
compat_vfp_get
(
struct
task_struct
*
target
,
const
struct
user_regset
*
regset
,
const
struct
user_regset
*
regset
,
unsigned
int
pos
,
unsigned
int
count
,
struct
membuf
to
)
void
*
kbuf
,
void
__user
*
ubuf
)
{
{
struct
user_fpsimd_state
*
uregs
;
struct
user_fpsimd_state
*
uregs
;
compat_ulong_t
fpscr
;
compat_ulong_t
fpscr
;
int
ret
,
vregs_end_pos
;
if
(
!
system_supports_fpsimd
())
if
(
!
system_supports_fpsimd
())
return
-
EINVAL
;
return
-
EINVAL
;
...
@@ -1373,19 +1282,10 @@ static int compat_vfp_get(struct task_struct *target,
...
@@ -1373,19 +1282,10 @@ static int compat_vfp_get(struct task_struct *target,
* The VFP registers are packed into the fpsimd_state, so they all sit
* The VFP registers are packed into the fpsimd_state, so they all sit
* nicely together for us. We just need to create the fpscr separately.
* nicely together for us. We just need to create the fpscr separately.
*/
*/
vregs_end_pos
=
VFP_STATE_SIZE
-
sizeof
(
compat_ulong_t
);
membuf_write
(
&
to
,
uregs
,
VFP_STATE_SIZE
-
sizeof
(
compat_ulong_t
));
ret
=
user_regset_copyout
(
&
pos
,
&
count
,
&
kbuf
,
&
ubuf
,
uregs
,
fpscr
=
(
uregs
->
fpsr
&
VFP_FPSCR_STAT_MASK
)
|
0
,
vregs_end_pos
);
(
uregs
->
fpcr
&
VFP_FPSCR_CTRL_MASK
);
return
membuf_store
(
&
to
,
fpscr
);
if
(
count
&&
!
ret
)
{
fpscr
=
(
uregs
->
fpsr
&
VFP_FPSCR_STAT_MASK
)
|
(
uregs
->
fpcr
&
VFP_FPSCR_CTRL_MASK
);
ret
=
user_regset_copyout
(
&
pos
,
&
count
,
&
kbuf
,
&
ubuf
,
&
fpscr
,
vregs_end_pos
,
VFP_STATE_SIZE
);
}
return
ret
;
}
}
static
int
compat_vfp_set
(
struct
task_struct
*
target
,
static
int
compat_vfp_set
(
struct
task_struct
*
target
,
...
@@ -1420,11 +1320,10 @@ static int compat_vfp_set(struct task_struct *target,
...
@@ -1420,11 +1320,10 @@ static int compat_vfp_set(struct task_struct *target,
}
}
static
int
compat_tls_get
(
struct
task_struct
*
target
,
static
int
compat_tls_get
(
struct
task_struct
*
target
,
const
struct
user_regset
*
regset
,
unsigned
int
pos
,
const
struct
user_regset
*
regset
,
unsigned
int
count
,
void
*
kbuf
,
void
__user
*
ubuf
)
struct
membuf
to
)
{
{
compat_ulong_t
tls
=
(
compat_ulong_t
)
target
->
thread
.
uw
.
tp_value
;
return
membuf_store
(
&
to
,
(
compat_ulong_t
)
target
->
thread
.
uw
.
tp_value
);
return
user_regset_copyout
(
&
pos
,
&
count
,
&
kbuf
,
&
ubuf
,
&
tls
,
0
,
-
1
);
}
}
static
int
compat_tls_set
(
struct
task_struct
*
target
,
static
int
compat_tls_set
(
struct
task_struct
*
target
,
...
@@ -1449,7 +1348,7 @@ static const struct user_regset aarch32_regsets[] = {
...
@@ -1449,7 +1348,7 @@ static const struct user_regset aarch32_regsets[] = {
.
n
=
COMPAT_ELF_NGREG
,
.
n
=
COMPAT_ELF_NGREG
,
.
size
=
sizeof
(
compat_elf_greg_t
),
.
size
=
sizeof
(
compat_elf_greg_t
),
.
align
=
sizeof
(
compat_elf_greg_t
),
.
align
=
sizeof
(
compat_elf_greg_t
),
.
get
=
compat_gpr_get
,
.
regset_
get
=
compat_gpr_get
,
.
set
=
compat_gpr_set
.
set
=
compat_gpr_set
},
},
[
REGSET_COMPAT_VFP
]
=
{
[
REGSET_COMPAT_VFP
]
=
{
...
@@ -1458,7 +1357,7 @@ static const struct user_regset aarch32_regsets[] = {
...
@@ -1458,7 +1357,7 @@ static const struct user_regset aarch32_regsets[] = {
.
size
=
sizeof
(
compat_ulong_t
),
.
size
=
sizeof
(
compat_ulong_t
),
.
align
=
sizeof
(
compat_ulong_t
),
.
align
=
sizeof
(
compat_ulong_t
),
.
active
=
fpr_active
,
.
active
=
fpr_active
,
.
get
=
compat_vfp_get
,
.
regset_
get
=
compat_vfp_get
,
.
set
=
compat_vfp_set
.
set
=
compat_vfp_set
},
},
};
};
...
@@ -1474,7 +1373,7 @@ static const struct user_regset aarch32_ptrace_regsets[] = {
...
@@ -1474,7 +1373,7 @@ static const struct user_regset aarch32_ptrace_regsets[] = {
.
n
=
COMPAT_ELF_NGREG
,
.
n
=
COMPAT_ELF_NGREG
,
.
size
=
sizeof
(
compat_elf_greg_t
),
.
size
=
sizeof
(
compat_elf_greg_t
),
.
align
=
sizeof
(
compat_elf_greg_t
),
.
align
=
sizeof
(
compat_elf_greg_t
),
.
get
=
compat_gpr_get
,
.
regset_
get
=
compat_gpr_get
,
.
set
=
compat_gpr_set
.
set
=
compat_gpr_set
},
},
[
REGSET_FPR
]
=
{
[
REGSET_FPR
]
=
{
...
@@ -1482,7 +1381,7 @@ static const struct user_regset aarch32_ptrace_regsets[] = {
...
@@ -1482,7 +1381,7 @@ static const struct user_regset aarch32_ptrace_regsets[] = {
.
n
=
VFP_STATE_SIZE
/
sizeof
(
compat_ulong_t
),
.
n
=
VFP_STATE_SIZE
/
sizeof
(
compat_ulong_t
),
.
size
=
sizeof
(
compat_ulong_t
),
.
size
=
sizeof
(
compat_ulong_t
),
.
align
=
sizeof
(
compat_ulong_t
),
.
align
=
sizeof
(
compat_ulong_t
),
.
get
=
compat_vfp_get
,
.
regset_
get
=
compat_vfp_get
,
.
set
=
compat_vfp_set
.
set
=
compat_vfp_set
},
},
[
REGSET_TLS
]
=
{
[
REGSET_TLS
]
=
{
...
@@ -1490,7 +1389,7 @@ static const struct user_regset aarch32_ptrace_regsets[] = {
...
@@ -1490,7 +1389,7 @@ static const struct user_regset aarch32_ptrace_regsets[] = {
.
n
=
1
,
.
n
=
1
,
.
size
=
sizeof
(
compat_ulong_t
),
.
size
=
sizeof
(
compat_ulong_t
),
.
align
=
sizeof
(
compat_ulong_t
),
.
align
=
sizeof
(
compat_ulong_t
),
.
get
=
compat_tls_get
,
.
regset_
get
=
compat_tls_get
,
.
set
=
compat_tls_set
,
.
set
=
compat_tls_set
,
},
},
#ifdef CONFIG_HAVE_HW_BREAKPOINT
#ifdef CONFIG_HAVE_HW_BREAKPOINT
...
@@ -1499,7 +1398,7 @@ static const struct user_regset aarch32_ptrace_regsets[] = {
...
@@ -1499,7 +1398,7 @@ static const struct user_regset aarch32_ptrace_regsets[] = {
.
n
=
sizeof
(
struct
user_hwdebug_state
)
/
sizeof
(
u32
),
.
n
=
sizeof
(
struct
user_hwdebug_state
)
/
sizeof
(
u32
),
.
size
=
sizeof
(
u32
),
.
size
=
sizeof
(
u32
),
.
align
=
sizeof
(
u32
),
.
align
=
sizeof
(
u32
),
.
get
=
hw_break_get
,
.
regset_
get
=
hw_break_get
,
.
set
=
hw_break_set
,
.
set
=
hw_break_set
,
},
},
[
REGSET_HW_WATCH
]
=
{
[
REGSET_HW_WATCH
]
=
{
...
@@ -1507,7 +1406,7 @@ static const struct user_regset aarch32_ptrace_regsets[] = {
...
@@ -1507,7 +1406,7 @@ static const struct user_regset aarch32_ptrace_regsets[] = {
.
n
=
sizeof
(
struct
user_hwdebug_state
)
/
sizeof
(
u32
),
.
n
=
sizeof
(
struct
user_hwdebug_state
)
/
sizeof
(
u32
),
.
size
=
sizeof
(
u32
),
.
size
=
sizeof
(
u32
),
.
align
=
sizeof
(
u32
),
.
align
=
sizeof
(
u32
),
.
get
=
hw_break_get
,
.
regset_
get
=
hw_break_get
,
.
set
=
hw_break_set
,
.
set
=
hw_break_set
,
},
},
#endif
#endif
...
@@ -1516,7 +1415,7 @@ static const struct user_regset aarch32_ptrace_regsets[] = {
...
@@ -1516,7 +1415,7 @@ static const struct user_regset aarch32_ptrace_regsets[] = {
.
n
=
1
,
.
n
=
1
,
.
size
=
sizeof
(
int
),
.
size
=
sizeof
(
int
),
.
align
=
sizeof
(
int
),
.
align
=
sizeof
(
int
),
.
get
=
system_call_get
,
.
regset_
get
=
system_call_get
,
.
set
=
system_call_set
,
.
set
=
system_call_set
,
},
},
};
};
...
...
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