mirror of
https://github.com/checkpoint-restore/criu
synced 2025-08-22 01:51:51 +00:00
Run 'make indent' on header files
Acked-by: Mike Rapoport <rppt@linux.ibm.com> Signed-off-by: Adrian Reber <areber@redhat.com>
This commit is contained in:
parent
93dd984ca0
commit
70833bcf29
@ -1,4 +1,8 @@
|
||||
#ifndef __COMPEL_SYSCALL_H__
|
||||
#define __COMPEL_SYSCALL_H__
|
||||
#define __NR(syscall, compat) ({ (void)compat; __NR_##syscall; })
|
||||
#define __NR(syscall, compat) \
|
||||
({ \
|
||||
(void)compat; \
|
||||
__NR_##syscall; \
|
||||
})
|
||||
#endif
|
||||
|
@ -1,6 +1,7 @@
|
||||
#ifndef UAPI_COMPEL_ASM_CPU_H__
|
||||
#define UAPI_COMPEL_ASM_CPU_H__
|
||||
|
||||
typedef struct { } compel_cpuinfo_t;
|
||||
typedef struct {
|
||||
} compel_cpuinfo_t;
|
||||
|
||||
#endif /* UAPI_COMPEL_ASM_CPU_H__ */
|
||||
|
@ -32,6 +32,10 @@ typedef struct user_fpsimd_state user_fpregs_struct_t;
|
||||
|
||||
#define ARCH_SI_TRAP TRAP_BRKPT
|
||||
|
||||
#define __NR(syscall, compat) ({ (void)compat; __NR_##syscall; })
|
||||
#define __NR(syscall, compat) \
|
||||
({ \
|
||||
(void)compat; \
|
||||
__NR_##syscall; \
|
||||
})
|
||||
|
||||
#endif /* UAPI_COMPEL_ASM_TYPES_H__ */
|
||||
|
@ -32,6 +32,7 @@ struct rt_sigframe {
|
||||
uint64_t lr;
|
||||
};
|
||||
|
||||
/* clang-format off */
|
||||
#define ARCH_RT_SIGRETURN(new_sp, rt_sigframe) \
|
||||
asm volatile( \
|
||||
"mov sp, %0 \n" \
|
||||
@ -40,6 +41,7 @@ struct rt_sigframe {
|
||||
: \
|
||||
: "r"(new_sp) \
|
||||
: "x8", "memory")
|
||||
/* clang-format on */
|
||||
|
||||
/* cr_sigcontext is copied from arch/arm64/include/uapi/asm/sigcontext.h */
|
||||
struct cr_sigcontext {
|
||||
@ -61,9 +63,7 @@ struct cr_sigcontext {
|
||||
#define RT_SIGFRAME_FPU(rt_sigframe) (&RT_SIGFRAME_AUX_CONTEXT(rt_sigframe)->fpsimd)
|
||||
#define RT_SIGFRAME_OFFSET(rt_sigframe) 0
|
||||
|
||||
#define rt_sigframe_erase_sigset(sigframe) \
|
||||
memset(&sigframe->uc.uc_sigmask, 0, sizeof(k_rtsigset_t))
|
||||
#define rt_sigframe_copy_sigset(sigframe, from) \
|
||||
memcpy(&sigframe->uc.uc_sigmask, from, sizeof(k_rtsigset_t))
|
||||
#define rt_sigframe_erase_sigset(sigframe) memset(&sigframe->uc.uc_sigmask, 0, sizeof(k_rtsigset_t))
|
||||
#define rt_sigframe_copy_sigset(sigframe, from) memcpy(&sigframe->uc.uc_sigmask, from, sizeof(k_rtsigset_t))
|
||||
|
||||
#endif /* UAPI_COMPEL_ASM_SIGFRAME_H__ */
|
||||
|
@ -1,4 +1,8 @@
|
||||
#ifndef __COMPEL_SYSCALL_H__
|
||||
#define __COMPEL_SYSCALL_H__
|
||||
#define __NR(syscall, compat) ({ (void)compat; __NR_##syscall; })
|
||||
#define __NR(syscall, compat) \
|
||||
({ \
|
||||
(void)compat; \
|
||||
__NR_##syscall; \
|
||||
})
|
||||
#endif
|
||||
|
@ -1,6 +1,7 @@
|
||||
#ifndef UAPI_COMPEL_ASM_CPU_H__
|
||||
#define UAPI_COMPEL_ASM_CPU_H__
|
||||
|
||||
typedef struct { } compel_cpuinfo_t;
|
||||
typedef struct {
|
||||
} compel_cpuinfo_t;
|
||||
|
||||
#endif /* UAPI_COMPEL_ASM_CPU_H__ */
|
||||
|
@ -43,7 +43,6 @@ typedef struct user_vfp user_fpregs_struct_t;
|
||||
#define ARM_r0 uregs[0]
|
||||
#define ARM_ORIG_r0 uregs[17]
|
||||
|
||||
|
||||
/* Copied from arch/arm/include/asm/user.h */
|
||||
|
||||
struct user_vfp {
|
||||
@ -66,6 +65,10 @@ struct user_vfp_exc {
|
||||
|
||||
#define ARCH_SI_TRAP TRAP_BRKPT
|
||||
|
||||
#define __NR(syscall, compat) ({ (void)compat; __NR_##syscall; })
|
||||
#define __NR(syscall, compat) \
|
||||
({ \
|
||||
(void)compat; \
|
||||
__NR_##syscall; \
|
||||
})
|
||||
|
||||
#endif /* UAPI_COMPEL_ASM_TYPES_H__ */
|
||||
|
@ -65,7 +65,7 @@ struct rt_sigframe {
|
||||
struct sigframe sig;
|
||||
};
|
||||
|
||||
|
||||
/* clang-format off */
|
||||
#define ARCH_RT_SIGRETURN(new_sp, rt_sigframe) \
|
||||
asm volatile( \
|
||||
"mov sp, %0 \n" \
|
||||
@ -74,6 +74,7 @@ struct rt_sigframe {
|
||||
: \
|
||||
: "r"(new_sp) \
|
||||
: "memory")
|
||||
/* clang-format on */
|
||||
|
||||
#define RT_SIGFRAME_UC(rt_sigframe) (&rt_sigframe->sig.uc)
|
||||
#define RT_SIGFRAME_REGIP(rt_sigframe) (rt_sigframe)->sig.uc.uc_mcontext.arm_ip
|
||||
@ -82,9 +83,7 @@ struct rt_sigframe {
|
||||
#define RT_SIGFRAME_FPU(rt_sigframe) (&RT_SIGFRAME_AUX_SIGFRAME(rt_sigframe)->vfp)
|
||||
#define RT_SIGFRAME_OFFSET(rt_sigframe) 0
|
||||
|
||||
#define rt_sigframe_erase_sigset(sigframe) \
|
||||
memset(&sigframe->sig.uc.uc_sigmask, 0, sizeof(k_rtsigset_t))
|
||||
#define rt_sigframe_copy_sigset(sigframe, from) \
|
||||
memcpy(&sigframe->sig.uc.uc_sigmask, from, sizeof(k_rtsigset_t))
|
||||
#define rt_sigframe_erase_sigset(sigframe) memset(&sigframe->sig.uc.uc_sigmask, 0, sizeof(k_rtsigset_t))
|
||||
#define rt_sigframe_copy_sigset(sigframe, from) memcpy(&sigframe->sig.uc.uc_sigmask, from, sizeof(k_rtsigset_t))
|
||||
|
||||
#endif /* UAPI_COMPEL_ASM_SIGFRAME_H__ */
|
||||
|
@ -9,8 +9,7 @@
|
||||
|
||||
#include <errno.h>
|
||||
|
||||
#define sys_recv(sockfd, ubuf, size, flags) \
|
||||
sys_recvfrom(sockfd, ubuf, size, flags, NULL, NULL)
|
||||
#define sys_recv(sockfd, ubuf, size, flags) sys_recvfrom(sockfd, ubuf, size, flags, NULL, NULL)
|
||||
|
||||
typedef struct prologue_init_args {
|
||||
struct sockaddr_un ctl_sock_addr;
|
||||
|
@ -29,37 +29,25 @@ struct La_mips_64_regs;
|
||||
struct La_mips_64_retval;
|
||||
|
||||
#define ARCH_PLTENTER_MEMBERS \
|
||||
Elf32_Addr (*mips_o32_gnu_pltenter) (Elf32_Sym *, unsigned int, \
|
||||
uintptr_t *, uintptr_t *, \
|
||||
struct La_mips_32_regs *, \
|
||||
unsigned int *, const char *name, \
|
||||
Elf32_Addr (*mips_o32_gnu_pltenter)(Elf32_Sym *, unsigned int, uintptr_t *, uintptr_t *, \
|
||||
struct La_mips_32_regs *, unsigned int *, const char *name, \
|
||||
long int *framesizep); \
|
||||
Elf32_Addr (*mips_n32_gnu_pltenter) (Elf32_Sym *, unsigned int, \
|
||||
uintptr_t *, uintptr_t *, \
|
||||
struct La_mips_64_regs *, \
|
||||
unsigned int *, const char *name, \
|
||||
Elf32_Addr (*mips_n32_gnu_pltenter)(Elf32_Sym *, unsigned int, uintptr_t *, uintptr_t *, \
|
||||
struct La_mips_64_regs *, unsigned int *, const char *name, \
|
||||
long int *framesizep); \
|
||||
Elf64_Addr (*mips_n64_gnu_pltenter) (Elf64_Sym *, unsigned int, \
|
||||
uintptr_t *, uintptr_t *, \
|
||||
struct La_mips_64_regs *, \
|
||||
unsigned int *, const char *name, \
|
||||
Elf64_Addr (*mips_n64_gnu_pltenter)(Elf64_Sym *, unsigned int, uintptr_t *, uintptr_t *, \
|
||||
struct La_mips_64_regs *, unsigned int *, const char *name, \
|
||||
long int *framesizep);
|
||||
|
||||
#define ARCH_PLTEXIT_MEMBERS \
|
||||
unsigned int (*mips_o32_gnu_pltexit) (Elf32_Sym *, unsigned int, \
|
||||
uintptr_t *, uintptr_t *, \
|
||||
const struct La_mips_32_regs *, \
|
||||
struct La_mips_32_retval *, \
|
||||
unsigned int (*mips_o32_gnu_pltexit)(Elf32_Sym *, unsigned int, uintptr_t *, uintptr_t *, \
|
||||
const struct La_mips_32_regs *, struct La_mips_32_retval *, \
|
||||
const char *); \
|
||||
unsigned int (*mips_n32_gnu_pltexit) (Elf32_Sym *, unsigned int, \
|
||||
uintptr_t *, uintptr_t *, \
|
||||
const struct La_mips_64_regs *, \
|
||||
struct La_mips_64_retval *, \
|
||||
unsigned int (*mips_n32_gnu_pltexit)(Elf32_Sym *, unsigned int, uintptr_t *, uintptr_t *, \
|
||||
const struct La_mips_64_regs *, struct La_mips_64_retval *, \
|
||||
const char *); \
|
||||
unsigned int (*mips_n64_gnu_pltexit) (Elf64_Sym *, unsigned int, \
|
||||
uintptr_t *, uintptr_t *, \
|
||||
const struct La_mips_64_regs *, \
|
||||
struct La_mips_64_retval *, \
|
||||
unsigned int (*mips_n64_gnu_pltexit)(Elf64_Sym *, unsigned int, uintptr_t *, uintptr_t *, \
|
||||
const struct La_mips_64_regs *, struct La_mips_64_retval *, \
|
||||
const char *);
|
||||
|
||||
/* The MIPS ABI specifies that the dynamic section has to be read-only. */
|
||||
@ -80,8 +68,7 @@ struct La_mips_64_retval;
|
||||
|
||||
/* An entry in a 64 bit SHT_REL section. */
|
||||
|
||||
typedef struct
|
||||
{
|
||||
typedef struct {
|
||||
Elf32_Word r_sym; /* Symbol index */
|
||||
unsigned char r_ssym; /* Special symbol for 2nd relocation */
|
||||
unsigned char r_type3; /* 3rd relocation type */
|
||||
@ -89,45 +76,35 @@ typedef struct
|
||||
unsigned char r_type1; /* 1st relocation type */
|
||||
} _Elf64_Mips_R_Info;
|
||||
|
||||
typedef union
|
||||
{
|
||||
typedef union {
|
||||
Elf64_Xword r_info_number;
|
||||
_Elf64_Mips_R_Info r_info_fields;
|
||||
} _Elf64_Mips_R_Info_union;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
typedef struct {
|
||||
Elf64_Addr r_offset; /* Address */
|
||||
_Elf64_Mips_R_Info_union r_info; /* Relocation type and symbol index */
|
||||
} Elf64_Mips_Rel;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
typedef struct {
|
||||
Elf64_Addr r_offset; /* Address */
|
||||
_Elf64_Mips_R_Info_union r_info; /* Relocation type and symbol index */
|
||||
Elf64_Sxword r_addend; /* Addend */
|
||||
} Elf64_Mips_Rela;
|
||||
|
||||
#define ELF64_MIPS_R_SYM(i) \
|
||||
((__extension__ (_Elf64_Mips_R_Info_union)(i)).r_info_fields.r_sym)
|
||||
#define ELF64_MIPS_R_SYM(i) ((__extension__(_Elf64_Mips_R_Info_union)(i)).r_info_fields.r_sym)
|
||||
|
||||
#define ELF64_MIPS_R_TYPE(i) \
|
||||
(((_Elf64_Mips_R_Info_union)(i)).r_info_fields.r_type1 \
|
||||
| ((Elf32_Word)(__extension__ (_Elf64_Mips_R_Info_union)(i) \
|
||||
).r_info_fields.r_type2 << 8) \
|
||||
| ((Elf32_Word)(__extension__ (_Elf64_Mips_R_Info_union)(i) \
|
||||
).r_info_fields.r_type3 << 16) \
|
||||
| ((Elf32_Word)(__extension__ (_Elf64_Mips_R_Info_union)(i) \
|
||||
).r_info_fields.r_ssym << 24))
|
||||
(((_Elf64_Mips_R_Info_union)(i)).r_info_fields.r_type1 | \
|
||||
((Elf32_Word)(__extension__(_Elf64_Mips_R_Info_union)(i)).r_info_fields.r_type2 << 8) | \
|
||||
((Elf32_Word)(__extension__(_Elf64_Mips_R_Info_union)(i)).r_info_fields.r_type3 << 16) | \
|
||||
((Elf32_Word)(__extension__(_Elf64_Mips_R_Info_union)(i)).r_info_fields.r_ssym << 24))
|
||||
|
||||
#define ELF64_MIPS_R_INFO(sym, type) \
|
||||
(__extension__ (_Elf64_Mips_R_Info_union) \
|
||||
(__extension__ (_Elf64_Mips_R_Info) \
|
||||
{ (sym), ELF64_MIPS_R_SSYM (type), \
|
||||
ELF64_MIPS_R_TYPE3 (type), \
|
||||
ELF64_MIPS_R_TYPE2 (type), \
|
||||
ELF64_MIPS_R_TYPE1 (type) \
|
||||
}).r_info_number)
|
||||
(__extension__(_Elf64_Mips_R_Info_union)( \
|
||||
__extension__(_Elf64_Mips_R_Info){ (sym), ELF64_MIPS_R_SSYM(type), ELF64_MIPS_R_TYPE3(type), \
|
||||
ELF64_MIPS_R_TYPE2(type), ELF64_MIPS_R_TYPE1(type) }) \
|
||||
.r_info_number)
|
||||
|
||||
/*
|
||||
* These macros decompose the value returned by ELF64_MIPS_R_TYPE, and
|
||||
@ -139,10 +116,7 @@ typedef struct
|
||||
#define ELF64_MIPS_R_TYPE2(i) (((i) >> 8) & 0xff)
|
||||
#define ELF64_MIPS_R_TYPE1(i) ((i)&0xff)
|
||||
#define ELF64_MIPS_R_TYPEENC(type1, type2, type3, ssym) \
|
||||
((type1) \
|
||||
| ((Elf32_Word)(type2) << 8) \
|
||||
| ((Elf32_Word)(type3) << 16) \
|
||||
| ((Elf32_Word)(ssym) << 24))
|
||||
((type1) | ((Elf32_Word)(type2) << 8) | ((Elf32_Word)(type3) << 16) | ((Elf32_Word)(ssym) << 24))
|
||||
|
||||
#undef ELF64_R_SYM
|
||||
#define ELF64_R_SYM(i) ELF64_MIPS_R_SYM(i)
|
||||
|
@ -1,5 +1,6 @@
|
||||
#ifndef __CR_ASM_CPU_H__
|
||||
#define __CR_ASM_CPU_H__
|
||||
|
||||
typedef struct { } compel_cpuinfo_t;
|
||||
typedef struct {
|
||||
} compel_cpuinfo_t;
|
||||
#endif /* __CR_ASM_CPU_H__ */
|
||||
|
@ -35,7 +35,6 @@ typedef struct {
|
||||
__u32 fpu_fcr31;
|
||||
__u32 fpu_id;
|
||||
|
||||
|
||||
} user_fpregs_struct_t;
|
||||
|
||||
#define MIPS_a0 regs[4] //arguments a0-a3
|
||||
@ -45,7 +44,6 @@ typedef struct {
|
||||
#define MIPS_sp regs[29]
|
||||
#define MIPS_ra regs[31]
|
||||
|
||||
|
||||
#define NATIVE_MAGIC 0x0A
|
||||
#define COMPAT_MAGIC 0x0C
|
||||
static inline bool user_regs_native(user_regs_struct_t *pregs)
|
||||
|
@ -13,7 +13,6 @@
|
||||
/* sigcontext defined in /usr/include/asm/sigcontext.h*/
|
||||
#define rt_sigcontext sigcontext
|
||||
|
||||
|
||||
#include <compel/sigframe-common.h>
|
||||
|
||||
/* refer to linux-3.10/include/uapi/asm-generic/ucontext.h */
|
||||
@ -33,17 +32,15 @@ struct rt_sigframe {
|
||||
struct k_ucontext rs_uc;
|
||||
};
|
||||
|
||||
|
||||
#define RT_SIGFRAME_UC(rt_sigframe) (&rt_sigframe->rs_uc)
|
||||
#define RT_SIGFRAME_UC_SIGMASK(rt_sigframe) ((k_rtsigset_t *)(void *)&rt_sigframe->rs_uc.uc_sigmask)
|
||||
#define RT_SIGFRAME_REGIP(rt_sigframe) ((long unsigned int)0x00)
|
||||
#define RT_SIGFRAME_FPU(rt_sigframe)
|
||||
#define RT_SIGFRAME_HAS_FPU(rt_sigframe) 1
|
||||
|
||||
|
||||
#define RT_SIGFRAME_OFFSET(rt_sigframe) 0
|
||||
|
||||
|
||||
/* clang-format off */
|
||||
#define ARCH_RT_SIGRETURN(new_sp, rt_sigframe) \
|
||||
asm volatile( \
|
||||
"move $29, %0 \n" \
|
||||
@ -52,12 +49,10 @@ struct rt_sigframe {
|
||||
: \
|
||||
: "r"(new_sp) \
|
||||
: "$2","memory")
|
||||
/* clang-format on */
|
||||
|
||||
int sigreturn_prep_fpu_frame(struct rt_sigframe *sigframe,
|
||||
struct rt_sigframe *rsigframe);
|
||||
int sigreturn_prep_fpu_frame(struct rt_sigframe *sigframe, struct rt_sigframe *rsigframe);
|
||||
|
||||
#define rt_sigframe_erase_sigset(sigframe) \
|
||||
memset(&sigframe->rs_uc.uc_sigmask, 0, sizeof(k_rtsigset_t))
|
||||
#define rt_sigframe_copy_sigset(sigframe, from) \
|
||||
memcpy(&sigframe->rs_uc.uc_sigmask, from, sizeof(k_rtsigset_t))
|
||||
#define rt_sigframe_erase_sigset(sigframe) memset(&sigframe->rs_uc.uc_sigmask, 0, sizeof(k_rtsigset_t))
|
||||
#define rt_sigframe_copy_sigset(sigframe, from) memcpy(&sigframe->rs_uc.uc_sigmask, from, sizeof(k_rtsigset_t))
|
||||
#endif /* UAPI_COMPEL_ASM_SIGFRAME_H__ */
|
||||
|
@ -9,7 +9,6 @@
|
||||
#ifndef _UAPI_ASM_SIGINFO_H
|
||||
#define _UAPI_ASM_SIGINFO_H
|
||||
|
||||
|
||||
#define __ARCH_SIGEV_PREAMBLE_SIZE (sizeof(long) + 2 * sizeof(int))
|
||||
#undef __ARCH_SI_TRAPNO /* exception code needs to fill this ... */
|
||||
|
||||
|
@ -1,4 +1,8 @@
|
||||
#ifndef __COMPEL_SYSCALL_H__
|
||||
#define __COMPEL_SYSCALL_H__
|
||||
#define __NR(syscall, compat) ({ (void)compat; __NR_##syscall; })
|
||||
#define __NR(syscall, compat) \
|
||||
({ \
|
||||
(void)compat; \
|
||||
__NR_##syscall; \
|
||||
})
|
||||
#endif
|
||||
|
@ -81,7 +81,11 @@ typedef struct {
|
||||
|
||||
#define ARCH_SI_TRAP TRAP_BRKPT
|
||||
|
||||
#define __NR(syscall, compat) ({ (void)compat; __NR_##syscall; })
|
||||
#define __NR(syscall, compat) \
|
||||
({ \
|
||||
(void)compat; \
|
||||
__NR_##syscall; \
|
||||
})
|
||||
|
||||
#define __compel_arch_fetch_thread_area(tid, th) 0
|
||||
#define compel_arch_fetch_thread_area(tctl) 0
|
||||
|
@ -43,6 +43,7 @@ struct rt_sigframe {
|
||||
char abigap[USER_REDZONE_SIZE];
|
||||
} __attribute__((aligned(16)));
|
||||
|
||||
/* clang-format off */
|
||||
#define ARCH_RT_SIGRETURN(new_sp, rt_sigframe) \
|
||||
asm volatile( \
|
||||
"mr 1, %0 \n" \
|
||||
@ -51,6 +52,7 @@ struct rt_sigframe {
|
||||
: \
|
||||
: "r"(new_sp) \
|
||||
: "memory")
|
||||
/* clang-format on */
|
||||
|
||||
#if _CALL_ELF != 2
|
||||
#error Only supporting ABIv2.
|
||||
@ -63,10 +65,8 @@ struct rt_sigframe {
|
||||
#define RT_SIGFRAME_HAS_FPU(rt_sigframe) (1)
|
||||
#define RT_SIGFRAME_FPU(rt_sigframe) (&(rt_sigframe)->uc.uc_mcontext)
|
||||
|
||||
#define rt_sigframe_erase_sigset(sigframe) \
|
||||
memset(&sigframe->uc.uc_sigmask, 0, sizeof(k_rtsigset_t))
|
||||
#define rt_sigframe_copy_sigset(sigframe, from) \
|
||||
memcpy(&sigframe->uc.uc_sigmask, from, sizeof(k_rtsigset_t))
|
||||
#define rt_sigframe_erase_sigset(sigframe) memset(&sigframe->uc.uc_sigmask, 0, sizeof(k_rtsigset_t))
|
||||
#define rt_sigframe_copy_sigset(sigframe, from) memcpy(&sigframe->uc.uc_sigmask, from, sizeof(k_rtsigset_t))
|
||||
|
||||
#define MSR_TMA (1UL << 34) /* bit 29 Trans Mem state: Transactional */
|
||||
#define MSR_TMS (1UL << 33) /* bit 30 Trans Mem state: Suspended */
|
||||
|
@ -1,8 +1,7 @@
|
||||
#ifndef __COMPEL_SYSCALL_H__
|
||||
#define __COMPEL_SYSCALL_H__
|
||||
|
||||
unsigned long sys_mmap(void *addr, unsigned long len, unsigned long prot,
|
||||
unsigned long flags, unsigned long fd,
|
||||
unsigned long sys_mmap(void *addr, unsigned long len, unsigned long prot, unsigned long flags, unsigned long fd,
|
||||
unsigned long offset);
|
||||
|
||||
#endif
|
||||
|
@ -73,7 +73,11 @@ typedef struct {
|
||||
|
||||
#define user_regs_native(pregs) true
|
||||
|
||||
#define __NR(syscall, compat) ({ (void)compat; __NR_##syscall; })
|
||||
#define __NR(syscall, compat) \
|
||||
({ \
|
||||
(void)compat; \
|
||||
__NR_##syscall; \
|
||||
})
|
||||
|
||||
struct mmap_arg_struct {
|
||||
unsigned long addr;
|
||||
|
@ -59,6 +59,7 @@ struct rt_sigframe {
|
||||
/*
|
||||
* Do rt_sigreturn SVC
|
||||
*/
|
||||
/* clang-format off */
|
||||
#define ARCH_RT_SIGRETURN(new_sp, rt_sigframe) \
|
||||
asm volatile( \
|
||||
"lgr %%r15,%0\n" \
|
||||
@ -67,14 +68,13 @@ struct rt_sigframe {
|
||||
: \
|
||||
: "d" (new_sp) \
|
||||
: "memory")
|
||||
/* clang-format on */
|
||||
|
||||
#define RT_SIGFRAME_UC(rt_sigframe) (&rt_sigframe->uc)
|
||||
#define RT_SIGFRAME_REGIP(rt_sigframe) (rt_sigframe)->uc.uc_mcontext.regs.psw.addr
|
||||
#define RT_SIGFRAME_HAS_FPU(rt_sigframe) (1)
|
||||
|
||||
#define rt_sigframe_erase_sigset(sigframe) \
|
||||
memset(&sigframe->uc.uc_sigmask, 0, sizeof(k_rtsigset_t))
|
||||
#define rt_sigframe_copy_sigset(sigframe, from) \
|
||||
memcpy(&sigframe->uc.uc_sigmask, from, sizeof(k_rtsigset_t))
|
||||
#define rt_sigframe_erase_sigset(sigframe) memset(&sigframe->uc.uc_sigmask, 0, sizeof(k_rtsigset_t))
|
||||
#define rt_sigframe_copy_sigset(sigframe, from) memcpy(&sigframe->uc.uc_sigmask, from, sizeof(k_rtsigset_t))
|
||||
|
||||
#endif /* UAPI_COMPEL_ASM_SIGFRAME_H__ */
|
||||
|
@ -9,8 +9,7 @@
|
||||
|
||||
#include <errno.h>
|
||||
|
||||
#define sys_recv(sockfd, ubuf, size, flags) \
|
||||
sys_recvfrom(sockfd, ubuf, size, flags, NULL, NULL)
|
||||
#define sys_recv(sockfd, ubuf, size, flags) sys_recvfrom(sockfd, ubuf, size, flags, NULL, NULL)
|
||||
|
||||
typedef struct prologue_init_args {
|
||||
struct sockaddr_un ctl_sock_addr;
|
||||
|
@ -1,31 +1,21 @@
|
||||
#ifndef __COMPEL_ASM_CPU_H__
|
||||
#define __COMPEL_ASM_CPU_H__
|
||||
|
||||
static inline void native_cpuid(unsigned int *eax, unsigned int *ebx,
|
||||
unsigned int *ecx, unsigned int *edx)
|
||||
static inline void native_cpuid(unsigned int *eax, unsigned int *ebx, unsigned int *ecx, unsigned int *edx)
|
||||
{
|
||||
/* ecx is often an input as well as an output. */
|
||||
asm volatile("cpuid"
|
||||
: "=a" (*eax),
|
||||
"=b" (*ebx),
|
||||
"=c" (*ecx),
|
||||
"=d" (*edx)
|
||||
: "0" (*eax), "2" (*ecx)
|
||||
: "memory");
|
||||
asm volatile("cpuid" : "=a"(*eax), "=b"(*ebx), "=c"(*ecx), "=d"(*edx) : "0"(*eax), "2"(*ecx) : "memory");
|
||||
}
|
||||
|
||||
static inline void cpuid(unsigned int op,
|
||||
unsigned int *eax, unsigned int *ebx,
|
||||
unsigned int *ecx, unsigned int *edx)
|
||||
static inline void cpuid(unsigned int op, unsigned int *eax, unsigned int *ebx, unsigned int *ecx, unsigned int *edx)
|
||||
{
|
||||
*eax = op;
|
||||
*ecx = 0;
|
||||
native_cpuid(eax, ebx, ecx, edx);
|
||||
}
|
||||
|
||||
static inline void cpuid_count(unsigned int op, int count,
|
||||
unsigned int *eax, unsigned int *ebx,
|
||||
unsigned int *ecx, unsigned int *edx)
|
||||
static inline void cpuid_count(unsigned int op, int count, unsigned int *eax, unsigned int *ebx, unsigned int *ecx,
|
||||
unsigned int *edx)
|
||||
{
|
||||
*eax = op;
|
||||
*ecx = count;
|
||||
|
@ -77,11 +77,8 @@ enum xfeature {
|
||||
|
||||
/* All currently supported features */
|
||||
#define XFEATURE_MASK_USER \
|
||||
(XFEATURE_MASK_FP | XFEATURE_MASK_SSE | \
|
||||
XFEATURE_MASK_YMM | XFEATURE_MASK_OPMASK | \
|
||||
XFEATURE_MASK_ZMM_Hi256 | XFEATURE_MASK_Hi16_ZMM | \
|
||||
XFEATURE_MASK_PKRU | XFEATURE_MASK_BNDREGS | \
|
||||
XFEATURE_MASK_BNDCSR)
|
||||
(XFEATURE_MASK_FP | XFEATURE_MASK_SSE | XFEATURE_MASK_YMM | XFEATURE_MASK_OPMASK | XFEATURE_MASK_ZMM_Hi256 | \
|
||||
XFEATURE_MASK_Hi16_ZMM | XFEATURE_MASK_PKRU | XFEATURE_MASK_BNDREGS | XFEATURE_MASK_BNDCSR)
|
||||
|
||||
struct fpx_sw_bytes {
|
||||
uint32_t magic1;
|
||||
@ -319,7 +316,6 @@ typedef struct {
|
||||
uint8_t has_fpu;
|
||||
} fpu_state_t;
|
||||
|
||||
extern void compel_convert_from_fxsr(struct user_i387_ia32_struct *env,
|
||||
struct i387_fxsave_struct *fxsave);
|
||||
extern void compel_convert_from_fxsr(struct user_i387_ia32_struct *env, struct i387_fxsave_struct *fxsave);
|
||||
|
||||
#endif /* __CR_ASM_FPU_H__ */
|
||||
|
@ -103,15 +103,10 @@ static inline bool user_regs_native(user_regs_struct_t *pregs)
|
||||
return pregs->__is_native == NATIVE_MAGIC;
|
||||
}
|
||||
|
||||
#define get_user_reg(pregs, name) \
|
||||
((user_regs_native(pregs)) ? \
|
||||
((pregs)->native.name) : \
|
||||
((pregs)->compat.name))
|
||||
#define get_user_reg(pregs, name) ((user_regs_native(pregs)) ? ((pregs)->native.name) : ((pregs)->compat.name))
|
||||
|
||||
#define set_user_reg(pregs, name, val) \
|
||||
((user_regs_native(pregs)) ? \
|
||||
((pregs)->native.name = (val)) : \
|
||||
((pregs)->compat.name = (val)))
|
||||
((user_regs_native(pregs)) ? ((pregs)->native.name = (val)) : ((pregs)->compat.name = (val)))
|
||||
|
||||
#if 0
|
||||
typedef struct {
|
||||
|
@ -137,8 +137,7 @@ struct rt_sigframe {
|
||||
bool is_native;
|
||||
};
|
||||
|
||||
static inline
|
||||
void rt_sigframe_copy_sigset(struct rt_sigframe *to, k_rtsigset_t *from)
|
||||
static inline void rt_sigframe_copy_sigset(struct rt_sigframe *to, k_rtsigset_t *from)
|
||||
{
|
||||
size_t sz = sizeof(k_rtsigset_t);
|
||||
|
||||
@ -149,8 +148,7 @@ void rt_sigframe_copy_sigset(struct rt_sigframe *to, k_rtsigset_t *from)
|
||||
memcpy(&to->compat.uc.uc_sigmask, from, sz);
|
||||
}
|
||||
|
||||
static inline
|
||||
void rt_sigframe_erase_sigset(struct rt_sigframe *sigframe)
|
||||
static inline void rt_sigframe_erase_sigset(struct rt_sigframe *sigframe)
|
||||
{
|
||||
size_t sz = sizeof(k_rtsigset_t);
|
||||
|
||||
@ -161,14 +159,10 @@ void rt_sigframe_erase_sigset(struct rt_sigframe *sigframe)
|
||||
}
|
||||
|
||||
#define RT_SIGFRAME_REGIP(rt_sigframe) \
|
||||
((rt_sigframe->is_native) ? \
|
||||
(rt_sigframe)->native.uc.uc_mcontext.rip : \
|
||||
(rt_sigframe)->compat.uc.uc_mcontext.ip)
|
||||
((rt_sigframe->is_native) ? (rt_sigframe)->native.uc.uc_mcontext.rip : (rt_sigframe)->compat.uc.uc_mcontext.ip)
|
||||
|
||||
#define RT_SIGFRAME_FPU(rt_sigframe) \
|
||||
((rt_sigframe->is_native) ? \
|
||||
(&(rt_sigframe)->native.fpu_state) : \
|
||||
(&(rt_sigframe)->compat.fpu_state))
|
||||
((rt_sigframe->is_native) ? (&(rt_sigframe)->native.fpu_state) : (&(rt_sigframe)->compat.fpu_state))
|
||||
|
||||
#define RT_SIGFRAME_HAS_FPU(rt_sigframe) (RT_SIGFRAME_FPU(rt_sigframe)->has_fpu)
|
||||
|
||||
@ -182,6 +176,7 @@ void rt_sigframe_erase_sigset(struct rt_sigframe *sigframe)
|
||||
|
||||
#define USER32_CS 0x23
|
||||
|
||||
/* clang-format off */
|
||||
#define ARCH_RT_SIGRETURN_NATIVE(new_sp) \
|
||||
asm volatile( \
|
||||
"movq %0, %%rax \n" \
|
||||
@ -215,6 +210,7 @@ do { \
|
||||
else \
|
||||
ARCH_RT_SIGRETURN_COMPAT(new_sp); \
|
||||
} while (0)
|
||||
/* clang-format off */
|
||||
|
||||
int sigreturn_prep_fpu_frame(struct rt_sigframe *sigframe,
|
||||
struct rt_sigframe *rsigframe);
|
||||
|
@ -58,9 +58,8 @@ struct ctl_msg;
|
||||
int parasite_wait_ack(int sockfd, unsigned int cmd, struct ctl_msg *m);
|
||||
|
||||
extern void parasite_setup_regs(unsigned long new_ip, void *stack, user_regs_struct_t *regs);
|
||||
extern void *remote_mmap(struct parasite_ctl *ctl,
|
||||
void *addr, size_t length, int prot,
|
||||
int flags, int fd, off_t offset);
|
||||
extern void *remote_mmap(struct parasite_ctl *ctl, void *addr, size_t length, int prot, int flags, int fd,
|
||||
off_t offset);
|
||||
extern bool arch_can_dump_task(struct parasite_ctl *ctl);
|
||||
/*
|
||||
* @regs: general purpose registers
|
||||
@ -70,16 +69,12 @@ extern bool arch_can_dump_task(struct parasite_ctl *ctl);
|
||||
* @flags: see INFECT_* in infect_ctx::flags
|
||||
* @pid: mystery
|
||||
*/
|
||||
extern int compel_get_task_regs(pid_t pid, user_regs_struct_t *regs,
|
||||
user_fpregs_struct_t *ext_regs, save_regs_t save,
|
||||
extern int compel_get_task_regs(pid_t pid, user_regs_struct_t *regs, user_fpregs_struct_t *ext_regs, save_regs_t save,
|
||||
void *arg, unsigned long flags);
|
||||
extern int compel_set_task_ext_regs(pid_t pid, user_fpregs_struct_t *ext_regs);
|
||||
extern int arch_fetch_sas(struct parasite_ctl *ctl, struct rt_sigframe *s);
|
||||
extern int sigreturn_prep_regs_plain(struct rt_sigframe *sigframe,
|
||||
user_regs_struct_t *regs,
|
||||
extern int sigreturn_prep_regs_plain(struct rt_sigframe *sigframe, user_regs_struct_t *regs,
|
||||
user_fpregs_struct_t *fpregs);
|
||||
extern int sigreturn_prep_fpu_frame_plain(struct rt_sigframe *sigframe,
|
||||
struct rt_sigframe *rsigframe);
|
||||
extern int compel_execute_syscall(struct parasite_ctl *ctl,
|
||||
user_regs_struct_t *regs, const char *code_syscall);
|
||||
extern int sigreturn_prep_fpu_frame_plain(struct rt_sigframe *sigframe, struct rt_sigframe *rsigframe);
|
||||
extern int compel_execute_syscall(struct parasite_ctl *ctl, user_regs_struct_t *regs, const char *code_syscall);
|
||||
#endif
|
||||
|
@ -9,26 +9,18 @@
|
||||
|
||||
static inline int pr_quelled(unsigned int loglevel)
|
||||
{
|
||||
return compel_log_get_loglevel() < loglevel
|
||||
&& loglevel != COMPEL_LOG_MSG;
|
||||
return compel_log_get_loglevel() < loglevel && loglevel != COMPEL_LOG_MSG;
|
||||
}
|
||||
|
||||
extern void compel_print_on_level(unsigned int loglevel,
|
||||
const char *format, ...)
|
||||
extern void compel_print_on_level(unsigned int loglevel, const char *format, ...)
|
||||
__attribute__((__format__(__printf__, 2, 3)));
|
||||
|
||||
#define pr_msg(fmt, ...) \
|
||||
compel_print_on_level(COMPEL_LOG_MSG, \
|
||||
fmt, ##__VA_ARGS__)
|
||||
#define pr_msg(fmt, ...) compel_print_on_level(COMPEL_LOG_MSG, fmt, ##__VA_ARGS__)
|
||||
|
||||
#define pr_info(fmt, ...) \
|
||||
compel_print_on_level(COMPEL_LOG_INFO, \
|
||||
LOG_PREFIX fmt, ##__VA_ARGS__)
|
||||
#define pr_info(fmt, ...) compel_print_on_level(COMPEL_LOG_INFO, LOG_PREFIX fmt, ##__VA_ARGS__)
|
||||
|
||||
#define pr_err(fmt, ...) \
|
||||
compel_print_on_level(COMPEL_LOG_ERROR, \
|
||||
"Error (%s:%d): " LOG_PREFIX fmt, \
|
||||
__FILE__, __LINE__, ##__VA_ARGS__)
|
||||
compel_print_on_level(COMPEL_LOG_ERROR, "Error (%s:%d): " LOG_PREFIX fmt, __FILE__, __LINE__, ##__VA_ARGS__)
|
||||
|
||||
#define pr_err_once(fmt, ...) \
|
||||
do { \
|
||||
@ -40,9 +32,7 @@ extern void compel_print_on_level(unsigned int loglevel,
|
||||
} while (0)
|
||||
|
||||
#define pr_warn(fmt, ...) \
|
||||
compel_print_on_level(COMPEL_LOG_WARN, \
|
||||
"Warn (%s:%d): " LOG_PREFIX fmt, \
|
||||
__FILE__, __LINE__, ##__VA_ARGS__)
|
||||
compel_print_on_level(COMPEL_LOG_WARN, "Warn (%s:%d): " LOG_PREFIX fmt, __FILE__, __LINE__, ##__VA_ARGS__)
|
||||
|
||||
#define pr_warn_once(fmt, ...) \
|
||||
do { \
|
||||
@ -53,11 +43,8 @@ extern void compel_print_on_level(unsigned int loglevel,
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define pr_debug(fmt, ...) \
|
||||
compel_print_on_level(COMPEL_LOG_DEBUG, \
|
||||
LOG_PREFIX fmt, ##__VA_ARGS__)
|
||||
#define pr_debug(fmt, ...) compel_print_on_level(COMPEL_LOG_DEBUG, LOG_PREFIX fmt, ##__VA_ARGS__)
|
||||
|
||||
#define pr_perror(fmt, ...) \
|
||||
pr_err(fmt ": %m\n", ##__VA_ARGS__)
|
||||
#define pr_perror(fmt, ...) pr_err(fmt ": %m\n", ##__VA_ARGS__)
|
||||
|
||||
#endif /* COMPEL_LOG_H__ */
|
||||
|
@ -7,10 +7,16 @@ struct ctl_msg {
|
||||
};
|
||||
|
||||
#define ctl_msg_cmd(_cmd) \
|
||||
(struct ctl_msg){.cmd = _cmd, }
|
||||
(struct ctl_msg) \
|
||||
{ \
|
||||
.cmd = _cmd, \
|
||||
}
|
||||
|
||||
#define ctl_msg_ack(_cmd, _err) \
|
||||
(struct ctl_msg){.cmd = _cmd, .ack = _cmd, .err = _err, }
|
||||
(struct ctl_msg) \
|
||||
{ \
|
||||
.cmd = _cmd, .ack = _cmd, .err = _err, \
|
||||
}
|
||||
|
||||
/*
|
||||
* NOTE: each command's args should be arch-independed sized.
|
||||
|
@ -7,4 +7,3 @@ struct shmem_plugin_msg {
|
||||
};
|
||||
|
||||
#endif /* __COMPEL_PLUGIN_SHMEM_PRIV_H__ */
|
||||
|
||||
|
@ -15,5 +15,4 @@ extern int compel_rpc_sock(struct parasite_ctl *ctl);
|
||||
|
||||
#define PARASITE_USER_CMDS 64
|
||||
|
||||
|
||||
#endif
|
||||
|
@ -37,8 +37,7 @@ struct parasite_thread_ctl;
|
||||
|
||||
extern struct parasite_ctl __must_check *compel_prepare(int pid);
|
||||
extern struct parasite_ctl __must_check *compel_prepare_noctx(int pid);
|
||||
extern int __must_check compel_infect(struct parasite_ctl *ctl,
|
||||
unsigned long nr_threads, unsigned long args_size);
|
||||
extern int __must_check compel_infect(struct parasite_ctl *ctl, unsigned long nr_threads, unsigned long args_size);
|
||||
extern struct parasite_thread_ctl __must_check *compel_prepare_thread(struct parasite_ctl *ctl, int pid);
|
||||
extern void compel_release_thread(struct parasite_thread_ctl *);
|
||||
|
||||
@ -60,13 +59,8 @@ extern int __must_check compel_cure(struct parasite_ctl *ctl);
|
||||
extern void *compel_parasite_args_p(struct parasite_ctl *ctl);
|
||||
extern void *compel_parasite_args_s(struct parasite_ctl *ctl, unsigned long args_size);
|
||||
|
||||
extern int __must_check compel_syscall(struct parasite_ctl *ctl,
|
||||
int nr, long *ret,
|
||||
unsigned long arg1,
|
||||
unsigned long arg2,
|
||||
unsigned long arg3,
|
||||
unsigned long arg4,
|
||||
unsigned long arg5,
|
||||
extern int __must_check compel_syscall(struct parasite_ctl *ctl, int nr, long *ret, unsigned long arg1,
|
||||
unsigned long arg2, unsigned long arg3, unsigned long arg4, unsigned long arg5,
|
||||
unsigned long arg6);
|
||||
extern int __must_check compel_run_in_thread(struct parasite_thread_ctl *tctl, unsigned int cmd);
|
||||
extern int __must_check compel_run_at(struct parasite_ctl *ctl, unsigned long ip, user_regs_struct_t *ret_regs);
|
||||
@ -83,11 +77,9 @@ enum trace_flags {
|
||||
TRACE_EXIT,
|
||||
};
|
||||
|
||||
extern int __must_check compel_stop_on_syscall(int tasks, int sys_nr,
|
||||
int sys_nr_compat, enum trace_flags trace);
|
||||
extern int __must_check compel_stop_on_syscall(int tasks, int sys_nr, int sys_nr_compat, enum trace_flags trace);
|
||||
|
||||
extern int __must_check compel_stop_pie(pid_t pid, void *addr,
|
||||
enum trace_flags *tf, bool no_bp);
|
||||
extern int __must_check compel_stop_pie(pid_t pid, void *addr, enum trace_flags *tf, bool no_bp);
|
||||
|
||||
extern int __must_check compel_unmap(struct parasite_ctl *ctl, unsigned long addr);
|
||||
|
||||
@ -98,8 +90,7 @@ extern k_rtsigset_t *compel_thread_sigmask(struct parasite_thread_ctl *tctl);
|
||||
|
||||
struct rt_sigframe;
|
||||
|
||||
typedef int (*open_proc_fn)(int pid, int mode, const char *fmt, ...)
|
||||
__attribute__ ((__format__ (__printf__, 3, 4)));
|
||||
typedef int (*open_proc_fn)(int pid, int mode, const char *fmt, ...) __attribute__((__format__(__printf__, 3, 4)));
|
||||
typedef int (*save_regs_t)(void *, user_regs_struct_t *, user_fpregs_struct_t *);
|
||||
typedef int (*make_sigframe_t)(void *, struct rt_sigframe *, struct rt_sigframe *, k_rtsigset_t *);
|
||||
|
||||
|
@ -6,8 +6,7 @@
|
||||
* also by log functions in the std plugin.
|
||||
*/
|
||||
|
||||
enum __compel_log_levels
|
||||
{
|
||||
enum __compel_log_levels {
|
||||
COMPEL_LOG_MSG, /* Print message regardless of log level */
|
||||
COMPEL_LOG_ERROR, /* Errors only, when we're in trouble */
|
||||
COMPEL_LOG_WARN, /* Warnings */
|
||||
|
@ -12,9 +12,7 @@ typedef struct {
|
||||
void (*exit)(void);
|
||||
} plugin_init_t;
|
||||
|
||||
#define plugin_register(___desc) \
|
||||
static const plugin_init_t * const \
|
||||
___ptr__##___desc __init = &___desc;
|
||||
#define plugin_register(___desc) static const plugin_init_t *const ___ptr__##___desc __init = &___desc;
|
||||
|
||||
#define PLUGIN_REGISTER(___id, ___name, ___init, ___exit) \
|
||||
static const plugin_init_t __plugin_desc_##___id = { \
|
||||
|
@ -21,8 +21,7 @@ struct rt_sigframe;
|
||||
#define RESTORE_STACK_ALIGN(x, a) (((x) + (a)-1) & ~((a)-1))
|
||||
|
||||
/* sigframe should be aligned on 64 byte for x86 and 8 bytes for arm */
|
||||
#define RESTORE_STACK_SIGFRAME \
|
||||
RESTORE_STACK_ALIGN(sizeof(struct rt_sigframe) + SIGFRAME_MAX_OFFSET, 64)
|
||||
#define RESTORE_STACK_SIGFRAME RESTORE_STACK_ALIGN(sizeof(struct rt_sigframe) + SIGFRAME_MAX_OFFSET, 64)
|
||||
|
||||
#ifndef __ARCH_SI_PREAMBLE_SIZE
|
||||
#define __ARCH_SI_PREAMBLE_SIZE (3 * sizeof(int))
|
||||
@ -57,7 +56,6 @@ struct rt_ucontext {
|
||||
unsigned long uc_regspace[128] __attribute__((aligned(8)));
|
||||
};
|
||||
|
||||
extern int __must_check sigreturn_prep_fpu_frame(struct rt_sigframe *frame,
|
||||
struct rt_sigframe *rframe);
|
||||
extern int __must_check sigreturn_prep_fpu_frame(struct rt_sigframe *frame, struct rt_sigframe *rframe);
|
||||
|
||||
#endif /* UAPI_COMPEL_SIGFRAME_COMMON_H__ */
|
||||
|
@ -5,8 +5,7 @@
|
||||
* Task state, as returned by compel_wait_task()
|
||||
* and used in arguments to compel_resume_task().
|
||||
*/
|
||||
enum __compel_task_state
|
||||
{
|
||||
enum __compel_task_state {
|
||||
COMPEL_TASK_ALIVE = 0x01,
|
||||
COMPEL_TASK_DEAD = 0x02,
|
||||
COMPEL_TASK_STOPPED = 0x03,
|
||||
|
@ -10,12 +10,10 @@
|
||||
#define STDOUT_FILENO 1 /* Standard output. */
|
||||
#define STDERR_FILENO 2 /* Standard error output. */
|
||||
|
||||
|
||||
extern void std_dputc(int fd, char c);
|
||||
extern void std_dputs(int fd, const char *s);
|
||||
extern void std_vdprintf(int fd, const char *format, va_list args);
|
||||
extern void std_dprintf(int fd, const char *format, ...)
|
||||
__attribute__ ((__format__ (__printf__, 2, 3)));
|
||||
extern void std_dprintf(int fd, const char *format, ...) __attribute__((__format__(__printf__, 2, 3)));
|
||||
|
||||
#define std_printf(fmt, ...) std_dprintf(STDOUT_FILENO, fmt, ##__VA_ARGS__)
|
||||
#define std_puts(s) std_dputs(STDOUT_FILENO, s)
|
||||
|
@ -57,7 +57,6 @@ typedef int kernel_timer_t;
|
||||
|
||||
#include <compel/plugins/std/asm/syscall-types.h>
|
||||
|
||||
|
||||
extern long sys_preadv_raw(int fd, struct iovec *iov, unsigned long nr, unsigned long pos_l, unsigned long pos_h);
|
||||
|
||||
static inline long sys_preadv(int fd, struct iovec *iov, unsigned long nr, off_t off)
|
||||
|
@ -5,7 +5,6 @@ extern int save_task_regs(void *, user_regs_struct_t *, user_fpregs_struct_t *);
|
||||
extern int arch_alloc_thread_info(CoreEntry *core);
|
||||
extern void arch_free_thread_info(CoreEntry *core);
|
||||
|
||||
|
||||
static inline void core_put_tls(CoreEntry *core, tls_t tls)
|
||||
{
|
||||
core->ti_aarch64->tls = tls;
|
||||
|
@ -5,6 +5,7 @@
|
||||
|
||||
#include "images/core.pb-c.h"
|
||||
|
||||
/* clang-format off */
|
||||
#define JUMP_TO_RESTORER_BLOB(new_sp, restore_task_exec_start, \
|
||||
task_args) \
|
||||
asm volatile( \
|
||||
@ -16,13 +17,13 @@
|
||||
"r"(restore_task_exec_start), \
|
||||
"r"(task_args) \
|
||||
: "x0", "memory")
|
||||
/* clang-format on */
|
||||
|
||||
static inline void core_get_tls(CoreEntry *pcore, tls_t *ptls)
|
||||
{
|
||||
*ptls = pcore->ti_aarch64->tls;
|
||||
}
|
||||
|
||||
|
||||
int restore_fpu(struct rt_sigframe *sigframe, CoreEntry *core);
|
||||
|
||||
#endif
|
||||
|
@ -9,6 +9,7 @@
|
||||
|
||||
#include <compel/asm/sigframe.h>
|
||||
|
||||
/* clang-format off */
|
||||
#define RUN_CLONE_RESTORE_FN(ret, clone_flags, new_sp, parent_tid, \
|
||||
thread_args, clone_restore_fn) \
|
||||
asm volatile( \
|
||||
@ -112,7 +113,7 @@
|
||||
: \
|
||||
: "r"(ret) \
|
||||
: "sp", "x0", "memory")
|
||||
|
||||
/* clang-format on */
|
||||
|
||||
#define arch_map_vdso(map, compat) -1
|
||||
|
||||
@ -124,8 +125,13 @@ static inline void restore_tls(tls_t *ptls)
|
||||
asm("msr tpidr_el0, %0" : : "r"(*ptls));
|
||||
}
|
||||
|
||||
static inline void *alloc_compat_syscall_stack(void) { return NULL; }
|
||||
static inline void free_compat_syscall_stack(void *stack32) { }
|
||||
static inline void *alloc_compat_syscall_stack(void)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
static inline void free_compat_syscall_stack(void *stack32)
|
||||
{
|
||||
}
|
||||
static inline int arch_compat_rt_sigaction(void *stack, int sig, void *act)
|
||||
{
|
||||
return -1;
|
||||
|
@ -22,8 +22,14 @@ typedef UserAarch64RegsEntry UserRegsEntry;
|
||||
|
||||
#define TI_SP(core) ((core)->ti_aarch64->gpregs->sp)
|
||||
|
||||
static inline void *decode_pointer(uint64_t v) { return (void*)v; }
|
||||
static inline uint64_t encode_pointer(void *p) { return (uint64_t)p; }
|
||||
static inline void *decode_pointer(uint64_t v)
|
||||
{
|
||||
return (void *)v;
|
||||
}
|
||||
static inline uint64_t encode_pointer(void *p)
|
||||
{
|
||||
return (uint64_t)p;
|
||||
}
|
||||
|
||||
#define AT_VECTOR_SIZE 40
|
||||
typedef uint64_t auxv_t;
|
||||
|
@ -22,11 +22,7 @@
|
||||
const char *aarch_vdso_symbol3 = "__kernel_gettimeofday"; \
|
||||
const char *aarch_vdso_symbol4 = "__kernel_rt_sigreturn";
|
||||
|
||||
#define ARCH_VDSO_SYMBOLS \
|
||||
aarch_vdso_symbol1, \
|
||||
aarch_vdso_symbol2, \
|
||||
aarch_vdso_symbol3, \
|
||||
aarch_vdso_symbol4
|
||||
#define ARCH_VDSO_SYMBOLS aarch_vdso_symbol1, aarch_vdso_symbol2, aarch_vdso_symbol3, aarch_vdso_symbol4
|
||||
|
||||
extern void write_intraprocedure_branch(unsigned long to, unsigned long from);
|
||||
|
||||
|
@ -5,7 +5,6 @@ extern int save_task_regs(void *, user_regs_struct_t *, user_fpregs_struct_t *);
|
||||
extern int arch_alloc_thread_info(CoreEntry *core);
|
||||
extern void arch_free_thread_info(CoreEntry *core);
|
||||
|
||||
|
||||
static inline void core_put_tls(CoreEntry *core, tls_t tls)
|
||||
{
|
||||
core->ti_arm->tls = tls;
|
||||
|
@ -5,6 +5,7 @@
|
||||
|
||||
#include "images/core.pb-c.h"
|
||||
|
||||
/* clang-format off */
|
||||
#define JUMP_TO_RESTORER_BLOB(new_sp, restore_task_exec_start, \
|
||||
task_args) \
|
||||
asm volatile( \
|
||||
@ -17,13 +18,13 @@
|
||||
"r"(restore_task_exec_start), \
|
||||
"r"(task_args) \
|
||||
: "r0", "r1", "memory")
|
||||
/* clang-format on */
|
||||
|
||||
static inline void core_get_tls(CoreEntry *pcore, tls_t *ptls)
|
||||
{
|
||||
*ptls = pcore->ti_arm->tls;
|
||||
}
|
||||
|
||||
|
||||
int restore_fpu(struct rt_sigframe *sigframe, CoreEntry *core);
|
||||
|
||||
#endif
|
||||
|
@ -6,6 +6,7 @@
|
||||
|
||||
#include <compel/asm/sigframe.h>
|
||||
|
||||
/* clang-format off */
|
||||
#define RUN_CLONE_RESTORE_FN(ret, clone_flags, new_sp, parent_tid, \
|
||||
thread_args, clone_restore_fn) \
|
||||
asm volatile( \
|
||||
@ -108,19 +109,18 @@
|
||||
: \
|
||||
: "r"(ret) \
|
||||
: "memory")
|
||||
|
||||
/* clang-format on */
|
||||
|
||||
#define arch_map_vdso(map, compat) -1
|
||||
|
||||
int restore_gpregs(struct rt_sigframe *f, UserArmRegsEntry *r);
|
||||
int restore_nonsigframe_gpregs(UserArmRegsEntry *r);
|
||||
#define ARCH_HAS_SHMAT_HOOK
|
||||
unsigned long arch_shmat(int shmid, void *shmaddr,
|
||||
int shmflg, unsigned long size);
|
||||
unsigned long arch_shmat(int shmid, void *shmaddr, int shmflg, unsigned long size);
|
||||
|
||||
static inline void restore_tls(tls_t *ptls) {
|
||||
asm (
|
||||
"mov r7, #15 \n"
|
||||
static inline void restore_tls(tls_t *ptls)
|
||||
{
|
||||
asm("mov r7, #15 \n"
|
||||
"lsl r7, #16 \n"
|
||||
"mov r0, #5 \n"
|
||||
"add r7, r0 \n" /* r7 = 0xF005 */
|
||||
@ -128,12 +128,16 @@ static inline void restore_tls(tls_t *ptls) {
|
||||
"svc #0 \n"
|
||||
:
|
||||
: "r"(ptls)
|
||||
: "r0", "r7"
|
||||
);
|
||||
: "r0", "r7");
|
||||
}
|
||||
|
||||
static inline void *alloc_compat_syscall_stack(void) { return NULL; }
|
||||
static inline void free_compat_syscall_stack(void *stack32) { }
|
||||
static inline void *alloc_compat_syscall_stack(void)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
static inline void free_compat_syscall_stack(void *stack32)
|
||||
{
|
||||
}
|
||||
static inline int arch_compat_rt_sigaction(void *stack, int sig, void *act)
|
||||
{
|
||||
return -1;
|
||||
|
@ -21,8 +21,14 @@ typedef UserArmRegsEntry UserRegsEntry;
|
||||
|
||||
#define TI_SP(core) ((core)->ti_arm->gpregs->sp)
|
||||
|
||||
static inline void *decode_pointer(u64 v) { return (void*)(u32)v; }
|
||||
static inline u64 encode_pointer(void *p) { return (u32)p; }
|
||||
static inline void *decode_pointer(u64 v)
|
||||
{
|
||||
return (void *)(u32)v;
|
||||
}
|
||||
static inline u64 encode_pointer(void *p)
|
||||
{
|
||||
return (u32)p;
|
||||
}
|
||||
|
||||
#define AT_VECTOR_SIZE 40
|
||||
typedef uint32_t auxv_t;
|
||||
|
@ -14,8 +14,6 @@
|
||||
#define ARCH_VDSO_SYMBOLS_LIST \
|
||||
const char *aarch_vdso_symbol1 = "__vdso_clock_gettime"; \
|
||||
const char *aarch_vdso_symbol2 = "__vdso_gettimeofday";
|
||||
#define ARCH_VDSO_SYMBOLS \
|
||||
aarch_vdso_symbol1, \
|
||||
aarch_vdso_symbol2,
|
||||
#define ARCH_VDSO_SYMBOLS aarch_vdso_symbol1, aarch_vdso_symbol2,
|
||||
|
||||
#endif /* __CR_ASM_VDSO_H__ */
|
||||
|
@ -4,6 +4,7 @@
|
||||
#include "asm/restorer.h"
|
||||
#include "images/core.pb-c.h"
|
||||
|
||||
/* clang-format off */
|
||||
#define JUMP_TO_RESTORER_BLOB(new_sp, restore_task_exec_start, task_args) \
|
||||
asm volatile( \
|
||||
"move $4, %0 \n" \
|
||||
@ -16,13 +17,13 @@
|
||||
:"r"(task_args),"r"(restore_task_exec_start), \
|
||||
"g"(new_sp) \
|
||||
: "$25", "$4","$5")
|
||||
/* clang-format on */
|
||||
|
||||
static inline void core_get_tls(CoreEntry *pcore, tls_t *ptls)
|
||||
{
|
||||
*ptls = pcore->ti_mips->tls;
|
||||
}
|
||||
|
||||
|
||||
int restore_fpu(struct rt_sigframe *sigframe, CoreEntry *core);
|
||||
|
||||
#endif
|
||||
|
@ -7,14 +7,16 @@
|
||||
#include <compel/plugins/std/syscall-codes.h>
|
||||
#include <compel/asm/sigframe.h>
|
||||
|
||||
static inline void restore_tls(tls_t *ptls) {
|
||||
asm volatile(
|
||||
"move $4, %0 \n"
|
||||
static inline void restore_tls(tls_t *ptls)
|
||||
{
|
||||
/* clang-format off */
|
||||
asm volatile("move $4, %0 \n"
|
||||
"li $2, " __stringify(__NR_set_thread_area) " \n"
|
||||
"syscall \n"
|
||||
:
|
||||
: "r"(*ptls)
|
||||
: "$4", "$2", "memory");
|
||||
/* clang-format on */
|
||||
}
|
||||
static inline int arch_compat_rt_sigaction(void *stack, int sig, void *act)
|
||||
{
|
||||
@ -25,6 +27,7 @@ static inline int set_compat_robust_list(uint32_t head_ptr, uint32_t len)
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* clang-format off */
|
||||
#define RUN_CLONE_RESTORE_FN(ret, clone_flags, new_sp, parent_tid, \
|
||||
thread_args, clone_restore_fn) \
|
||||
asm volatile( \
|
||||
@ -67,17 +70,22 @@ static inline int set_compat_robust_list(uint32_t head_ptr, uint32_t len)
|
||||
pr_err("This architecture does not support clone3() with set_tid, yet!\n"); \
|
||||
ret = -1; \
|
||||
} while (0)
|
||||
/* clang-format on */
|
||||
|
||||
#define kdat_compatible_cr() 0
|
||||
#define arch_map_vdso(map, compat) -1
|
||||
|
||||
static inline void *alloc_compat_syscall_stack(void) { return NULL; }
|
||||
static inline void free_compat_syscall_stack(void *stack32) { }
|
||||
static inline void *alloc_compat_syscall_stack(void)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
static inline void free_compat_syscall_stack(void *stack32)
|
||||
{
|
||||
}
|
||||
int restore_gpregs(struct rt_sigframe *f, UserMipsRegsEntry *r);
|
||||
int restore_nonsigframe_gpregs(UserMipsRegsEntry *r);
|
||||
|
||||
#define ARCH_HAS_SHMAT_HOOK
|
||||
unsigned long arch_shmat(int shmid, void *shmaddr,
|
||||
int shmflg, unsigned long size);
|
||||
unsigned long arch_shmat(int shmid, void *shmaddr, int shmflg, unsigned long size);
|
||||
|
||||
#endif
|
||||
|
@ -20,9 +20,14 @@
|
||||
|
||||
typedef UserMipsRegsEntry UserRegsEntry;
|
||||
|
||||
static inline u64 encode_pointer(void *p) { return (u64)p; }
|
||||
static inline void *decode_pointer(u64 v) { return (void*)v; }
|
||||
|
||||
static inline u64 encode_pointer(void *p)
|
||||
{
|
||||
return (u64)p;
|
||||
}
|
||||
static inline void *decode_pointer(u64 v)
|
||||
{
|
||||
return (void *)v;
|
||||
}
|
||||
|
||||
#define AT_VECTOR_SIZE 44
|
||||
typedef uint64_t auxv_t;
|
||||
|
@ -18,10 +18,6 @@
|
||||
const char *aarch_vdso_symbol1 = "__vdso_clock_gettime"; \
|
||||
const char *aarch_vdso_symbol2 = "__vdso_gettimeofday"; \
|
||||
const char *aarch_vdso_symbol3 = "__vdso_clock_getres";
|
||||
#define ARCH_VDSO_SYMBOLS \
|
||||
aarch_vdso_symbol1, \
|
||||
aarch_vdso_symbol2, \
|
||||
aarch_vdso_symbol3,
|
||||
|
||||
#define ARCH_VDSO_SYMBOLS aarch_vdso_symbol1, aarch_vdso_symbol2, aarch_vdso_symbol3,
|
||||
|
||||
#endif /* __CR_ASM_VDSO_H__ */
|
||||
|
@ -5,7 +5,6 @@ extern int save_task_regs(void *, user_regs_struct_t *, user_fpregs_struct_t *);
|
||||
extern int arch_alloc_thread_info(CoreEntry *core);
|
||||
extern void arch_free_thread_info(CoreEntry *core);
|
||||
|
||||
|
||||
#define core_put_tls(core, tls)
|
||||
|
||||
#define get_task_futex_robust_list_compat(pid, info) -1
|
||||
|
@ -2,6 +2,9 @@
|
||||
#define __ASM_PARASITE_H__
|
||||
|
||||
/* TLS is accessed through r13, which is already processed */
|
||||
static inline void arch_get_tls(tls_t *ptls) { (void)ptls; }
|
||||
static inline void arch_get_tls(tls_t *ptls)
|
||||
{
|
||||
(void)ptls;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -9,6 +9,7 @@
|
||||
* Set R2 to blob + 8000 which is the default value
|
||||
* Jump to restore_task_exec_start + 8 since R2 is already set (local call)
|
||||
*/
|
||||
/* clang-format off */
|
||||
#define JUMP_TO_RESTORER_BLOB(new_sp, restore_task_exec_start, \
|
||||
task_args) \
|
||||
asm volatile( \
|
||||
@ -22,6 +23,7 @@
|
||||
"r"((unsigned long)restore_task_exec_start), \
|
||||
"r"(task_args) \
|
||||
: "3", "12")
|
||||
/* clang-format on */
|
||||
|
||||
/* There is nothing to do since TLS is accessed through r13 */
|
||||
#define core_get_tls(pcore, ptls)
|
||||
|
@ -14,6 +14,7 @@
|
||||
*
|
||||
* See glibc sysdeps/powerpc/powerpc64/sysdep.h for FRAME_MIN_SIZE defines
|
||||
*/
|
||||
/* clang-format off */
|
||||
#define RUN_CLONE_RESTORE_FN(ret, clone_flags, new_sp, parent_tid, \
|
||||
thread_args, clone_restore_fn) \
|
||||
asm volatile( \
|
||||
@ -88,6 +89,7 @@
|
||||
"r"(clone_restore_fn), /* %3 */ \
|
||||
"r"(args) /* %4 */ \
|
||||
: "memory","0","3","4","5","14","15")
|
||||
/* clang-format on */
|
||||
|
||||
#define arch_map_vdso(map, compat) -1
|
||||
|
||||
@ -95,15 +97,23 @@ int restore_gpregs(struct rt_sigframe *f, UserPpc64RegsEntry *r);
|
||||
int restore_nonsigframe_gpregs(UserPpc64RegsEntry *r);
|
||||
|
||||
/* Nothing to do, TLS is accessed through r13 */
|
||||
static inline void restore_tls(tls_t *ptls) { (void)ptls; }
|
||||
static inline void restore_tls(tls_t *ptls)
|
||||
{
|
||||
(void)ptls;
|
||||
}
|
||||
|
||||
/*
|
||||
* Defined in arch/ppc64/syscall-common-ppc64.S
|
||||
*/
|
||||
unsigned long sys_shmat(int shmid, const void *shmaddr, int shmflg);
|
||||
|
||||
static inline void *alloc_compat_syscall_stack(void) { return NULL; }
|
||||
static inline void free_compat_syscall_stack(void *stack32) { }
|
||||
static inline void *alloc_compat_syscall_stack(void)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
static inline void free_compat_syscall_stack(void *stack32)
|
||||
{
|
||||
}
|
||||
static inline int arch_compat_rt_sigaction(void *stack, int sig, void *act)
|
||||
{
|
||||
return -1;
|
||||
|
@ -19,8 +19,14 @@ typedef UserPpc64RegsEntry UserRegsEntry;
|
||||
|
||||
#define CORE_THREAD_ARCH_INFO(core) core->ti_ppc64
|
||||
|
||||
static inline void *decode_pointer(uint64_t v) { return (void*)v; }
|
||||
static inline uint64_t encode_pointer(void *p) { return (uint64_t)p; }
|
||||
static inline void *decode_pointer(uint64_t v)
|
||||
{
|
||||
return (void *)v;
|
||||
}
|
||||
static inline uint64_t encode_pointer(void *p)
|
||||
{
|
||||
return (uint64_t)p;
|
||||
}
|
||||
|
||||
/*
|
||||
* Copied from the following kernel header files :
|
||||
|
@ -27,15 +27,7 @@
|
||||
const char *aarch_vdso_symbol10 = "__kernel_time";
|
||||
|
||||
#define ARCH_VDSO_SYMBOLS \
|
||||
aarch_vdso_symbol1, \
|
||||
aarch_vdso_symbol2, \
|
||||
aarch_vdso_symbol3, \
|
||||
aarch_vdso_symbol4, \
|
||||
aarch_vdso_symbol5, \
|
||||
aarch_vdso_symbol6, \
|
||||
aarch_vdso_symbol7, \
|
||||
aarch_vdso_symbol8, \
|
||||
aarch_vdso_symbol9, \
|
||||
aarch_vdso_symbol10
|
||||
aarch_vdso_symbol1, aarch_vdso_symbol2, aarch_vdso_symbol3, aarch_vdso_symbol4, aarch_vdso_symbol5, \
|
||||
aarch_vdso_symbol6, aarch_vdso_symbol7, aarch_vdso_symbol8, aarch_vdso_symbol9, aarch_vdso_symbol10
|
||||
|
||||
#endif /* __CR_ASM_VDSO_H__ */
|
||||
|
@ -5,7 +5,9 @@ int save_task_regs(void *arg, user_regs_struct_t *u, user_fpregs_struct_t *f);
|
||||
int arch_alloc_thread_info(CoreEntry *core);
|
||||
void arch_free_thread_info(CoreEntry *core);
|
||||
|
||||
static inline void core_put_tls(CoreEntry *core, tls_t tls) { }
|
||||
static inline void core_put_tls(CoreEntry *core, tls_t tls)
|
||||
{
|
||||
}
|
||||
|
||||
#define get_task_futex_robust_list_compat(pid, info) -1
|
||||
|
||||
|
@ -2,6 +2,9 @@
|
||||
#define __ASM_PARASITE_H__
|
||||
|
||||
/* TLS is accessed through %a01, which is already processed */
|
||||
static inline void arch_get_tls(tls_t *ptls) { (void)ptls; }
|
||||
static inline void arch_get_tls(tls_t *ptls)
|
||||
{
|
||||
(void)ptls;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -7,6 +7,7 @@
|
||||
/*
|
||||
* Load stack to %r15, return address in %r14 and argument 1 into %r2
|
||||
*/
|
||||
/* clang-format off */
|
||||
#define JUMP_TO_RESTORER_BLOB(new_sp, restore_task_exec_start, \
|
||||
task_args) \
|
||||
asm volatile( \
|
||||
@ -19,6 +20,7 @@
|
||||
"d"((unsigned long)restore_task_exec_start), \
|
||||
"d" (task_args) \
|
||||
: "2", "14", "memory")
|
||||
/* clang-format on */
|
||||
|
||||
/* There is nothing to do since TLS is accessed through %a01 */
|
||||
#define core_get_tls(pcore, ptls)
|
||||
|
@ -11,6 +11,7 @@
|
||||
/*
|
||||
* Clone trampoline - see glibc sysdeps/unix/sysv/linux/s390/s390-64/clone.S
|
||||
*/
|
||||
/* clang-format off */
|
||||
#define RUN_CLONE_RESTORE_FN(ret, clone_flags, new_sp, parent_tid, \
|
||||
thread_args, clone_restore_fn) \
|
||||
asm volatile( \
|
||||
@ -75,6 +76,7 @@
|
||||
"d"(clone_restore_fn), \
|
||||
"d"(args) \
|
||||
: "0", "1", "2", "3", "4", "5", "cc", "memory")
|
||||
/* clang-format on */
|
||||
|
||||
#define arch_map_vdso(map, compat) -1
|
||||
|
||||
@ -82,13 +84,20 @@ int restore_gpregs(struct rt_sigframe *f, UserS390RegsEntry *r);
|
||||
int restore_nonsigframe_gpregs(UserS390RegsEntry *r);
|
||||
|
||||
unsigned long sys_shmat(int shmid, const void *shmaddr, int shmflg);
|
||||
unsigned long sys_mmap(void *addr, unsigned long len, unsigned long prot,
|
||||
unsigned long flags, unsigned long fd,
|
||||
unsigned long sys_mmap(void *addr, unsigned long len, unsigned long prot, unsigned long flags, unsigned long fd,
|
||||
unsigned long offset);
|
||||
|
||||
static inline void restore_tls(tls_t *ptls) { (void)ptls; }
|
||||
static inline void *alloc_compat_syscall_stack(void) { return NULL; }
|
||||
static inline void free_compat_syscall_stack(void *stack32) { }
|
||||
static inline void restore_tls(tls_t *ptls)
|
||||
{
|
||||
(void)ptls;
|
||||
}
|
||||
static inline void *alloc_compat_syscall_stack(void)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
static inline void free_compat_syscall_stack(void *stack32)
|
||||
{
|
||||
}
|
||||
static inline int arch_compat_rt_sigaction(void *stack, int sig, void *act)
|
||||
{
|
||||
return -1;
|
||||
|
@ -19,8 +19,14 @@ typedef UserS390RegsEntry UserRegsEntry;
|
||||
|
||||
#define CORE_THREAD_ARCH_INFO(core) core->ti_s390
|
||||
|
||||
static inline u64 encode_pointer(void *p) { return (u64) p; }
|
||||
static inline void *decode_pointer(u64 v) { return (void *) v; }
|
||||
static inline u64 encode_pointer(void *p)
|
||||
{
|
||||
return (u64)p;
|
||||
}
|
||||
static inline void *decode_pointer(u64 v)
|
||||
{
|
||||
return (void *)v;
|
||||
}
|
||||
|
||||
/*
|
||||
* See also:
|
||||
|
@ -20,10 +20,6 @@
|
||||
const char *aarch_vdso_symbol2 = "__kernel_clock_gettime"; \
|
||||
const char *aarch_vdso_symbol3 = "__kernel_clock_getres"; \
|
||||
const char *aarch_vdso_symbol4 = "__kernel_getcpu";
|
||||
#define ARCH_VDSO_SYMBOLS \
|
||||
aarch_vdso_symbol1, \
|
||||
aarch_vdso_symbol2, \
|
||||
aarch_vdso_symbol3, \
|
||||
aarch_vdso_symbol4
|
||||
#define ARCH_VDSO_SYMBOLS aarch_vdso_symbol1, aarch_vdso_symbol2, aarch_vdso_symbol3, aarch_vdso_symbol4
|
||||
|
||||
#endif /* __CR_ASM_VDSO_H__ */
|
||||
|
@ -13,8 +13,8 @@
|
||||
|
||||
static inline void *alloc_compat_syscall_stack(void)
|
||||
{
|
||||
void *mem = (void*)sys_mmap(NULL, PAGE_SIZE, PROT_READ | PROT_WRITE,
|
||||
MAP_32BIT | MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
|
||||
void *mem = (void *)sys_mmap(NULL, PAGE_SIZE, PROT_READ | PROT_WRITE, MAP_32BIT | MAP_ANONYMOUS | MAP_PRIVATE,
|
||||
-1, 0);
|
||||
|
||||
if ((uintptr_t)mem % PAGE_SIZE) {
|
||||
int err = (~(uint32_t)(uintptr_t)mem) + 1;
|
||||
@ -30,8 +30,7 @@ static inline void free_compat_syscall_stack(void *mem)
|
||||
long int ret = sys_munmap(mem, PAGE_SIZE);
|
||||
|
||||
if (ret)
|
||||
pr_err("munmap() of compat addr %p failed with %ld\n",
|
||||
mem, ret);
|
||||
pr_err("munmap() of compat addr %p failed with %ld\n", mem, ret);
|
||||
}
|
||||
|
||||
struct syscall_args32 {
|
||||
@ -72,9 +71,8 @@ static inline uint32_t do_full_int80(struct syscall_args32 *args)
|
||||
"popq %%rbp\n\t"
|
||||
"add $128, %%rsp\n\t"
|
||||
: "=a"(ret)
|
||||
: "a" (args->nr),
|
||||
"b" (args->arg0), "c" (args->arg1), "d" (args->arg2),
|
||||
"S" (args->arg3), "D" (args->arg4), "g" (args->arg5)
|
||||
: "a"(args->nr), "b"(args->arg0), "c"(args->arg1), "d"(args->arg2), "S"(args->arg3),
|
||||
"D"(args->arg4), "g"(args->arg5)
|
||||
: "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15");
|
||||
return ret;
|
||||
}
|
||||
|
@ -11,8 +11,7 @@ static inline void core_put_tls(CoreEntry *core, tls_t tls)
|
||||
ThreadInfoX86 *ti = core->thread_info;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < GDT_ENTRY_TLS_NUM; i++)
|
||||
{
|
||||
for (i = 0; i < GDT_ENTRY_TLS_NUM; i++) {
|
||||
user_desc_t *from = &tls.desc[i];
|
||||
UserDescT *to = ti->tls[i];
|
||||
|
||||
|
@ -5,6 +5,9 @@
|
||||
* TLS is accessed through PTRACE_GET_THREAD_AREA,
|
||||
* see compel_arch_fetch_thread_area().
|
||||
*/
|
||||
static inline void arch_get_tls(tls_t *ptls) { (void)ptls; }
|
||||
static inline void arch_get_tls(tls_t *ptls)
|
||||
{
|
||||
(void)ptls;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -5,6 +5,7 @@
|
||||
|
||||
#include "images/core.pb-c.h"
|
||||
|
||||
/* clang-format off */
|
||||
#define JUMP_TO_RESTORER_BLOB(new_sp, restore_task_exec_start, \
|
||||
task_args) \
|
||||
asm volatile( \
|
||||
@ -18,6 +19,7 @@
|
||||
"g"(restore_task_exec_start), \
|
||||
"g"(task_args) \
|
||||
: "rdi", "rsi", "rbx", "rax", "memory")
|
||||
/* clang-format on */
|
||||
|
||||
static inline void core_get_tls(CoreEntry *pcore, tls_t *ptls)
|
||||
{
|
||||
@ -52,7 +54,6 @@ static inline void core_get_tls(CoreEntry *pcore, tls_t *ptls)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int restore_fpu(struct rt_sigframe *sigframe, CoreEntry *core);
|
||||
|
||||
#endif
|
||||
|
@ -11,11 +11,12 @@
|
||||
|
||||
#ifdef CONFIG_COMPAT
|
||||
extern void restore_tls(tls_t *ptls);
|
||||
extern int arch_compat_rt_sigaction(void *stack32, int sig,
|
||||
rt_sigaction_t_compat *act);
|
||||
extern int arch_compat_rt_sigaction(void *stack32, int sig, rt_sigaction_t_compat *act);
|
||||
extern int set_compat_robust_list(uint32_t head_ptr, uint32_t len);
|
||||
#else /* CONFIG_COMPAT */
|
||||
static inline void restore_tls(tls_t *ptls) { }
|
||||
static inline void restore_tls(tls_t *ptls)
|
||||
{
|
||||
}
|
||||
static inline int arch_compat_rt_sigaction(void *stack, int sig, void *act)
|
||||
{
|
||||
return -1;
|
||||
@ -41,6 +42,7 @@ static inline int set_compat_robust_list(uint32_t head_ptr, uint32_t len)
|
||||
* unsigned long tls);
|
||||
*/
|
||||
|
||||
/* clang-format off */
|
||||
#define RUN_CLONE_RESTORE_FN(ret, clone_flags, new_sp, parent_tid, \
|
||||
thread_args, clone_restore_fn) \
|
||||
asm volatile( \
|
||||
@ -164,17 +166,16 @@ static inline int set_compat_robust_list(uint32_t head_ptr, uint32_t len)
|
||||
: \
|
||||
: "r"(ret) \
|
||||
: "memory")
|
||||
/* clang-format on */
|
||||
|
||||
static inline void
|
||||
__setup_sas_compat(struct ucontext_ia32* uc, ThreadSasEntry *sas)
|
||||
static inline void __setup_sas_compat(struct ucontext_ia32 *uc, ThreadSasEntry *sas)
|
||||
{
|
||||
uc->uc_stack.ss_sp = (compat_uptr_t)(sas)->ss_sp;
|
||||
uc->uc_stack.ss_flags = (int)(sas)->ss_flags;
|
||||
uc->uc_stack.ss_size = (compat_size_t)(sas)->ss_size;
|
||||
}
|
||||
|
||||
static inline void
|
||||
__setup_sas(struct rt_sigframe* sigframe, ThreadSasEntry *sas)
|
||||
static inline void __setup_sas(struct rt_sigframe *sigframe, ThreadSasEntry *sas)
|
||||
{
|
||||
if (sigframe->is_native) {
|
||||
struct rt_ucontext *uc = &sigframe->native.uc;
|
||||
|
@ -30,8 +30,14 @@ static inline int core_is_compat(CoreEntry *c)
|
||||
|
||||
typedef UserX86RegsEntry UserRegsEntry;
|
||||
|
||||
static inline u64 encode_pointer(void *p) { return (u64)(long)p; }
|
||||
static inline void *decode_pointer(u64 v) { return (void*)(long)v; }
|
||||
static inline u64 encode_pointer(void *p)
|
||||
{
|
||||
return (u64)(long)p;
|
||||
}
|
||||
static inline void *decode_pointer(u64 v)
|
||||
{
|
||||
return (void *)(long)v;
|
||||
}
|
||||
|
||||
#define AT_VECTOR_SIZE 44
|
||||
typedef uint64_t auxv_t;
|
||||
|
@ -45,11 +45,7 @@
|
||||
const char *aarch_vdso_symbol6 = "__kernel_rt_sigreturn";
|
||||
|
||||
#define ARCH_VDSO_SYMBOLS \
|
||||
aarch_vdso_symbol1, \
|
||||
aarch_vdso_symbol2, \
|
||||
aarch_vdso_symbol3, \
|
||||
aarch_vdso_symbol4, \
|
||||
aarch_vdso_symbol5, \
|
||||
aarch_vdso_symbol1, aarch_vdso_symbol2, aarch_vdso_symbol3, aarch_vdso_symbol4, aarch_vdso_symbol5, \
|
||||
aarch_vdso_symbol6
|
||||
|
||||
/* "__kernel_vsyscall", */
|
||||
@ -64,13 +60,10 @@
|
||||
|
||||
#if defined(CONFIG_COMPAT) && !defined(__ASSEMBLY__)
|
||||
struct vdso_symtable;
|
||||
extern int vdso_fill_symtable(uintptr_t mem, size_t size,
|
||||
struct vdso_symtable *t);
|
||||
extern int vdso_fill_symtable_compat(uintptr_t mem, size_t size,
|
||||
struct vdso_symtable *t);
|
||||
extern int vdso_fill_symtable(uintptr_t mem, size_t size, struct vdso_symtable *t);
|
||||
extern int vdso_fill_symtable_compat(uintptr_t mem, size_t size, struct vdso_symtable *t);
|
||||
|
||||
static inline int __vdso_fill_symtable(uintptr_t mem, size_t size,
|
||||
struct vdso_symtable *t, bool compat_vdso)
|
||||
static inline int __vdso_fill_symtable(uintptr_t mem, size_t size, struct vdso_symtable *t, bool compat_vdso)
|
||||
{
|
||||
if (compat_vdso)
|
||||
return vdso_fill_symtable_compat(mem, size, t);
|
||||
|
@ -12,8 +12,7 @@ bool is_autofs_pipe(unsigned long inode);
|
||||
struct mount_info;
|
||||
int autofs_parse(struct mount_info *pm);
|
||||
int autofs_dump(struct mount_info *pm);
|
||||
int autofs_mount(struct mount_info *mi, const char *source, const
|
||||
char *filesystemtype, unsigned long mountflags);
|
||||
int autofs_mount(struct mount_info *mi, const char *source, const char *filesystemtype, unsigned long mountflags);
|
||||
|
||||
#include <linux/limits.h>
|
||||
#include <linux/auto_fs.h>
|
||||
@ -71,7 +70,6 @@ struct args_expire {
|
||||
__u32 how;
|
||||
};
|
||||
|
||||
|
||||
struct args_askumount {
|
||||
__u32 may_umount;
|
||||
};
|
||||
@ -131,7 +129,6 @@ static inline void init_autofs_dev_ioctl(struct autofs_dev_ioctl *in)
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* If you change this make sure you make the corresponding change
|
||||
* to autofs-dev-ioctl.c:lookup_ioctl()
|
||||
@ -174,61 +171,32 @@ enum {
|
||||
|
||||
#define AUTOFS_IOCTL 0x93
|
||||
|
||||
#define AUTOFS_DEV_IOCTL_VERSION \
|
||||
_IOWR(AUTOFS_IOCTL, \
|
||||
AUTOFS_DEV_IOCTL_VERSION_CMD, struct autofs_dev_ioctl)
|
||||
#define AUTOFS_DEV_IOCTL_VERSION _IOWR(AUTOFS_IOCTL, AUTOFS_DEV_IOCTL_VERSION_CMD, struct autofs_dev_ioctl)
|
||||
|
||||
#define AUTOFS_DEV_IOCTL_PROTOVER \
|
||||
_IOWR(AUTOFS_IOCTL, \
|
||||
AUTOFS_DEV_IOCTL_PROTOVER_CMD, struct autofs_dev_ioctl)
|
||||
#define AUTOFS_DEV_IOCTL_PROTOVER _IOWR(AUTOFS_IOCTL, AUTOFS_DEV_IOCTL_PROTOVER_CMD, struct autofs_dev_ioctl)
|
||||
|
||||
#define AUTOFS_DEV_IOCTL_PROTOSUBVER \
|
||||
_IOWR(AUTOFS_IOCTL, \
|
||||
AUTOFS_DEV_IOCTL_PROTOSUBVER_CMD, struct autofs_dev_ioctl)
|
||||
#define AUTOFS_DEV_IOCTL_PROTOSUBVER _IOWR(AUTOFS_IOCTL, AUTOFS_DEV_IOCTL_PROTOSUBVER_CMD, struct autofs_dev_ioctl)
|
||||
|
||||
#define AUTOFS_DEV_IOCTL_OPENMOUNT \
|
||||
_IOWR(AUTOFS_IOCTL, \
|
||||
AUTOFS_DEV_IOCTL_OPENMOUNT_CMD, struct autofs_dev_ioctl)
|
||||
#define AUTOFS_DEV_IOCTL_OPENMOUNT _IOWR(AUTOFS_IOCTL, AUTOFS_DEV_IOCTL_OPENMOUNT_CMD, struct autofs_dev_ioctl)
|
||||
|
||||
#define AUTOFS_DEV_IOCTL_CLOSEMOUNT _IOWR(AUTOFS_IOCTL, AUTOFS_DEV_IOCTL_CLOSEMOUNT_CMD, struct autofs_dev_ioctl)
|
||||
|
||||
#define AUTOFS_DEV_IOCTL_CLOSEMOUNT \
|
||||
_IOWR(AUTOFS_IOCTL, \
|
||||
AUTOFS_DEV_IOCTL_CLOSEMOUNT_CMD, struct autofs_dev_ioctl)
|
||||
#define AUTOFS_DEV_IOCTL_READY _IOWR(AUTOFS_IOCTL, AUTOFS_DEV_IOCTL_READY_CMD, struct autofs_dev_ioctl)
|
||||
|
||||
#define AUTOFS_DEV_IOCTL_READY \
|
||||
_IOWR(AUTOFS_IOCTL, \
|
||||
AUTOFS_DEV_IOCTL_READY_CMD, struct autofs_dev_ioctl)
|
||||
#define AUTOFS_DEV_IOCTL_FAIL _IOWR(AUTOFS_IOCTL, AUTOFS_DEV_IOCTL_FAIL_CMD, struct autofs_dev_ioctl)
|
||||
|
||||
#define AUTOFS_DEV_IOCTL_FAIL \
|
||||
_IOWR(AUTOFS_IOCTL, \
|
||||
AUTOFS_DEV_IOCTL_FAIL_CMD, struct autofs_dev_ioctl)
|
||||
#define AUTOFS_DEV_IOCTL_SETPIPEFD _IOWR(AUTOFS_IOCTL, AUTOFS_DEV_IOCTL_SETPIPEFD_CMD, struct autofs_dev_ioctl)
|
||||
|
||||
#define AUTOFS_DEV_IOCTL_SETPIPEFD \
|
||||
_IOWR(AUTOFS_IOCTL, \
|
||||
AUTOFS_DEV_IOCTL_SETPIPEFD_CMD, struct autofs_dev_ioctl)
|
||||
#define AUTOFS_DEV_IOCTL_CATATONIC _IOWR(AUTOFS_IOCTL, AUTOFS_DEV_IOCTL_CATATONIC_CMD, struct autofs_dev_ioctl)
|
||||
|
||||
#define AUTOFS_DEV_IOCTL_CATATONIC \
|
||||
_IOWR(AUTOFS_IOCTL, \
|
||||
AUTOFS_DEV_IOCTL_CATATONIC_CMD, struct autofs_dev_ioctl)
|
||||
#define AUTOFS_DEV_IOCTL_TIMEOUT _IOWR(AUTOFS_IOCTL, AUTOFS_DEV_IOCTL_TIMEOUT_CMD, struct autofs_dev_ioctl)
|
||||
|
||||
#define AUTOFS_DEV_IOCTL_TIMEOUT \
|
||||
_IOWR(AUTOFS_IOCTL, \
|
||||
AUTOFS_DEV_IOCTL_TIMEOUT_CMD, struct autofs_dev_ioctl)
|
||||
#define AUTOFS_DEV_IOCTL_REQUESTER _IOWR(AUTOFS_IOCTL, AUTOFS_DEV_IOCTL_REQUESTER_CMD, struct autofs_dev_ioctl)
|
||||
|
||||
#define AUTOFS_DEV_IOCTL_REQUESTER \
|
||||
_IOWR(AUTOFS_IOCTL, \
|
||||
AUTOFS_DEV_IOCTL_REQUESTER_CMD, struct autofs_dev_ioctl)
|
||||
#define AUTOFS_DEV_IOCTL_EXPIRE _IOWR(AUTOFS_IOCTL, AUTOFS_DEV_IOCTL_EXPIRE_CMD, struct autofs_dev_ioctl)
|
||||
|
||||
#define AUTOFS_DEV_IOCTL_EXPIRE \
|
||||
_IOWR(AUTOFS_IOCTL, \
|
||||
AUTOFS_DEV_IOCTL_EXPIRE_CMD, struct autofs_dev_ioctl)
|
||||
#define AUTOFS_DEV_IOCTL_ASKUMOUNT _IOWR(AUTOFS_IOCTL, AUTOFS_DEV_IOCTL_ASKUMOUNT_CMD, struct autofs_dev_ioctl)
|
||||
|
||||
#define AUTOFS_DEV_IOCTL_ASKUMOUNT \
|
||||
_IOWR(AUTOFS_IOCTL, \
|
||||
AUTOFS_DEV_IOCTL_ASKUMOUNT_CMD, struct autofs_dev_ioctl)
|
||||
|
||||
#define AUTOFS_DEV_IOCTL_ISMOUNTPOINT \
|
||||
_IOWR(AUTOFS_IOCTL, \
|
||||
AUTOFS_DEV_IOCTL_ISMOUNTPOINT_CMD, struct autofs_dev_ioctl)
|
||||
#define AUTOFS_DEV_IOCTL_ISMOUNTPOINT _IOWR(AUTOFS_IOCTL, AUTOFS_DEV_IOCTL_ISMOUNTPOINT_CMD, struct autofs_dev_ioctl)
|
||||
|
||||
#endif
|
||||
|
@ -22,8 +22,8 @@ struct bpfmap_data_rst {
|
||||
|
||||
extern int is_bpfmap_link(char *link);
|
||||
extern int dump_one_bpfmap_data(BpfmapFileEntry *bpf, int lfd, const struct fd_parms *p);
|
||||
extern int do_collect_bpfmap_data(struct bpfmap_data_rst *, ProtobufCMessage *,
|
||||
struct cr_img *, struct bpfmap_data_rst **);
|
||||
extern int do_collect_bpfmap_data(struct bpfmap_data_rst *, ProtobufCMessage *, struct cr_img *,
|
||||
struct bpfmap_data_rst **);
|
||||
extern int restore_bpfmap_data(int, uint32_t, struct bpfmap_data_rst **);
|
||||
|
||||
extern const struct fdtype_ops bpfmap_dump_ops;
|
||||
|
@ -2,7 +2,6 @@
|
||||
#define __CR_CLONE_NOASAN_H__
|
||||
|
||||
int clone_noasan(int (*fn)(void *), int flags, void *arg);
|
||||
int clone3_with_pid_noasan(int (*fn)(void *), void *arg, int flags,
|
||||
int exit_signal, pid_t pid);
|
||||
int clone3_with_pid_noasan(int (*fn)(void *), void *arg, int flags, int exit_signal, pid_t pid);
|
||||
|
||||
#endif /* __CR_CLONE_NOASAN_H__ */
|
||||
|
@ -64,8 +64,7 @@ struct cg_root_opt {
|
||||
|
||||
#define DEFAULT_TIMEOUT 10
|
||||
|
||||
enum FILE_VALIDATION_OPTIONS
|
||||
{
|
||||
enum FILE_VALIDATION_OPTIONS {
|
||||
/*
|
||||
* This constant indicates that the file validation should be tried with the
|
||||
* file size method by default.
|
||||
|
@ -31,9 +31,7 @@
|
||||
#define CRIU_PLUGIN_VERSION_OLD CRIU_PLUGIN_GEN_VERSION(0, 1, 0)
|
||||
|
||||
#define CRIU_PLUGIN_VERSION \
|
||||
CRIU_PLUGIN_GEN_VERSION(CRIU_PLUGIN_VERSION_MAJOR, \
|
||||
CRIU_PLUGIN_VERSION_MINOR, \
|
||||
CRIU_PLUGIN_VERSION_SUBLEVEL)
|
||||
CRIU_PLUGIN_GEN_VERSION(CRIU_PLUGIN_VERSION_MAJOR, CRIU_PLUGIN_VERSION_MINOR, CRIU_PLUGIN_VERSION_SUBLEVEL)
|
||||
|
||||
/*
|
||||
* Plugin hook points and their arguments in hooks.
|
||||
@ -53,8 +51,7 @@ enum {
|
||||
CR_PLUGIN_HOOK__MAX
|
||||
};
|
||||
|
||||
#define DECLARE_PLUGIN_HOOK_ARGS(__hook, ...) \
|
||||
typedef int (__hook ##_t)(__VA_ARGS__)
|
||||
#define DECLARE_PLUGIN_HOOK_ARGS(__hook, ...) typedef int(__hook##_t)(__VA_ARGS__)
|
||||
|
||||
DECLARE_PLUGIN_HOOK_ARGS(CR_PLUGIN_HOOK__DUMP_UNIX_SK, int fd, int id);
|
||||
DECLARE_PLUGIN_HOOK_ARGS(CR_PLUGIN_HOOK__RESTORE_UNIX_SK, int id);
|
||||
@ -95,8 +92,13 @@ extern cr_plugin_desc_t CR_PLUGIN_DESC;
|
||||
.max_hooks = CR_PLUGIN_HOOK__MAX, \
|
||||
};
|
||||
|
||||
static inline int cr_plugin_dummy_init(int stage) { return 0; }
|
||||
static inline void cr_plugin_dummy_exit(int stage, int ret) { }
|
||||
static inline int cr_plugin_dummy_init(int stage)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline void cr_plugin_dummy_exit(int stage, int ret)
|
||||
{
|
||||
}
|
||||
|
||||
#define CR_PLUGIN_REGISTER_DUMMY(___name) \
|
||||
cr_plugin_desc_t CR_PLUGIN_DESC = { \
|
||||
|
@ -34,12 +34,14 @@ extern void pr_check_features(const char *offset, const char *sep, int width);
|
||||
|
||||
#define PPREP_HEAD_INACTIVE ((struct pprep_head *)-1)
|
||||
|
||||
#define add_post_prepare_cb_once(phead) do { \
|
||||
#define add_post_prepare_cb_once(phead) \
|
||||
do { \
|
||||
if ((phead)->next == PPREP_HEAD_INACTIVE) \
|
||||
add_post_prepare_cb(phead); \
|
||||
} while (0)
|
||||
|
||||
#define MAKE_PPREP_HEAD(name) struct pprep_head name = { \
|
||||
#define MAKE_PPREP_HEAD(name) \
|
||||
struct pprep_head name = { \
|
||||
.next = PPREP_HEAD_INACTIVE, \
|
||||
.actor = name##_cb, \
|
||||
}
|
||||
|
@ -29,7 +29,8 @@
|
||||
/* operations for bsd flock(), also used by the kernel implementation */
|
||||
#define LOCK_SH 1 /* shared lock */
|
||||
#define LOCK_EX 2 /* exclusive lock */
|
||||
#define LOCK_NB 4 /* or'd with one of the above to prevent
|
||||
#define LOCK_NB \
|
||||
4 /* or'd with one of the above to prevent
|
||||
blocking */
|
||||
#define LOCK_UN 8 /* remove lock */
|
||||
|
||||
|
@ -29,8 +29,7 @@ struct reg_file_info {
|
||||
|
||||
extern int open_reg_by_id(u32 id);
|
||||
extern int open_reg_fd(struct file_desc *);
|
||||
extern int open_path(struct file_desc *, int (*open_cb)(int ns_root_fd,
|
||||
struct reg_file_info *, void *), void *arg);
|
||||
extern int open_path(struct file_desc *, int (*open_cb)(int ns_root_fd, struct reg_file_info *, void *), void *arg);
|
||||
|
||||
extern const struct fdtype_ops regfile_dump_ops;
|
||||
extern int do_open_reg_noseek_flags(int ns_root_fd, struct reg_file_info *rfi, void *arg);
|
||||
|
@ -55,11 +55,9 @@ struct fd_parms {
|
||||
};
|
||||
|
||||
#define FD_PARMS_INIT \
|
||||
(struct fd_parms) { \
|
||||
.fd = FD_DESC_INVALID, \
|
||||
.fown = FOWN_ENTRY__INIT, \
|
||||
.link = NULL, \
|
||||
.mnt_id = -1, \
|
||||
(struct fd_parms) \
|
||||
{ \
|
||||
.fd = FD_DESC_INVALID, .fown = FOWN_ENTRY__INIT, .link = NULL, .mnt_id = -1, \
|
||||
}
|
||||
|
||||
extern int fill_fdlink(int lfd, const struct fd_parms *p, struct fd_link *link);
|
||||
@ -99,8 +97,7 @@ extern int inh_fd_max;
|
||||
/* reports whether fd_a takes prio over fd_b */
|
||||
static inline int fdinfo_rst_prio(struct fdinfo_list_entry *fd_a, struct fdinfo_list_entry *fd_b)
|
||||
{
|
||||
return pid_rst_prio(fd_a->pid, fd_b->pid) ||
|
||||
((fd_a->pid == fd_b->pid) && (fd_a->fe->fd < fd_b->fe->fd));
|
||||
return pid_rst_prio(fd_a->pid, fd_b->pid) || ((fd_a->pid == fd_b->pid) && (fd_a->fe->fd < fd_b->fe->fd));
|
||||
}
|
||||
|
||||
struct file_desc_ops {
|
||||
@ -116,8 +113,7 @@ struct file_desc_ops {
|
||||
};
|
||||
|
||||
int collect_fd(int pid, FdinfoEntry *e, struct rst_info *rst_info, bool ghost);
|
||||
struct fdinfo_list_entry *collect_fd_to(int pid, FdinfoEntry *e,
|
||||
struct rst_info *rst_info, struct file_desc *fdesc,
|
||||
struct fdinfo_list_entry *collect_fd_to(int pid, FdinfoEntry *e, struct rst_info *rst_info, struct file_desc *fdesc,
|
||||
bool fake, bool force_master);
|
||||
|
||||
u32 find_unused_file_desc_id(void);
|
||||
@ -142,12 +138,9 @@ struct fdtype_ops {
|
||||
struct cr_img;
|
||||
|
||||
extern int dump_my_file(int lfd, u32 *, int *type);
|
||||
extern int do_dump_gen_file(struct fd_parms *p, int lfd,
|
||||
const struct fdtype_ops *ops,
|
||||
FdinfoEntry *e);
|
||||
extern int do_dump_gen_file(struct fd_parms *p, int lfd, const struct fdtype_ops *ops, FdinfoEntry *e);
|
||||
struct parasite_drain_fd;
|
||||
int dump_task_files_seized(struct parasite_ctl *ctl, struct pstree_item *item,
|
||||
struct parasite_drain_fd *dfds);
|
||||
int dump_task_files_seized(struct parasite_ctl *ctl, struct pstree_item *item, struct parasite_drain_fd *dfds);
|
||||
int predump_task_files(int pid);
|
||||
|
||||
extern void file_desc_init(struct file_desc *d, u32 id, struct file_desc_ops *ops);
|
||||
@ -184,8 +177,7 @@ extern int close_old_fds(void);
|
||||
extern int shared_fdt_prepare(struct pstree_item *item);
|
||||
|
||||
extern struct collect_image_info ext_file_cinfo;
|
||||
extern int dump_unsupp_fd(struct fd_parms *p, int lfd,
|
||||
char *more, char *info, FdinfoEntry *);
|
||||
extern int dump_unsupp_fd(struct fd_parms *p, int lfd, char *more, char *info, FdinfoEntry *);
|
||||
|
||||
extern int inherit_fd_parse(char *optarg);
|
||||
extern int inherit_fd_add(int fd, char *key);
|
||||
@ -197,8 +189,7 @@ extern int inherit_fd_lookup_id(char *id);
|
||||
extern bool inherited_fd(struct file_desc *, int *fdp);
|
||||
|
||||
extern FdinfoEntry *dup_fdinfo(FdinfoEntry *old, int fd, unsigned flags);
|
||||
int dup_fle(struct pstree_item *task, struct fdinfo_list_entry *ple,
|
||||
int fd, unsigned flags);
|
||||
int dup_fle(struct pstree_item *task, struct fdinfo_list_entry *ple, int fd, unsigned flags);
|
||||
|
||||
extern int open_transport_socket(void);
|
||||
extern int set_fds_event(pid_t virt);
|
||||
|
@ -5,8 +5,7 @@ extern struct fstype *decode_fstype(u32 fst);
|
||||
extern bool add_fsname_auto(const char *names);
|
||||
|
||||
struct mount_info;
|
||||
typedef int (*mount_fn_t)(struct mount_info *mi, const char *src, const
|
||||
char *fstype, unsigned long mountflags);
|
||||
typedef int (*mount_fn_t)(struct mount_info *mi, const char *src, const char *fstype, unsigned long mountflags);
|
||||
|
||||
struct fstype {
|
||||
char *name;
|
||||
|
@ -27,10 +27,8 @@ extern struct cr_imgset *glob_imgset;
|
||||
extern struct cr_fd_desc_tmpl imgset_template[CR_FD_MAX];
|
||||
|
||||
extern struct cr_imgset *cr_task_imgset_open(int pid, int mode);
|
||||
extern struct cr_imgset *cr_imgset_open_range(int pid, int from, int to,
|
||||
unsigned long flags);
|
||||
#define cr_imgset_open(pid, type, flags) cr_imgset_open_range(pid, \
|
||||
_CR_FD_##type##_FROM, _CR_FD_##type##_TO, flags)
|
||||
extern struct cr_imgset *cr_imgset_open_range(int pid, int from, int to, unsigned long flags);
|
||||
#define cr_imgset_open(pid, type, flags) cr_imgset_open_range(pid, _CR_FD_##type##_FROM, _CR_FD_##type##_TO, flags)
|
||||
extern struct cr_imgset *cr_glob_imgset_open(int mode);
|
||||
|
||||
extern void close_cr_imgset(struct cr_imgset **cr_imgset);
|
||||
|
@ -114,7 +114,6 @@ enum {
|
||||
|
||||
#define INET_DIAG_MAX INET_DIAG_SHUTDOWN
|
||||
|
||||
|
||||
/* INET_DIAG_MEM */
|
||||
|
||||
struct inet_diag_meminfo {
|
||||
|
@ -4,12 +4,10 @@
|
||||
#include "images/fh.pb-c.h"
|
||||
|
||||
char *irmap_lookup(unsigned int s_dev, unsigned long i_ino);
|
||||
int irmap_queue_cache(unsigned int dev, unsigned long ino,
|
||||
FhEntry *fh);
|
||||
int irmap_queue_cache(unsigned int dev, unsigned long ino, FhEntry *fh);
|
||||
int irmap_predump_prep(void);
|
||||
int irmap_predump_run(void);
|
||||
int check_open_handle(unsigned int s_dev, unsigned long i_ino,
|
||||
FhEntry *f_handle);
|
||||
int check_open_handle(unsigned int s_dev, unsigned long i_ino, FhEntry *f_handle);
|
||||
int irmap_load_cache(void);
|
||||
int irmap_scan_path_add(char *path);
|
||||
#endif
|
||||
|
@ -10,7 +10,6 @@ struct kid_tree {
|
||||
struct rb_root root;
|
||||
unsigned int kcmp_type;
|
||||
unsigned long subid;
|
||||
|
||||
};
|
||||
|
||||
#define DECLARE_KCMP_TREE(name, type) \
|
||||
@ -26,11 +25,8 @@ struct kid_elem {
|
||||
unsigned int idx;
|
||||
};
|
||||
|
||||
extern uint32_t kid_generate_gen(struct kid_tree *tree,
|
||||
struct kid_elem *elem, int *new_id);
|
||||
extern uint32_t kid_generate_gen(struct kid_tree *tree, struct kid_elem *elem, int *new_id);
|
||||
|
||||
extern struct kid_elem *kid_lookup_epoll_tfd(struct kid_tree *tree,
|
||||
struct kid_elem *elem,
|
||||
kcmp_epoll_slot_t *slot);
|
||||
extern struct kid_elem *kid_lookup_epoll_tfd(struct kid_tree *tree, struct kid_elem *elem, kcmp_epoll_slot_t *slot);
|
||||
|
||||
#endif /* __CR_KCMP_IDS_H__ */
|
||||
|
@ -8,17 +8,14 @@ extern int do_rtnl_req(int nl, void *req, int size,
|
||||
int (*receive_callback)(struct nlmsghdr *h, struct ns_id *ns, void *),
|
||||
int (*error_callback)(int err, struct ns_id *ns, void *), struct ns_id *ns, void *);
|
||||
|
||||
extern int addattr_l(struct nlmsghdr *n, int maxlen, int type,
|
||||
const void *data, int alen);
|
||||
extern int addattr_l(struct nlmsghdr *n, int maxlen, int type, const void *data, int alen);
|
||||
|
||||
extern int32_t nla_get_s32(const struct nlattr *nla);
|
||||
|
||||
#define NLMSG_TAIL(nmsg) \
|
||||
((struct rtattr *) (((void *) (nmsg)) + NLMSG_ALIGN((nmsg)->nlmsg_len)))
|
||||
#define NLMSG_TAIL(nmsg) ((struct rtattr *)(((void *)(nmsg)) + NLMSG_ALIGN((nmsg)->nlmsg_len)))
|
||||
|
||||
#ifndef NETNS_RTA
|
||||
#define NETNS_RTA(r) \
|
||||
((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct rtgenmsg))))
|
||||
#define NETNS_RTA(r) ((struct rtattr *)(((char *)(r)) + NLMSG_ALIGN(sizeof(struct rtgenmsg))))
|
||||
#endif
|
||||
|
||||
#endif /* __CR_LIBNETLINK_H__ */
|
||||
|
@ -18,23 +18,12 @@
|
||||
* means the userland is reading).
|
||||
*/
|
||||
#define UFFD_API ((__u64)0xAA)
|
||||
#define UFFD_API_FEATURES (UFFD_FEATURE_EVENT_FORK | \
|
||||
UFFD_FEATURE_EVENT_REMAP | \
|
||||
UFFD_FEATURE_EVENT_REMOVE | \
|
||||
UFFD_FEATURE_EVENT_UNMAP | \
|
||||
UFFD_FEATURE_MISSING_HUGETLBFS | \
|
||||
UFFD_FEATURE_MISSING_SHMEM)
|
||||
#define UFFD_API_IOCTLS \
|
||||
((__u64)1 << _UFFDIO_REGISTER | \
|
||||
(__u64)1 << _UFFDIO_UNREGISTER | \
|
||||
(__u64)1 << _UFFDIO_API)
|
||||
#define UFFD_API_RANGE_IOCTLS \
|
||||
((__u64)1 << _UFFDIO_WAKE | \
|
||||
(__u64)1 << _UFFDIO_COPY | \
|
||||
(__u64)1 << _UFFDIO_ZEROPAGE)
|
||||
#define UFFD_API_RANGE_IOCTLS_BASIC \
|
||||
((__u64)1 << _UFFDIO_WAKE | \
|
||||
(__u64)1 << _UFFDIO_COPY)
|
||||
#define UFFD_API_FEATURES \
|
||||
(UFFD_FEATURE_EVENT_FORK | UFFD_FEATURE_EVENT_REMAP | UFFD_FEATURE_EVENT_REMOVE | UFFD_FEATURE_EVENT_UNMAP | \
|
||||
UFFD_FEATURE_MISSING_HUGETLBFS | UFFD_FEATURE_MISSING_SHMEM)
|
||||
#define UFFD_API_IOCTLS ((__u64)1 << _UFFDIO_REGISTER | (__u64)1 << _UFFDIO_UNREGISTER | (__u64)1 << _UFFDIO_API)
|
||||
#define UFFD_API_RANGE_IOCTLS ((__u64)1 << _UFFDIO_WAKE | (__u64)1 << _UFFDIO_COPY | (__u64)1 << _UFFDIO_ZEROPAGE)
|
||||
#define UFFD_API_RANGE_IOCTLS_BASIC ((__u64)1 << _UFFDIO_WAKE | (__u64)1 << _UFFDIO_COPY)
|
||||
|
||||
/*
|
||||
* Valid ioctl command number range with this API is from 0x00 to
|
||||
@ -53,18 +42,12 @@
|
||||
|
||||
/* userfaultfd ioctl ids */
|
||||
#define UFFDIO 0xAA
|
||||
#define UFFDIO_API _IOWR(UFFDIO, _UFFDIO_API, \
|
||||
struct uffdio_api)
|
||||
#define UFFDIO_REGISTER _IOWR(UFFDIO, _UFFDIO_REGISTER, \
|
||||
struct uffdio_register)
|
||||
#define UFFDIO_UNREGISTER _IOR(UFFDIO, _UFFDIO_UNREGISTER, \
|
||||
struct uffdio_range)
|
||||
#define UFFDIO_WAKE _IOR(UFFDIO, _UFFDIO_WAKE, \
|
||||
struct uffdio_range)
|
||||
#define UFFDIO_COPY _IOWR(UFFDIO, _UFFDIO_COPY, \
|
||||
struct uffdio_copy)
|
||||
#define UFFDIO_ZEROPAGE _IOWR(UFFDIO, _UFFDIO_ZEROPAGE, \
|
||||
struct uffdio_zeropage)
|
||||
#define UFFDIO_API _IOWR(UFFDIO, _UFFDIO_API, struct uffdio_api)
|
||||
#define UFFDIO_REGISTER _IOWR(UFFDIO, _UFFDIO_REGISTER, struct uffdio_register)
|
||||
#define UFFDIO_UNREGISTER _IOR(UFFDIO, _UFFDIO_UNREGISTER, struct uffdio_range)
|
||||
#define UFFDIO_WAKE _IOR(UFFDIO, _UFFDIO_WAKE, struct uffdio_range)
|
||||
#define UFFDIO_COPY _IOWR(UFFDIO, _UFFDIO_COPY, struct uffdio_copy)
|
||||
#define UFFDIO_ZEROPAGE _IOWR(UFFDIO, _UFFDIO_ZEROPAGE, struct uffdio_zeropage)
|
||||
|
||||
/* read() structure */
|
||||
struct uffd_msg {
|
||||
|
@ -42,40 +42,23 @@ void flush_early_log_buffer(int fd);
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define pr_msg(fmt, ...) \
|
||||
print_on_level(LOG_MSG, \
|
||||
fmt, ##__VA_ARGS__)
|
||||
#define pr_msg(fmt, ...) print_on_level(LOG_MSG, fmt, ##__VA_ARGS__)
|
||||
|
||||
#define pr_info(fmt, ...) \
|
||||
print_on_level(LOG_INFO, \
|
||||
LOG_PREFIX fmt, ##__VA_ARGS__)
|
||||
#define pr_info(fmt, ...) print_on_level(LOG_INFO, LOG_PREFIX fmt, ##__VA_ARGS__)
|
||||
|
||||
#define pr_err(fmt, ...) \
|
||||
print_on_level(LOG_ERROR, \
|
||||
"Error (%s:%d): " LOG_PREFIX fmt, \
|
||||
__FILE__, __LINE__, ##__VA_ARGS__)
|
||||
#define pr_err(fmt, ...) print_on_level(LOG_ERROR, "Error (%s:%d): " LOG_PREFIX fmt, __FILE__, __LINE__, ##__VA_ARGS__)
|
||||
|
||||
#define pr_err_once(fmt, ...) \
|
||||
print_once(LOG_ERROR, fmt, ##__VA_ARGS__)
|
||||
#define pr_err_once(fmt, ...) print_once(LOG_ERROR, fmt, ##__VA_ARGS__)
|
||||
|
||||
#define pr_warn(fmt, ...) \
|
||||
print_on_level(LOG_WARN, \
|
||||
"Warn (%s:%d): " LOG_PREFIX fmt, \
|
||||
__FILE__, __LINE__, ##__VA_ARGS__)
|
||||
#define pr_warn(fmt, ...) print_on_level(LOG_WARN, "Warn (%s:%d): " LOG_PREFIX fmt, __FILE__, __LINE__, ##__VA_ARGS__)
|
||||
|
||||
#define pr_warn_once(fmt, ...) \
|
||||
print_once(LOG_WARN, \
|
||||
"Warn (%s:%d): " LOG_PREFIX fmt, \
|
||||
__FILE__, __LINE__, ##__VA_ARGS__)
|
||||
#define pr_warn_once(fmt, ...) print_once(LOG_WARN, "Warn (%s:%d): " LOG_PREFIX fmt, __FILE__, __LINE__, ##__VA_ARGS__)
|
||||
|
||||
#define pr_debug(fmt, ...) \
|
||||
print_on_level(LOG_DEBUG, \
|
||||
LOG_PREFIX fmt, ##__VA_ARGS__)
|
||||
#define pr_debug(fmt, ...) print_on_level(LOG_DEBUG, LOG_PREFIX fmt, ##__VA_ARGS__)
|
||||
|
||||
#ifndef CR_NOGLIBC
|
||||
|
||||
#define pr_perror(fmt, ...) \
|
||||
pr_err(fmt ": %s\n", ##__VA_ARGS__, strerror(errno))
|
||||
#define pr_perror(fmt, ...) pr_err(fmt ": %s\n", ##__VA_ARGS__, strerror(errno))
|
||||
|
||||
#endif /* CR_NOGLIBC */
|
||||
|
||||
|
@ -41,13 +41,16 @@ int dump_xattr_security_selinux(int fd, FdinfoEntry *e);
|
||||
int run_setsockcreatecon(FdinfoEntry *e);
|
||||
int reset_setsockcreatecon(void);
|
||||
#else
|
||||
static inline int dump_xattr_security_selinux(int fd, FdinfoEntry *e) {
|
||||
static inline int dump_xattr_security_selinux(int fd, FdinfoEntry *e)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline int run_setsockcreatecon(FdinfoEntry *e) {
|
||||
static inline int run_setsockcreatecon(FdinfoEntry *e)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline int reset_setsockcreatecon(void) {
|
||||
static inline int reset_setsockcreatecon(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
@ -28,10 +28,8 @@ extern int prepare_mm_pid(struct pstree_item *i);
|
||||
extern void prepare_cow_vmas(void);
|
||||
extern int do_task_reset_dirty_track(int pid);
|
||||
extern unsigned long dump_pages_args_size(struct vm_area_list *vmas);
|
||||
extern int parasite_dump_pages_seized(struct pstree_item *item,
|
||||
struct vm_area_list *vma_area_list,
|
||||
struct mem_dump_ctl *mdc,
|
||||
struct parasite_ctl *ctl);
|
||||
extern int parasite_dump_pages_seized(struct pstree_item *item, struct vm_area_list *vma_area_list,
|
||||
struct mem_dump_ctl *mdc, struct parasite_ctl *ctl);
|
||||
|
||||
#define PME_PRESENT (1ULL << 63)
|
||||
#define PME_SWAP (1ULL << 62)
|
||||
|
@ -94,7 +94,10 @@ extern struct ns_desc mnt_ns_desc;
|
||||
#ifdef CONFIG_BINFMT_MISC_VIRTUALIZED
|
||||
extern int collect_binfmt_misc(void);
|
||||
#else
|
||||
static inline int collect_binfmt_misc(void) { return 0; }
|
||||
static inline int collect_binfmt_misc(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
extern struct mount_info *mnt_entry_alloc(void);
|
||||
@ -115,14 +118,12 @@ extern int prepare_mnt_ns(void);
|
||||
|
||||
extern int pivot_root(const char *new_root, const char *put_old);
|
||||
|
||||
extern struct mount_info *lookup_overlayfs(char *rpath, unsigned int s_dev,
|
||||
unsigned int st_ino, unsigned int mnt_id);
|
||||
extern struct mount_info *lookup_overlayfs(char *rpath, unsigned int s_dev, unsigned int st_ino, unsigned int mnt_id);
|
||||
extern struct mount_info *lookup_mnt_id(unsigned int id);
|
||||
extern struct mount_info *lookup_mnt_sdev(unsigned int s_dev);
|
||||
|
||||
extern dev_t phys_stat_resolve_dev(struct ns_id *, dev_t st_dev, const char *path);
|
||||
extern bool phys_stat_dev_match(dev_t st_dev, dev_t phys_dev,
|
||||
struct ns_id *, const char *path);
|
||||
extern bool phys_stat_dev_match(dev_t st_dev, dev_t phys_dev, struct ns_id *, const char *path);
|
||||
|
||||
extern int restore_task_mnt_ns(struct pstree_item *current);
|
||||
extern void fini_restore_mntns(void);
|
||||
|
@ -38,9 +38,9 @@
|
||||
#define CLONE_NEWTIME 0x00000080
|
||||
#endif
|
||||
|
||||
#define CLONE_ALLNS (CLONE_NEWPID | CLONE_NEWNET | CLONE_NEWIPC | \
|
||||
CLONE_NEWUTS | CLONE_NEWNS | CLONE_NEWUSER | \
|
||||
CLONE_NEWCGROUP | CLONE_NEWTIME)
|
||||
#define CLONE_ALLNS \
|
||||
(CLONE_NEWPID | CLONE_NEWNET | CLONE_NEWIPC | CLONE_NEWUTS | CLONE_NEWNS | CLONE_NEWUSER | CLONE_NEWCGROUP | \
|
||||
CLONE_NEWTIME)
|
||||
|
||||
/* Nested namespaces are supported only for these types */
|
||||
#define CLONE_SUBNS (CLONE_NEWNS | CLONE_NEWNET)
|
||||
@ -116,7 +116,6 @@ struct ns_id {
|
||||
} mnt;
|
||||
|
||||
struct {
|
||||
|
||||
/*
|
||||
* ns_fd is used when network namespaces are being
|
||||
* restored. On this stage we access these file
|
||||
@ -143,9 +142,7 @@ extern struct ns_id *ns_ids;
|
||||
|
||||
#define NS_DESC_ENTRY(_cflag, _str) \
|
||||
{ \
|
||||
.cflag = _cflag, \
|
||||
.str = _str, \
|
||||
.len = sizeof(_str) - 1, \
|
||||
.cflag = _cflag, .str = _str, .len = sizeof(_str) - 1, \
|
||||
}
|
||||
|
||||
extern bool check_ns_proc(struct fd_link *link);
|
||||
@ -215,12 +212,10 @@ typedef int (*uns_call_t)(void *arg, int fd, pid_t pid);
|
||||
* In case we're not in userns, just call the callback immediately
|
||||
* in the context of calling task.
|
||||
*/
|
||||
extern int __userns_call(const char *func_name, uns_call_t call, int flags,
|
||||
void *arg, size_t arg_size, int fd);
|
||||
extern int __userns_call(const char *func_name, uns_call_t call, int flags, void *arg, size_t arg_size, int fd);
|
||||
|
||||
#define userns_call(__call, __flags, __arg, __arg_size, __fd) \
|
||||
__userns_call(__stringify(__call), __call, __flags, \
|
||||
__arg, __arg_size, __fd)
|
||||
__userns_call(__stringify(__call), __call, __flags, __arg, __arg_size, __fd)
|
||||
|
||||
extern int add_ns_shared_cb(int (*actor)(void *data), void *data);
|
||||
|
||||
|
@ -19,8 +19,7 @@ struct kernel_pipe_buffer {
|
||||
* fails very often, so we need to restrict the pipe capacity to not
|
||||
* allocate big chunks.
|
||||
*/
|
||||
#define PIPE_MAX_SIZE ((1 << PAGE_ALLOC_COSTLY_ORDER) * PAGE_SIZE / \
|
||||
sizeof(struct kernel_pipe_buffer))
|
||||
#define PIPE_MAX_SIZE ((1 << PAGE_ALLOC_COSTLY_ORDER) * PAGE_SIZE / sizeof(struct kernel_pipe_buffer))
|
||||
|
||||
/* The number of pipes for one chunk */
|
||||
#define NR_PIPES_PER_CHUNK 8
|
||||
@ -131,16 +130,15 @@ struct page_pipe {
|
||||
unsigned int flags; /* PP_FOO flags below */
|
||||
};
|
||||
|
||||
#define PP_CHUNK_MODE 0x1 /* Restrict the maximum buffer size of pipes
|
||||
#define PP_CHUNK_MODE \
|
||||
0x1 /* Restrict the maximum buffer size of pipes
|
||||
and dump memory for a few iterations */
|
||||
#define PP_OWN_IOVS 0x4 /* create_page_pipe allocated IOVs memory */
|
||||
|
||||
struct page_pipe *create_page_pipe(unsigned int nr_segs, struct iovec *iovs, unsigned flags);
|
||||
extern void destroy_page_pipe(struct page_pipe *p);
|
||||
extern int page_pipe_add_page(struct page_pipe *p, unsigned long addr,
|
||||
unsigned int flags);
|
||||
extern int page_pipe_add_hole(struct page_pipe *pp, unsigned long addr,
|
||||
unsigned int flags);
|
||||
extern int page_pipe_add_page(struct page_pipe *p, unsigned long addr, unsigned int flags);
|
||||
extern int page_pipe_add_hole(struct page_pipe *pp, unsigned long addr, unsigned int flags);
|
||||
|
||||
extern void debug_show_page_pipe(struct page_pipe *pp);
|
||||
void page_pipe_reinit(struct page_pipe *pp);
|
||||
@ -153,8 +151,7 @@ struct pipe_read_dest {
|
||||
};
|
||||
|
||||
extern int pipe_read_dest_init(struct pipe_read_dest *prd);
|
||||
extern int page_pipe_read(struct page_pipe *pp, struct pipe_read_dest *prd,
|
||||
unsigned long addr, unsigned int *nr_pages,
|
||||
extern int page_pipe_read(struct page_pipe *pp, struct pipe_read_dest *prd, unsigned long addr, unsigned int *nr_pages,
|
||||
unsigned int ppb_flags);
|
||||
|
||||
#endif /* __CR_PAGE_PIPE_H__ */
|
||||
|
@ -72,7 +72,6 @@ extern int check_parent_page_xfer(int fd_type, unsigned long id);
|
||||
extern int request_remote_pages(unsigned long img_id, unsigned long addr, int nr_pages);
|
||||
|
||||
typedef int (*ps_async_read_complete)(unsigned long img_id, unsigned long vaddr, int nr_pages, void *);
|
||||
extern int page_server_start_read(void *buf, int nr_pages,
|
||||
ps_async_read_complete complete, void *priv, unsigned flags);
|
||||
extern int page_server_start_read(void *buf, int nr_pages, ps_async_read_complete complete, void *priv, unsigned flags);
|
||||
|
||||
#endif /* __CR_PAGE_XFER__H__ */
|
||||
|
@ -20,7 +20,10 @@ typedef struct {
|
||||
int fd; /* file to read PMs from */
|
||||
} pmc_t;
|
||||
|
||||
#define PMC_INIT (pmc_t){ }
|
||||
#define PMC_INIT \
|
||||
(pmc_t) \
|
||||
{ \
|
||||
}
|
||||
|
||||
extern int pmc_init(pmc_t *pmc, pid_t pid, const struct list_head *vma_head, size_t size);
|
||||
extern u64 *pmc_get_map(pmc_t *pmc, const struct vma_area *vma);
|
||||
|
@ -44,8 +44,7 @@
|
||||
|
||||
struct page_read {
|
||||
/* reads page from current pagemap */
|
||||
int (*read_pages)(struct page_read *, unsigned long vaddr, int nr,
|
||||
void *, unsigned flags);
|
||||
int (*read_pages)(struct page_read *, unsigned long vaddr, int nr, void *, unsigned flags);
|
||||
/* Advance page_read to the next entry */
|
||||
int (*advance)(struct page_read *pr);
|
||||
void (*close)(struct page_read *);
|
||||
@ -54,8 +53,7 @@ struct page_read {
|
||||
int (*seek_pagemap)(struct page_read *pr, unsigned long vaddr);
|
||||
void (*reset)(struct page_read *pr);
|
||||
int (*io_complete)(struct page_read *, unsigned long vaddr, int nr);
|
||||
int (*maybe_read_page)(struct page_read *pr, unsigned long vaddr,
|
||||
int nr, void *buf, unsigned flags);
|
||||
int (*maybe_read_page)(struct page_read *pr, unsigned long vaddr, int nr, void *buf, unsigned flags);
|
||||
|
||||
/* Whether or not pages can be read in PIE code */
|
||||
bool pieok;
|
||||
@ -103,13 +101,11 @@ struct page_read {
|
||||
* 1 -- opened
|
||||
*/
|
||||
extern int open_page_read(unsigned long id, struct page_read *, int pr_flags);
|
||||
extern int open_page_read_at(int dfd, unsigned long id, struct page_read *pr,
|
||||
int pr_flags);
|
||||
extern int open_page_read_at(int dfd, unsigned long id, struct page_read *pr, int pr_flags);
|
||||
|
||||
struct task_restore_args;
|
||||
|
||||
int pagemap_enqueue_iovec(struct page_read *pr, void *buf,
|
||||
unsigned long len, struct list_head *to);
|
||||
int pagemap_enqueue_iovec(struct page_read *pr, void *buf, unsigned long len, struct list_head *to);
|
||||
int pagemap_render_iovec(struct list_head *from, struct task_restore_args *ta);
|
||||
|
||||
/*
|
||||
@ -119,8 +115,7 @@ int pagemap_render_iovec(struct list_head *from, struct task_restore_args *ta);
|
||||
*/
|
||||
extern void dup_page_read(struct page_read *src, struct page_read *dst);
|
||||
|
||||
extern int dedup_one_iovec(struct page_read *pr, unsigned long base,
|
||||
unsigned long len);
|
||||
extern int dedup_one_iovec(struct page_read *pr, unsigned long base, unsigned long len);
|
||||
|
||||
static inline unsigned long pagemap_len(PagemapEntry *pe)
|
||||
{
|
||||
|
@ -25,25 +25,21 @@ extern int parasite_dump_sigacts_seized(struct parasite_ctl *ctl, struct pstree_
|
||||
extern int parasite_dump_itimers_seized(struct parasite_ctl *ctl, struct pstree_item *);
|
||||
|
||||
struct proc_posix_timers_stat;
|
||||
extern int parasite_dump_posix_timers_seized(struct proc_posix_timers_stat *proc_args,
|
||||
struct parasite_ctl *ctl, struct pstree_item *);
|
||||
extern int parasite_dump_posix_timers_seized(struct proc_posix_timers_stat *proc_args, struct parasite_ctl *ctl,
|
||||
struct pstree_item *);
|
||||
|
||||
extern int parasite_dump_misc_seized(struct parasite_ctl *ctl, struct parasite_dump_misc *misc);
|
||||
extern int parasite_dump_creds(struct parasite_ctl *ctl, CredsEntry *ce);
|
||||
extern int parasite_dump_thread_leader_seized(struct parasite_ctl *ctl, int pid, CoreEntry *core);
|
||||
extern int parasite_dump_thread_seized(struct parasite_thread_ctl *tctl,
|
||||
struct parasite_ctl *ctl, int id,
|
||||
extern int parasite_dump_thread_seized(struct parasite_thread_ctl *tctl, struct parasite_ctl *ctl, int id,
|
||||
struct pid *tid, CoreEntry *core);
|
||||
extern int dump_thread_core(int pid, CoreEntry *core,
|
||||
const struct parasite_dump_thread *dt);
|
||||
extern int dump_thread_core(int pid, CoreEntry *core, const struct parasite_dump_thread *dt);
|
||||
|
||||
extern int parasite_drain_fds_seized(struct parasite_ctl *ctl,
|
||||
struct parasite_drain_fd *dfds, int nr_fds, int off,
|
||||
extern int parasite_drain_fds_seized(struct parasite_ctl *ctl, struct parasite_drain_fd *dfds, int nr_fds, int off,
|
||||
int *lfds, struct fd_opts *flags);
|
||||
extern int parasite_get_proc_fd_seized(struct parasite_ctl *ctl);
|
||||
|
||||
extern struct parasite_ctl *parasite_infect_seized(pid_t pid,
|
||||
struct pstree_item *item,
|
||||
extern struct parasite_ctl *parasite_infect_seized(pid_t pid, struct pstree_item *item,
|
||||
struct vm_area_list *vma_area_list);
|
||||
extern void parasite_ensure_args_size(unsigned long sz);
|
||||
extern unsigned long get_exec_start(struct vm_area_list *);
|
||||
|
@ -44,8 +44,8 @@ struct vdso_mark {
|
||||
#define VDSO_MARK_SIGNATURE_V3 (0x4f53447655495243ULL) /* Magic number (CRIUvDSO) */
|
||||
#define VDSO_MARK_CUR_VERSION (3)
|
||||
|
||||
static inline void vdso_put_mark(void *where, unsigned long rt_vvar_addr,
|
||||
unsigned long orig_vdso_addr, unsigned long orig_vvar_addr)
|
||||
static inline void vdso_put_mark(void *where, unsigned long rt_vvar_addr, unsigned long orig_vdso_addr,
|
||||
unsigned long orig_vvar_addr)
|
||||
{
|
||||
struct vdso_mark *m = where;
|
||||
|
||||
@ -68,13 +68,11 @@ static inline bool is_vdso_mark(void *addr)
|
||||
* to the version we support.
|
||||
*/
|
||||
case VDSO_MARK_SIGNATURE_V2:
|
||||
vdso_put_mark(m, VVAR_BAD_ADDR,
|
||||
m->orig_vdso_addr, m->orig_vvar_addr);
|
||||
vdso_put_mark(m, VVAR_BAD_ADDR, m->orig_vdso_addr, m->orig_vvar_addr);
|
||||
return true;
|
||||
|
||||
case VDSO_MARK_SIGNATURE_V1:
|
||||
vdso_put_mark(m, VVAR_BAD_ADDR,
|
||||
m->orig_vdso_addr, VVAR_BAD_ADDR);
|
||||
vdso_put_mark(m, VVAR_BAD_ADDR, m->orig_vdso_addr, VVAR_BAD_ADDR);
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -82,14 +80,11 @@ static inline bool is_vdso_mark(void *addr)
|
||||
}
|
||||
|
||||
extern void vdso_update_gtod_addr(struct vdso_maps *rt);
|
||||
extern int vdso_do_park(struct vdso_maps *rt, unsigned long park_at,
|
||||
unsigned long park_size);
|
||||
extern int vdso_do_park(struct vdso_maps *rt, unsigned long park_at, unsigned long park_size);
|
||||
extern int vdso_map_compat(unsigned long map_at);
|
||||
extern int vdso_proxify(struct vdso_maps *rt, bool *added_proxy,
|
||||
VmaEntry *vmas, size_t nr_vmas,
|
||||
bool compat_vdso, bool force_trampolines);
|
||||
extern int vdso_redirect_calls(unsigned long base_to, unsigned long base_from,
|
||||
struct vdso_symtable *to, struct vdso_symtable *from,
|
||||
bool compat_vdso);
|
||||
extern int vdso_proxify(struct vdso_maps *rt, bool *added_proxy, VmaEntry *vmas, size_t nr_vmas, bool compat_vdso,
|
||||
bool force_trampolines);
|
||||
extern int vdso_redirect_calls(unsigned long base_to, unsigned long base_from, struct vdso_symtable *to,
|
||||
struct vdso_symtable *from, bool compat_vdso);
|
||||
|
||||
#endif /* __CR_PARASITE_VDSO_H__ */
|
||||
|
@ -39,8 +39,7 @@ enum {
|
||||
PARASITE_CMD_MAX,
|
||||
};
|
||||
|
||||
struct parasite_vma_entry
|
||||
{
|
||||
struct parasite_vma_entry {
|
||||
unsigned long start;
|
||||
unsigned long len;
|
||||
int prot;
|
||||
@ -134,8 +133,8 @@ struct parasite_dump_misc {
|
||||
* and still fit the struct in one page
|
||||
*/
|
||||
#define PARASITE_MAX_GROUPS \
|
||||
((PAGE_SIZE - sizeof(struct parasite_dump_thread) - \
|
||||
offsetof(struct parasite_dump_creds, groups)) / sizeof(unsigned int)) /* groups */
|
||||
((PAGE_SIZE - sizeof(struct parasite_dump_thread) - offsetof(struct parasite_dump_creds, groups)) / \
|
||||
sizeof(unsigned int)) /* groups */
|
||||
|
||||
struct parasite_dump_creds {
|
||||
unsigned int cap_last_cap;
|
||||
|
@ -35,7 +35,6 @@ char *cut_root_for_bind(char *target_root, char *source_root);
|
||||
* Get a mount point for a sibling of m if m->parent and p are in the same
|
||||
* shared group.
|
||||
*/
|
||||
char *mnt_get_sibling_path(struct mount_info *m,
|
||||
struct mount_info *p, char *buf, int len);
|
||||
char *mnt_get_sibling_path(struct mount_info *m, struct mount_info *p, char *buf, int len);
|
||||
|
||||
#endif
|
||||
|
@ -8,8 +8,7 @@
|
||||
/*
|
||||
* Task states, used in e.g. struct pid's state.
|
||||
*/
|
||||
enum __criu_task_state
|
||||
{
|
||||
enum __criu_task_state {
|
||||
/* Values shared with compel */
|
||||
TASK_ALIVE = COMPEL_TASK_ALIVE,
|
||||
TASK_DEAD = COMPEL_TASK_DEAD,
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user