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>
30 #include <linux/page-flags.h>
46 #include <xen/interface/xen-mca.h>
49 #include <xen/hvc-console.h>
63 #include <asm/msr-index.h>
76 #include <asm/cpu.h>
90 #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);
115 * returning from schedule as the task might move to a different CPU.
166 return -EINVAL; in parse_xen_msr_safe()
183 /* Get physical address width (only 64-bit cpus supported). */ in xen_set_mtrr_data()
203 var[reg].base_hi = op.u.read_memtype.mfn >> (32 - PAGE_SHIFT); in xen_set_mtrr_data()
204 mask = ~((op.u.read_memtype.nr_mfns << PAGE_SHIFT) - 1); in xen_set_mtrr_data()
205 mask &= (1UL << width) - 1; in xen_set_mtrr_data()
226 set_fixmap(FIX_PARAVIRT_BOOTMAP, xen_start_info->shared_info); in xen_pv_init_platform()
229 /* xen clock uses per-cpu vcpu_info, need to init it for boot cpu */ in xen_pv_init_platform()
247 /* Setup shared vcpu info for non-smp configurations */ in xen_pv_guest_late_init()
267 /* Replace initial APIC ID in bits 24-31 of EBX. */ in xen_cpuid()
303 .u.set_pminfo.id = -1, in xen_check_mwait()
451 * address is a vmalloc mapping (or other non-linear mapping), then
478 * top-level page table entry populated. in set_aliased_prot()
542 op->cmd = MMUEXT_SET_LDT; in xen_set_ldt()
543 op->arg1.linear_addr = (unsigned long)addr; in xen_set_ldt()
544 op->arg2.nr_ents = entries; in xen_set_ldt()
553 unsigned long va = dtr->address; in xen_load_gdt()
554 unsigned int size = dtr->size + 1; in xen_load_gdt()
565 * The GDT is per-cpu and is in the percpu data area. in xen_load_gdt()
567 * page-walk to get the underlying MFN for the in xen_load_gdt()
590 unsigned long va = dtr->address; in xen_load_gdt_boot()
591 unsigned int size = dtr->size + 1; in xen_load_gdt_boot()
618 unsigned int cpu, unsigned int i) in load_TLS_descriptor() argument
620 struct desc_struct *shadow = &per_cpu(shadow_tls_desc, cpu).desc[i]; in load_TLS_descriptor()
625 if (desc_equal(shadow, &t->tls_array[i])) in load_TLS_descriptor()
628 *shadow = t->tls_array[i]; in load_TLS_descriptor()
630 gdt = get_cpu_gdt_rw(cpu); in load_TLS_descriptor()
634 MULTI_update_descriptor(mc.mc, maddr.maddr, t->tls_array[i]); in load_TLS_descriptor()
637 static void xen_load_tls(struct thread_struct *t, unsigned int cpu) in xen_load_tls() argument
649 load_TLS_descriptor(t, cpu, 0); in xen_load_tls()
650 load_TLS_descriptor(t, cpu, 1); in xen_load_tls()
651 load_TLS_descriptor(t, cpu, 2); in xen_load_tls()
807 unsigned int nr; in get_trap_addr() local
816 * them. Warn if there's an unexpected IST-using fault handler. in get_trap_addr()
818 for (nr = 0; nr < ARRAY_SIZE(trap_array); nr++) { in get_trap_addr()
819 struct trap_array_entry *entry = trap_array + nr; in get_trap_addr()
821 if (*addr == entry->orig) { in get_trap_addr()
822 *addr = entry->xen; in get_trap_addr()
823 ist_okay = entry->ist_okay; in get_trap_addr()
829 if (nr == ARRAY_SIZE(trap_array) && in get_trap_addr()
832 nr = (*addr - (void *)early_idt_handler_array[0]) / in get_trap_addr()
834 *addr = (void *)xen_early_idt_handler_array[nr]; in get_trap_addr()
852 if (val->bits.type != GATE_TRAP && val->bits.type != GATE_INTERRUPT) in cvt_gate_to_trap()
855 info->vector = vector; in cvt_gate_to_trap()
858 if (!get_trap_addr((void **)&addr, val->bits.ist)) in cvt_gate_to_trap()
860 info->address = addr; in cvt_gate_to_trap()
862 info->cs = gate_segment(val); in cvt_gate_to_trap()
863 info->flags = val->bits.dpl; in cvt_gate_to_trap()
865 if (val->bits.type == GATE_INTERRUPT) in cvt_gate_to_trap()
866 info->flags |= 1 << 2; in cvt_gate_to_trap()
871 /* Locations of each CPU's IDT */
910 count = (desc->size+1) / sizeof(gate_desc); in xen_convert_trap_info()
914 gate_desc *entry = (gate_desc *)(desc->address) + in; in xen_convert_trap_info()
930 /* Load a new IDT into Xen. In principle this can be per-CPU, so we
985 * Version of write_gdt_entry for use at early boot-time needed to
1038 iobitmap.bitmap = (uint8_t *)(&tss->x86_tss) + in xen_update_io_bitmap()
1039 tss->x86_tss.io_bitmap_base; in xen_update_io_bitmap()
1040 if (tss->x86_tss.io_bitmap_base == IO_BITMAP_OFFSET_INVALID) in xen_update_io_bitmap()
1122 * Supplying an err pointer requires err to be pre-initialized with 0.
1196 int cpu; in xen_setup_vcpu_info_placement() local
1198 for_each_possible_cpu(cpu) { in xen_setup_vcpu_info_placement()
1200 per_cpu(xen_vcpu_id, cpu) = cpu; in xen_setup_vcpu_info_placement()
1201 xen_vcpu_setup(cpu); in xen_setup_vcpu_info_placement()
1216 .cpu = {
1299 &HYPERVISOR_shared_info->arch.nmi_reason)) in xen_get_nmi_reason()
1302 &HYPERVISOR_shared_info->arch.nmi_reason)) in xen_get_nmi_reason()
1314 unsigned nr; in xen_boot_params_init_edd() local
1323 for (nr = 0; nr < EDDMAXNR; nr++) { in xen_boot_params_init_edd()
1324 struct edd_info *info = edd_info + nr; in xen_boot_params_init_edd()
1326 op.u.firmware_info.index = nr; in xen_boot_params_init_edd()
1327 info->params.length = sizeof(info->params); in xen_boot_params_init_edd()
1329 &info->params); in xen_boot_params_init_edd()
1334 #define C(x) info->x = op.u.firmware_info.u.disk_info.x in xen_boot_params_init_edd()
1343 boot_params.eddbuf_entries = nr; in xen_boot_params_init_edd()
1346 for (nr = 0; nr < EDD_MBR_SIG_MAX; nr++) { in xen_boot_params_init_edd()
1347 op.u.firmware_info.index = nr; in xen_boot_params_init_edd()
1351 mbr_signature[nr] = op.u.firmware_info.u.disk_mbr_signature.mbr_signature; in xen_boot_params_init_edd()
1353 boot_params.edd_mbr_sig_buf_entries = nr; in xen_boot_params_init_edd()
1358 * Set up the GDT and segment registers for -fstack-protector. Until
1359 * we do this, we have to be careful not to call any stack-protected
1362 static void __init xen_setup_gdt(int cpu) in xen_setup_gdt() argument
1364 pv_ops.cpu.write_gdt_entry = xen_write_gdt_entry_boot; in xen_setup_gdt()
1365 pv_ops.cpu.load_gdt = xen_load_gdt_boot; in xen_setup_gdt()
1367 switch_gdt_and_percpu_base(cpu); in xen_setup_gdt()
1369 pv_ops.cpu.write_gdt_entry = xen_write_gdt_entry; in xen_setup_gdt()
1370 pv_ops.cpu.load_gdt = xen_load_gdt; in xen_setup_gdt()
1405 xen_start_flags = xen_start_info->flags; in xen_start_kernel()
1414 pv_ops.cpu = xen_cpu_ops.cpu; in xen_start_kernel()
1422 * the cpu_possible_mask and a non-dummy shared_info. in xen_start_kernel()
1458 * -fstack-protector code can be executed. in xen_start_kernel()
1501 xen_setup_kernel_pagetable((pgd_t *)xen_start_info->pt_base, in xen_start_kernel()
1502 xen_start_info->nr_pages); in xen_start_kernel()
1507 * on AMD were early_cpu_init (run before ->arch_setup()) calls in xen_start_kernel()
1516 if (xen_start_info->mod_start) { in xen_start_kernel()
1517 if (xen_start_info->flags & SIF_MOD_START_PFN) in xen_start_kernel()
1518 initrd_start = PFN_PHYS(xen_start_info->mod_start); in xen_start_kernel()
1520 initrd_start = __pa(xen_start_info->mod_start); in xen_start_kernel()
1526 boot_params.hdr.ramdisk_size = xen_start_info->mod_len; in xen_start_kernel()
1527 boot_params.hdr.cmd_line_ptr = __pa(xen_start_info->cmd_line); in xen_start_kernel()
1538 xen_start_info->console.dom0.info_off); in xen_start_kernel()
1547 xen_init_vga(info, xen_start_info->console.dom0.info_size, in xen_start_kernel()
1549 xen_start_info->console.domU.mfn = 0; in xen_start_kernel()
1550 xen_start_info->console.domU.evtchn = 0; in xen_start_kernel()
1590 static int xen_cpu_up_prepare_pv(unsigned int cpu) in xen_cpu_up_prepare_pv() argument
1594 if (per_cpu(xen_vcpu, cpu) == NULL) in xen_cpu_up_prepare_pv()
1595 return -ENODEV; in xen_cpu_up_prepare_pv()
1597 xen_setup_timer(cpu); in xen_cpu_up_prepare_pv()
1599 rc = xen_smp_intr_init(cpu); in xen_cpu_up_prepare_pv()
1601 WARN(1, "xen_smp_intr_init() for CPU %d failed: %d\n", in xen_cpu_up_prepare_pv()
1602 cpu, rc); in xen_cpu_up_prepare_pv()
1606 rc = xen_smp_intr_init_pv(cpu); in xen_cpu_up_prepare_pv()
1608 WARN(1, "xen_smp_intr_init_pv() for CPU %d failed: %d\n", in xen_cpu_up_prepare_pv()
1609 cpu, rc); in xen_cpu_up_prepare_pv()
1616 static int xen_cpu_dead_pv(unsigned int cpu) in xen_cpu_dead_pv() argument
1618 xen_smp_intr_free(cpu); in xen_cpu_dead_pv()
1619 xen_smp_intr_free_pv(cpu); in xen_cpu_dead_pv()
1621 xen_teardown_timer(cpu); in xen_cpu_dead_pv()