arch/s390/kernel/early.c
Source file repositories/reference/linux-study-clean/arch/s390/kernel/early.c
File Facts
- System
- Linux kernel
- Corpus path
arch/s390/kernel/early.c- Extension
.c- Size
- 6254 bytes
- Lines
- 244
- Domain
- Architecture Layer
- Bucket
- arch/s390
- Inferred role
- Architecture Layer: implementation source
- Status
- source implementation candidate
Why This File Exists
CPU and platform-specific kernel glue: boot entry, traps, syscall entry, interrupts, page tables, context switch, and low-level barriers.
- CPU and platform-specific kernel glue: boot entry, traps, syscall entry, interrupts, page tables, context switch, and low-level barriers.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/sched/debug.hlinux/cpufeature.hlinux/compiler.hlinux/init.hlinux/errno.hlinux/string.hlinux/ctype.hlinux/lockdep.hlinux/extable.hlinux/pfn.hlinux/uaccess.hlinux/kernel.hasm/asm-extable.hlinux/memblock.hlinux/kasan.hasm/access-regs.hasm/asm-offsets.hasm/machine.hasm/diag.hasm/ebcdic.hasm/fpu.hasm/ipl.hasm/lowcore.hasm/processor.hasm/sections.hasm/setup.hasm/sysinfo.hasm/cpcmd.hasm/sclp.hasm/facility.hasm/boot_data.hentry.h
Detected Declarations
function kasan_early_initfunction init_kernel_storage_keyfunction strim_allfunction setup_arch_stringfunction setup_topologyfunction __do_early_pgm_checkfunction setup_lowcore_earlyfunction save_vector_registersfunction setup_low_address_protectionfunction setup_access_registersfunction setup_boot_command_linefunction sort_amode31_extablefunction startup_init
Annotated Snippet
if (isspace(*str)) {
s = skip_spaces(str);
memmove(str, s, strlen(s) + 1);
}
}
}
char arch_hw_string[128];
static noinline __init void setup_arch_string(void)
{
struct sysinfo_1_1_1 *mach = (struct sysinfo_1_1_1 *)&sysinfo_page;
struct sysinfo_3_2_2 *vm = (struct sysinfo_3_2_2 *)&sysinfo_page;
char mstr[80], hvstr[17];
if (stsi(mach, 1, 1, 1))
return;
EBCASC(mach->manufacturer, sizeof(mach->manufacturer));
EBCASC(mach->type, sizeof(mach->type));
EBCASC(mach->model, sizeof(mach->model));
EBCASC(mach->model_capacity, sizeof(mach->model_capacity));
scnprintf(mstr, sizeof(mstr), "%-16.16s %-4.4s %-16.16s %-16.16s",
mach->manufacturer, mach->type,
mach->model, mach->model_capacity);
strim_all(mstr);
if (stsi(vm, 3, 2, 2) == 0 && vm->count) {
EBCASC(vm->vm[0].cpi, sizeof(vm->vm[0].cpi));
scnprintf(hvstr, sizeof(hvstr), "%-16.16s", vm->vm[0].cpi);
strim_all(hvstr);
} else {
scnprintf(hvstr, sizeof(hvstr), "%s",
machine_is_lpar() ? "LPAR" :
machine_is_vm() ? "z/VM" :
machine_is_kvm() ? "KVM" : "unknown");
}
scnprintf(arch_hw_string, sizeof(arch_hw_string), "HW: %s (%s)", mstr, hvstr);
dump_stack_set_arch_desc("%s (%s)", mstr, hvstr);
}
static __init void setup_topology(void)
{
int max_mnest;
if (!cpu_has_topology())
return;
for (max_mnest = 6; max_mnest > 1; max_mnest--) {
if (stsi(&sysinfo_page, 15, 1, max_mnest) == 0)
break;
}
topology_max_mnest = max_mnest;
}
void __init __do_early_pgm_check(struct pt_regs *regs)
{
struct lowcore *lc = get_lowcore();
unsigned long ip;
regs->int_code = lc->pgm_int_code;
regs->int_parm_long = lc->trans_exc_code;
regs->last_break = lc->pgm_last_break;
ip = __rewind_psw(regs->psw, regs->int_code >> 16);
/* Monitor Event? Might be a warning */
if ((regs->int_code & PGM_INT_CODE_MASK) == 0x40) {
if (report_bug(ip, regs) == BUG_TRAP_TYPE_WARN)
return;
}
if (fixup_exception(regs))
return;
/*
* Unhandled exception - system cannot continue but try to get some
* helpful messages to the console. Use early_printk() to print
* some basic information in case it is too early for printk().
*/
register_early_console();
early_printk("PANIC: early exception %04x PSW: %016lx %016lx\n",
regs->int_code & 0xffff, regs->psw.mask, regs->psw.addr);
show_regs(regs);
disabled_wait();
}
static noinline __init void setup_lowcore_early(void)
{
struct lowcore *lc = get_lowcore();
psw_t psw;
psw.addr = (unsigned long)early_pgm_check_handler;
psw.mask = PSW_KERNEL_BITS;
lc->program_new_psw = psw;
lc->preempt_count = INIT_PREEMPT_COUNT;
Annotation
- Immediate include surface: `linux/sched/debug.h`, `linux/cpufeature.h`, `linux/compiler.h`, `linux/init.h`, `linux/errno.h`, `linux/string.h`, `linux/ctype.h`, `linux/lockdep.h`.
- Detected declarations: `function kasan_early_init`, `function init_kernel_storage_key`, `function strim_all`, `function setup_arch_string`, `function setup_topology`, `function __do_early_pgm_check`, `function setup_lowcore_early`, `function save_vector_registers`, `function setup_low_address_protection`, `function setup_access_registers`.
- Atlas domain: Architecture Layer / arch/s390.
- Implementation status: source implementation candidate.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.