libcareplus/0027-kpatch_parse-Split-function-init_multilines.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

250 lines
6.2 KiB
Diff

From 0e0e7195fca05f706c1701484710fea9fc8b21f5 Mon Sep 17 00:00:00 2001
From: Jiajie Li <lijiajie11@huawei.com>
Date: Mon, 12 Oct 2020 13:41:06 +0800
Subject: [PATCH 27/89] kpatch_parse: Split function init_multilines
The function init_multilines is arch related, so let's make
two definations in arch/x86/arch_parse.c and arch/aarch64/arch_parse.c
Signed-off-by: Jiajie Li <lijiajie11@huawei.com>
Signed-off-by: Ying Fang <fangying1@huawei.com>
---
src/arch/aarch64/arch_parse.c | 67 +++++++++++++++++++++++++++++++++++
src/arch/x86/arch_parse.c | 65 +++++++++++++++++++++++++++++++++
src/kpatch_parse.c | 65 ---------------------------------
3 files changed, 132 insertions(+), 65 deletions(-)
diff --git a/src/arch/aarch64/arch_parse.c b/src/arch/aarch64/arch_parse.c
index 8eb88a9..1233e03 100644
--- a/src/arch/aarch64/arch_parse.c
+++ b/src/arch/aarch64/arch_parse.c
@@ -4,6 +4,73 @@
#include "include/kpatch_parse.h"
#include "include/kpatch_flags.h"
+/* break manually crafted multiple statements separated by ; to separate lines */
+void init_multilines(struct kp_file *f)
+{
+ int i, nr, sz = 64, slen, first_token;
+ char **lines = NULL, *s, *se;
+ int *lines_num = NULL;
+ kpstr_t t;
+
+ nr = 0;
+ for (i = 0; i < f->nr_lines; i++) {
+ if (nr + 1000 >= sz || !lines) {
+ sz *= 2;
+ lines = kp_realloc(lines, (sz/2) * sizeof(char *), sz * sizeof(char *));
+ lines_num = kp_realloc(lines_num, (sz/2) * sizeof(int), sz * sizeof(int));
+ }
+
+ s = f->lines[i];
+ if (strpbrk(s, ";:") != NULL) {
+ while (s && *s) {
+ se = s;
+ slen = strlen(s);
+ first_token = 1;
+ while (se) {
+ get_token(&se, &t);
+ if (t.l == 1 && t.s[0] == '#')
+ goto done;
+ if (t.l == 2 && t.s[0] == '/' && t.s[1] == '/')
+ goto done;
+ if (t.l == 1 && t.s[0] == ';') {
+ slen = t.s - s;
+ break;
+ }
+ /* first token with ':' after is
+ * the label, separate it unless
+ * it is done already (next non-blank
+ * is '\0')
+ */
+ if (first_token && se &&
+ se[0] == ':' &&
+ se[1] != '\0') {
+ slen = se - s + 1;
+ se++;
+ break;
+ }
+ first_token = 0;
+ }
+ lines[nr] = strndup(s, slen);
+ s = se;
+ lines_num[nr] = i;
+ nr++;
+ if (nr >= sz)
+ kpfatal("oops, not prepared to handle >1000 asm statements in single line");
+ }
+ free(f->lines[i]);
+ } else {
+done:
+ lines[nr] = s;
+ lines_num[nr] = i;
+ nr++;
+ }
+ }
+ free(f->lines);
+ f->lines = lines;
+ f->lines_num = lines_num;
+ f->nr_lines = nr;
+}
+
int parse_ctype(char *origs, bool with_checks)
{
char *s = origs;
diff --git a/src/arch/x86/arch_parse.c b/src/arch/x86/arch_parse.c
index 5a67116..92ff483 100644
--- a/src/arch/x86/arch_parse.c
+++ b/src/arch/x86/arch_parse.c
@@ -4,6 +4,71 @@
#include "include/kpatch_parse.h"
#include "include/kpatch_flags.h"
+/* break manually crafted multiple statements separated by ; to separate lines */
+void init_multilines(struct kp_file *f)
+{
+ int i, nr, sz = 64, slen, first_token;
+ char **lines = NULL, *s, *se;
+ int *lines_num = NULL;
+ kpstr_t t;
+
+ nr = 0;
+ for (i = 0; i < f->nr_lines; i++) {
+ if (nr + 1000 >= sz || !lines) {
+ sz *= 2;
+ lines = kp_realloc(lines, (sz/2) * sizeof(char *), sz * sizeof(char *));
+ lines_num = kp_realloc(lines_num, (sz/2) * sizeof(int), sz * sizeof(int));
+ }
+
+ s = f->lines[i];
+ if (strpbrk(s, ";:") != NULL) {
+ while (s && *s) {
+ se = s;
+ slen = strlen(s);
+ first_token = 1;
+ while (se) {
+ get_token(&se, &t);
+ if (t.l == 1 && t.s[0] == '#')
+ goto done;
+ if (t.l == 1 && t.s[0] == ';') {
+ slen = t.s - s;
+ break;
+ }
+ /* first token with ':' after is
+ * the label, separate it unless
+ * it is done already (next non-blank
+ * is '\0')
+ */
+ if (first_token && se &&
+ se[0] == ':' &&
+ se[1] != '\0') {
+ slen = se - s + 1;
+ se++;
+ break;
+ }
+ first_token = 0;
+ }
+ lines[nr] = strndup(s, slen);
+ s = se;
+ lines_num[nr] = i;
+ nr++;
+ if (nr >= sz)
+ kpfatal("oops, not prepared to handle >1000 asm statements in single line");
+ }
+ free(f->lines[i]);
+ } else {
+done:
+ lines[nr] = s;
+ lines_num[nr] = i;
+ nr++;
+ }
+ }
+ free(f->lines);
+ f->lines = lines;
+ f->lines_num = lines_num;
+ f->nr_lines = nr;
+}
+
int parse_ctype(char *origs, bool with_checks)
{
char *s = origs;
diff --git a/src/kpatch_parse.c b/src/kpatch_parse.c
index 4bafdb7..857dbf3 100644
--- a/src/kpatch_parse.c
+++ b/src/kpatch_parse.c
@@ -136,71 +136,6 @@ int is_sect_cmd(struct kp_file *f, int l)
t == DIRECTIVE_PREVIOUS || t == DIRECTIVE_SUBSECTION;
}
-/* break manually crafted multiple statements separated by ; to separate lines */
-void init_multilines(struct kp_file *f)
-{
- int i, nr, sz = 64, slen, first_token;
- char **lines = NULL, *s, *se;
- int *lines_num = NULL;
- kpstr_t t;
-
- nr = 0;
- for (i = 0; i < f->nr_lines; i++) {
- if (nr + 1000 >= sz || !lines) {
- sz *= 2;
- lines = kp_realloc(lines, (sz/2) * sizeof(char *), sz * sizeof(char *));
- lines_num = kp_realloc(lines_num, (sz/2) * sizeof(int), sz * sizeof(int));
- }
-
- s = f->lines[i];
- if (strpbrk(s, ";:") != NULL) {
- while (s && *s) {
- se = s;
- slen = strlen(s);
- first_token = 1;
- while (se) {
- get_token(&se, &t);
- if (t.l == 1 && t.s[0] == '#')
- goto done;
- if (t.l == 1 && t.s[0] == ';') {
- slen = t.s - s;
- break;
- }
- /* first token with ':' after is
- * the label, separate it unless
- * it is done already (next non-blank
- * is '\0')
- */
- if (first_token && se &&
- se[0] == ':' &&
- se[1] != '\0') {
- slen = se - s + 1;
- se++;
- break;
- }
- first_token = 0;
- }
- lines[nr] = strndup(s, slen);
- s = se;
- lines_num[nr] = i;
- nr++;
- if (nr >= sz)
- kpfatal("oops, not prepared to handle >1000 asm statements in single line");
- }
- free(f->lines[i]);
- } else {
-done:
- lines[nr] = s;
- lines_num[nr] = i;
- nr++;
- }
- }
- free(f->lines);
- f->lines = lines;
- f->lines_num = lines_num;
- f->nr_lines = nr;
-}
-
void init_ctypes(struct kp_file *f)
{
int i;
--
2.23.0