* [PATCH] x86/efi: Fix kernel panic when CONFIG_DEBUG_VIRTUAL is enabled
@ 2015-10-13 19:42 Sai Praneeth Prakhya
[not found] ` <1444765377-29303-1-git-send-email-sai.praneeth.prakhya-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
0 siblings, 1 reply; 4+ messages in thread
From: Sai Praneeth Prakhya @ 2015-10-13 19:42 UTC (permalink / raw)
To: linux-efi
Cc: matt.fleming, bp, linux-kernel, Sai Praneeth, Ricardo Neri,
Glenn P Williamson, Ravi Shankar
From: Sai Praneeth <sai.praneeth.prakhya@intel.com>
When CONFIG_DEBUG_VIRTUAL is turned on, all accesses to __pa(address)
are monitored to see whether address falls in direct mapping or kernel
mapping, if it does not kernel panics. During 1:1 mapping of EFI runtime
services we access addresses which are below 4G and hence when passed as
arguments to __pa() kernel panics as reported by Dave Hansen here
https://lkml.org/lkml/2015/1/27/742. So, before calling __pa() virtual
addresses should be validated which results in skipping call to
split_page_count() and that should be fine because it is used to keep
track of direct kernel mappings and not 1:1 mappings.
Signed-off-by: Sai Praneeth Prakhya <sai.praneeth.prakhya@intel.com>
Reported-by: Dave Hansen <dave.hansen@intel.com>
Cc: Matt Fleming <matt.fleming@intel.com>
Cc: Ricardo Neri <ricardo.neri@intel.com>
Cc: Glenn P Williamson <glenn.p.williamson@intel.com>
Cc: Ravi Shankar <ravi.v.shankar@intel.com>
---
arch/x86/mm/pageattr.c | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c
index 727158cb3b3c..3a603830503a 100644
--- a/arch/x86/mm/pageattr.c
+++ b/arch/x86/mm/pageattr.c
@@ -648,9 +648,11 @@ __split_large_page(struct cpa_data *cpa, pte_t *kpte, unsigned long address,
for (i = 0; i < PTRS_PER_PTE; i++, pfn += pfninc)
set_pte(&pbase[i], pfn_pte(pfn, canon_pgprot(ref_prot)));
- if (pfn_range_is_mapped(PFN_DOWN(__pa(address)),
- PFN_DOWN(__pa(address)) + 1))
- split_page_count(level);
+ if (virt_addr_valid(address)) {
+ if (pfn_range_is_mapped(PFN_DOWN(__pa(address)),
+ PFN_DOWN(__pa(address)) + 1))
+ split_page_count(level);
+ }
/*
* Install the new, split up pagetable.
--
2.1.4
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH] x86/efi: Fix kernel panic when CONFIG_DEBUG_VIRTUAL is enabled
2015-10-13 19:42 [PATCH] x86/efi: Fix kernel panic when CONFIG_DEBUG_VIRTUAL is enabled Sai Praneeth Prakhya
@ 2015-10-14 14:41 ` Borislav Petkov
0 siblings, 0 replies; 4+ messages in thread
From: Borislav Petkov @ 2015-10-14 14:41 UTC (permalink / raw)
To: Sai Praneeth Prakhya
Cc: linux-efi-u79uwXL29TY76Z2rM5mHXA,
matt.fleming-ral2JQCrhuEAvxtiuMwx3w,
linux-kernel-u79uwXL29TY76Z2rM5mHXA, Ricardo Neri,
Glenn P Williamson, Ravi Shankar
On Tue, Oct 13, 2015 at 12:42:57PM -0700, Sai Praneeth Prakhya wrote:
> From: Sai Praneeth <sai.praneeth.prakhya-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
>
> When CONFIG_DEBUG_VIRTUAL is turned on, all accesses to __pa(address)
> are monitored to see whether address falls in direct mapping or kernel
> mapping,
make that
"... or kernel text mapping (see Documentation/x86/x86_64/mm.txt for
details)"
for more clarity please. It just took mfleming and me a while to figure
out what what is.
> if it does not kernel panics. During 1:1 mapping of EFI runtime
> services we access addresses which are below 4G and hence when passed as
not "below 4G" but "we access virtual adresses which are == physical
addresses, thus the 1:1 mapping" - on a box with more than 4G, physical
addresses can be above 4G too :)
> arguments to __pa() kernel panics as reported by Dave Hansen here
> https://lkml.org/lkml/2015/1/27/742.
Please quote this mail with the k.org redirector:
https://lkml.kernel.org/r/5462999A.7090706-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org
lkml.org is unreliable.
> So, before calling __pa() virtual
> addresses should be validated which results in skipping call to
> split_page_count() and that should be fine because it is used to keep
> track of direct kernel mappings and not 1:1 mappings.
I think that should say:
"to keep track of everything *but* 1:1 mappings."
The 1:1 mappings are EFI-specific thing and the physaddr.c checkers
aren't aware of them.
Again, IMHO.
> Signed-off-by: Sai Praneeth Prakhya <sai.praneeth.prakhya-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
> Reported-by: Dave Hansen <dave.hansen-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
> Cc: Matt Fleming <matt.fleming-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
> Cc: Ricardo Neri <ricardo.neri-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
> Cc: Glenn P Williamson <glenn.p.williamson-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
> Cc: Ravi Shankar <ravi.v.shankar-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
> ---
> arch/x86/mm/pageattr.c | 8 +++++---
> 1 file changed, 5 insertions(+), 3 deletions(-)
>
> diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c
> index 727158cb3b3c..3a603830503a 100644
> --- a/arch/x86/mm/pageattr.c
> +++ b/arch/x86/mm/pageattr.c
> @@ -648,9 +648,11 @@ __split_large_page(struct cpa_data *cpa, pte_t *kpte, unsigned long address,
> for (i = 0; i < PTRS_PER_PTE; i++, pfn += pfninc)
> set_pte(&pbase[i], pfn_pte(pfn, canon_pgprot(ref_prot)));
>
> - if (pfn_range_is_mapped(PFN_DOWN(__pa(address)),
> - PFN_DOWN(__pa(address)) + 1))
> - split_page_count(level);
> + if (virt_addr_valid(address)) {
> + if (pfn_range_is_mapped(PFN_DOWN(__pa(address)),
> + PFN_DOWN(__pa(address)) + 1))
> + split_page_count(level);
Maybe make it a bit more readable:
if (virt_addr_valid(address)) {
unsigned long pfn = PFN_DOWN(__pa(address));
if (pfn_range_is_mapped(pfn, pfn + 1))
split_page_count(level);
}
But yeah, patch makes sense to me.
Thanks for fixing that!
--
Regards/Gruss,
Boris.
ECO tip #101: Trim your mails when you reply.
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] x86/efi: Fix kernel panic when CONFIG_DEBUG_VIRTUAL is enabled
@ 2015-10-14 14:41 ` Borislav Petkov
0 siblings, 0 replies; 4+ messages in thread
From: Borislav Petkov @ 2015-10-14 14:41 UTC (permalink / raw)
To: Sai Praneeth Prakhya
Cc: linux-efi, matt.fleming, linux-kernel, Ricardo Neri,
Glenn P Williamson, Ravi Shankar
On Tue, Oct 13, 2015 at 12:42:57PM -0700, Sai Praneeth Prakhya wrote:
> From: Sai Praneeth <sai.praneeth.prakhya@intel.com>
>
> When CONFIG_DEBUG_VIRTUAL is turned on, all accesses to __pa(address)
> are monitored to see whether address falls in direct mapping or kernel
> mapping,
make that
"... or kernel text mapping (see Documentation/x86/x86_64/mm.txt for
details)"
for more clarity please. It just took mfleming and me a while to figure
out what what is.
> if it does not kernel panics. During 1:1 mapping of EFI runtime
> services we access addresses which are below 4G and hence when passed as
not "below 4G" but "we access virtual adresses which are == physical
addresses, thus the 1:1 mapping" - on a box with more than 4G, physical
addresses can be above 4G too :)
> arguments to __pa() kernel panics as reported by Dave Hansen here
> https://lkml.org/lkml/2015/1/27/742.
Please quote this mail with the k.org redirector:
https://lkml.kernel.org/r/5462999A.7090706@intel.com
lkml.org is unreliable.
> So, before calling __pa() virtual
> addresses should be validated which results in skipping call to
> split_page_count() and that should be fine because it is used to keep
> track of direct kernel mappings and not 1:1 mappings.
I think that should say:
"to keep track of everything *but* 1:1 mappings."
The 1:1 mappings are EFI-specific thing and the physaddr.c checkers
aren't aware of them.
Again, IMHO.
> Signed-off-by: Sai Praneeth Prakhya <sai.praneeth.prakhya@intel.com>
> Reported-by: Dave Hansen <dave.hansen@intel.com>
> Cc: Matt Fleming <matt.fleming@intel.com>
> Cc: Ricardo Neri <ricardo.neri@intel.com>
> Cc: Glenn P Williamson <glenn.p.williamson@intel.com>
> Cc: Ravi Shankar <ravi.v.shankar@intel.com>
> ---
> arch/x86/mm/pageattr.c | 8 +++++---
> 1 file changed, 5 insertions(+), 3 deletions(-)
>
> diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c
> index 727158cb3b3c..3a603830503a 100644
> --- a/arch/x86/mm/pageattr.c
> +++ b/arch/x86/mm/pageattr.c
> @@ -648,9 +648,11 @@ __split_large_page(struct cpa_data *cpa, pte_t *kpte, unsigned long address,
> for (i = 0; i < PTRS_PER_PTE; i++, pfn += pfninc)
> set_pte(&pbase[i], pfn_pte(pfn, canon_pgprot(ref_prot)));
>
> - if (pfn_range_is_mapped(PFN_DOWN(__pa(address)),
> - PFN_DOWN(__pa(address)) + 1))
> - split_page_count(level);
> + if (virt_addr_valid(address)) {
> + if (pfn_range_is_mapped(PFN_DOWN(__pa(address)),
> + PFN_DOWN(__pa(address)) + 1))
> + split_page_count(level);
Maybe make it a bit more readable:
if (virt_addr_valid(address)) {
unsigned long pfn = PFN_DOWN(__pa(address));
if (pfn_range_is_mapped(pfn, pfn + 1))
split_page_count(level);
}
But yeah, patch makes sense to me.
Thanks for fixing that!
--
Regards/Gruss,
Boris.
ECO tip #101: Trim your mails when you reply.
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH] x86/efi: Fix kernel panic when CONFIG_DEBUG_VIRTUAL is enabled
2015-10-25 10:49 [GIT PULL] EFI changes for v4.4 Matt Fleming
@ 2015-10-25 10:49 ` Matt Fleming
0 siblings, 0 replies; 4+ messages in thread
From: Matt Fleming @ 2015-10-25 10:49 UTC (permalink / raw)
To: Ingo Molnar, Thomas Gleixner, H . Peter Anvin
Cc: Sai Praneeth, linux-kernel, linux-efi, Ricardo Neri,
Glenn P Williamson, Ravi Shankar, Matt Fleming, Borislav Petkov,
Dave Hansen
From: Sai Praneeth <sai.praneeth.prakhya@intel.com>
When CONFIG_DEBUG_VIRTUAL is enabled, all accesses to __pa(address) are
monitored to see whether address falls in direct mapping or kernel text
mapping (see Documentation/x86/x86_64/mm.txt for details), if it does
not, the kernel panics. During 1:1 mapping of EFI runtime services we access
virtual addresses which are == physical addresses, thus the 1:1 mapping
and these addresses do not fall in either of the above two regions and
hence when passed as arguments to __pa() kernel panics as reported by
Dave Hansen here https://lkml.kernel.org/r/5462999A.7090706@intel.com.
So, before calling __pa() virtual addresses should be validated which
results in skipping call to split_page_count() and that should be fine
because it is used to keep track of everything *but* 1:1 mappings.
Signed-off-by: Sai Praneeth Prakhya <sai.praneeth.prakhya@intel.com>
Reported-by: Dave Hansen <dave.hansen@intel.com>
Reviewed-by: Borislav Petkov <bp@suse.de>
Cc: Ricardo Neri <ricardo.neri@intel.com>
Cc: Glenn P Williamson <glenn.p.williamson@intel.com>
Cc: Ravi Shankar <ravi.v.shankar@intel.com>
Signed-off-by: Matt Fleming <matt@codeblueprint.co.uk>
---
arch/x86/mm/pageattr.c | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c
index 727158cb3b3c..9abe0c9b1098 100644
--- a/arch/x86/mm/pageattr.c
+++ b/arch/x86/mm/pageattr.c
@@ -648,9 +648,12 @@ __split_large_page(struct cpa_data *cpa, pte_t *kpte, unsigned long address,
for (i = 0; i < PTRS_PER_PTE; i++, pfn += pfninc)
set_pte(&pbase[i], pfn_pte(pfn, canon_pgprot(ref_prot)));
- if (pfn_range_is_mapped(PFN_DOWN(__pa(address)),
- PFN_DOWN(__pa(address)) + 1))
- split_page_count(level);
+ if (virt_addr_valid(address)) {
+ unsigned long pfn = PFN_DOWN(__pa(address));
+
+ if (pfn_range_is_mapped(pfn, pfn + 1))
+ split_page_count(level);
+ }
/*
* Install the new, split up pagetable.
--
2.6.0
^ permalink raw reply related [flat|nested] 4+ messages in thread
end of thread, other threads:[~2015-10-25 10:49 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-10-13 19:42 [PATCH] x86/efi: Fix kernel panic when CONFIG_DEBUG_VIRTUAL is enabled Sai Praneeth Prakhya
[not found] ` <1444765377-29303-1-git-send-email-sai.praneeth.prakhya-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2015-10-14 14:41 ` Borislav Petkov
2015-10-14 14:41 ` Borislav Petkov
-- strict thread matches above, loose matches on Subject: below --
2015-10-25 10:49 [GIT PULL] EFI changes for v4.4 Matt Fleming
2015-10-25 10:49 ` [PATCH] x86/efi: Fix kernel panic when CONFIG_DEBUG_VIRTUAL is enabled Matt Fleming
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.