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: YunQiang Su <syq@debian.org> Reviewed-by: Jiaxun Yang <jiaxun.yang@flygoat.com> Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
This commit is contained in:
parent
be28076433
commit
e585b768da
|
@ -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)
|
||||||
__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)
|
||||||
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);
|
||||||
|
|
||||||
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)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue