Commit e585b768 authored by YunQiang Su's avatar YunQiang Su Committed by Thomas Bogendoerfer

Use ELF_BASE_PLATFORM to pass ISA level

Some userland application/program runtime/dynamic loaded need to
know about the current ISA level to use the best runtime.
While kernel doesn't provides this info.

ELF_PLATFORM only provides some info about the CPU, with very few info,
for example, the value is "mips" for both 24Kc and P6600.

Currently ELF_BASE_PLATFORM is not used by MIPS (only by powerpc).
So we cant set its value as:
  mips2, mips3, mips4, mips5,
  mips32, mips32r2, mips32r6
  mips64, mips64r2, mips64r6
Then in userland, we can get it by:
  getauxval(AT_BASE_PLATFORM)

The only problem is that it seems has different defination than ppc:
  on ppc, it is the mircoarchitecture
while now we use it as ISA level on MIPS.
Signed-off-by: default avatarYunQiang Su <syq@debian.org>
Reviewed-by: default avatarJiaxun Yang <jiaxun.yang@flygoat.com>
Signed-off-by: default avatarThomas Bogendoerfer <tsbogend@alpha.franken.de>
parent be280764
...@@ -445,6 +445,9 @@ extern unsigned int elf_hwcap; ...@@ -445,6 +445,9 @@ extern unsigned int elf_hwcap;
#define ELF_PLATFORM __elf_platform #define ELF_PLATFORM __elf_platform
extern const char *__elf_platform; extern const char *__elf_platform;
#define ELF_BASE_PLATFORM __elf_base_platform
extern const char *__elf_base_platform;
/* /*
* See comments in asm-alpha/elf.h, this is the same thing * See comments in asm-alpha/elf.h, this is the same thing
* on the MIPS. * on the MIPS.
......
...@@ -513,6 +513,13 @@ static inline void set_elf_platform(int cpu, const char *plat) ...@@ -513,6 +513,13 @@ static inline void set_elf_platform(int cpu, const char *plat)
__elf_platform = plat; __elf_platform = plat;
} }
static inline void set_elf_base_platform(const char *plat)
{
if (__elf_base_platform == NULL) {
__elf_base_platform = plat;
}
}
static inline void cpu_probe_vmbits(struct cpuinfo_mips *c) static inline void cpu_probe_vmbits(struct cpuinfo_mips *c)
{ {
#ifdef __NEED_VMBITS_PROBE #ifdef __NEED_VMBITS_PROBE
...@@ -527,36 +534,46 @@ static void set_isa(struct cpuinfo_mips *c, unsigned int isa) ...@@ -527,36 +534,46 @@ static void set_isa(struct cpuinfo_mips *c, unsigned int isa)
switch (isa) { switch (isa) {
case MIPS_CPU_ISA_M64R2: case MIPS_CPU_ISA_M64R2:
c->isa_level |= MIPS_CPU_ISA_M32R2 | MIPS_CPU_ISA_M64R2; c->isa_level |= MIPS_CPU_ISA_M32R2 | MIPS_CPU_ISA_M64R2;
set_elf_base_platform("mips64r2");
/* fall through */ /* fall through */
case MIPS_CPU_ISA_M64R1: case MIPS_CPU_ISA_M64R1:
c->isa_level |= MIPS_CPU_ISA_M32R1 | MIPS_CPU_ISA_M64R1; c->isa_level |= MIPS_CPU_ISA_M32R1 | MIPS_CPU_ISA_M64R1;
set_elf_base_platform("mips64");
/* fall through */ /* fall through */
case MIPS_CPU_ISA_V: case MIPS_CPU_ISA_V:
c->isa_level |= MIPS_CPU_ISA_V; c->isa_level |= MIPS_CPU_ISA_V;
set_elf_base_platform("mips5");
/* fall through */ /* fall through */
case MIPS_CPU_ISA_IV: case MIPS_CPU_ISA_IV:
c->isa_level |= MIPS_CPU_ISA_IV; c->isa_level |= MIPS_CPU_ISA_IV;
set_elf_base_platform("mips4");
/* fall through */ /* fall through */
case MIPS_CPU_ISA_III: case MIPS_CPU_ISA_III:
c->isa_level |= MIPS_CPU_ISA_II | MIPS_CPU_ISA_III; c->isa_level |= MIPS_CPU_ISA_II | MIPS_CPU_ISA_III;
set_elf_base_platform("mips3");
break; break;
/* R6 incompatible with everything else */ /* R6 incompatible with everything else */
case MIPS_CPU_ISA_M64R6: case MIPS_CPU_ISA_M64R6:
c->isa_level |= MIPS_CPU_ISA_M32R6 | MIPS_CPU_ISA_M64R6; c->isa_level |= MIPS_CPU_ISA_M32R6 | MIPS_CPU_ISA_M64R6;
set_elf_base_platform("mips64r6");
/* fall through */ /* fall through */
case MIPS_CPU_ISA_M32R6: case MIPS_CPU_ISA_M32R6:
c->isa_level |= MIPS_CPU_ISA_M32R6; c->isa_level |= MIPS_CPU_ISA_M32R6;
set_elf_base_platform("mips32r6");
/* Break here so we don't add incompatible ISAs */ /* Break here so we don't add incompatible ISAs */
break; break;
case MIPS_CPU_ISA_M32R2: case MIPS_CPU_ISA_M32R2:
c->isa_level |= MIPS_CPU_ISA_M32R2; c->isa_level |= MIPS_CPU_ISA_M32R2;
set_elf_base_platform("mips32r2");
/* fall through */ /* fall through */
case MIPS_CPU_ISA_M32R1: case MIPS_CPU_ISA_M32R1:
c->isa_level |= MIPS_CPU_ISA_M32R1; c->isa_level |= MIPS_CPU_ISA_M32R1;
set_elf_base_platform("mips32");
/* fall through */ /* fall through */
case MIPS_CPU_ISA_II: case MIPS_CPU_ISA_II:
c->isa_level |= MIPS_CPU_ISA_II; c->isa_level |= MIPS_CPU_ISA_II;
set_elf_base_platform("mips2");
break; break;
} }
} }
...@@ -2113,6 +2130,7 @@ EXPORT_SYMBOL(__ua_limit); ...@@ -2113,6 +2130,7 @@ EXPORT_SYMBOL(__ua_limit);
const char *__cpu_name[NR_CPUS]; const char *__cpu_name[NR_CPUS];
const char *__elf_platform; const char *__elf_platform;
const char *__elf_base_platform;
void cpu_probe(void) void cpu_probe(void)
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment