From: Chao Fan <fanc.fnst@cn.fujitsu.com>
To: <linux-kernel@vger.kernel.org>, <x86@kernel.org>,
<linux-efi@vger.kernel.org>, <linux-acpi@vger.kernel.org>,
<bp@alien8.de>, <tglx@linutronix.de>, <mingo@redhat.com>,
<hpa@zytor.com>, <keescook@chromium.org>, <bhe@redhat.com>,
<msys.mizuma@gmail.com>
Cc: <indou.takao@jp.fujitsu.com>, <caoj.fnst@cn.fujitsu.com>,
<fanc.fnst@cn.fujitsu.com>
Subject: [PATCH v9 2/8] x86/boot: Copy kstrtoull() to compressed period
Date: Wed, 17 Oct 2018 18:20:06 +0800 [thread overview]
Message-ID: <20181017102012.872-3-fanc.fnst@cn.fujitsu.com> (raw)
In-Reply-To: <20181017102012.872-1-fanc.fnst@cn.fujitsu.com>
Copy kstrtoull() to 'compressed' directory so that
we can use it to change the address in cmdline from
string to unsigned long long.
Signed-off-by: Chao Fan <fanc.fnst@cn.fujitsu.com>
---
arch/x86/boot/compressed/misc.c | 88 +++++++++++++++++++++++++++++++++
arch/x86/boot/compressed/misc.h | 4 ++
2 files changed, 92 insertions(+)
diff --git a/arch/x86/boot/compressed/misc.c b/arch/x86/boot/compressed/misc.c
index 8dd1d5ccae58..5b9b24949337 100644
--- a/arch/x86/boot/compressed/misc.c
+++ b/arch/x86/boot/compressed/misc.c
@@ -426,3 +426,91 @@ void fortify_panic(const char *name)
{
error("detected buffer overflow");
}
+
+#define KSTRTOX_OVERFLOW (1U << 31)
+
+static inline char _tolower(const char c)
+{
+ return c | 0x20;
+}
+
+unsigned int
+_parse_integer(const char *s, unsigned int base, unsigned long long *p)
+{
+ unsigned long long res;
+ unsigned int rv;
+
+ res = 0;
+ rv = 0;
+ while (1) {
+ unsigned int c = *s;
+ unsigned int lc = c | 0x20; /* don't tolower() this line */
+ unsigned int val;
+
+ if ('0' <= c && c <= '9')
+ val = c - '0';
+ else if ('a' <= lc && lc <= 'f')
+ val = lc - 'a' + 10;
+ else
+ break;
+
+ if (val >= base)
+ break;
+ /*
+ * Check for overflow only if we are within range of
+ * it in the max base we support (16)
+ */
+ if (unlikely(res & (~0ull << 60))) {
+ if (res > div_u64(ULLONG_MAX - val, base))
+ rv |= KSTRTOX_OVERFLOW;
+ }
+ res = res * base + val;
+ rv++;
+ s++;
+ }
+ *p = res;
+ return rv;
+}
+
+const char *_parse_integer_fixup_radix(const char *s, unsigned int *base)
+{
+ if (*base == 0) {
+ if (s[0] == '0') {
+ if (_tolower(s[1]) == 'x' && isxdigit(s[2]))
+ *base = 16;
+ else
+ *base = 8;
+ } else
+ *base = 10;
+ }
+ if (*base == 16 && s[0] == '0' && _tolower(s[1]) == 'x')
+ s += 2;
+ return s;
+}
+
+static int _kstrtoull(const char *s, unsigned int base, unsigned long long *res)
+{
+ unsigned long long _res;
+ unsigned int rv;
+
+ s = _parse_integer_fixup_radix(s, &base);
+ rv = _parse_integer(s, base, &_res);
+ if (rv & KSTRTOX_OVERFLOW)
+ return -ERANGE;
+ if (rv == 0)
+ return -EINVAL;
+ s += rv;
+ if (*s == '\n')
+ s++;
+ if (*s)
+ return -EINVAL;
+ *res = _res;
+ return 0;
+}
+
+int kstrtoull(const char *s, unsigned int base, unsigned long long *res)
+{
+ if (s[0] == '+')
+ s++;
+ return _kstrtoull(s, base, res);
+}
diff --git a/arch/x86/boot/compressed/misc.h b/arch/x86/boot/compressed/misc.h
index 008fdc47a29c..40378408d980 100644
--- a/arch/x86/boot/compressed/misc.h
+++ b/arch/x86/boot/compressed/misc.h
@@ -63,6 +63,10 @@ static inline void debug_puthex(const char *s)
#endif
+#if (defined CONFIG_RANDOMIZE_BASE) && (defined CONFIG_RANDOMIZE_BASE)
+int kstrtoull(const char *s, unsigned int base, unsigned long long *res);
+#endif
+
#if CONFIG_EARLY_PRINTK || CONFIG_RANDOMIZE_BASE
/* cmdline.c */
int cmdline_find_option(const char *option, char *buffer, int bufsize);
--
2.17.2
next prev parent reply other threads:[~2018-10-17 10:21 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-10-17 10:20 [PATCH v9 0/8] x86/boot/KASLR: Parse ACPI table and limit kaslr in immovable memory Chao Fan
2018-10-17 10:20 ` [PATCH v9 1/8] x86/boot: Introduce cmdline_find_option_arg()to detect if option=arg in cmdline Chao Fan
2018-10-18 4:01 ` Baoquan He
2018-10-18 6:15 ` Chao Fan
2018-10-17 10:20 ` Chao Fan [this message]
2018-10-18 4:03 ` [PATCH v9 2/8] x86/boot: Copy kstrtoull() to compressed period Baoquan He
2018-10-18 5:51 ` Chao Fan
2018-10-18 6:01 ` Baoquan He
2018-10-18 6:08 ` Chao Fan
2018-10-17 10:20 ` [PATCH v9 3/8] x86/boot: Add efi_get_rsdp_addr() to dig out RSDP from EFI table Chao Fan
2018-10-18 4:35 ` Baoquan He
2018-10-18 5:54 ` Chao Fan
2018-10-18 5:56 ` Baoquan He
2018-10-18 6:10 ` Chao Fan
2018-10-17 10:20 ` [PATCH v9 4/8] x86/boot: Add bios_get_rsdp_addr() to search RSDP in memory Chao Fan
2018-10-17 10:20 ` [PATCH v9 5/8] x86/boot: Add get_acpi_rsdp() to parse RSDP in cmdlien from kexec Chao Fan
2018-10-21 2:26 ` Baoquan He
2018-10-22 5:30 ` Fan, Chao
2018-10-22 6:06 ` Baoquan He
2018-10-22 7:30 ` Chao Fan
2018-10-22 7:36 ` Baoquan He
2018-10-17 10:20 ` [PATCH v9 6/8] x86/boot: Dig out SRAT table from RSDP and find immovable memory Chao Fan
2018-10-18 6:12 ` Chao Fan
2018-10-21 2:34 ` Baoquan He
2018-10-22 5:29 ` Fan, Chao
2018-10-22 6:08 ` Baoquan He
2018-10-17 10:20 ` [PATCH v9 7/8] x86/boot/KASLR: Walk srat tables to filter " Chao Fan
2018-10-18 4:23 ` Baoquan He
2018-10-18 5:56 ` Chao Fan
2018-10-17 10:20 ` [PATCH v9 8/8] x86/boot/KASLR: Limit kaslr to choosing the " Chao Fan
2018-10-18 4:21 ` Baoquan He
2018-10-22 10:13 ` Chao Fan
2018-10-22 10:24 ` Baoquan He
2018-10-22 10:49 ` Chao Fan
2018-10-18 3:59 ` [PATCH v9 0/8] x86/boot/KASLR: Parse ACPI table and limit kaslr in " Baoquan He
2018-10-18 5:48 ` Chao Fan
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20181017102012.872-3-fanc.fnst@cn.fujitsu.com \
--to=fanc.fnst@cn.fujitsu.com \
--cc=bhe@redhat.com \
--cc=bp@alien8.de \
--cc=caoj.fnst@cn.fujitsu.com \
--cc=hpa@zytor.com \
--cc=indou.takao@jp.fujitsu.com \
--cc=keescook@chromium.org \
--cc=linux-acpi@vger.kernel.org \
--cc=linux-efi@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@redhat.com \
--cc=msys.mizuma@gmail.com \
--cc=tglx@linutronix.de \
--cc=x86@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).