Add related code which make libcareplus can run basic demo on aarch64. Signed-off-by: Jiajie Li <lijiajie11@huawei.com>
250 lines
6.2 KiB
Diff
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
|
|
|