#ifndef RLD
#include "stdio.h"
#endif
#include "stdlib.h"
#include "string.h"
#include <mach/mach.h>
#include "stuff/openstep_mach.h"
#include "stuff/arch.h"
#include "stuff/allocate.h"
#ifdef __DYNAMIC__
static struct arch_flag arch_flags[] = {
#else
static const struct arch_flag arch_flags[] = {
#endif
{ "any", CPU_TYPE_ANY, CPU_SUBTYPE_MULTIPLE },
{ "little", CPU_TYPE_ANY, CPU_SUBTYPE_LITTLE_ENDIAN },
{ "big", CPU_TYPE_ANY, CPU_SUBTYPE_BIG_ENDIAN },
{ "ppc64", CPU_TYPE_POWERPC64, CPU_SUBTYPE_POWERPC_ALL },
{ "ppc970-64", CPU_TYPE_POWERPC64, CPU_SUBTYPE_POWERPC_970 },
{ "ppc", CPU_TYPE_POWERPC, CPU_SUBTYPE_POWERPC_ALL },
{ "i386", CPU_TYPE_I386, CPU_SUBTYPE_I386_ALL },
{ "m68k", CPU_TYPE_MC680x0, CPU_SUBTYPE_MC680x0_ALL },
{ "hppa", CPU_TYPE_HPPA, CPU_SUBTYPE_HPPA_ALL },
{ "sparc", CPU_TYPE_SPARC, CPU_SUBTYPE_SPARC_ALL },
{ "m88k", CPU_TYPE_MC88000, CPU_SUBTYPE_MC88000_ALL },
{ "i860", CPU_TYPE_I860, CPU_SUBTYPE_I860_ALL },
{ "veo", CPU_TYPE_VEO, CPU_SUBTYPE_VEO_ALL },
{ "ppc601", CPU_TYPE_POWERPC, CPU_SUBTYPE_POWERPC_601 },
{ "ppc603", CPU_TYPE_POWERPC, CPU_SUBTYPE_POWERPC_603 },
{ "ppc603e",CPU_TYPE_POWERPC, CPU_SUBTYPE_POWERPC_603e },
{ "ppc603ev",CPU_TYPE_POWERPC,CPU_SUBTYPE_POWERPC_603ev },
{ "ppc604", CPU_TYPE_POWERPC, CPU_SUBTYPE_POWERPC_604 },
{ "ppc604e",CPU_TYPE_POWERPC, CPU_SUBTYPE_POWERPC_604e },
{ "ppc750", CPU_TYPE_POWERPC, CPU_SUBTYPE_POWERPC_750 },
{ "ppc7400",CPU_TYPE_POWERPC, CPU_SUBTYPE_POWERPC_7400 },
{ "ppc7450",CPU_TYPE_POWERPC, CPU_SUBTYPE_POWERPC_7450 },
{ "ppc970", CPU_TYPE_POWERPC, CPU_SUBTYPE_POWERPC_970 },
{ "i486", CPU_TYPE_I386, CPU_SUBTYPE_486 },
{ "i486SX", CPU_TYPE_I386, CPU_SUBTYPE_486SX },
{ "pentium",CPU_TYPE_I386, CPU_SUBTYPE_PENT },
{ "i586", CPU_TYPE_I386, CPU_SUBTYPE_586 },
{ "pentpro", CPU_TYPE_I386, CPU_SUBTYPE_PENTPRO },
{ "i686", CPU_TYPE_I386, CPU_SUBTYPE_PENTPRO },
{ "pentIIm3",CPU_TYPE_I386, CPU_SUBTYPE_PENTII_M3 },
{ "pentIIm5",CPU_TYPE_I386, CPU_SUBTYPE_PENTII_M5 },
{ "pentium4",CPU_TYPE_I386, CPU_SUBTYPE_PENTIUM_4 },
{ "m68030", CPU_TYPE_MC680x0, CPU_SUBTYPE_MC68030_ONLY },
{ "m68040", CPU_TYPE_MC680x0, CPU_SUBTYPE_MC68040 },
{ "hppa7100LC", CPU_TYPE_HPPA, CPU_SUBTYPE_HPPA_7100LC },
{ "veo1", CPU_TYPE_VEO, CPU_SUBTYPE_VEO_1 },
{ "veo2", CPU_TYPE_VEO, CPU_SUBTYPE_VEO_2 },
{ NULL, 0, 0 }
};
#ifndef RLD
__private_extern__
int
get_arch_from_flag(
char *name,
struct arch_flag *arch_flag)
{
unsigned long i;
for(i = 0; arch_flags[i].name != NULL; i++){
if(strcmp(arch_flags[i].name, name) == 0){
if(arch_flag != NULL)
*arch_flag = arch_flags[i];
return(1);
}
}
if(arch_flag != NULL)
memset(arch_flag, '\0', sizeof(struct arch_flag));
return(0);
}
__private_extern__
const struct arch_flag *
get_arch_flags(
void)
{
return(arch_flags);
}
#endif
__private_extern__
const char *
get_arch_name_from_types(
cpu_type_t cputype,
cpu_subtype_t cpusubtype)
{
unsigned long i;
char *p;
for(i = 0; arch_flags[i].name != NULL; i++){
if(arch_flags[i].cputype == cputype &&
arch_flags[i].cpusubtype == cpusubtype)
return(arch_flags[i].name);
}
#ifndef RLD
p = savestr("cputype 1234567890 cpusubtype 1234567890");
if(p != NULL)
sprintf(p, "cputype %u cpusubtype %u", cputype, cpusubtype);
#else
p = savestr("cputype ?? cpusubtype ??");
#endif
return(p);
}
__private_extern__
const struct arch_flag *
get_arch_family_from_cputype(
cpu_type_t cputype)
{
unsigned long i;
for(i = 0; arch_flags[i].name != NULL; i++){
if(arch_flags[i].cputype == cputype)
return(arch_flags + i);
}
return(NULL);
}
__private_extern__
enum byte_sex
get_byte_sex_from_flag(
const struct arch_flag *flag)
{
if(flag->cputype == CPU_TYPE_MC680x0 ||
flag->cputype == CPU_TYPE_MC88000 ||
flag->cputype == CPU_TYPE_POWERPC ||
flag->cputype == CPU_TYPE_POWERPC64 ||
flag->cputype == CPU_TYPE_HPPA ||
flag->cputype == CPU_TYPE_SPARC ||
flag->cputype == CPU_TYPE_I860 ||
flag->cputype == CPU_TYPE_VEO)
return BIG_ENDIAN_BYTE_SEX;
else if(flag->cputype == CPU_TYPE_I386)
return LITTLE_ENDIAN_BYTE_SEX;
else
return UNKNOWN_BYTE_SEX;
}
#ifndef RLD
__private_extern__
long
get_stack_direction_from_flag(
const struct arch_flag *flag)
{
if(flag->cputype == CPU_TYPE_MC680x0 ||
flag->cputype == CPU_TYPE_MC88000 ||
flag->cputype == CPU_TYPE_POWERPC ||
flag->cputype == CPU_TYPE_I386 ||
flag->cputype == CPU_TYPE_SPARC ||
flag->cputype == CPU_TYPE_I860 ||
flag->cputype == CPU_TYPE_VEO)
return(-1);
else if(flag->cputype == CPU_TYPE_HPPA)
return(+1);
else
return(0);
}
__private_extern__
unsigned long
get_stack_addr_from_flag(
const struct arch_flag *flag)
{
switch(flag->cputype){
case CPU_TYPE_MC680x0:
return(0x04000000);
case CPU_TYPE_MC88000:
return(0xffffe000);
case CPU_TYPE_POWERPC:
case CPU_TYPE_VEO:
return(0xc0000000);
case CPU_TYPE_I386:
return(0xc0000000);
case CPU_TYPE_SPARC:
return(0xf0000000);
case CPU_TYPE_I860:
return(0);
case CPU_TYPE_HPPA:
return(0xc0000000-0x04000000);
default:
return(0);
}
}
__private_extern__
unsigned long
get_stack_size_from_flag(
const struct arch_flag *flag)
{
#ifdef __MWERKS__
const struct arch_flag *dummy;
dummy = flag;
#endif
return(64*1024*1024);
}
#endif
__private_extern__
unsigned long
get_segalign_from_flag(
const struct arch_flag *flag)
{
if(flag->cputype == CPU_TYPE_POWERPC ||
flag->cputype == CPU_TYPE_VEO ||
flag->cputype == CPU_TYPE_I386)
return(0x1000);
else
return(0x2000);
}
__private_extern__
vm_prot_t
get_segprot_from_flag(
const struct arch_flag *flag)
{
if(flag->cputype == CPU_TYPE_I386)
return(VM_PROT_READ | VM_PROT_WRITE);
else
return(VM_PROT_READ | VM_PROT_WRITE | VM_PROT_EXECUTE);
}
__private_extern__
enum bool
force_cpusubtype_ALL_for_cputype(
cpu_type_t cputype)
{
if(cputype == CPU_TYPE_I386)
return(TRUE);
else
return(FALSE);
}