linux/arch/arm/xen/enlighten.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2#include <xen/xen.h>
   3#include <xen/events.h>
   4#include <xen/grant_table.h>
   5#include <xen/hvm.h>
   6#include <xen/interface/vcpu.h>
   7#include <xen/interface/xen.h>
   8#include <xen/interface/memory.h>
   9#include <xen/interface/hvm/params.h>
  10#include <xen/features.h>
  11#include <xen/platform_pci.h>
  12#include <xen/xenbus.h>
  13#include <xen/page.h>
  14#include <xen/interface/sched.h>
  15#include <xen/xen-ops.h>
  16#include <asm/xen/hypervisor.h>
  17#include <asm/xen/hypercall.h>
  18#include <asm/system_misc.h>
  19#include <asm/efi.h>
  20#include <linux/interrupt.h>
  21#include <linux/irqreturn.h>
  22#include <linux/module.h>
  23#include <linux/of.h>
  24#include <linux/of_fdt.h>
  25#include <linux/of_irq.h>
  26#include <linux/of_address.h>
  27#include <linux/cpuidle.h>
  28#include <linux/cpufreq.h>
  29#include <linux/cpu.h>
  30#include <linux/console.h>
  31#include <linux/pvclock_gtod.h>
  32#include <linux/reboot.h>
  33#include <linux/time64.h>
  34#include <linux/timekeeping.h>
  35#include <linux/timekeeper_internal.h>
  36#include <linux/acpi.h>
  37
  38#include <linux/mm.h>
  39
  40static struct start_info _xen_start_info;
  41struct start_info *xen_start_info = &_xen_start_info;
  42EXPORT_SYMBOL(xen_start_info);
  43
  44enum xen_domain_type xen_domain_type = XEN_NATIVE;
  45EXPORT_SYMBOL(xen_domain_type);
  46
  47struct shared_info xen_dummy_shared_info;
  48struct shared_info *HYPERVISOR_shared_info = (void *)&xen_dummy_shared_info;
  49
  50DEFINE_PER_CPU(struct vcpu_info *, xen_vcpu);
  51static struct vcpu_info __percpu *xen_vcpu_info;
  52
  53/* Linux <-> Xen vCPU id mapping */
  54DEFINE_PER_CPU(uint32_t, xen_vcpu_id);
  55EXPORT_PER_CPU_SYMBOL(xen_vcpu_id);
  56
  57/* These are unused until we support booting "pre-ballooned" */
  58unsigned long xen_released_pages;
  59struct xen_memory_region xen_extra_mem[XEN_EXTRA_MEM_MAX_REGIONS] __initdata;
  60
  61static __read_mostly unsigned int xen_events_irq;
  62static __read_mostly phys_addr_t xen_grant_frames;
  63
  64#define GRANT_TABLE_INDEX   0
  65#define EXT_REGION_INDEX    1
  66
  67uint32_t xen_start_flags;
  68EXPORT_SYMBOL(xen_start_flags);
  69
  70int xen_unmap_domain_gfn_range(struct vm_area_struct *vma,
  71                               int nr, struct page **pages)
  72{
  73        return xen_xlate_unmap_gfn_range(vma, nr, pages);
  74}
  75EXPORT_SYMBOL_GPL(xen_unmap_domain_gfn_range);
  76
  77static void xen_read_wallclock(struct timespec64 *ts)
  78{
  79        u32 version;
  80        struct timespec64 now, ts_monotonic;
  81        struct shared_info *s = HYPERVISOR_shared_info;
  82        struct pvclock_wall_clock *wall_clock = &(s->wc);
  83
  84        /* get wallclock at system boot */
  85        do {
  86                version = wall_clock->version;
  87                rmb();          /* fetch version before time */
  88                now.tv_sec  = ((uint64_t)wall_clock->sec_hi << 32) | wall_clock->sec;
  89                now.tv_nsec = wall_clock->nsec;
  90                rmb();          /* fetch time before checking version */
  91        } while ((wall_clock->version & 1) || (version != wall_clock->version));
  92
  93        /* time since system boot */
  94        ktime_get_ts64(&ts_monotonic);
  95        *ts = timespec64_add(now, ts_monotonic);
  96}
  97
  98static int xen_pvclock_gtod_notify(struct notifier_block *nb,
  99                                   unsigned long was_set, void *priv)
 100{
 101        /* Protected by the calling core code serialization */
 102        static struct timespec64 next_sync;
 103
 104        struct xen_platform_op op;
 105        struct timespec64 now, system_time;
 106        struct timekeeper *tk = priv;
 107
 108        now.tv_sec = tk->xtime_sec;
 109        now.tv_nsec = (long)(tk->tkr_mono.xtime_nsec >> tk->tkr_mono.shift);
 110        system_time = timespec64_add(now, tk->wall_to_monotonic);
 111
 112        /*
 113         * We only take the expensive HV call when the clock was set
 114         * or when the 11 minutes RTC synchronization time elapsed.
 115         */
 116        if (!was_set && timespec64_compare(&now, &next_sync) < 0)
 117                return NOTIFY_OK;
 118
 119        op.cmd = XENPF_settime64;
 120        op.u.settime64.mbz = 0;
 121        op.u.settime64.secs = now.tv_sec;
 122        op.u.settime64.nsecs = now.tv_nsec;
 123        op.u.settime64.system_time = timespec64_to_ns(&system_time);
 124        (void)HYPERVISOR_platform_op(&op);
 125
 126        /*
 127         * Move the next drift compensation time 11 minutes
 128         * ahead. That's emulating the sync_cmos_clock() update for
 129         * the hardware RTC.
 130         */
 131        next_sync = now;
 132        next_sync.tv_sec += 11 * 60;
 133
 134        return NOTIFY_OK;
 135}
 136
 137static struct notifier_block xen_pvclock_gtod_notifier = {
 138        .notifier_call = xen_pvclock_gtod_notify,
 139};
 140
 141static int xen_starting_cpu(unsigned int cpu)
 142{
 143        struct vcpu_register_vcpu_info info;
 144        struct vcpu_info *vcpup;
 145        int err;
 146
 147        /* 
 148         * VCPUOP_register_vcpu_info cannot be called twice for the same
 149         * vcpu, so if vcpu_info is already registered, just get out. This
 150         * can happen with cpu-hotplug.
 151         */
 152        if (per_cpu(xen_vcpu, cpu) != NULL)
 153                goto after_register_vcpu_info;
 154
 155        pr_info("Xen: initializing cpu%d\n", cpu);
 156        vcpup = per_cpu_ptr(xen_vcpu_info, cpu);
 157
 158        info.mfn = percpu_to_gfn(vcpup);
 159        info.offset = xen_offset_in_page(vcpup);
 160
 161        err = HYPERVISOR_vcpu_op(VCPUOP_register_vcpu_info, xen_vcpu_nr(cpu),
 162                                 &info);
 163        BUG_ON(err);
 164        per_cpu(xen_vcpu, cpu) = vcpup;
 165
 166        if (!xen_kernel_unmapped_at_usr())
 167                xen_setup_runstate_info(cpu);
 168
 169after_register_vcpu_info:
 170        enable_percpu_irq(xen_events_irq, 0);
 171        return 0;
 172}
 173
 174static int xen_dying_cpu(unsigned int cpu)
 175{
 176        disable_percpu_irq(xen_events_irq);
 177        return 0;
 178}
 179
 180void xen_reboot(int reason)
 181{
 182        struct sched_shutdown r = { .reason = reason };
 183        int rc;
 184
 185        rc = HYPERVISOR_sched_op(SCHEDOP_shutdown, &r);
 186        BUG_ON(rc);
 187}
 188
 189static int xen_restart(struct notifier_block *nb, unsigned long action,
 190                       void *data)
 191{
 192        xen_reboot(SHUTDOWN_reboot);
 193
 194        return NOTIFY_DONE;
 195}
 196
 197static struct notifier_block xen_restart_nb = {
 198        .notifier_call = xen_restart,
 199        .priority = 192,
 200};
 201
 202static void xen_power_off(void)
 203{
 204        xen_reboot(SHUTDOWN_poweroff);
 205}
 206
 207static irqreturn_t xen_arm_callback(int irq, void *arg)
 208{
 209        xen_hvm_evtchn_do_upcall();
 210        return IRQ_HANDLED;
 211}
 212
 213static __initdata struct {
 214        const char *compat;
 215        const char *prefix;
 216        const char *version;
 217        bool found;
 218} hyper_node = {"xen,xen", "xen,xen-", NULL, false};
 219
 220static int __init fdt_find_hyper_node(unsigned long node, const char *uname,
 221                                      int depth, void *data)
 222{
 223        const void *s = NULL;
 224        int len;
 225
 226        if (depth != 1 || strcmp(uname, "hypervisor") != 0)
 227                return 0;
 228
 229        if (of_flat_dt_is_compatible(node, hyper_node.compat))
 230                hyper_node.found = true;
 231
 232        s = of_get_flat_dt_prop(node, "compatible", &len);
 233        if (strlen(hyper_node.prefix) + 3  < len &&
 234            !strncmp(hyper_node.prefix, s, strlen(hyper_node.prefix)))
 235                hyper_node.version = s + strlen(hyper_node.prefix);
 236
 237        /*
 238         * Check if Xen supports EFI by checking whether there is the
 239         * "/hypervisor/uefi" node in DT. If so, runtime services are available
 240         * through proxy functions (e.g. in case of Xen dom0 EFI implementation
 241         * they call special hypercall which executes relevant EFI functions)
 242         * and that is why they are always enabled.
 243         */
 244        if (IS_ENABLED(CONFIG_XEN_EFI)) {
 245                if ((of_get_flat_dt_subnode_by_name(node, "uefi") > 0) &&
 246                    !efi_runtime_disabled())
 247                        set_bit(EFI_RUNTIME_SERVICES, &efi.flags);
 248        }
 249
 250        return 0;
 251}
 252
 253/*
 254 * see Documentation/devicetree/bindings/arm/xen.txt for the
 255 * documentation of the Xen Device Tree format.
 256 */
 257void __init xen_early_init(void)
 258{
 259        of_scan_flat_dt(fdt_find_hyper_node, NULL);
 260        if (!hyper_node.found) {
 261                pr_debug("No Xen support\n");
 262                return;
 263        }
 264
 265        if (hyper_node.version == NULL) {
 266                pr_debug("Xen version not found\n");
 267                return;
 268        }
 269
 270        pr_info("Xen %s support found\n", hyper_node.version);
 271
 272        xen_domain_type = XEN_HVM_DOMAIN;
 273
 274        xen_setup_features();
 275
 276        if (xen_feature(XENFEAT_dom0))
 277                xen_start_flags |= SIF_INITDOMAIN|SIF_PRIVILEGED;
 278
 279        if (!console_set_on_cmdline && !xen_initial_domain())
 280                add_preferred_console("hvc", 0, NULL);
 281}
 282
 283static void __init xen_acpi_guest_init(void)
 284{
 285#ifdef CONFIG_ACPI
 286        struct xen_hvm_param a;
 287        int interrupt, trigger, polarity;
 288
 289        a.domid = DOMID_SELF;
 290        a.index = HVM_PARAM_CALLBACK_IRQ;
 291
 292        if (HYPERVISOR_hvm_op(HVMOP_get_param, &a)
 293            || (a.value >> 56) != HVM_PARAM_CALLBACK_TYPE_PPI) {
 294                xen_events_irq = 0;
 295                return;
 296        }
 297
 298        interrupt = a.value & 0xff;
 299        trigger = ((a.value >> 8) & 0x1) ? ACPI_EDGE_SENSITIVE
 300                                         : ACPI_LEVEL_SENSITIVE;
 301        polarity = ((a.value >> 8) & 0x2) ? ACPI_ACTIVE_LOW
 302                                          : ACPI_ACTIVE_HIGH;
 303        xen_events_irq = acpi_register_gsi(NULL, interrupt, trigger, polarity);
 304#endif
 305}
 306
 307#ifdef CONFIG_XEN_UNPOPULATED_ALLOC
 308/*
 309 * A type-less specific Xen resource which contains extended regions
 310 * (unused regions of guest physical address space provided by the hypervisor).
 311 */
 312static struct resource xen_resource = {
 313        .name = "Xen unused space",
 314};
 315
 316int __init arch_xen_unpopulated_init(struct resource **res)
 317{
 318        struct device_node *np;
 319        struct resource *regs, *tmp_res;
 320        uint64_t min_gpaddr = -1, max_gpaddr = 0;
 321        unsigned int i, nr_reg = 0;
 322        int rc;
 323
 324        if (!xen_domain())
 325                return -ENODEV;
 326
 327        if (!acpi_disabled)
 328                return -ENODEV;
 329
 330        np = of_find_compatible_node(NULL, NULL, "xen,xen");
 331        if (WARN_ON(!np))
 332                return -ENODEV;
 333
 334        /* Skip region 0 which is reserved for grant table space */
 335        while (of_get_address(np, nr_reg + EXT_REGION_INDEX, NULL, NULL))
 336                nr_reg++;
 337
 338        if (!nr_reg) {
 339                pr_err("No extended regions are found\n");
 340                of_node_put(np);
 341                return -EINVAL;
 342        }
 343
 344        regs = kcalloc(nr_reg, sizeof(*regs), GFP_KERNEL);
 345        if (!regs) {
 346                of_node_put(np);
 347                return -ENOMEM;
 348        }
 349
 350        /*
 351         * Create resource from extended regions provided by the hypervisor to be
 352         * used as unused address space for Xen scratch pages.
 353         */
 354        for (i = 0; i < nr_reg; i++) {
 355                rc = of_address_to_resource(np, i + EXT_REGION_INDEX, &regs[i]);
 356                if (rc)
 357                        goto err;
 358
 359                if (max_gpaddr < regs[i].end)
 360                        max_gpaddr = regs[i].end;
 361                if (min_gpaddr > regs[i].start)
 362                        min_gpaddr = regs[i].start;
 363        }
 364
 365        xen_resource.start = min_gpaddr;
 366        xen_resource.end = max_gpaddr;
 367
 368        /*
 369         * Mark holes between extended regions as unavailable. The rest of that
 370         * address space will be available for the allocation.
 371         */
 372        for (i = 1; i < nr_reg; i++) {
 373                resource_size_t start, end;
 374
 375                /* There is an overlap between regions */
 376                if (regs[i - 1].end + 1 > regs[i].start) {
 377                        rc = -EINVAL;
 378                        goto err;
 379                }
 380
 381                /* There is no hole between regions */
 382                if (regs[i - 1].end + 1 == regs[i].start)
 383                        continue;
 384
 385                start = regs[i - 1].end + 1;
 386                end = regs[i].start - 1;
 387
 388                tmp_res = kzalloc(sizeof(*tmp_res), GFP_KERNEL);
 389                if (!tmp_res) {
 390                        rc = -ENOMEM;
 391                        goto err;
 392                }
 393
 394                tmp_res->name = "Unavailable space";
 395                tmp_res->start = start;
 396                tmp_res->end = end;
 397
 398                rc = insert_resource(&xen_resource, tmp_res);
 399                if (rc) {
 400                        pr_err("Cannot insert resource %pR (%d)\n", tmp_res, rc);
 401                        kfree(tmp_res);
 402                        goto err;
 403                }
 404        }
 405
 406        *res = &xen_resource;
 407
 408err:
 409        of_node_put(np);
 410        kfree(regs);
 411        return rc;
 412}
 413#endif
 414
 415static void __init xen_dt_guest_init(void)
 416{
 417        struct device_node *xen_node;
 418        struct resource res;
 419
 420        xen_node = of_find_compatible_node(NULL, NULL, "xen,xen");
 421        if (!xen_node) {
 422                pr_err("Xen support was detected before, but it has disappeared\n");
 423                return;
 424        }
 425
 426        xen_events_irq = irq_of_parse_and_map(xen_node, 0);
 427
 428        if (of_address_to_resource(xen_node, GRANT_TABLE_INDEX, &res)) {
 429                pr_err("Xen grant table region is not found\n");
 430                of_node_put(xen_node);
 431                return;
 432        }
 433        of_node_put(xen_node);
 434        xen_grant_frames = res.start;
 435}
 436
 437static int __init xen_guest_init(void)
 438{
 439        struct xen_add_to_physmap xatp;
 440        struct shared_info *shared_info_page = NULL;
 441        int rc, cpu;
 442
 443        if (!xen_domain())
 444                return 0;
 445
 446        if (!acpi_disabled)
 447                xen_acpi_guest_init();
 448        else
 449                xen_dt_guest_init();
 450
 451        if (!xen_events_irq) {
 452                pr_err("Xen event channel interrupt not found\n");
 453                return -ENODEV;
 454        }
 455
 456        /*
 457         * The fdt parsing codes have set EFI_RUNTIME_SERVICES if Xen EFI
 458         * parameters are found. Force enable runtime services.
 459         */
 460        if (efi_enabled(EFI_RUNTIME_SERVICES))
 461                xen_efi_runtime_setup();
 462
 463        shared_info_page = (struct shared_info *)get_zeroed_page(GFP_KERNEL);
 464
 465        if (!shared_info_page) {
 466                pr_err("not enough memory\n");
 467                return -ENOMEM;
 468        }
 469        xatp.domid = DOMID_SELF;
 470        xatp.idx = 0;
 471        xatp.space = XENMAPSPACE_shared_info;
 472        xatp.gpfn = virt_to_gfn(shared_info_page);
 473        if (HYPERVISOR_memory_op(XENMEM_add_to_physmap, &xatp))
 474                BUG();
 475
 476        HYPERVISOR_shared_info = (struct shared_info *)shared_info_page;
 477
 478        /* xen_vcpu is a pointer to the vcpu_info struct in the shared_info
 479         * page, we use it in the event channel upcall and in some pvclock
 480         * related functions. 
 481         * The shared info contains exactly 1 CPU (the boot CPU). The guest
 482         * is required to use VCPUOP_register_vcpu_info to place vcpu info
 483         * for secondary CPUs as they are brought up.
 484         * For uniformity we use VCPUOP_register_vcpu_info even on cpu0.
 485         */
 486        xen_vcpu_info = alloc_percpu(struct vcpu_info);
 487        if (xen_vcpu_info == NULL)
 488                return -ENOMEM;
 489
 490        /* Direct vCPU id mapping for ARM guests. */
 491        for_each_possible_cpu(cpu)
 492                per_cpu(xen_vcpu_id, cpu) = cpu;
 493
 494        if (!xen_grant_frames) {
 495                xen_auto_xlat_grant_frames.count = gnttab_max_grant_frames();
 496                rc = xen_xlate_map_ballooned_pages(&xen_auto_xlat_grant_frames.pfn,
 497                                                                                   &xen_auto_xlat_grant_frames.vaddr,
 498                                                                                   xen_auto_xlat_grant_frames.count);
 499        } else
 500                rc = gnttab_setup_auto_xlat_frames(xen_grant_frames);
 501        if (rc) {
 502                free_percpu(xen_vcpu_info);
 503                return rc;
 504        }
 505        gnttab_init();
 506
 507        /*
 508         * Making sure board specific code will not set up ops for
 509         * cpu idle and cpu freq.
 510         */
 511        disable_cpuidle();
 512        disable_cpufreq();
 513
 514        xen_init_IRQ();
 515
 516        if (request_percpu_irq(xen_events_irq, xen_arm_callback,
 517                               "events", &xen_vcpu)) {
 518                pr_err("Error request IRQ %d\n", xen_events_irq);
 519                return -EINVAL;
 520        }
 521
 522        if (!xen_kernel_unmapped_at_usr())
 523                xen_time_setup_guest();
 524
 525        if (xen_initial_domain())
 526                pvclock_gtod_register_notifier(&xen_pvclock_gtod_notifier);
 527
 528        return cpuhp_setup_state(CPUHP_AP_ARM_XEN_STARTING,
 529                                 "arm/xen:starting", xen_starting_cpu,
 530                                 xen_dying_cpu);
 531}
 532early_initcall(xen_guest_init);
 533
 534static int __init xen_pm_init(void)
 535{
 536        if (!xen_domain())
 537                return -ENODEV;
 538
 539        pm_power_off = xen_power_off;
 540        register_restart_handler(&xen_restart_nb);
 541        if (!xen_initial_domain()) {
 542                struct timespec64 ts;
 543                xen_read_wallclock(&ts);
 544                do_settimeofday64(&ts);
 545        }
 546
 547        return 0;
 548}
 549late_initcall(xen_pm_init);
 550
 551
 552/* empty stubs */
 553void xen_arch_pre_suspend(void) { }
 554void xen_arch_post_suspend(int suspend_cancelled) { }
 555void xen_timer_resume(void) { }
 556void xen_arch_resume(void) { }
 557void xen_arch_suspend(void) { }
 558
 559
 560/* In the hypercall.S file. */
 561EXPORT_SYMBOL_GPL(HYPERVISOR_event_channel_op);
 562EXPORT_SYMBOL_GPL(HYPERVISOR_grant_table_op);
 563EXPORT_SYMBOL_GPL(HYPERVISOR_xen_version);
 564EXPORT_SYMBOL_GPL(HYPERVISOR_console_io);
 565EXPORT_SYMBOL_GPL(HYPERVISOR_sched_op);
 566EXPORT_SYMBOL_GPL(HYPERVISOR_hvm_op);
 567EXPORT_SYMBOL_GPL(HYPERVISOR_memory_op);
 568EXPORT_SYMBOL_GPL(HYPERVISOR_physdev_op);
 569EXPORT_SYMBOL_GPL(HYPERVISOR_vcpu_op);
 570EXPORT_SYMBOL_GPL(HYPERVISOR_platform_op_raw);
 571EXPORT_SYMBOL_GPL(HYPERVISOR_multicall);
 572EXPORT_SYMBOL_GPL(HYPERVISOR_vm_assist);
 573EXPORT_SYMBOL_GPL(HYPERVISOR_dm_op);
 574EXPORT_SYMBOL_GPL(privcmd_call);
 575