aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/lantiq/xrx200
Commit message (Expand)AuthorAgeFilesLines
...
* lantiq: add 3.18 supportJohn Crispin2015-02-091-4/+21
* Add profile and userspace for P2812HNUF1/3, switch from UBI_GLUEBI to UBI_BLOCKJohn Crispin2015-01-172-7/+23
* vgv7519: fix profile, this board have a rt2800-pci boardJohn Crispin2014-10-301-2/+2
* lantiq - vgv7519: enable pci busJohn Crispin2014-10-061-1/+1
* lantiq: update to 3.14John Crispin2014-08-181-0/+70
* lantiq: generate unique ARV7519RW22 firmwareJohn Crispin2014-08-181-13/+3
* kernel: sort Kconfig options in kernel configsGabor Juhos2014-07-131-1/+1
* lantiq: Enable LANTIQ_PHY and LANTIQ_XRX200 only in XRX200 subtargetJohn Crispin2014-07-011-0/+2
* kernel: make sure the new UBIBLOCK symbol does not break buildsJohn Crispin2014-06-111-0/+1
* kernel: add a NAND_SUPPORT symbolJohn Crispin2014-06-111-1/+1
* lantiq: ARV7519RW22: several fixesJohn Crispin2014-04-161-6/+4
* lantiq: there is a V2 of VG3503J that needs a newer fe phy firmwareJohn Crispin2014-04-071-0/+8
* lantiq: fix vr9 ubi handlingJohn Crispin2014-04-033-2/+5
* lntiq: add support for Astoria ARV7519RW.John Crispin2014-03-301-0/+22
* lantiq: add support for ZyXEL P2812HNUFXJohn Crispin2014-03-301-0/+14
* lantiq: add ubifs to FEATURESJohn Crispin2014-03-301-1/+1
* lantiq: xrx200: add ubi support in the kernelJohn Crispin2014-03-301-0/+17
* lantiq: update kernel configurationLuka Perkov2014-01-151-1/+0
* lantiq: experia v8 fixesJohn Crispin2013-10-071-2/+2
* lantiq: fix fritz image generationJohn Crispin2013-10-071-1/+1
* lantiq: add support for VGV7519 KPN Experia box v8John Crispin2013-09-301-0/+22
* build: unify mips target cflagsFelix Fietkau2013-09-261-1/+2
* lantiq: style fixesLuka Perkov2013-09-191-1/+1
* lantiq: add v3.10 patchesJohn Crispin2013-09-171-0/+1
* lantiq: add a subtarget for the xrx200 SoC familyJohn Crispin2013-09-176-0/+103
*/ .highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */ .highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */ .highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */ .highlight .vc { color: #336699 } /* Name.Variable.Class */ .highlight .vg { color: #dd7700 } /* Name.Variable.Global */ .highlight .vi { color: #3333bb } /* Name.Variable.Instance */ .highlight .vm { color: #336699 } /* Name.Variable.Magic */ .highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
/******************************************************************************
 * machine_kexec.c
 *
 * Xen port written by:
 * - Simon 'Horms' Horman <horms@verge.net.au>
 * - Magnus Damm <magnus@valinux.co.jp>
 */

#include <xen/lib.h>
#include <asm/irq.h>
#include <asm/page.h>
#include <asm/flushtlb.h>
#include <xen/smp.h>
#include <xen/nmi.h>
#include <xen/types.h>
#include <xen/console.h>
#include <xen/kexec.h>
#include <xen/domain_page.h>
#include <asm/fixmap.h>
#include <asm/hvm/hvm.h>
#include <asm/hpet.h>

typedef void (*relocate_new_kernel_t)(
                unsigned long indirection_page,
                unsigned long *page_list,
                unsigned long start_address,
#ifdef __i386__
                unsigned int cpu_has_pae,
#endif
                unsigned int preserve_context);

extern int machine_kexec_get_xen(xen_kexec_range_t *range);


int machine_kexec_load(int type, int slot, xen_kexec_image_t *image)
{
    unsigned long prev_ma = 0;
    int fix_base = FIX_KEXEC_BASE_0 + (slot * (KEXEC_XEN_NO_PAGES >> 1));
    int k;

    /* setup fixmap to point to our pages and record the virtual address
     * in every odd index in page_list[].
     */

    for ( k = 0; k < KEXEC_XEN_NO_PAGES; k++ )
    {
        if ( (k & 1) == 0 )
        {
            /* Even pages: machine address. */
            prev_ma = image->page_list[k];
        }
        else
        {
            /* Odd pages: va for previous ma. */
            if ( is_pv_32on64_domain(dom0) )
            {
                /*
                 * The compatability bounce code sets up a page table
                 * with a 1-1 mapping of the first 1G of memory so
                 * VA==PA here.
                 *
                 * This Linux purgatory code still sets up separate
                 * high and low mappings on the control page (entries
                 * 0 and 1) but it is harmless if they are equal since
                 * that PT is not live at the time.
                 */
                image->page_list[k] = prev_ma;
            }
            else
            {
                set_fixmap(fix_base + (k >> 1), prev_ma);
                image->page_list[k] = fix_to_virt(fix_base + (k >> 1));
            }
        }
    }

    return 0;
}

void machine_kexec_unload(int type, int slot, xen_kexec_image_t *image)
{
}

void machine_reboot_kexec(xen_kexec_image_t *image)
{
    BUG_ON(smp_processor_id() != 0);
    smp_send_stop();
    machine_kexec(image);
    BUG();
}

void machine_kexec(xen_kexec_image_t *image)
{
    struct desc_ptr gdt_desc = {
        .base = (unsigned long)(boot_cpu_gdt_table - FIRST_RESERVED_GDT_ENTRY),
        .limit = LAST_RESERVED_GDT_BYTE
    };

    if ( hpet_broadcast_is_available() )
        hpet_disable_legacy_broadcast();

    /*
     * compat_machine_kexec() returns to idle pagetables, which requires us
     * to be running on a static GDT mapping (idle pagetables have no GDT
     * mappings in their per-domain mapping area).
     */
    asm volatile ( "lgdt %0" : : "m" (gdt_desc) );

#ifdef CONFIG_COMPAT
    if ( is_pv_32on64_domain(dom0) )
    {
        extern void compat_machine_kexec(unsigned long rnk,
                                         unsigned long indirection_page,
                                         unsigned long *page_list,
                                         unsigned long start_address);
        compat_machine_kexec(image->page_list[1],
                             image->indirection_page,
                             image->page_list,
                             image->start_address);
    }
    else
#endif
    {
        relocate_new_kernel_t rnk;

        rnk = (relocate_new_kernel_t) image->page_list[1];
        (*rnk)(image->indirection_page, image->page_list,
               image->start_address,
#ifdef __i386__
               1 /* cpu_has_pae */,
#endif
               0 /* preserve_context */);
    }
}

int machine_kexec_get(xen_kexec_range_t *range)
{
	if (range->range != KEXEC_RANGE_MA_XEN)
		return -EINVAL;
	return machine_kexec_get_xen(range);
}

void arch_crash_save_vmcoreinfo(void)
{
	VMCOREINFO_SYMBOL(dom_xen);
	VMCOREINFO_SYMBOL(dom_io);

#ifdef CONFIG_X86_32
    VMCOREINFO_SYMBOL(xenheap_phys_end);
#endif
#ifdef CONFIG_X86_PAE
	VMCOREINFO_SYMBOL_ALIAS(pgd_l3, idle_pg_table);
#endif
#ifdef CONFIG_X86_64
	VMCOREINFO_SYMBOL_ALIAS(pgd_l4, idle_pg_table);
#endif
}

/*
 * Local variables:
 * mode: C
 * c-set-style: "BSD"
 * c-basic-offset: 4
 * tab-width: 4
 * indent-tabs-mode: nil
 * End:
 */