libcareplus/0032-kpatch_coro-Split-function-_UCORO_access_reg.patch
Jiajie Li 2b0fff2855 AArch64 support: add aarch64 support for libcareplus
Add related code which make libcareplus can run basic demo on aarch64.

Signed-off-by: Jiajie Li <lijiajie11@huawei.com>
2021-02-10 09:18:56 +08:00

197 lines
5.5 KiB
Diff

From ae9e01aefed4105c808301e783d29ddd349dc0f6 Mon Sep 17 00:00:00 2001
From: Jiajie Li <lijiajie11@huawei.com>
Date: Mon, 12 Oct 2020 14:22:45 +0800
Subject: [PATCH 32/89] kpatch_coro: Split function _UCORO_access_reg
The function _UCORO_access_reg is arch related, so make two
separate definations in arch/x86/arch_coro.c and arch/aarch64/arch_coro.c
Signed-off-by: Jiajie Li <lijiajie11@huawei.com>
Signed-off-by: Ying Fang <fangying1@huawei.com>
---
src/arch/aarch64/arch_coro.c | 39 ++++++++++++++++++++++++++++++++
src/arch/x86/arch_coro.c | 43 ++++++++++++++++++++++++++++++++++++
src/include/kpatch_coro.h | 11 +++++++++
src/kpatch_coro.c | 37 -------------------------------
4 files changed, 93 insertions(+), 37 deletions(-)
diff --git a/src/arch/aarch64/arch_coro.c b/src/arch/aarch64/arch_coro.c
index e69de29..e6fe3d0 100644
--- a/src/arch/aarch64/arch_coro.c
+++ b/src/arch/aarch64/arch_coro.c
@@ -0,0 +1,39 @@
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <libunwind-ptrace.h>
+#include <sys/utsname.h>
+
+#include "include/kpatch_user.h"
+#include "include/kpatch_coro.h"
+#include "include/kpatch_common.h"
+#include "include/kpatch_elf.h"
+#include "include/kpatch_ptrace.h"
+#include "include/kpatch_log.h"
+
+int _UCORO_access_reg(unw_addr_space_t as, unw_regnum_t reg, unw_word_t *val,
+ int write, void *arg)
+{
+ struct UCORO_info *info = (struct UCORO_info *)arg;
+ unsigned long *regs = (unsigned long *)info->coro->env[0].__jmpbuf;
+
+ if (write) {
+ kperr("_UCORO_access_reg: write is not implemeneted (%d)\n", reg);
+ return -UNW_EINVAL;
+ }
+ switch (reg) {
+ case UNW_AARCH64_X9:
+ *val = regs[JB_RBX]; break;
+ case UNW_AARCH64_X29:
+ *val = regs[JB_RBP]; break;
+ case UNW_AARCH64_X12...UNW_AARCH64_X15:
+ *val = regs[reg - UNW_AARCH64_X12 + JB_R12]; break;
+ case UNW_AARCH64_SP:
+ *val = regs[JB_RSP]; break;
+ case UNW_AARCH64_PC:
+ *val = regs[JB_RIP]; break;
+ default:
+ return _UPT_access_reg(as, reg, val, write, arg);
+ }
+ return 0;
+}
diff --git a/src/arch/x86/arch_coro.c b/src/arch/x86/arch_coro.c
index e69de29..ce889df 100644
--- a/src/arch/x86/arch_coro.c
+++ b/src/arch/x86/arch_coro.c
@@ -0,0 +1,43 @@
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include <libunwind-ptrace.h>
+
+#include <sys/utsname.h>
+
+#include <asm/prctl.h>
+
+#include "include/kpatch_user.h"
+#include "include/kpatch_coro.h"
+#include "include/kpatch_common.h"
+#include "include/kpatch_elf.h"
+#include "include/kpatch_ptrace.h"
+#include "include/kpatch_log.h"
+
+int _UCORO_access_reg(unw_addr_space_t as, unw_regnum_t reg, unw_word_t *val,
+ int write, void *arg)
+{
+ struct UCORO_info *info = (struct UCORO_info *)arg;
+ unsigned long *regs = (unsigned long *)info->coro->env[0].__jmpbuf;
+
+ if (write) {
+ kperr("_UCORO_access_reg: write is not implemeneted (%d)\n", reg);
+ return -UNW_EINVAL;
+ }
+ switch (reg) {
+ case UNW_X86_64_RBX:
+ *val = regs[JB_RBX]; break;
+ case UNW_X86_64_RBP:
+ *val = regs[JB_RBP]; break;
+ case UNW_X86_64_R12...UNW_X86_64_R15:
+ *val = regs[reg - UNW_X86_64_R12 + JB_R12]; break;
+ case UNW_X86_64_RSP:
+ *val = regs[JB_RSP]; break;
+ case UNW_X86_64_RIP:
+ *val = regs[JB_RIP]; break;
+ default:
+ return _UPT_access_reg(as, reg, val, write, arg);
+ }
+ return 0;
+}
diff --git a/src/include/kpatch_coro.h b/src/include/kpatch_coro.h
index 1588b5e..760b1db 100644
--- a/src/include/kpatch_coro.h
+++ b/src/include/kpatch_coro.h
@@ -19,6 +19,17 @@ struct kpatch_coro {
void *_UCORO_create(struct kpatch_coro *coro, pid_t pid);
void _UCORO_destroy(void *arg);
+
+struct UCORO_info {
+ union {
+ void *upt;
+ char dummy[256];
+ };
+ struct kpatch_coro *coro;
+};
+int _UCORO_access_reg(unw_addr_space_t as, unw_regnum_t reg,
+ unw_word_t *val, int write, void *arg);
+
int kpatch_coroutines_init(struct kpatch_process *proc);
int kpatch_coroutines_find(struct kpatch_process *proc);
void kpatch_coroutines_free(struct kpatch_process *proc);
diff --git a/src/kpatch_coro.c b/src/kpatch_coro.c
index 02d421b..83d04ce 100644
--- a/src/kpatch_coro.c
+++ b/src/kpatch_coro.c
@@ -6,8 +6,6 @@
#include <sys/utsname.h>
-#include <asm/prctl.h>
-
#include "include/kpatch_user.h"
#include "include/kpatch_coro.h"
#include "include/kpatch_common.h"
@@ -505,13 +503,6 @@ static struct kpatch_coro_ops kpatch_coro_flavours[] = {
*
* That's why I had to do this hack
*/
-struct UCORO_info {
- union {
- void *upt;
- char dummy[256];
- };
- struct kpatch_coro *coro;
-};
void *_UCORO_create(struct kpatch_coro *coro, pid_t pid)
{
@@ -538,34 +529,6 @@ void _UCORO_destroy(void *arg)
_UPT_destroy(info);
}
-static int
-_UCORO_access_reg(unw_addr_space_t as, unw_regnum_t reg, unw_word_t *val,
- int write, void *arg)
-{
- struct UCORO_info *info = (struct UCORO_info *)arg;
- unsigned long *regs = (unsigned long *)info->coro->env[0].__jmpbuf;
-
- if (write) {
- kperr("_UCORO_access_reg: write is not implemeneted (%d)\n", reg);
- return -UNW_EINVAL;
- }
- switch (reg) {
- case UNW_X86_64_RBX:
- *val = regs[JB_RBX]; break;
- case UNW_X86_64_RBP:
- *val = regs[JB_RBP]; break;
- case UNW_X86_64_R12...UNW_X86_64_R15:
- *val = regs[reg - UNW_X86_64_R12 + JB_R12]; break;
- case UNW_X86_64_RSP:
- *val = regs[JB_RSP]; break;
- case UNW_X86_64_RIP:
- *val = regs[JB_RIP]; break;
- default:
- return _UPT_access_reg(as, reg, val, write, arg);
- }
- return 0;
-}
-
static unw_accessors_t _UCORO_accessors = {
_UPT_find_proc_info,
_UPT_put_unwind_info,
--
2.23.0