diff mbox series

[v2,4/4] linux-user: MIPS set cpu to r6 CPU if binary is R6

Message ID 20180116172510.28878-5-laurent@vivier.eu
State New
Headers show
Series linux-user: select CPU type according ELF header values | expand

Commit Message

Laurent Vivier Jan. 16, 2018, 5:25 p.m. UTC
From: YunQiang Su <syq@debian.org>

So here we need to detect the version of binaries and set
cpu_model for it.

[lv: original patch modified to move code into cpu_get_model()]
Signed-off-by: Laurent Vivier <laurent@vivier.eu>
---

Notes:
    YunQiang Su, please add your Signed-off-by that was
    missing in your original patch.
    
    v2: call cpu_get_model() with the result of get_elf_eflags()

 include/elf.h                  | 4 ++++
 linux-user/mips/target_elf.h   | 3 +++
 linux-user/mips64/target_elf.h | 3 +++
 3 files changed, 10 insertions(+)

Comments

Richard Henderson Jan. 16, 2018, 8:26 p.m. UTC | #1
On 01/16/2018 09:25 AM, Laurent Vivier wrote:
> From: YunQiang Su <syq@debian.org>
> 
> So here we need to detect the version of binaries and set
> cpu_model for it.
> 
> [lv: original patch modified to move code into cpu_get_model()]
> Signed-off-by: Laurent Vivier <laurent@vivier.eu>
> ---

Reviewed-by: Richard Henderson <richard.henderson@linaro.org>

>  static inline const char *cpu_get_model(uint32_t eflags)
>  {
> +     if ((eflags & EF_MIPS_ARCH_32R6) != 0) {
> +         return "mips32r6-generic";
> +     }
>      return "24Kf";

That said, I don't suppose it's worth diagnosing cases that we can't support
somehow?  E.g. mips-linux-user and EF_MIPS_ARCH_64.  Or even coldfire ISA-C.


r~
Philippe Mathieu-Daudé Jan. 16, 2018, 8:29 p.m. UTC | #2
On 01/16/2018 02:25 PM, Laurent Vivier wrote:
> From: YunQiang Su <syq@debian.org>
> 
> So here we need to detect the version of binaries and set
> cpu_model for it.
> 
> [lv: original patch modified to move code into cpu_get_model()]
> Signed-off-by: Laurent Vivier <laurent@vivier.eu>
> ---
> 
> Notes:
>     YunQiang Su, please add your Signed-off-by that was
>     missing in your original patch.
>     
>     v2: call cpu_get_model() with the result of get_elf_eflags()
> 
>  include/elf.h                  | 4 ++++
>  linux-user/mips/target_elf.h   | 3 +++
>  linux-user/mips64/target_elf.h | 3 +++
>  3 files changed, 10 insertions(+)
> 
> diff --git a/include/elf.h b/include/elf.h
> index e8a515ce3d..f2104809b1 100644
> --- a/include/elf.h
> +++ b/include/elf.h
> @@ -40,6 +40,10 @@ typedef int64_t  Elf64_Sxword;
>  #define EF_MIPS_ARCH_5		0x40000000	/* -mips5 code.  */
>  #define EF_MIPS_ARCH_32		0x50000000	/* MIPS32 code.  */
>  #define EF_MIPS_ARCH_64		0x60000000	/* MIPS64 code.  */
> +#define EF_MIPS_ARCH_32R2       0x70000000      /* MIPS32r2 code.  */
> +#define EF_MIPS_ARCH_64R2       0x80000000      /* MIPS64r2 code.  */
> +#define EF_MIPS_ARCH_32R6       0x90000000      /* MIPS32r6 code.  */
> +#define EF_MIPS_ARCH_64R6       0xa0000000      /* MIPS64r6 code.  */
>  
>  /* The ABI of a file. */
>  #define EF_MIPS_ABI_O32		0x00001000	/* O32 ABI.  */
> diff --git a/linux-user/mips/target_elf.h b/linux-user/mips/target_elf.h
> index bed0b43259..ac14f99ac5 100644
> --- a/linux-user/mips/target_elf.h
> +++ b/linux-user/mips/target_elf.h
> @@ -9,6 +9,9 @@
>  #define MIPS_TARGET_ELF_H
>  static inline const char *cpu_get_model(uint32_t eflags)
>  {
> +     if ((eflags & EF_MIPS_ARCH_32R6) != 0) {

        if (eflags & EF_MIPS_ARCH_32R6) {

> +         return "mips32r6-generic";

What is the gain of the "-generic" suffix?

Using "mips32r6":
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>

> +     }
>      return "24Kf";
>  }
>  #endif
> diff --git a/linux-user/mips64/target_elf.h b/linux-user/mips64/target_elf.h
> index 5b6f4692e0..6cda7ae435 100644
> --- a/linux-user/mips64/target_elf.h
> +++ b/linux-user/mips64/target_elf.h
> @@ -9,6 +9,9 @@
>  #define MIPS64_TARGET_ELF_H
>  static inline const char *cpu_get_model(uint32_t eflags)
>  {
> +     if ((eflags & EF_MIPS_ARCH_64R6) != 0) {
> +         return "I6400";
> +     }
>      return "5KEf";
>  }
>  #endif
>
Laurent Vivier Jan. 16, 2018, 9:58 p.m. UTC | #3
Le 16/01/2018 à 21:29, Philippe Mathieu-Daudé a écrit :
> On 01/16/2018 02:25 PM, Laurent Vivier wrote:
>> From: YunQiang Su <syq@debian.org>
>>
>> So here we need to detect the version of binaries and set
>> cpu_model for it.
>>
>> [lv: original patch modified to move code into cpu_get_model()]
>> Signed-off-by: Laurent Vivier <laurent@vivier.eu>
>> ---
>>
>> Notes:
>>     YunQiang Su, please add your Signed-off-by that was
>>     missing in your original patch.
>>     
>>     v2: call cpu_get_model() with the result of get_elf_eflags()
>>
>>  include/elf.h                  | 4 ++++
>>  linux-user/mips/target_elf.h   | 3 +++
>>  linux-user/mips64/target_elf.h | 3 +++
>>  3 files changed, 10 insertions(+)
>>
>> diff --git a/include/elf.h b/include/elf.h
>> index e8a515ce3d..f2104809b1 100644
>> --- a/include/elf.h
>> +++ b/include/elf.h
>> @@ -40,6 +40,10 @@ typedef int64_t  Elf64_Sxword;
>>  #define EF_MIPS_ARCH_5		0x40000000	/* -mips5 code.  */
>>  #define EF_MIPS_ARCH_32		0x50000000	/* MIPS32 code.  */
>>  #define EF_MIPS_ARCH_64		0x60000000	/* MIPS64 code.  */
>> +#define EF_MIPS_ARCH_32R2       0x70000000      /* MIPS32r2 code.  */
>> +#define EF_MIPS_ARCH_64R2       0x80000000      /* MIPS64r2 code.  */
>> +#define EF_MIPS_ARCH_32R6       0x90000000      /* MIPS32r6 code.  */
>> +#define EF_MIPS_ARCH_64R6       0xa0000000      /* MIPS64r6 code.  */
>>  
>>  /* The ABI of a file. */
>>  #define EF_MIPS_ABI_O32		0x00001000	/* O32 ABI.  */
>> diff --git a/linux-user/mips/target_elf.h b/linux-user/mips/target_elf.h
>> index bed0b43259..ac14f99ac5 100644
>> --- a/linux-user/mips/target_elf.h
>> +++ b/linux-user/mips/target_elf.h
>> @@ -9,6 +9,9 @@
>>  #define MIPS_TARGET_ELF_H
>>  static inline const char *cpu_get_model(uint32_t eflags)
>>  {
>> +     if ((eflags & EF_MIPS_ARCH_32R6) != 0) {
> 
>         if (eflags & EF_MIPS_ARCH_32R6) {
> 
>> +         return "mips32r6-generic";
> 
> What is the gain of the "-generic" suffix?

Don't know, but this the name in list given by:

qemu-system-mips -cpu help

> 
> Using "mips32r6":
> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>

qemu-system-mips -cpu mips32r6
qemu-system-mips: unable to find CPU model 'mips32r6'

mips-softmmu/qemu-system-mips -cpu mips32r6-generic
qemu-system-mips: Could not load MIPS bios 'mips_bios.bin', and no
-kernel argument was specified

Thanks,
Laurent
Laurent Vivier Jan. 16, 2018, 10:01 p.m. UTC | #4
Le 16/01/2018 à 21:26, Richard Henderson a écrit :
> On 01/16/2018 09:25 AM, Laurent Vivier wrote:
>> From: YunQiang Su <syq@debian.org>
>>
>> So here we need to detect the version of binaries and set
>> cpu_model for it.
>>
>> [lv: original patch modified to move code into cpu_get_model()]
>> Signed-off-by: Laurent Vivier <laurent@vivier.eu>
>> ---
> 
> Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
> 
>>  static inline const char *cpu_get_model(uint32_t eflags)
>>  {
>> +     if ((eflags & EF_MIPS_ARCH_32R6) != 0) {
>> +         return "mips32r6-generic";
>> +     }
>>      return "24Kf";
> 
> That said, I don't suppose it's worth diagnosing cases that we can't support
> somehow?  E.g. mips-linux-user and EF_MIPS_ARCH_64.  Or even coldfire ISA-C.

Yes, the idea is "if we don't know, do as before":
the real error will be reported by the loader.

Thanks,
Laurent
diff mbox series

Patch

diff --git a/include/elf.h b/include/elf.h
index e8a515ce3d..f2104809b1 100644
--- a/include/elf.h
+++ b/include/elf.h
@@ -40,6 +40,10 @@  typedef int64_t  Elf64_Sxword;
 #define EF_MIPS_ARCH_5		0x40000000	/* -mips5 code.  */
 #define EF_MIPS_ARCH_32		0x50000000	/* MIPS32 code.  */
 #define EF_MIPS_ARCH_64		0x60000000	/* MIPS64 code.  */
+#define EF_MIPS_ARCH_32R2       0x70000000      /* MIPS32r2 code.  */
+#define EF_MIPS_ARCH_64R2       0x80000000      /* MIPS64r2 code.  */
+#define EF_MIPS_ARCH_32R6       0x90000000      /* MIPS32r6 code.  */
+#define EF_MIPS_ARCH_64R6       0xa0000000      /* MIPS64r6 code.  */
 
 /* The ABI of a file. */
 #define EF_MIPS_ABI_O32		0x00001000	/* O32 ABI.  */
diff --git a/linux-user/mips/target_elf.h b/linux-user/mips/target_elf.h
index bed0b43259..ac14f99ac5 100644
--- a/linux-user/mips/target_elf.h
+++ b/linux-user/mips/target_elf.h
@@ -9,6 +9,9 @@ 
 #define MIPS_TARGET_ELF_H
 static inline const char *cpu_get_model(uint32_t eflags)
 {
+     if ((eflags & EF_MIPS_ARCH_32R6) != 0) {
+         return "mips32r6-generic";
+     }
     return "24Kf";
 }
 #endif
diff --git a/linux-user/mips64/target_elf.h b/linux-user/mips64/target_elf.h
index 5b6f4692e0..6cda7ae435 100644
--- a/linux-user/mips64/target_elf.h
+++ b/linux-user/mips64/target_elf.h
@@ -9,6 +9,9 @@ 
 #define MIPS64_TARGET_ELF_H
 static inline const char *cpu_get_model(uint32_t eflags)
 {
+     if ((eflags & EF_MIPS_ARCH_64R6) != 0) {
+         return "I6400";
+     }
     return "5KEf";
 }
 #endif