From: Borislav Petkov <bp@alien8.de>
To: Daniel Kiper <daniel.kiper@oracle.com>
Cc: linux-efi@vger.kernel.org, linux-kernel@vger.kernel.org,
x86@kernel.org, xen-devel@lists.xenproject.org,
ard.biesheuvel@linaro.org, boris.ostrovsky@oracle.com,
corbet@lwn.net, dave.hansen@linux.intel.com, luto@kernel.org,
peterz@infradead.org, eric.snowberg@oracle.com, hpa@zytor.com,
jgross@suse.com, kanth.ghatraju@oracle.com,
konrad.wilk@oracle.com, mingo@redhat.com, rdunlap@infradead.org,
ross.philipson@oracle.com, tglx@linutronix.de
Subject: Re: [PATCH v5 3/3] x86/boot: Introduce the setup_indirect
Date: Fri, 8 Nov 2019 12:33:56 +0100 [thread overview]
Message-ID: <20191108113356.GC4503@zn.tnic> (raw)
In-Reply-To: <20191104151354.28145-4-daniel.kiper@oracle.com>
On Mon, Nov 04, 2019 at 04:13:54PM +0100, Daniel Kiper wrote:
> diff --git a/arch/x86/kernel/kdebugfs.c b/arch/x86/kernel/kdebugfs.c
> index edaa30b20841..701a98300f86 100644
> --- a/arch/x86/kernel/kdebugfs.c
> +++ b/arch/x86/kernel/kdebugfs.c
> @@ -44,7 +44,11 @@ static ssize_t setup_data_read(struct file *file, char __user *user_buf,
> if (count > node->len - pos)
> count = node->len - pos;
>
> - pa = node->paddr + sizeof(struct setup_data) + pos;
> + pa = node->paddr + pos;
> +
> + if (!(node->type & SETUP_INDIRECT) || node->type == SETUP_INDIRECT)
This check looks strange at a first glance and could use a comment.
> + pa += sizeof(struct setup_data);
> +
> p = memremap(pa, count, MEMREMAP_WB);
> if (!p)
> return -ENOMEM;
> @@ -108,9 +112,17 @@ static int __init create_setup_data_nodes(struct dentry *parent)
> goto err_dir;
> }
>
> - node->paddr = pa_data;
> - node->type = data->type;
> - node->len = data->len;
> + if (data->type == SETUP_INDIRECT &&
> + ((struct setup_indirect *)data->data)->type != SETUP_INDIRECT) {
> + node->paddr = ((struct setup_indirect *)data->data)->addr;
> + node->type = ((struct setup_indirect *)data->data)->type;
> + node->len = ((struct setup_indirect *)data->data)->len;
Align them vertically on the "=" sign even if they stick out over the
80-cols rule.
> + } else {
> + node->paddr = pa_data;
> + node->type = data->type;
> + node->len = data->len;
> + }
> +
> create_setup_data_node(d, no, node);
> pa_data = data->next;
>
> diff --git a/arch/x86/kernel/ksysfs.c b/arch/x86/kernel/ksysfs.c
> index 7969da939213..14ef8121aa53 100644
> --- a/arch/x86/kernel/ksysfs.c
> +++ b/arch/x86/kernel/ksysfs.c
> @@ -100,7 +100,11 @@ static int __init get_setup_data_size(int nr, size_t *size)
> if (!data)
> return -ENOMEM;
> if (nr == i) {
> - *size = data->len;
> + if (data->type == SETUP_INDIRECT &&
> + ((struct setup_indirect *)data->data)->type != SETUP_INDIRECT)
> + *size = ((struct setup_indirect *)data->data)->len;
> + else
> + *size = data->len;
<---- newline here.
> memunmap(data);
> return 0;
> }
> @@ -130,7 +134,10 @@ static ssize_t type_show(struct kobject *kobj,
> if (!data)
> return -ENOMEM;
>
> - ret = sprintf(buf, "0x%x\n", data->type);
> + if (data->type == SETUP_INDIRECT)
> + ret = sprintf(buf, "0x%x\n", ((struct setup_indirect *)data->data)->type);
> + else
> + ret = sprintf(buf, "0x%x\n", data->type);
> memunmap(data);
> return ret;
> }
> @@ -142,7 +149,7 @@ static ssize_t setup_data_data_read(struct file *fp,
> loff_t off, size_t count)
> {
> int nr, ret = 0;
> - u64 paddr;
> + u64 paddr, len;
> struct setup_data *data;
> void *p;
>
> @@ -157,19 +164,28 @@ static ssize_t setup_data_data_read(struct file *fp,
> if (!data)
> return -ENOMEM;
>
> - if (off > data->len) {
> + if (data->type == SETUP_INDIRECT &&
> + ((struct setup_indirect *)data->data)->type != SETUP_INDIRECT) {
> + paddr = ((struct setup_indirect *)data->data)->addr;
> + len = ((struct setup_indirect *)data->data)->len;
> + } else {
> + paddr += sizeof(*data);
> + len = data->len;
> + }
> +
> + if (off > len) {
> ret = -EINVAL;
> goto out;
> }
>
> - if (count > data->len - off)
> - count = data->len - off;
> + if (count > len - off)
> + count = len - off;
>
> if (!count)
> goto out;
>
> ret = count;
> - p = memremap(paddr + sizeof(*data), data->len, MEMREMAP_WB);
> + p = memremap(paddr, len, MEMREMAP_WB);
> if (!p) {
> ret = -ENOMEM;
> goto out;
> diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
> index 77ea96b794bd..4603702dbfc1 100644
> --- a/arch/x86/kernel/setup.c
> +++ b/arch/x86/kernel/setup.c
> @@ -438,6 +438,10 @@ static void __init memblock_x86_reserve_range_setup_data(void)
> while (pa_data) {
> data = early_memremap(pa_data, sizeof(*data));
> memblock_reserve(pa_data, sizeof(*data) + data->len);
<---- newline here.
> + if (data->type == SETUP_INDIRECT &&
> + ((struct setup_indirect *)data->data)->type != SETUP_INDIRECT)
> + memblock_reserve(((struct setup_indirect *)data->data)->addr,
> + ((struct setup_indirect *)data->data)->len);
<---- newline here.
Let's space that statement out for better readability.
> pa_data = data->next;
> early_memunmap(data, sizeof(*data));
> }
> diff --git a/arch/x86/mm/ioremap.c b/arch/x86/mm/ioremap.c
> index a39dcdb5ae34..1ff9c2030b4f 100644
> --- a/arch/x86/mm/ioremap.c
> +++ b/arch/x86/mm/ioremap.c
> @@ -626,6 +626,17 @@ static bool memremap_is_setup_data(resource_size_t phys_addr,
> paddr_next = data->next;
> len = data->len;
>
> + if ((phys_addr > paddr) && (phys_addr < (paddr + len))) {
> + memunmap(data);
> + return true;
> + }
> +
> + if (data->type == SETUP_INDIRECT &&
> + ((struct setup_indirect *)data->data)->type != SETUP_INDIRECT) {
> + paddr = ((struct setup_indirect *)data->data)->addr;
> + len = ((struct setup_indirect *)data->data)->len;
> + }
> +
> memunmap(data);
>
> if ((phys_addr > paddr) && (phys_addr < (paddr + len)))
> --
--
Regards/Gruss,
Boris.
https://people.kernel.org/tglx/notes-about-netiquette
next prev parent reply other threads:[~2019-11-08 11:34 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-11-04 15:13 [PATCH v5 0/3] x86/boot: Introduce the kernel_info et consortes Daniel Kiper
2019-11-04 15:13 ` [PATCH v5 1/3] x86/boot: Introduce the kernel_info Daniel Kiper
2019-11-04 15:13 ` [PATCH v5 2/3] x86/boot: Introduce the kernel_info.setup_type_max Daniel Kiper
2019-11-08 10:09 ` Borislav Petkov
2019-11-08 10:47 ` Daniel Kiper
2019-11-08 11:07 ` Borislav Petkov
2019-11-08 12:52 ` Daniel Kiper
2019-11-08 13:03 ` Borislav Petkov
2019-11-08 13:39 ` Daniel Kiper
2019-11-04 15:13 ` [PATCH v5 3/3] x86/boot: Introduce the setup_indirect Daniel Kiper
2019-11-08 11:33 ` Borislav Petkov [this message]
2019-11-05 21:40 ` [PATCH v5 0/3] x86/boot: Introduce the kernel_info et consortes H. Peter Anvin
2019-11-06 17:03 ` Borislav Petkov
2019-11-06 17:56 ` hpa
2019-11-06 19:43 ` Borislav Petkov
2019-11-07 11:31 ` Daniel Kiper
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=20191108113356.GC4503@zn.tnic \
--to=bp@alien8.de \
--cc=ard.biesheuvel@linaro.org \
--cc=boris.ostrovsky@oracle.com \
--cc=corbet@lwn.net \
--cc=daniel.kiper@oracle.com \
--cc=dave.hansen@linux.intel.com \
--cc=eric.snowberg@oracle.com \
--cc=hpa@zytor.com \
--cc=jgross@suse.com \
--cc=kanth.ghatraju@oracle.com \
--cc=konrad.wilk@oracle.com \
--cc=linux-efi@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=luto@kernel.org \
--cc=mingo@redhat.com \
--cc=peterz@infradead.org \
--cc=rdunlap@infradead.org \
--cc=ross.philipson@oracle.com \
--cc=tglx@linutronix.de \
--cc=x86@kernel.org \
--cc=xen-devel@lists.xenproject.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