* [PATCH for-6.2 0/2] target/ppc: Fix vector registers access in gdbstub for little-endian
@ 2021-08-16 19:13 matheus.ferst
2021-08-16 19:13 ` [PATCH for-6.2 1/2] include/qemu/int128.h: introduce bswap128s matheus.ferst
2021-08-16 19:13 ` [PATCH for-6.2 2/2] target/ppc: Don't swap 64-bit elements of AVR in gdbstub for user mode matheus.ferst
0 siblings, 2 replies; 7+ messages in thread
From: matheus.ferst @ 2021-08-16 19:13 UTC (permalink / raw)
To: qemu-devel, qemu-ppc
Cc: peter.maydell, Matheus Ferst, richard.henderson, groug, david
From: Matheus Ferst <matheus.ferst@eldorado.org.br>
PPC gdbstub code has two possible swaps of the 64-bit elements of AVR
registers: in gdb_get_avr_reg/gdb_set_avr_reg (based on msr_le) and in
gdb_get_reg128/ldq_p (based on TARGET_WORDS_BIGENDIAN).
In softmmu, only the first is done, because TARGET_WORDS_BIGENDIAN is
always true. In user mode, both are being done, resulting in swapped
high and low doublewords of AVR registers in little-endian binaries.
We fix this by moving the first swap to ppc_maybe_bswap_register, which
already handles the endianness swap of each element's value in softmmu
and does nothing in user mode.
Matheus Ferst (2):
include/qemu/int128.h: introduce bswap128s
target/ppc: fix vector registers access in gdbstub for little-endian
include/qemu/int128.h | 16 +++++++++++-----
target/ppc/gdbstub.c | 32 +++++++-------------------------
2 files changed, 18 insertions(+), 30 deletions(-)
--
2.25.1
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH for-6.2 1/2] include/qemu/int128.h: introduce bswap128s
2021-08-16 19:13 [PATCH for-6.2 0/2] target/ppc: Fix vector registers access in gdbstub for little-endian matheus.ferst
@ 2021-08-16 19:13 ` matheus.ferst
2021-08-17 9:27 ` Philippe Mathieu-Daudé
2021-08-16 19:13 ` [PATCH for-6.2 2/2] target/ppc: Don't swap 64-bit elements of AVR in gdbstub for user mode matheus.ferst
1 sibling, 1 reply; 7+ messages in thread
From: matheus.ferst @ 2021-08-16 19:13 UTC (permalink / raw)
To: qemu-devel, qemu-ppc
Cc: peter.maydell, Matheus Ferst, richard.henderson, groug, david
From: Matheus Ferst <matheus.ferst@eldorado.org.br>
Introduces bswap128s based on bswap128. Since bswap128 is defined using
int128_* methods available in either CONFIG_INT128 or !CONFIG_INT128
builds, place both outside of #ifdef CONFIG_INT128.
Signed-off-by: Matheus Ferst <matheus.ferst@eldorado.org.br>
---
include/qemu/int128.h | 16 +++++++++++-----
1 file changed, 11 insertions(+), 5 deletions(-)
diff --git a/include/qemu/int128.h b/include/qemu/int128.h
index 64500385e3..e0d385628c 100644
--- a/include/qemu/int128.h
+++ b/include/qemu/int128.h
@@ -153,11 +153,6 @@ static inline void int128_subfrom(Int128 *a, Int128 b)
*a -= b;
}
-static inline Int128 bswap128(Int128 a)
-{
- return int128_make128(bswap64(int128_gethi(a)), bswap64(int128_getlo(a)));
-}
-
#else /* !CONFIG_INT128 */
typedef struct Int128 Int128;
@@ -338,4 +333,15 @@ static inline void int128_subfrom(Int128 *a, Int128 b)
}
#endif /* CONFIG_INT128 */
+
+static inline Int128 bswap128(Int128 a)
+{
+ return int128_make128(bswap64(int128_gethi(a)), bswap64(int128_getlo(a)));
+}
+
+static inline void bswap128s(Int128 *s)
+{
+ *s = bswap128(*s);
+}
+
#endif /* INT128_H */
--
2.25.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH for-6.2 2/2] target/ppc: Don't swap 64-bit elements of AVR in gdbstub for user mode
2021-08-16 19:13 [PATCH for-6.2 0/2] target/ppc: Fix vector registers access in gdbstub for little-endian matheus.ferst
2021-08-16 19:13 ` [PATCH for-6.2 1/2] include/qemu/int128.h: introduce bswap128s matheus.ferst
@ 2021-08-16 19:13 ` matheus.ferst
1 sibling, 0 replies; 7+ messages in thread
From: matheus.ferst @ 2021-08-16 19:13 UTC (permalink / raw)
To: qemu-devel, qemu-ppc
Cc: peter.maydell, Matheus Ferst, richard.henderson, groug, david
From: Matheus Ferst <matheus.ferst@eldorado.org.br>
As vector registers are stored in host endianness, we shouldn't swap its
64-bit elements in user mode to call gdb_get_reg128. Add a 16-byte case
in ppc_maybe_bswap_register to handle the reordering of elements in
softmmu and remove avr_need_swap which is now unused.
Signed-off-by: Matheus Ferst <matheus.ferst@eldorado.org.br>
---
target/ppc/gdbstub.c | 32 +++++++-------------------------
1 file changed, 7 insertions(+), 25 deletions(-)
diff --git a/target/ppc/gdbstub.c b/target/ppc/gdbstub.c
index 09ff1328d4..011016edfa 100644
--- a/target/ppc/gdbstub.c
+++ b/target/ppc/gdbstub.c
@@ -101,6 +101,8 @@ void ppc_maybe_bswap_register(CPUPPCState *env, uint8_t *mem_buf, int len)
bswap32s((uint32_t *)mem_buf);
} else if (len == 8) {
bswap64s((uint64_t *)mem_buf);
+ } else if (len == 16) {
+ bswap128s((Int128 *)mem_buf);
} else {
g_assert_not_reached();
}
@@ -389,15 +391,6 @@ const char *ppc_gdb_get_dynamic_xml(CPUState *cs, const char *xml_name)
}
#endif
-static bool avr_need_swap(CPUPPCState *env)
-{
-#ifdef HOST_WORDS_BIGENDIAN
- return msr_le;
-#else
- return !msr_le;
-#endif
-}
-
#if !defined(CONFIG_USER_ONLY)
static int gdb_find_spr_idx(CPUPPCState *env, int n)
{
@@ -486,14 +479,9 @@ static int gdb_get_avr_reg(CPUPPCState *env, GByteArray *buf, int n)
if (n < 32) {
ppc_avr_t *avr = cpu_avr_ptr(env, n);
- if (!avr_need_swap(env)) {
- gdb_get_reg128(buf, avr->u64[0] , avr->u64[1]);
- } else {
- gdb_get_reg128(buf, avr->u64[1] , avr->u64[0]);
- }
+ gdb_get_reg128(buf, avr->VsrD(0) , avr->VsrD(1));
mem_buf = gdb_get_reg_ptr(buf, 16);
- ppc_maybe_bswap_register(env, mem_buf, 8);
- ppc_maybe_bswap_register(env, mem_buf + 8, 8);
+ ppc_maybe_bswap_register(env, mem_buf, 16);
return 16;
}
if (n == 32) {
@@ -515,15 +503,9 @@ static int gdb_set_avr_reg(CPUPPCState *env, uint8_t *mem_buf, int n)
{
if (n < 32) {
ppc_avr_t *avr = cpu_avr_ptr(env, n);
- ppc_maybe_bswap_register(env, mem_buf, 8);
- ppc_maybe_bswap_register(env, mem_buf + 8, 8);
- if (!avr_need_swap(env)) {
- avr->u64[0] = ldq_p(mem_buf);
- avr->u64[1] = ldq_p(mem_buf + 8);
- } else {
- avr->u64[1] = ldq_p(mem_buf);
- avr->u64[0] = ldq_p(mem_buf + 8);
- }
+ ppc_maybe_bswap_register(env, mem_buf, 16);
+ avr->VsrD(0) = ldq_p(mem_buf);
+ avr->VsrD(1) = ldq_p(mem_buf + 8);
return 16;
}
if (n == 32) {
--
2.25.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH for-6.2 1/2] include/qemu/int128.h: introduce bswap128s
2021-08-16 19:13 ` [PATCH for-6.2 1/2] include/qemu/int128.h: introduce bswap128s matheus.ferst
@ 2021-08-17 9:27 ` Philippe Mathieu-Daudé
2021-08-17 12:09 ` Matheus K. Ferst
0 siblings, 1 reply; 7+ messages in thread
From: Philippe Mathieu-Daudé @ 2021-08-17 9:27 UTC (permalink / raw)
To: matheus.ferst, qemu-devel, qemu-ppc
Cc: peter.maydell, richard.henderson, groug, david
On 8/16/21 9:13 PM, matheus.ferst@eldorado.org.br wrote:
> From: Matheus Ferst <matheus.ferst@eldorado.org.br>
>
> Introduces bswap128s based on bswap128. Since bswap128 is defined using
> int128_* methods available in either CONFIG_INT128 or !CONFIG_INT128
> builds, place both outside of #ifdef CONFIG_INT128.
>
> Signed-off-by: Matheus Ferst <matheus.ferst@eldorado.org.br>
> ---
> include/qemu/int128.h | 16 +++++++++++-----
> 1 file changed, 11 insertions(+), 5 deletions(-)
>
> diff --git a/include/qemu/int128.h b/include/qemu/int128.h
> index 64500385e3..e0d385628c 100644
> --- a/include/qemu/int128.h
> +++ b/include/qemu/int128.h
> @@ -153,11 +153,6 @@ static inline void int128_subfrom(Int128 *a, Int128 b)
> *a -= b;
> }
>
> -static inline Int128 bswap128(Int128 a)
> -{
> - return int128_make128(bswap64(int128_gethi(a)), bswap64(int128_getlo(a)));
> -}
Personally I'd move this one to the other #ifdef side,
and implement here with __builtin_bswap128().
> #else /* !CONFIG_INT128 */
>
> typedef struct Int128 Int128;
> @@ -338,4 +333,15 @@ static inline void int128_subfrom(Int128 *a, Int128 b)
> }
> +static inline Int128 bswap128(Int128 a)
> +{
> + return int128_make128(bswap64(int128_gethi(a)), bswap64(int128_getlo(a)));
> +}
#endif /* CONFIG_INT128 */
And add this generic one here indeed:
> +static inline void bswap128s(Int128 *s)
> +{
> + *s = bswap128(*s);
> +}
> +
> #endif /* INT128_H */
>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH for-6.2 1/2] include/qemu/int128.h: introduce bswap128s
2021-08-17 9:27 ` Philippe Mathieu-Daudé
@ 2021-08-17 12:09 ` Matheus K. Ferst
2021-08-17 12:15 ` Peter Maydell
0 siblings, 1 reply; 7+ messages in thread
From: Matheus K. Ferst @ 2021-08-17 12:09 UTC (permalink / raw)
To: Philippe Mathieu-Daudé, qemu-devel, qemu-ppc
Cc: peter.maydell, richard.henderson, groug, david
On 17/08/2021 06:27, Philippe Mathieu-Daudé wrote:
> [E-MAIL EXTERNO] Não clique em links ou abra anexos, a menos que você possa confirmar o remetente e saber que o conteúdo é seguro. Em caso de e-mail suspeito entre imediatamente em contato com o DTI.
>
> On 8/16/21 9:13 PM, matheus.ferst@eldorado.org.br wrote:
>> From: Matheus Ferst <matheus.ferst@eldorado.org.br>
>>
>> Introduces bswap128s based on bswap128. Since bswap128 is defined using
>> int128_* methods available in either CONFIG_INT128 or !CONFIG_INT128
>> builds, place both outside of #ifdef CONFIG_INT128.
>>
>> Signed-off-by: Matheus Ferst <matheus.ferst@eldorado.org.br>
>> ---
>> include/qemu/int128.h | 16 +++++++++++-----
>> 1 file changed, 11 insertions(+), 5 deletions(-)
>>
>> diff --git a/include/qemu/int128.h b/include/qemu/int128.h
>> index 64500385e3..e0d385628c 100644
>> --- a/include/qemu/int128.h
>> +++ b/include/qemu/int128.h
>> @@ -153,11 +153,6 @@ static inline void int128_subfrom(Int128 *a, Int128 b)
>> *a -= b;
>> }
>>
>> -static inline Int128 bswap128(Int128 a)
>> -{
>> - return int128_make128(bswap64(int128_gethi(a)), bswap64(int128_getlo(a)));
>> -}
>
> Personally I'd move this one to the other #ifdef side,
> and implement here with __builtin_bswap128().
>
I saw this builtin, but I couldn't test it on my system. It seems that
Clang doesn't implement it, and it's only available on GCC 11:
https://godbolt.org/z/T6vhd5a38 . I think we can use it, but I'd need to
figure how to add a test for it in the configure script.
>> #else /* !CONFIG_INT128 */
>>
>> typedef struct Int128 Int128;
>> @@ -338,4 +333,15 @@ static inline void int128_subfrom(Int128 *a, Int128 b)
>> }
>
>> +static inline Int128 bswap128(Int128 a)
>> +{
>> + return int128_make128(bswap64(int128_gethi(a)), bswap64(int128_getlo(a)));
>> +}
>
> #endif /* CONFIG_INT128 */
>
> And add this generic one here indeed:
>
>> +static inline void bswap128s(Int128 *s)
>> +{
>> + *s = bswap128(*s);
>> +}
>> +
>> #endif /* INT128_H */
>>
>
--
Matheus K. Ferst
Instituto de Pesquisas ELDORADO <http://www.eldorado.org.br/>
Analista de Software Júnior
Aviso Legal - Disclaimer <https://www.eldorado.org.br/disclaimer.html>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH for-6.2 1/2] include/qemu/int128.h: introduce bswap128s
2021-08-17 12:09 ` Matheus K. Ferst
@ 2021-08-17 12:15 ` Peter Maydell
2021-08-17 13:55 ` Matheus K. Ferst
0 siblings, 1 reply; 7+ messages in thread
From: Peter Maydell @ 2021-08-17 12:15 UTC (permalink / raw)
To: Matheus K. Ferst
Cc: Richard Henderson, QEMU Developers, Greg Kurz, qemu-ppc,
Philippe Mathieu-Daudé, David Gibson
On Tue, 17 Aug 2021 at 13:09, Matheus K. Ferst
<matheus.ferst@eldorado.org.br> wrote:
>
> On 17/08/2021 06:27, Philippe Mathieu-Daudé wrote:
> > On 8/16/21 9:13 PM, matheus.ferst@eldorado.org.br wrote:
> >> From: Matheus Ferst <matheus.ferst@eldorado.org.br>
> >> -static inline Int128 bswap128(Int128 a)
> >> -{
> >> - return int128_make128(bswap64(int128_gethi(a)), bswap64(int128_getlo(a)));
> >> -}
> >
> > Personally I'd move this one to the other #ifdef side,
> > and implement here with __builtin_bswap128().
> >
>
> I saw this builtin, but I couldn't test it on my system. It seems that
> Clang doesn't implement it, and it's only available on GCC 11:
> https://godbolt.org/z/T6vhd5a38 . I think we can use it, but I'd need to
> figure how to add a test for it in the configure script.
You should be able to get away without a configure script test --
#if __has_builtin(__builtin_bswap128)
/* version with the builtin here */
#else
/* fallback */
#endif
ought to work. (Any gcc new enough to have the builtin also has
__has_builtin; clang has had __has_builtin for ages; our compiler.h
defines a fallback "always 0" __has_builtin for older compilers.)
-- PMM
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH for-6.2 1/2] include/qemu/int128.h: introduce bswap128s
2021-08-17 12:15 ` Peter Maydell
@ 2021-08-17 13:55 ` Matheus K. Ferst
0 siblings, 0 replies; 7+ messages in thread
From: Matheus K. Ferst @ 2021-08-17 13:55 UTC (permalink / raw)
To: Peter Maydell
Cc: Richard Henderson, QEMU Developers, Greg Kurz, qemu-ppc,
Philippe Mathieu-Daudé, David Gibson
On 17/08/2021 09:15, Peter Maydell wrote:
> [E-MAIL EXTERNO] Não clique em links ou abra anexos, a menos que você possa confirmar o remetente e saber que o conteúdo é seguro. Em caso de e-mail suspeito entre imediatamente em contato com o DTI.
>
> On Tue, 17 Aug 2021 at 13:09, Matheus K. Ferst
> <matheus.ferst@eldorado.org.br> wrote:
>>
>> On 17/08/2021 06:27, Philippe Mathieu-Daudé wrote:
>>> On 8/16/21 9:13 PM, matheus.ferst@eldorado.org.br wrote:
>>>> From: Matheus Ferst <matheus.ferst@eldorado.org.br>
>>>> -static inline Int128 bswap128(Int128 a)
>>>> -{
>>>> - return int128_make128(bswap64(int128_gethi(a)), bswap64(int128_getlo(a)));
>>>> -}
>>>
>>> Personally I'd move this one to the other #ifdef side,
>>> and implement here with __builtin_bswap128().
>>>
>>
>> I saw this builtin, but I couldn't test it on my system. It seems that
>> Clang doesn't implement it, and it's only available on GCC 11:
>> https://godbolt.org/z/T6vhd5a38 . I think we can use it, but I'd need to
>> figure how to add a test for it in the configure script.
>
> You should be able to get away without a configure script test --
> #if __has_builtin(__builtin_bswap128)
> /* version with the builtin here */
> #else
> /* fallback */
> #endif
>
> ought to work. (Any gcc new enough to have the builtin also has
> __has_builtin; clang has had __has_builtin for ages; our compiler.h
> defines a fallback "always 0" __has_builtin for older compilers.)
>
> -- PMM
>
Nice, I'll prepare a v2.
--
Matheus K. Ferst
Instituto de Pesquisas ELDORADO <http://www.eldorado.org.br/>
Analista de Software Júnior
Aviso Legal - Disclaimer <https://www.eldorado.org.br/disclaimer.html>
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2021-08-17 13:57 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2021-08-16 19:13 [PATCH for-6.2 0/2] target/ppc: Fix vector registers access in gdbstub for little-endian matheus.ferst
2021-08-16 19:13 ` [PATCH for-6.2 1/2] include/qemu/int128.h: introduce bswap128s matheus.ferst
2021-08-17 9:27 ` Philippe Mathieu-Daudé
2021-08-17 12:09 ` Matheus K. Ferst
2021-08-17 12:15 ` Peter Maydell
2021-08-17 13:55 ` Matheus K. Ferst
2021-08-16 19:13 ` [PATCH for-6.2 2/2] target/ppc: Don't swap 64-bit elements of AVR in gdbstub for user mode matheus.ferst
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).