Lines Matching +full:cpu +full:- +full:nr

1 // SPDX-License-Identifier: GPL-2.0
7 * - privileged instructions
8 * - interrupt flags
9 * - segment operations
10 * - booting and setup
15 #include <linux/cpu.h>
29 #include <linux/page-flags.h>
45 #include <xen/interface/xen-mca.h>
48 #include <xen/hvc-console.h>
61 #include <asm/msr-index.h>
73 #include <asm/cpu.h>
86 #include "xen-ops.h"
92 #include "../kernel/cpu/cpu.h" /* get_cpu_cap() */
96 static int xen_cpu_up_prepare_pv(unsigned int cpu);
97 static int xen_cpu_dead_pv(unsigned int cpu);
121 xen_feature(XENFEAT_mmu_pt_update_preserve_ad) ? " (preserve-AD)" : ""); in xen_banner()
128 set_fixmap(FIX_PARAVIRT_BOOTMAP, xen_start_info->shared_info); in xen_pv_init_platform()
131 /* xen clock uses per-cpu vcpu_info, need to init it for boot cpu */ in xen_pv_init_platform()
141 /* Setup shared vcpu info for non-smp configurations */ in xen_pv_guest_late_init()
205 .u.set_pminfo.id = -1, in xen_check_mwait()
338 * address is a vmalloc mapping (or other non-linear mapping), then
365 * top-level page table entry populated. in set_aliased_prot()
429 op->cmd = MMUEXT_SET_LDT; in xen_set_ldt()
430 op->arg1.linear_addr = (unsigned long)addr; in xen_set_ldt()
431 op->arg2.nr_ents = entries; in xen_set_ldt()
440 unsigned long va = dtr->address; in xen_load_gdt()
441 unsigned int size = dtr->size + 1; in xen_load_gdt()
452 * The GDT is per-cpu and is in the percpu data area. in xen_load_gdt()
454 * page-walk to get the underlying MFN for the in xen_load_gdt()
477 unsigned long va = dtr->address; in xen_load_gdt_boot()
478 unsigned int size = dtr->size + 1; in xen_load_gdt_boot()
505 unsigned int cpu, unsigned int i) in load_TLS_descriptor() argument
507 struct desc_struct *shadow = &per_cpu(shadow_tls_desc, cpu).desc[i]; in load_TLS_descriptor()
512 if (desc_equal(shadow, &t->tls_array[i])) in load_TLS_descriptor()
515 *shadow = t->tls_array[i]; in load_TLS_descriptor()
517 gdt = get_cpu_gdt_rw(cpu); in load_TLS_descriptor()
521 MULTI_update_descriptor(mc.mc, maddr.maddr, t->tls_array[i]); in load_TLS_descriptor()
524 static void xen_load_tls(struct thread_struct *t, unsigned int cpu) in xen_load_tls() argument
536 load_TLS_descriptor(t, cpu, 0); in xen_load_tls()
537 load_TLS_descriptor(t, cpu, 1); in xen_load_tls()
538 load_TLS_descriptor(t, cpu, 2); in xen_load_tls()
632 unsigned int nr; in get_trap_addr() local
640 * them. Warn if there's an unexpected IST-using fault handler. in get_trap_addr()
642 for (nr = 0; nr < ARRAY_SIZE(trap_array); nr++) { in get_trap_addr()
643 struct trap_array_entry *entry = trap_array + nr; in get_trap_addr()
645 if (*addr == entry->orig) { in get_trap_addr()
646 *addr = entry->xen; in get_trap_addr()
647 ist_okay = entry->ist_okay; in get_trap_addr()
652 if (nr == ARRAY_SIZE(trap_array) && in get_trap_addr()
655 nr = (*addr - (void *)early_idt_handler_array[0]) / in get_trap_addr()
657 *addr = (void *)xen_early_idt_handler_array[nr]; in get_trap_addr()
671 if (val->bits.type != GATE_TRAP && val->bits.type != GATE_INTERRUPT) in cvt_gate_to_trap()
674 info->vector = vector; in cvt_gate_to_trap()
677 if (!get_trap_addr((void **)&addr, val->bits.ist)) in cvt_gate_to_trap()
679 info->address = addr; in cvt_gate_to_trap()
681 info->cs = gate_segment(val); in cvt_gate_to_trap()
682 info->flags = val->bits.dpl; in cvt_gate_to_trap()
684 if (val->bits.type == GATE_INTERRUPT) in cvt_gate_to_trap()
685 info->flags |= 1 << 2; in cvt_gate_to_trap()
690 /* Locations of each CPU's IDT */
729 count = (desc->size+1) / sizeof(gate_desc); in xen_convert_trap_info()
733 gate_desc *entry = (gate_desc *)(desc->address) + in; in xen_convert_trap_info()
748 /* Load a new IDT into Xen. In principle this can be per-CPU, so we
800 * Version of write_gdt_entry for use at early boot-time needed to
853 iobitmap.bitmap = (uint8_t *)(&tss->x86_tss) + in xen_update_io_bitmap()
854 tss->x86_tss.io_bitmap_base; in xen_update_io_bitmap()
855 if (tss->x86_tss.io_bitmap_base == IO_BITMAP_OFFSET_INVALID) in xen_update_io_bitmap()
936 ret = -EIO; in xen_write_msr_safe()
982 int cpu; in xen_setup_vcpu_info_placement() local
984 for_each_possible_cpu(cpu) { in xen_setup_vcpu_info_placement()
986 per_cpu(xen_vcpu_id, cpu) = cpu; in xen_setup_vcpu_info_placement()
989 * xen_vcpu_setup(cpu) can fail -- in which case it in xen_setup_vcpu_info_placement()
991 * where xen_vcpu_nr(cpu) < MAX_VIRT_CPUS. in xen_setup_vcpu_info_placement()
996 (void) xen_vcpu_setup(cpu); in xen_setup_vcpu_info_placement()
1112 &HYPERVISOR_shared_info->arch.nmi_reason)) in xen_get_nmi_reason()
1115 &HYPERVISOR_shared_info->arch.nmi_reason)) in xen_get_nmi_reason()
1127 unsigned nr; in xen_boot_params_init_edd() local
1136 for (nr = 0; nr < EDDMAXNR; nr++) { in xen_boot_params_init_edd()
1137 struct edd_info *info = edd_info + nr; in xen_boot_params_init_edd()
1139 op.u.firmware_info.index = nr; in xen_boot_params_init_edd()
1140 info->params.length = sizeof(info->params); in xen_boot_params_init_edd()
1142 &info->params); in xen_boot_params_init_edd()
1147 #define C(x) info->x = op.u.firmware_info.u.disk_info.x in xen_boot_params_init_edd()
1156 boot_params.eddbuf_entries = nr; in xen_boot_params_init_edd()
1159 for (nr = 0; nr < EDD_MBR_SIG_MAX; nr++) { in xen_boot_params_init_edd()
1160 op.u.firmware_info.index = nr; in xen_boot_params_init_edd()
1164 mbr_signature[nr] = op.u.firmware_info.u.disk_mbr_signature.mbr_signature; in xen_boot_params_init_edd()
1166 boot_params.edd_mbr_sig_buf_entries = nr; in xen_boot_params_init_edd()
1171 * Set up the GDT and segment registers for -fstack-protector. Until
1172 * we do this, we have to be careful not to call any stack-protected
1175 static void __init xen_setup_gdt(int cpu) in xen_setup_gdt() argument
1177 pv_ops.cpu.write_gdt_entry = xen_write_gdt_entry_boot; in xen_setup_gdt()
1178 pv_ops.cpu.load_gdt = xen_load_gdt_boot; in xen_setup_gdt()
1180 setup_stack_canary_segment(cpu); in xen_setup_gdt()
1181 switch_to_new_gdt(cpu); in xen_setup_gdt()
1183 pv_ops.cpu.write_gdt_entry = xen_write_gdt_entry; in xen_setup_gdt()
1184 pv_ops.cpu.load_gdt = xen_load_gdt; in xen_setup_gdt()
1203 xen_start_flags = xen_start_info->flags; in xen_start_kernel()
1210 pv_ops.cpu = xen_cpu_ops; in xen_start_kernel()
1218 * the cpu_possible_mask and a non-dummy shared_info. in xen_start_kernel()
1254 * -fstack-protector code can be executed. in xen_start_kernel()
1311 xen_setup_kernel_pagetable((pgd_t *)xen_start_info->pt_base, in xen_start_kernel()
1312 xen_start_info->nr_pages); in xen_start_kernel()
1317 * on AMD were early_cpu_init (run before ->arch_setup()) calls in xen_start_kernel()
1326 if (xen_start_info->mod_start) { in xen_start_kernel()
1327 if (xen_start_info->flags & SIF_MOD_START_PFN) in xen_start_kernel()
1328 initrd_start = PFN_PHYS(xen_start_info->mod_start); in xen_start_kernel()
1330 initrd_start = __pa(xen_start_info->mod_start); in xen_start_kernel()
1336 boot_params.hdr.ramdisk_size = xen_start_info->mod_len; in xen_start_kernel()
1337 boot_params.hdr.cmd_line_ptr = __pa(xen_start_info->cmd_line); in xen_start_kernel()
1347 xen_start_info->console.dom0.info_off); in xen_start_kernel()
1356 xen_init_vga(info, xen_start_info->console.dom0.info_size); in xen_start_kernel()
1357 xen_start_info->console.domU.mfn = 0; in xen_start_kernel()
1358 xen_start_info->console.domU.evtchn = 0; in xen_start_kernel()
1406 static int xen_cpu_up_prepare_pv(unsigned int cpu) in xen_cpu_up_prepare_pv() argument
1410 if (per_cpu(xen_vcpu, cpu) == NULL) in xen_cpu_up_prepare_pv()
1411 return -ENODEV; in xen_cpu_up_prepare_pv()
1413 xen_setup_timer(cpu); in xen_cpu_up_prepare_pv()
1415 rc = xen_smp_intr_init(cpu); in xen_cpu_up_prepare_pv()
1417 WARN(1, "xen_smp_intr_init() for CPU %d failed: %d\n", in xen_cpu_up_prepare_pv()
1418 cpu, rc); in xen_cpu_up_prepare_pv()
1422 rc = xen_smp_intr_init_pv(cpu); in xen_cpu_up_prepare_pv()
1424 WARN(1, "xen_smp_intr_init_pv() for CPU %d failed: %d\n", in xen_cpu_up_prepare_pv()
1425 cpu, rc); in xen_cpu_up_prepare_pv()
1432 static int xen_cpu_dead_pv(unsigned int cpu) in xen_cpu_dead_pv() argument
1434 xen_smp_intr_free(cpu); in xen_cpu_dead_pv()
1435 xen_smp_intr_free_pv(cpu); in xen_cpu_dead_pv()
1437 xen_teardown_timer(cpu); in xen_cpu_dead_pv()