* Re: [Qemu-devel] [PATCH v2 for-2.0] target-i386: x86_cpu_get_phys_page_debug(): support 1GB page translation
2014-03-19 21:03 [Qemu-devel] [PATCH v2 for-2.0] target-i386: x86_cpu_get_phys_page_debug(): support 1GB page translation Luiz Capitulino
@ 2014-03-19 21:58 ` Andreas Färber
2014-03-20 12:56 ` Luiz Capitulino
2014-03-20 13:07 ` Paolo Bonzini
` (2 subsequent siblings)
3 siblings, 1 reply; 8+ messages in thread
From: Andreas Färber @ 2014-03-19 21:58 UTC (permalink / raw)
To: Luiz Capitulino, qemu-devel; +Cc: peter.maydell, pbonzini, jan.kiszka
Am 19.03.2014 22:03, schrieb Luiz Capitulino:
> Linux guests, when using more than 4GB of RAM, may end up using 1GB pages
> to store (kernel) data. When this happens, we're unable to debug a running
> Linux kernel with GDB:
>
> (gdb) p node_data[0]->node_id
> Cannot access memory at address 0xffff88013fffd3a0
> (gdb)
>
> GDB returns this error because x86_cpu_get_phys_page_debug() doesn't support
> translating 1GB pages in IA-32e paging mode and returns an error to GDB.
>
> This commit adds support for 1GB page translation for IA32e paging.
>
> Signed-off-by: Luiz capitulino <lcapitulino@redhat.com>
Capitulino? :)
> ---
>
> - I'm proposing this patch for 2.0 because GDB debugging of large Linux
> guests is kind of broken
Agree that it would be nice to fix, but having mainly touched the
function interface, I am dependent on reviewers here. => rc2 or .1
Regards,
Andreas
>
> - Changelog v2:
> - Move PS bit handling to if (env->hflags & HF_LMA_MASK) block
> - Update changelog
>
> target-i386/helper.c | 9 +++++++++
> 1 file changed, 9 insertions(+)
--
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer; HRB 16746 AG Nürnberg
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [Qemu-devel] [PATCH v2 for-2.0] target-i386: x86_cpu_get_phys_page_debug(): support 1GB page translation
2014-03-19 21:58 ` Andreas Färber
@ 2014-03-20 12:56 ` Luiz Capitulino
2014-03-27 18:25 ` Andreas Färber
0 siblings, 1 reply; 8+ messages in thread
From: Luiz Capitulino @ 2014-03-20 12:56 UTC (permalink / raw)
To: Andreas Färber; +Cc: peter.maydell, pbonzini, qemu-devel, jan.kiszka
On Wed, 19 Mar 2014 22:58:11 +0100
Andreas Färber <afaerber@suse.de> wrote:
> Am 19.03.2014 22:03, schrieb Luiz Capitulino:
> > Linux guests, when using more than 4GB of RAM, may end up using 1GB pages
> > to store (kernel) data. When this happens, we're unable to debug a running
> > Linux kernel with GDB:
> >
> > (gdb) p node_data[0]->node_id
> > Cannot access memory at address 0xffff88013fffd3a0
> > (gdb)
> >
> > GDB returns this error because x86_cpu_get_phys_page_debug() doesn't support
> > translating 1GB pages in IA-32e paging mode and returns an error to GDB.
> >
> > This commit adds support for 1GB page translation for IA32e paging.
> >
> > Signed-off-by: Luiz capitulino <lcapitulino@redhat.com>
>
> Capitulino? :)
Can you or Peter fix it when merging?
> > ---
> >
> > - I'm proposing this patch for 2.0 because GDB debugging of large Linux
> > guests is kind of broken
>
> Agree that it would be nice to fix, but having mainly touched the
> function interface, I am dependent on reviewers here. => rc2 or .1
I think Paolo and/or Jan will review it.
>
> Regards,
> Andreas
>
> >
> > - Changelog v2:
> > - Move PS bit handling to if (env->hflags & HF_LMA_MASK) block
> > - Update changelog
> >
> > target-i386/helper.c | 9 +++++++++
> > 1 file changed, 9 insertions(+)
>
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [Qemu-devel] [PATCH v2 for-2.0] target-i386: x86_cpu_get_phys_page_debug(): support 1GB page translation
2014-03-20 12:56 ` Luiz Capitulino
@ 2014-03-27 18:25 ` Andreas Färber
2014-03-27 18:27 ` Luiz Capitulino
0 siblings, 1 reply; 8+ messages in thread
From: Andreas Färber @ 2014-03-27 18:25 UTC (permalink / raw)
To: Luiz Capitulino; +Cc: peter.maydell, jan.kiszka, qemu-devel, pbonzini
Am 20.03.2014 13:56, schrieb Luiz Capitulino:
> On Wed, 19 Mar 2014 22:58:11 +0100
> Andreas Färber <afaerber@suse.de> wrote:
>
>> Am 19.03.2014 22:03, schrieb Luiz Capitulino:
>>> Linux guests, when using more than 4GB of RAM, may end up using 1GB pages
>>> to store (kernel) data. When this happens, we're unable to debug a running
>>> Linux kernel with GDB:
>>>
>>> (gdb) p node_data[0]->node_id
>>> Cannot access memory at address 0xffff88013fffd3a0
>>> (gdb)
>>>
>>> GDB returns this error because x86_cpu_get_phys_page_debug() doesn't support
>>> translating 1GB pages in IA-32e paging mode and returns an error to GDB.
>>>
>>> This commit adds support for 1GB page translation for IA32e paging.
>>>
>>> Signed-off-by: Luiz capitulino <lcapitulino@redhat.com>
>>
>> Capitulino? :)
>
> Can you or Peter fix it when merging?
Done.
>>> ---
>>>
>>> - I'm proposing this patch for 2.0 because GDB debugging of large Linux
>>> guests is kind of broken
>>
>> Agree that it would be nice to fix, but having mainly touched the
>> function interface, I am dependent on reviewers here. => rc2 or .1
>
> I think Paolo and/or Jan will review it.
Thanks to them. I did need the followup build fix though:
diff --git a/target-i386/helper.c b/target-i386/helper.c
index 7cee501..372f0e3 100644
--- a/target-i386/helper.c
+++ b/target-i386/helper.c
@@ -1001,7 +1001,9 @@ hwaddr x86_cpu_get_phys_page_debug(CPUState *cs,
vaddr addr)
pte = pte & env->a20_mask;
}
+#ifdef TARGET_X86_64
out:
+#endif
page_offset = (addr & TARGET_PAGE_MASK) & (page_size - 1);
paddr = (pte & TARGET_PAGE_MASK) + page_offset;
return paddr;
Thanks, applied to qom-cpu:
https://github.com/afaerber/qemu-cpu/commits/qom-cpu
Andreas
--
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer; HRB 16746 AG Nürnberg
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [Qemu-devel] [PATCH v2 for-2.0] target-i386: x86_cpu_get_phys_page_debug(): support 1GB page translation
2014-03-27 18:25 ` Andreas Färber
@ 2014-03-27 18:27 ` Luiz Capitulino
0 siblings, 0 replies; 8+ messages in thread
From: Luiz Capitulino @ 2014-03-27 18:27 UTC (permalink / raw)
To: Andreas Färber; +Cc: peter.maydell, jan.kiszka, qemu-devel, pbonzini
On Thu, 27 Mar 2014 19:25:31 +0100
Andreas Färber <afaerber@suse.de> wrote:
> Am 20.03.2014 13:56, schrieb Luiz Capitulino:
> > On Wed, 19 Mar 2014 22:58:11 +0100
> > Andreas Färber <afaerber@suse.de> wrote:
> >
> >> Am 19.03.2014 22:03, schrieb Luiz Capitulino:
> >>> Linux guests, when using more than 4GB of RAM, may end up using 1GB pages
> >>> to store (kernel) data. When this happens, we're unable to debug a running
> >>> Linux kernel with GDB:
> >>>
> >>> (gdb) p node_data[0]->node_id
> >>> Cannot access memory at address 0xffff88013fffd3a0
> >>> (gdb)
> >>>
> >>> GDB returns this error because x86_cpu_get_phys_page_debug() doesn't support
> >>> translating 1GB pages in IA-32e paging mode and returns an error to GDB.
> >>>
> >>> This commit adds support for 1GB page translation for IA32e paging.
> >>>
> >>> Signed-off-by: Luiz capitulino <lcapitulino@redhat.com>
> >>
> >> Capitulino? :)
> >
> > Can you or Peter fix it when merging?
>
> Done.
>
> >>> ---
> >>>
> >>> - I'm proposing this patch for 2.0 because GDB debugging of large Linux
> >>> guests is kind of broken
> >>
> >> Agree that it would be nice to fix, but having mainly touched the
> >> function interface, I am dependent on reviewers here. => rc2 or .1
> >
> > I think Paolo and/or Jan will review it.
>
> Thanks to them. I did need the followup build fix though:
Thanks a lot.
>
> diff --git a/target-i386/helper.c b/target-i386/helper.c
> index 7cee501..372f0e3 100644
> --- a/target-i386/helper.c
> +++ b/target-i386/helper.c
> @@ -1001,7 +1001,9 @@ hwaddr x86_cpu_get_phys_page_debug(CPUState *cs,
> vaddr addr)
> pte = pte & env->a20_mask;
> }
>
> +#ifdef TARGET_X86_64
> out:
> +#endif
> page_offset = (addr & TARGET_PAGE_MASK) & (page_size - 1);
> paddr = (pte & TARGET_PAGE_MASK) + page_offset;
> return paddr;
>
> Thanks, applied to qom-cpu:
> https://github.com/afaerber/qemu-cpu/commits/qom-cpu
>
> Andreas
>
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [Qemu-devel] [PATCH v2 for-2.0] target-i386: x86_cpu_get_phys_page_debug(): support 1GB page translation
2014-03-19 21:03 [Qemu-devel] [PATCH v2 for-2.0] target-i386: x86_cpu_get_phys_page_debug(): support 1GB page translation Luiz Capitulino
2014-03-19 21:58 ` Andreas Färber
@ 2014-03-20 13:07 ` Paolo Bonzini
2014-03-20 13:07 ` Jan Kiszka
2014-03-27 17:48 ` Luiz Capitulino
3 siblings, 0 replies; 8+ messages in thread
From: Paolo Bonzini @ 2014-03-20 13:07 UTC (permalink / raw)
To: Luiz Capitulino, qemu-devel; +Cc: peter.maydell, afaerber, jan.kiszka
Il 19/03/2014 22:03, Luiz Capitulino ha scritto:
> Linux guests, when using more than 4GB of RAM, may end up using 1GB pages
> to store (kernel) data. When this happens, we're unable to debug a running
> Linux kernel with GDB:
>
> (gdb) p node_data[0]->node_id
> Cannot access memory at address 0xffff88013fffd3a0
> (gdb)
>
> GDB returns this error because x86_cpu_get_phys_page_debug() doesn't support
> translating 1GB pages in IA-32e paging mode and returns an error to GDB.
>
> This commit adds support for 1GB page translation for IA32e paging.
>
> Signed-off-by: Luiz capitulino <lcapitulino@redhat.com>
> ---
>
> - I'm proposing this patch for 2.0 because GDB debugging of large Linux
> guests is kind of broken
>
> - Changelog v2:
> - Move PS bit handling to if (env->hflags & HF_LMA_MASK) block
> - Update changelog
>
> target-i386/helper.c | 9 +++++++++
> 1 file changed, 9 insertions(+)
>
> diff --git a/target-i386/helper.c b/target-i386/helper.c
> index 4f447b8..7cee501 100644
> --- a/target-i386/helper.c
> +++ b/target-i386/helper.c
> @@ -941,6 +941,14 @@ hwaddr x86_cpu_get_phys_page_debug(CPUState *cs, vaddr addr)
> pdpe = ldq_phys(cs->as, pdpe_addr);
> if (!(pdpe & PG_PRESENT_MASK))
> return -1;
> +
> + if (pdpe & PG_PSE_MASK) {
> + page_size = 1024 * 1024 * 1024;
> + pte = pdpe & ~( (page_size - 1) & ~0xfff);
> + pte &= ~(PG_NX_MASK | PG_HI_USER_MASK);
> + goto out;
> + }
> +
> } else
> #endif
> {
> @@ -993,6 +1001,7 @@ hwaddr x86_cpu_get_phys_page_debug(CPUState *cs, vaddr addr)
> pte = pte & env->a20_mask;
> }
>
> +out:
> page_offset = (addr & TARGET_PAGE_MASK) & (page_size - 1);
> paddr = (pte & TARGET_PAGE_MASK) + page_offset;
> return paddr;
>
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Paolo
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [Qemu-devel] [PATCH v2 for-2.0] target-i386: x86_cpu_get_phys_page_debug(): support 1GB page translation
2014-03-19 21:03 [Qemu-devel] [PATCH v2 for-2.0] target-i386: x86_cpu_get_phys_page_debug(): support 1GB page translation Luiz Capitulino
2014-03-19 21:58 ` Andreas Färber
2014-03-20 13:07 ` Paolo Bonzini
@ 2014-03-20 13:07 ` Jan Kiszka
2014-03-27 17:48 ` Luiz Capitulino
3 siblings, 0 replies; 8+ messages in thread
From: Jan Kiszka @ 2014-03-20 13:07 UTC (permalink / raw)
To: Luiz Capitulino, qemu-devel; +Cc: peter.maydell, afaerber, pbonzini
On 2014-03-19 22:03, Luiz Capitulino wrote:
> Linux guests, when using more than 4GB of RAM, may end up using 1GB pages
> to store (kernel) data. When this happens, we're unable to debug a running
> Linux kernel with GDB:
>
> (gdb) p node_data[0]->node_id
> Cannot access memory at address 0xffff88013fffd3a0
> (gdb)
>
> GDB returns this error because x86_cpu_get_phys_page_debug() doesn't support
> translating 1GB pages in IA-32e paging mode and returns an error to GDB.
>
> This commit adds support for 1GB page translation for IA32e paging.
>
> Signed-off-by: Luiz capitulino <lcapitulino@redhat.com>
> ---
>
> - I'm proposing this patch for 2.0 because GDB debugging of large Linux
> guests is kind of broken
>
> - Changelog v2:
> - Move PS bit handling to if (env->hflags & HF_LMA_MASK) block
> - Update changelog
>
> target-i386/helper.c | 9 +++++++++
> 1 file changed, 9 insertions(+)
>
> diff --git a/target-i386/helper.c b/target-i386/helper.c
> index 4f447b8..7cee501 100644
> --- a/target-i386/helper.c
> +++ b/target-i386/helper.c
> @@ -941,6 +941,14 @@ hwaddr x86_cpu_get_phys_page_debug(CPUState *cs, vaddr addr)
> pdpe = ldq_phys(cs->as, pdpe_addr);
> if (!(pdpe & PG_PRESENT_MASK))
> return -1;
> +
> + if (pdpe & PG_PSE_MASK) {
> + page_size = 1024 * 1024 * 1024;
> + pte = pdpe & ~( (page_size - 1) & ~0xfff);
> + pte &= ~(PG_NX_MASK | PG_HI_USER_MASK);
> + goto out;
> + }
> +
> } else
> #endif
> {
> @@ -993,6 +1001,7 @@ hwaddr x86_cpu_get_phys_page_debug(CPUState *cs, vaddr addr)
> pte = pte & env->a20_mask;
> }
>
> +out:
> page_offset = (addr & TARGET_PAGE_MASK) & (page_size - 1);
> paddr = (pte & TARGET_PAGE_MASK) + page_offset;
> return paddr;
>
Reviewed-by: Jan Kiszka <jan.kiszka@siemens.com>
--
Siemens AG, Corporate Technology, CT RTC ITP SES-DE
Corporate Competence Center Embedded Linux
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [Qemu-devel] [PATCH v2 for-2.0] target-i386: x86_cpu_get_phys_page_debug(): support 1GB page translation
2014-03-19 21:03 [Qemu-devel] [PATCH v2 for-2.0] target-i386: x86_cpu_get_phys_page_debug(): support 1GB page translation Luiz Capitulino
` (2 preceding siblings ...)
2014-03-20 13:07 ` Jan Kiszka
@ 2014-03-27 17:48 ` Luiz Capitulino
3 siblings, 0 replies; 8+ messages in thread
From: Luiz Capitulino @ 2014-03-27 17:48 UTC (permalink / raw)
To: peter.maydell; +Cc: jan.kiszka, pbonzini, qemu-devel, afaerber
On Wed, 19 Mar 2014 17:03:53 -0400
Luiz Capitulino <lcapitulino@redhat.com> wrote:
> Linux guests, when using more than 4GB of RAM, may end up using 1GB pages
> to store (kernel) data. When this happens, we're unable to debug a running
> Linux kernel with GDB:
>
> (gdb) p node_data[0]->node_id
> Cannot access memory at address 0xffff88013fffd3a0
> (gdb)
>
> GDB returns this error because x86_cpu_get_phys_page_debug() doesn't support
> translating 1GB pages in IA-32e paging mode and returns an error to GDB.
>
> This commit adds support for 1GB page translation for IA32e paging.
Peter, can you pick up this one please?
>
> Signed-off-by: Luiz capitulino <lcapitulino@redhat.com>
> ---
>
> - I'm proposing this patch for 2.0 because GDB debugging of large Linux
> guests is kind of broken
>
> - Changelog v2:
> - Move PS bit handling to if (env->hflags & HF_LMA_MASK) block
> - Update changelog
>
> target-i386/helper.c | 9 +++++++++
> 1 file changed, 9 insertions(+)
>
> diff --git a/target-i386/helper.c b/target-i386/helper.c
> index 4f447b8..7cee501 100644
> --- a/target-i386/helper.c
> +++ b/target-i386/helper.c
> @@ -941,6 +941,14 @@ hwaddr x86_cpu_get_phys_page_debug(CPUState *cs, vaddr addr)
> pdpe = ldq_phys(cs->as, pdpe_addr);
> if (!(pdpe & PG_PRESENT_MASK))
> return -1;
> +
> + if (pdpe & PG_PSE_MASK) {
> + page_size = 1024 * 1024 * 1024;
> + pte = pdpe & ~( (page_size - 1) & ~0xfff);
> + pte &= ~(PG_NX_MASK | PG_HI_USER_MASK);
> + goto out;
> + }
> +
> } else
> #endif
> {
> @@ -993,6 +1001,7 @@ hwaddr x86_cpu_get_phys_page_debug(CPUState *cs, vaddr addr)
> pte = pte & env->a20_mask;
> }
>
> +out:
> page_offset = (addr & TARGET_PAGE_MASK) & (page_size - 1);
> paddr = (pte & TARGET_PAGE_MASK) + page_offset;
> return paddr;
^ permalink raw reply [flat|nested] 8+ messages in thread