/* * Data detected about CPUs at boot time which is the same for all CPU's. * HP boxes are SMP - ie identical processors. * * FIXME: some CPU rev info may be processor specific...
*/ struct system_cpuinfo_parisc { unsignedint cpu_count; unsignedint cpu_hz; unsignedint hversion; unsignedint sversion; enum cpu_type cpu_type;
struct { struct pdc_model model; unsignedlong versions; unsignedlong cpuid; unsignedlong capabilities; char sys_model_name[81]; /* PDC-ROM returnes this model name */
} pdc;
constchar *cpu_name; /* e.g. "PA7300LC (PCX-L2)" */ constchar *family_name; /* e.g. "1.1e" */
};
/* Per CPU data structure - ie varies per CPU. */ struct cpuinfo_parisc { unsignedlong it_value; /* Interval Timer at last timer Intr */ unsignedlong irq_count; /* number of IRQ's since boot */ unsignedlong cpuid; /* aka slot_number or set to NO_PROC_ID */ unsignedlong hpa; /* Host Physical address */ unsignedlong txn_addr; /* MMIO addr of EIR or id_eid */ #ifdef CONFIG_SMP unsignedlong pending_ipi; /* bitmap of type ipi_message_type */ #endif unsignedlong bh_count; /* number of times bh was invoked */ unsignedlong fp_rev; unsignedlong fp_model; unsignedlong cpu_num; /* CPU number from PAT firmware */ unsignedlong cpu_loc; /* CPU location from PAT firmware */ unsignedint state; struct parisc_device *dev;
};
externstruct system_cpuinfo_parisc boot_cpu_data;
DECLARE_PER_CPU(struct cpuinfo_parisc, cpu_data); externint time_keeper_id; /* CPU used for timekeeping */
/* * Start user thread in another space. * * Note that we set both the iaoq and r31 to the new pc. When * the kernel initially calls execve it will return through an * rfi path that will use the values in the iaoq. The execve * syscall path will return through the gateway page, and * that uses r31 to branch to. * * For ELF we clear r23, because the dynamic linker uses it to pass * the address of the finalizer function. * * We also initialize sr3 to an illegal value (illegal for our * implementation, not for the architecture).
*/ typedefunsignedint elf_caddr_t;
/* The ELF abi wants things done a "wee bit" differently than * som does. Supporting this behavior here avoids * having our own version of create_elf_tables. * * Oh, and yes, that is not a typo, we are really passing argc in r25 * and argv in r24 (rather than r26 and r25). This is because that's * where __libc_start_main wants them. * * Duplicated from dl-machine.h for the benefit of readers: * * Our initial stack layout is rather different from everyone else's * due to the unique PA-RISC ABI. As far as I know it looks like * this:
----------------------------------- (user startup code creates this frame) | 32 bytes of magic | |---------------------------------| | 32 bytes argument/sp save area | |---------------------------------| (bprm->p) | ELF auxiliary info | | (up to 28 words) | |---------------------------------| | NULL | |---------------------------------| | Environment pointers | |---------------------------------| | NULL | |---------------------------------| | Argument pointers | |---------------------------------| <- argv | argc (1 word) | |---------------------------------| <- bprm->exec (HACK!) | N bytes of slack | |---------------------------------| | filename passed to execve | |---------------------------------| (mm->env_end) | env strings | |---------------------------------| (mm->env_start, mm->arg_end) | arg strings | |---------------------------------| | additional faked arg strings if | | we're invoked via binfmt_script | |---------------------------------| (mm->arg_start) stack base is at TASK_SIZE - rlim_max.
on downward growing arches, it looks like this: stack base at TASK_SIZE | filename passed to execve | env strings | arg strings | faked arg strings | slack | ELF | envps | argvs | argc
* The pleasant part of this is that if we need to skip arguments we * can just decrement argc and move argv, because the stack pointer * is utterly unrelated to the location of the environment and * argument vectors. * * Note that the S/390 people took the easy way out and hacked their * GCC to make the stack grow downwards. * * Final Note: For entry from syscall, the W (wide) bit of the PSW * is stuffed into the lowest bit of the user sp (%r30), so we fill * it in here from the current->personality
*/
/* * parisc_requires_coherency() is used to identify the combined VIPT/PIPT * cached CPUs which require a guarantee of coherency (no inequivalent aliases * with different data, whether clean or not) to operate
*/ #ifdef CONFIG_PA8X00 externint _parisc_requires_coherency; #define parisc_requires_coherency() _parisc_requires_coherency #else #define parisc_requires_coherency() (0) #endif
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.