Jae-Min Ryu
2012-Feb-13 08:03 UTC
[PATCH 11/14] arm: add files that are required to support the Tegra2 harmony board.
arm: add files that are required to support the Tegra2 harmony board. xen/arch/arm/tegra/Makefile | 3 +- xen/arch/arm/tegra/entry.S | 33 ++++++++ xen/arch/arm/tegra/tegra250.c | 330 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ xen/arch/arm/tegra/timer.c | 110 +++++++++++++++++++++++++++ xen/arch/arm/xen/cpu.c | 5 + xen/arch/arm/xen/fault.c | 1 - xen/arch/arm/xen/irq.c | 46 +++++++++++- xen/arch/arm/xen/mm.c | 24 ++++++ xen/arch/arm/xen/setup.c | 6 +- xen/arch/arm/xen/time.c | 1 - xen/drivers/char/console.c | 4 + xen/include/asm-arm/gic.h | 101 +++++++++++++++++++++++++ xen/include/asm-arm/irq.h | 3 +- xen/include/asm-arm/tegra/avp.h | 144 ++++++++++++++++++++++++++++++++++++ xen/include/asm-arm/tegra/config.h | 7 +- xen/include/asm-arm/tegra/irqs.h | 60 +++++++++++++++ xen/include/asm-arm/tegra/smp.h | 7 + xen/include/asm-arm/tegra/tegra.h | 75 ++++++++++++++++++ xen/include/xen/irq.h | 6 + 19 files changed, 952 insertions(+), 14 deletions(-) Signed-off-by: Jaemin Ryu <jm77.ryu@samsung.com> diff -r 6af8a89c99cd xen/arch/arm/tegra/Makefile --- a/xen/arch/arm/tegra/Makefile Sun Feb 12 12:24:21 2012 +0900 +++ b/xen/arch/arm/tegra/Makefile Sun Feb 12 15:04:06 2012 +0900 @@ -1,1 +1,2 @@ -obj-y += dummy.o +obj-y += timer.o entry.o tegra250.o + diff -r 6af8a89c99cd xen/arch/arm/tegra/entry.S --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xen/arch/arm/tegra/entry.S Sun Feb 12 15:04:06 2012 +0900 @@ -0,0 +1,33 @@ +/* + * entry.S + * + * Copyright (C) 2008 Samsung Electronics + * JaeMin Ryu <jm77.ryu@samsung.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public version 2 of License as published by + * the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include <xen/config.h> +#inlcude <asm/arch/irqs.h> +#include <asm/page.h> +#include <asm/system.h> +#include <asm/asm-macros.h> +#include <asm/cpu-domain.h> +#include <asm/asm-offsets.h> + + .align 5 + +ENTRY(arch_context_switch) + mov pc, lr + diff -r 6af8a89c99cd xen/arch/arm/tegra/tegra250.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xen/arch/arm/tegra/tegra250.c Sun Feb 12 15:04:06 2012 +0900 @@ -0,0 +1,330 @@ +/* + * tegra250.c + * + * Copyright (C) 2008-2011 Samsung Electronics + * JaeMin Ryu <jm77.ryu@samsung.com> + * + * Secure Xen on ARM architecture designed by Sang-bum Suh consists of + * Xen on ARM and the associated access control. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public version 2 of License as published by + * the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include <xen/config.h> +#include <xen/spinlock.h> +#include <xen/lib.h> +#include <xen/serial.h> +#include <xen/errno.h> +#include <xen/smp.h> +#include <xen/irq.h> +#include <xen/mm.h> +#include <asm/mmu.h> +#include <asm/platform.h> +#include <asm/gic.h> +#include <asm/regs.h> +#include <asm/io.h> +#include <asm/flushtlb.h> +#include <asm/arch/tegra.h> +#include <asm/arch/irqs.h> + +#define TEGRA250_MEMORY_BASE 0x00000000UL +#define TEGRA250_MEMORY_SIZE 0x40000000UL + +#define TEGRA250_DEV_BASE 0x50000000UL +#define TEGRA250_DEV_SIZE 0x00300000UL + +DECLARE_MEMORY_MAP(tegra250) = { + MEMMAP_ENTRY(TEGRA250_MEMORY_BASE, TEGRA250_MEMORY_SIZE, MEMORY_TYPE_RAM, L1E_TYPE_HYPERVISOR), + MEMMAP_ENTRY(TEGRA250_DEV_BASE, TEGRA250_DEV_SIZE, MEMORY_TYPE_DEV, L1E_TYPE_DEVICE) +}; + +// Register APBDMA_IRQ_MASK_CLR_0 +#define APBDMA_IRQ_STA_CPU_0 (0x14) +#define APBDMA_IRQ_MASK_SET_0 (0x20) +#define APBDMA_IRQ_MASK_CLR_0 (0x24) + +void *tegra_gic_cpu_base[MAX_PHYS_CPUS] = {0, 0}; +void *tegra_gic_dist_base = 0; + +struct tegra_irq_ctrl { + unsigned int irq_start; + void *reg; +}; + +static struct tegra_irq_ctrl tegra_irq_ctrl[(INT_SYS_NR + INT_SYS_SZ - 1) / INT_SYS_SZ]; + +#define gic_irq(irq) (irq) + +static void tegra_mask(struct irq_desc *desc) +{ + struct tegra_irq_ctrl *chip; + unsigned int irq = desc_to_irq(desc); + unsigned int mask = 1 << (irq % 32); + + mmio_writel(mask, tegra_gic_dist_base + _ICDICER + (gic_irq(irq) / 32) * 4); + + irq -= INT_PRI_BASE; + chip = &tegra_irq_ctrl[irq / INT_SYS_SZ]; + mmio_writel(1 << (irq & 31), chip->reg + ICTLR_CPU_IER_CLR_0); +} + +static void tegra_unmask(struct irq_desc *desc) +{ + struct tegra_irq_ctrl *chip; + unsigned int irq = desc_to_irq(desc); + unsigned int mask = 1 << (irq % 32); + + mmio_writel(mask, tegra_gic_dist_base + _ICDISER + (gic_irq(irq) / 32) * 4); + + irq -= INT_PRI_BASE; + chip = &tegra_irq_ctrl[irq / INT_SYS_SZ]; + mmio_writel(1 << (irq & 31), chip->reg + ICTLR_CPU_IER_SET_0); +} + +static void tegra_ack(struct irq_desc *desc) +{ + unsigned int irq = desc_to_irq(desc); + unsigned int mask = 1 << (irq % 32); + unsigned int cpu = smp_processor_id(); + + tegra_mask(desc); + + mmio_writel(mask, tegra_gic_dist_base + _ICDICER + (gic_irq(irq) / 32) * 4); + mmio_writel(gic_irq(irq), tegra_gic_cpu_base[cpu] + _ICCEOIR); +} + +static void tegra_end(struct irq_desc *desc) +{ + tegra_unmask(desc); +} + +hw_irq_controller tegra_irq_controller = { + .typename = "level", + .startup = tegra_unmask, + .shutdown = tegra_mask, + .enable = tegra_unmask, + .disable = tegra_mask, + .ack = tegra_ack, + .end = tegra_end, +}; + +static void tegra250_irq_init() +{ + unsigned int max_irq, i; + unsigned int cpu = smp_processor_id(); + unsigned long cpumask = 1 << cpu; + + for (i = 0; i < ARRAY_SIZE(tegra_irq_ctrl); i++) { + tegra_irq_ctrl[i].irq_start = INT_PRI_BASE + INT_SYS_SZ * i; + tegra_irq_ctrl[i].reg = IO_ADDRESS(INT_PPI_ADDRESS(i)); + mmio_writel(0xFFFFFFFF, tegra_irq_ctrl[i].reg + ICTLR_CPU_IER_CLR_0); + mmio_writel(0x00000000, tegra_irq_ctrl[i].reg + ICTLR_CPU_IEP_CLASS_0); + } + + for (i = INT_PRI_BASE; i < INT_GPIO_BASE; i++) { + irq_desc[i].handler = &tegra_irq_controller; + } + + cpumask |= cpumask << 8; + cpumask |= cpumask << 16; + + tegra_gic_dist_base = IO_ADDRESS(TEGRA_ARM_INT_DIST_BASE); + tegra_gic_cpu_base[cpu] = IO_ADDRESS(TEGRA_GIC_PROC_IF_BASE); + + mmio_writel(0, tegra_gic_dist_base + _ICDDCR); + + /* + * Find out how many interrupts are supported. + */ + max_irq = mmio_readl(tegra_gic_dist_base + _ICDICTR) & 0x1f; + max_irq = (max_irq + 1) * 32; + + /* + * The GIC only supports up to 1020 interrupt sources. + * Limit this to either the architected maximum, or the + * platform maximum. + */ + if (max_irq > max(1020, NR_IRQS)) + max_irq = max(1020, NR_IRQS); + + /* + * Set all global interrupts to be level triggered, active low. + */ + for (i = 32; i < max_irq; i += 16) + mmio_writel(0, tegra_gic_dist_base + _ICDICFR + i * 4 / 16); + + /* + * Set all global interrupts to this CPU only. + */ + for (i = 32; i < max_irq; i += 4) + mmio_writel(cpumask, tegra_gic_dist_base + _ICDIPTR + i * 4 / 4); + /* + * Set priority on all interrupts. + */ + for (i = 0; i < max_irq; i += 4) + mmio_writel(0xa0a0a0a0, tegra_gic_dist_base + _ICDIPR + i * 4 / 4); + + /* + * Disable all interrupts. + */ + for (i = 0; i < max_irq; i += 32) + mmio_writel(0xffffffff, tegra_gic_dist_base + _ICDICER + i * 4 / 32); + + mmio_writel(1, tegra_gic_dist_base + _ICDDCR); + + mmio_writel(0xf0, tegra_gic_cpu_base[cpu] + _ICCPMR); + mmio_writel(1, tegra_gic_cpu_base[cpu] + _ICCICR); + + +} + +#define CLK_RST_CONTROLLER_RST_CPU_CMPLX_CLR_0 (0x344) +#define CLK_RST_CONTROLLER_CLK_CPU_CMPLX_0 (0x4c) +#define CPU_CLK_STOP(cpu) (0x1<<(8+cpu)) +#define CPU_RESET(cpu) (0x1011ul<<(cpu)) + +#define EVP_CPU_RESET_VECTOR_0 (0x100) +#define FLOW_CTRL_HALT_CPUx_EVENTS(cpu) ((cpu) ? ((cpu - 1) * 0x8 + 0x14) : 0x0) + + +volatile int tegra250_core_map = 1; + +asm( +".type tegra250_slave_cpu_start, #function \n" +".global tegra250_slave_cpu_start \n" +"tegra250_slave_cpu_start: \n" +" msr cpsr_c, #0xD3 \n" +" mov r0, #0 \n" +" mcr p15, 2, r0, c0, c0, 0 \n" +" mrc p15, 1, r0, c0, c0, 0 \n" +" ldr r1, =0x7FFF \n" +" and r2, r1, r0, lsr #13 \n" +" ldr r1, =0x3FF \n" +" and r3, r1, r0, lsr #3 \n" +" add r2, r2, #1 \n" +" and r0, r0, #0x07 \n" +" add r0, r0, #4 \n" +" clz r1, r3 \n" +" add r4, r3, #1 \n" +"1: sub r2, r2, #1 \n" +" mov r3, r4 \n" +"2: subs r3, r3, #1 \n" +" mov r5, r3, lsl r1 \n" +" mov r6, r2, lsl r0 \n" +" orr r5, r5, r6 \n" +" mcr p15, 0, r5, c7, c6, 2 \n" +" bgt 2b \n" +" cmp r2, #0 \n" +" bgt 1b \n" +" dsb \n" +" isb \n" +" mrc p15, 0, r0, c0, c0, 5 \n" +" and r0, r0, #15 \n" +" adr r4, 1f \n" +" ldmia r4, {r5, r6} \n" +" sub r4, r4, r5 \n" +" add r6, r6, r4 \n" +" mov r1, #1 \n" +" lsl r1, r1, r0 \n" +"spin: ldr r7, [r6] \n" +" tst r7, r1 \n" +" beq spin \n" +" b slave_cpu_start \n" +"1: .long . \n" +" .long tegra250_core_map \n" +); + +int wakeup_cpu(unsigned int cpu) +{ + tegra250_core_map |= 1 << cpu; + + cpu_flush_cache_all(); + + return 0; +} + +extern void tegra250_slave_cpu_start(void); + +static void tegra250_evp_init(void) +{ + unsigned long r, org, loop, ctrl; + + /* Initialize Snoop Control Unit */ + ctrl = mmio_readl(IO_ADDRESS(TEGRA_SCU_BASE) + 0x0); + ctrl |= 1; + mmio_writel(ctrl, IO_ADDRESS(TEGRA_SCU_BASE) + 0x0); + + org = mmio_readl(IO_ADDRESS(TEGRA_EXCEPTION_VECTORS_BASE) + EVP_CPU_RESET_VECTOR_0); + + /* Set boot entry */ + mmio_writel(__pa(tegra250_slave_cpu_start), IO_ADDRESS(TEGRA_EXCEPTION_VECTORS_BASE) + EVP_CPU_RESET_VECTOR_0); + + dsb(); + isb(); + + /* Halt CPU */ + mmio_writel(0, IO_ADDRESS(TEGRA_FLOW_CTRL_BASE) + FLOW_CTRL_HALT_CPUx_EVENTS(1)); + + dsb(); + isb(); + + /* CPU Clock Stop */ + r = mmio_readl(IO_ADDRESS(TEGRA_CLK_RESET_BASE) + CLK_RST_CONTROLLER_CLK_CPU_CMPLX_0); + r &= ~CPU_CLK_STOP(1); + mmio_writel(r, IO_ADDRESS(TEGRA_CLK_RESET_BASE) + CLK_RST_CONTROLLER_CLK_CPU_CMPLX_0); + + dsb(); + isb(); + + /* Restart Slave CPU */ + mmio_writel(CPU_RESET(1), IO_ADDRESS(TEGRA_CLK_RESET_BASE) + CLK_RST_CONTROLLER_RST_CPU_CMPLX_CLR_0); + + dsb(); + isb(); + + /* Wait util the power unit is in stable */ + loop = 10000; + while((--loop) > 0 ); +} + +void tegra250_ioremap(void) +{ + map_pages_to_xen(IO_ADDRESS(TEGRA_ARM_CPU_BASE), + TEGRA_ARM_CPU_BASE >> PAGE_SHIFT, 0x100000 >> PAGE_SHIFT, + L1E_TYPE_DEVICE); + + map_pages_to_xen(IO_ADDRESS(TEGRA_PPSB_DEVICE_BASE), + TEGRA_PPSB_DEVICE_BASE >> PAGE_SHIFT, 0x100000 >> PAGE_SHIFT, + L1E_TYPE_DEVICE); + + map_pages_to_xen(IO_ADDRESS(TEGRA_APB_DEVICE_BASE), + TEGRA_APB_DEVICE_BASE >> PAGE_SHIFT, 0x100000 >> PAGE_SHIFT, + L1E_TYPE_DEVICE); +} + +int machine_setup(void) +{ + cpu_topology_init(2); + + tegra250_ioremap(); + + tegra250_evp_init(); + + tegra250_irq_init(); + + tegra250_timer_init(); + + return 0; +} + diff -r 6af8a89c99cd xen/arch/arm/tegra/timer.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xen/arch/arm/tegra/timer.c Sun Feb 12 15:04:06 2012 +0900 @@ -0,0 +1,110 @@ +/* + * arch/arm/mach-tegra/timer.c + * + * Timer and clock event support for NVIDIA Tegra SoCs + * + * Copyright (c) 2008-2009, NVIDIA Corporation. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include <xen/sched.h> +#include <xen/irq.h> +#include <xen/init.h> +#include <xen/softirq.h> +#include <xen/spinlock.h> +#include <asm/time.h> +#include <asm/arch/irqs.h> +#include <asm/arch/tegra.h> + + +#define CLK_RST_CONTROLLER_OSC_CTRL_0 0x50 + +#define TIMER1_OFFS 0x00 /* reserved for AVP */ +#define TIMER2_OFFS 0x08 /* reserved for AVP */ +#define TIMER3_OFFS 0x50 /* used as OS CPU event timer */ +#define TIMER4_OFFS 0x58 /* reserved as LP2 wakeup trigger */ + +#define TIMER_TMR_PTV_0 0x0 +#define TIMER_TMR_PCR_0 0x4 + +#define TIMERUS_OFFS 0x10 +#define TIMERUS_CNTR_1US_0 0x0 +#define TIMERUS_USEC_CFG_0 0x4 + +#define NSEC_PER_SEC 1000000000L + +void tegra_clockevent_interrupt(int irq, void *dev_id, struct cpu_user_regs *regs) +{ + mmio_writel(1 << 30, IO_ADDRESS(TEGRA_TMR1_BASE + TIMER3_OFFS) + TIMER_TMR_PCR_0); +} + +static struct irqaction tegra_clockevent_irq = { + .name = "Timer_event", + .handler = tegra_clockevent_interrupt, +}; + +void tegra_lp2wake_interrupt(int irq, void *dev_id, struct cpu_user_regs *regs) +{ + mmio_writel(1<<30, IO_ADDRESS(TEGRA_TMR1_BASE + TIMER4_OFFS) + TIMER_TMR_PCR_0); +} + +static struct irqaction tegra_lp2wake_irq = { + .name = "timer_lp2wake", + .handler = tegra_lp2wake_interrupt, +}; + +static unsigned long measure_input_freq(unsigned int *m, unsigned int *n) +{ + void *clk_rst = IO_ADDRESS(TEGRA_CLK_RESET_BASE); + unsigned long osc = mmio_readl(clk_rst + CLK_RST_CONTROLLER_OSC_CTRL_0); + osc >>= 30; + + switch (osc) { + case 0: if (m && n) { *m=1; *n=13; } return 13000; + case 1: if (m && n) { *m=5; *n=96; } return 19200; + case 2: if (m && n) { *m=1; *n=12; } return 12000; + case 3: if (m && n) { *m=1; *n=26; } return 26000; + } + + return 0; +} + +void tegra250_timer_init(void) +{ + void *tmr; + unsigned int m, n; + unsigned long val; + u32 reg; + + tmr = IO_ADDRESS(TEGRA_TMR1_BASE + TIMERUS_OFFS); + val = measure_input_freq(&m, &n); + + val = ((m-1)<<8) | (n-1); + + mmio_writel(val, tmr + TIMERUS_USEC_CFG_0); + mmio_writel(0, IO_ADDRESS(TEGRA_TMR1_BASE + TIMER3_OFFS) + TIMER_TMR_PTV_0); + + reg = 0xc000270f; + mmio_writel(reg, IO_ADDRESS(TEGRA_TMR1_BASE + TIMER3_OFFS) + TIMER_TMR_PTV_0); + + if (setup_irq(INT_TMR3, &tegra_clockevent_irq)) { + BUG(); + } + if (setup_irq(INT_TMR4, &tegra_lp2wake_irq)) { + BUG(); + } +} + diff -r 6af8a89c99cd xen/arch/arm/xen/cpu.c --- a/xen/arch/arm/xen/cpu.c Sun Feb 12 12:24:21 2012 +0900 +++ b/xen/arch/arm/xen/cpu.c Sun Feb 12 15:04:06 2012 +0900 @@ -53,6 +53,11 @@ int __cpu_up(unsigned int cpu) { int ret = 0; + ret = wakeup_cpu(cpu); + if (!ret) { + return -EINVAL; + } + while(!cpu_online(cpu)) { cpu_relax(); process_pending_softirqs(); diff -r 6af8a89c99cd xen/arch/arm/xen/fault.c --- a/xen/arch/arm/xen/fault.c Sun Feb 12 12:24:21 2012 +0900 +++ b/xen/arch/arm/xen/fault.c Sun Feb 12 15:04:06 2012 +0900 @@ -33,7 +33,6 @@ #include <asm/processor.h> #include <asm/guest_access.h> #include <asm/system.h> -#include <asm/memory.h> asmlinkage void __div0(void) { diff -r 6af8a89c99cd xen/arch/arm/xen/irq.c --- a/xen/arch/arm/xen/irq.c Sun Feb 12 12:24:21 2012 +0900 +++ b/xen/arch/arm/xen/irq.c Sun Feb 12 15:04:06 2012 +0900 @@ -38,9 +38,27 @@ hw_irq_controller no_irq_type = { .shutdown = irq_shutdown_none, .enable = irq_enable_none, .disable = irq_disable_none, + .end = irq_end_none, + .ack = irq_ack_none, }; -struct irq_desc *irq_desc; +//struct irq_desc *irq_desc; + +irq_desc_t irq_desc[NR_IRQS] = { + [0 ... NR_IRQS - 1] = { + .status = IRQ_DISABLED, + .handler = &no_irq_type, + .action = NULL, + .lock = SPIN_LOCK_UNLOCKED + } +}; + +struct irq_cfg irq_cfg[NR_IRQS] = { + [0 ... NR_IRQS - 1] ={ + .irq = 0 + } +}; + int pirq_guest_unmask(struct domain *d) { @@ -75,6 +93,32 @@ struct pirq *alloc_pirq_struct(struct do return NULL; } +int setup_irq(unsigned int irq, struct irqaction *new) +{ + unsigned long flags; + struct irq_desc *desc; + + if(irq >= NR_IRQS) { + printk("BAD IRQ = %d\n", irq); + } + + desc = irq_to_desc(irq); + + spin_lock_irqsave(&desc->lock, flags); + desc->action = new; + if (desc->handler) { + if (desc->handler->startup) { + desc->handler->startup(desc); + } else if(desc->handler->enable) { + desc->handler->enable(desc); + } + } + + spin_unlock_irqrestore(&desc->lock, flags); + + return 0; +} + int arch_init_one_irq_desc(struct irq_desc *desc) { NOT_YET(); diff -r 6af8a89c99cd xen/arch/arm/xen/mm.c --- a/xen/arch/arm/xen/mm.c Sun Feb 12 12:24:21 2012 +0900 +++ b/xen/arch/arm/xen/mm.c Sun Feb 12 15:04:06 2012 +0900 @@ -255,3 +255,27 @@ int alloc_page_map(unsigned long virt, u return 0; } +int map_pages_to_xen(unsigned long virt, unsigned long mfn, int nr, unsigned long flags) +{ + unsigned long vaddr = round_down(virt, PAGE_SIZE); + unsigned long maddr = mfn << PAGE_SHIFT; + unsigned int end = virt + (nr << PAGE_SHIFT); + + l1e_t *l1e = l1_linear_offset_xen(vaddr); + + do { + unsigned long limit = (vaddr + SECTION_SIZE) & (SECTION_MASK); + limit = (limit < end) ? limit : end; + + if (((vaddr | maddr | limit) & ~SECTION_MASK) == 0) { + *l1e = MK_L1E(maddr, flags); + pte_sync(l1e); + + vaddr += SECTION_SIZE; + maddr += SECTION_SIZE; + } + } while(l1e++, vaddr < end); + + return 0; +} + diff -r 6af8a89c99cd xen/arch/arm/xen/setup.c --- a/xen/arch/arm/xen/setup.c Sun Feb 12 12:24:21 2012 +0900 +++ b/xen/arch/arm/xen/setup.c Sun Feb 12 15:04:06 2012 +0900 @@ -64,11 +64,11 @@ static unsigned int dom0_size = 256 * 10 integer_param("dom0_size", dom0_size); //static unsigned long dom0_image_start = 0x40B00000UL; -static unsigned long dom0_image_start = 0x00B00000UL; +static unsigned long dom0_image_start = 0xA00000UL; integer_param("image_start", dom0_image_start); //static unsigned long dom0_image_size = 0xA00000UL; -static unsigned long dom0_image_size = 0xA00000UL; +static unsigned long dom0_image_size = 0x1400000UL; integer_param("image_length", dom0_image_size); void arch_get_xen_caps(xen_capabilities_info_t *info) @@ -211,6 +211,8 @@ asmlinkage void start_xen(void) tasklet_subsys_init(); + machine_setup(); + timer_init(); idle_domain_init(); diff -r 6af8a89c99cd xen/arch/arm/xen/time.c --- a/xen/arch/arm/xen/time.c Sun Feb 12 12:24:21 2012 +0900 +++ b/xen/arch/arm/xen/time.c Sun Feb 12 15:04:06 2012 +0900 @@ -79,5 +79,4 @@ void domain_set_time_offset(struct domai void timekeeping_init(void) { - NOT_YET(); } diff -r 6af8a89c99cd xen/drivers/char/console.c --- a/xen/drivers/char/console.c Sun Feb 12 12:24:21 2012 +0900 +++ b/xen/drivers/char/console.c Sun Feb 12 15:04:06 2012 +0900 @@ -412,7 +412,11 @@ long do_console_io(int cmd, int count, X * ***************************************************** */ +#if defined(__arm__) +static bool_t console_locks_busted = 1; +#else static bool_t console_locks_busted; +#endif static void __putstr(const char *str) { diff -r 6af8a89c99cd xen/include/asm-arm/gic.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xen/include/asm-arm/gic.h Sun Feb 12 15:04:06 2012 +0900 @@ -0,0 +1,101 @@ +/* + * gic.h + * + * Copyright (C) 2011 Samsung Electronics + * Jaemin Ryu <jm77.ryu@samsung.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public version 2 of License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __ARM_GIC_H__ +#define __ARM_GIC_H__ + + +/* Distributor Register Map */ +#define _ICDDCR 0x000 /* Distributor Control Register */ +#define _ICDICTR 0x004 /* Interrupt Controller Type Register */ +#define _ICDIIDR 0x008 /* Distributor Implementer Id Register */ +#define _ICDISR0 0x080 /* Interrupt Security Register */ +#define _ICDISR1 0x084 /* Interrupt Security Register */ +#define _ICDISR2 0x088 /* Interrupt Security Register */ +#define _ICDISR3 0x08c /* Interrupt Security Register */ +#define _ICDISR4 0x090 /* Interrupt Security Register */ +#define _ICDISER 0x100 /* Interrupt Set-Enable Register */ +#define _ICDICER 0x180 /* Interrupt Clear-Enable Register */ +#define _ICDISPR 0x200 /* Interrupt Set-Pending Register */ +#define _ICDICPR 0x280 /* Interrupt Clear-Pending Register */ +#define _ICDABR 0x300 /* Active Bit Registers */ +#define _ICDIPR 0x400 /* Interrupt Priority Register */ +#define _ICDIPTR 0x800 /* Interrupt Processor Targets Registers */ +#define _ICDICFR 0xC00 /* Interrupt Configuration Registers */ +#define _ICDSGIR 0xF00 /* Software Generated Interrupt Register */ + +#define ICDDCR() (_ICDDCR) +#define ICDICTR() (_ICDICTR) +#define ICDISR(x) (_ICDISR0 + (x / BITS_PER_LONG) * BYTES_PER_LONG) +#define ICDISER(x) (_ICDISER + (x / BITS_PER_LONG) * BYTES_PER_LONG) +#define ICDICER(x) (_ICDICER + (x / BITS_PER_LONG) * BYTES_PER_LONG) +#define ICDISPR(x) (_ICDISPR + (x / BITS_PER_LONG) * BYTES_PER_LONG) +#define ICDICPR(x) (_ICDICPR + (x / BITS_PER_LONG) * BYTES_PER_LONG) +#define ICDABR(x) (_ICDABR + (x / BITS_PER_LONG) * BYTES_PER_LONG) +#define ICDIPR(x) (_ICDIPR + (x / 4) * BYTES_PER_LONG) +#define ICDIPTR(x) (_ICDIPTR + (x / 4) * BYTES_PER_LONG) +#define ICDSGIR() (_ICDSGIR) + +/* CPU Interface Register Map */ +#define _ICCICR 0x000 /* CPU Interface Control Register */ +#define _ICCPMR 0x004 /* Interrupt Priority Mask Register */ +#define _ICCBPR 0x008 /* Binrary Point Register */ +#define _ICCIAR 0x00C /* Interrupt Acknowledge Register */ +#define _ICCEOIR 0x010 /* End of Interrupt Register */ +#define _ICCRPR 0x014 /* Running Priority Register */ +#define _ICCHPIR 0x018 /* Highest Pending Interrupt Register */ +#define _ICCABPR 0x01C /* Aliased Binary Point Register */ +#define _ICCIIDR 0x0FC /* CPU Interface Id Register */ + +#define ICCICR() (_ICCICR) +#define ICCPMR() (_ICCPMR) +#define ICCBPR() (_ICCBPR) +#define ICCIAR() (_ICCIAR) +#define ICCEOIR() (_ICCEOIR) +#define ICCRPR() (_ICCRPR) +#define ICCHPIR() (_ICCHPIR) +#define ICCIIDR() (_ICCIIDR) + +#define SECURE_INTERRUPT 0 +#define NONSECURE_INTERRUPT 1 + +#define SGI(x) (x) +#define PPI(x) (x + 16) +#define SPI(x) (x + 32) + +#ifndef __ASSEMBLY__ + +#include <xen/types.h> + +#define GIC_DISTRIBUTOR(x) (_gic_distributor_base + x) +#define GIC_CPU_INTERFACE(x) (_gic_cpu_base + x) + +void gic_set_cpu(unsigned int irq, unsigned int mask); +void gic_set_irq_priority(unsigned int irq, unsigned int priority); +void gic_ack_irq(unsigned int irq); +void gic_mask_irq(unsigned int irq); +void gic_unmask_irq(unsigned int irq); +void gic_end_irq(unsigned int irq); +void gic_change_irq_state(unsigned int irq, unsigned int state); + +extern void *_gic_cpu_base[NR_CPUS]; +extern void *_gic_distributor_base; +#endif +#endif diff -r 6af8a89c99cd xen/include/asm-arm/irq.h --- a/xen/include/asm-arm/irq.h Sun Feb 12 12:24:21 2012 +0900 +++ b/xen/include/asm-arm/irq.h Sun Feb 12 15:04:06 2012 +0900 @@ -15,6 +15,7 @@ #define irq_cfg(irq) (&irq_cfg[irq]) #define irq_to_desc(irq) (&irq_desc[irq]) +#define desc_to_irq(desc) ((desc - &irq_desc[0]) / sizeof(struct irq_desc)); #define IRQ_MAX_GUESTS 7 typedef struct { @@ -40,8 +41,6 @@ typedef struct { DECLARE_BITMAP(_bits,NR_IRQS); } vmask_t; -extern struct irq_desc *irq_desc; - static inline int irq_desc_initialized(struct irq_desc *desc) { return 0; diff -r 6af8a89c99cd xen/include/asm-arm/tegra/avp.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xen/include/asm-arm/tegra/avp.h Sun Feb 12 15:04:06 2012 +0900 @@ -0,0 +1,144 @@ +/* + * Copyright (c) 2010 NVIDIA Corporation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * Neither the name of the NVIDIA Corporation nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef INCLUDED_AVP_H +#define INCLUDED_AVP_H + +#include "ap15/arictlr.h" +#include "ap15/artimer.h" +// FIXME: get the ararmev header + +// 3 controllers in contiguous memory starting at INTERRUPT_BASE, each +// controller's aperture is INTERRUPT_SIZE large +#define INTERRUPT_BASE 0x60004000 +#define INTERRUPT_SIZE 0x100 +#define INTERRUPT_NUM_CONTROLLERS 3 + +#define INTERRUPT_PENDING( ctlr ) \ + (INTERRUPT_BASE + ((ctlr) * INTERRUPT_SIZE) + ICTLR_VIRQ_COP_0) + +#define INTERRUPT_SET( ctlr ) \ + (INTERRUPT_BASE + ((ctlr) * INTERRUPT_SIZE) + ICTLR_COP_IER_SET_0) + +#define INTERRUPT_CLR( ctlr ) \ + (INTERRUPT_BASE + ((ctlr) * INTERRUPT_SIZE) + ICTLR_COP_IER_CLR_0) + +#define OSC_CTRL ( 0x60006000 + 0x50 ) +#define OSC_FREQ_DET ( 0x60006000 + 0x58 ) +#define OSC_DET_STATUS ( 0x60006000 + 0x5C ) + +#define TIMER_USEC ( 0x60005010 ) +#define TIMER_CFG ( 0x60005014 ) +#define TIMER_0_BASE ( 0x60005000 ) +#define TIMER_0 ( TIMER_0_BASE + TIMER_TMR_PTV_0 ) +#define TIMER_0_CLEAR ( TIMER_0_BASE + TIMER_TMR_PCR_0 ) +#define TIMER_1_BASE ( 0x60005008 ) +#define TIMER_1 ( TIMER_1_BASE + TIMER_TMR_PTV_0 ) +#define TIMER_1_CLEAR ( TIMER_1_BASE + TIMER_TMR_PCR_0 ) + +#define CLOCK_RST_LO (0x60006004) +#define CLOCK_CTLR_HI (0x60006014) +#define CLOCK_CTLR_LO (0x60006010) + +#define CACHE_CTLR (0x6000C000) +#define CACHE_CONTROL_0 (0x0) + +#define PPI_INTR_ID_TIMER_0 (0) +#define PPI_INTR_ID_TIMER_1 (1) +#define PPI_INTR_ID_TIMER_2 (9) +#define PPI_INTR_ID_TIMER_3 (10) + +/* flow controller */ +#define FLOW_CONTROLLER (0x60007004) + +/* exception vectors */ +#define VECTOR_BASE ( 0x6000F200 ) +#define VECTOR_RESET ( VECTOR_BASE + 0 ) +#define VECTOR_UNDEF ( VECTOR_BASE + 4 ) +#define VECTOR_SWI ( VECTOR_BASE + 8 ) +#define VECTOR_PREFETCH_ABORT ( VECTOR_BASE + 12 ) +#define VECTOR_DATA_ABORT ( VECTOR_BASE + 16 ) +#define VECTOR_IRQ ( VECTOR_BASE + 24 ) +#define VECTOR_FIQ ( VECTOR_BASE + 28 ) + +#define MODE_DISABLE_INTR 0xc0 +#define MODE_USR 0x10 +#define MODE_FIQ 0x11 +#define MODE_IRQ 0x12 +#define MODE_SVC 0x13 +#define MODE_ABT 0x17 +#define MODE_UND 0x1B +#define MODE_SYS 0x1F + +#define AP15_CACHE_LINE_SIZE 32 + +#define AP15_APB_L2_CACHE_BASE 0x7000e800 +#define AP15_APB_CLK_RST_BASE 0x60006000 +#define AP15_APB_MISC_BASE 0x70000000 + +#define AP10_APB_CLK_RST_BASE 0x60006000 +#define AP10_APB_MISC_BASE 0x70000000 + +#define MMU_TLB_BASE 0xf000f000 +#define MMU_TLB_CACHE_WINDOW_0 0x40 +#define MMU_TLB_CACHE_OPTIONS_0 0x44 + +#define AP15_PINMUX_CFG_CTL_0 0x70000024 +#define AP15_AVP_JTAG_ENABLE 0xC0 + +#define PMC_SCRATCH22_REG_LP0 0x7000e4a8 + +#define AVP_WDT_RESET 0x2F00BAD0 + +/* Cached to uncached offset for AVP + * + * Hardware has uncached remap aperture for AVP as AVP doesn't have MMU + * but still has cache (named COP cache). + * + * This aperture moved between AP15 and AP20. + */ +#define AP15_CACHED_TO_UNCACHED_OFFSET 0x90000000 +#define AP20_CACHED_TO_UNCACHED_OFFSET 0x80000000 + +#define APXX_EXT_MEM_START 0x00000000 +#define APXX_EXT_MEM_END 0x40000000 + +#define APXX_MMIO_START 0x40000000 +#define APXX_MMIO_END 0xFFF00000 + +#define TXX_EXT_MEM_START 0x80000000 +#define TXX_EXT_MEM_END 0xc0000000 + +#define TXX_MMIO_START 0x40000000 +#define TXX_MMIO_END 0x80000000 + +#endif diff -r 6af8a89c99cd xen/include/asm-arm/tegra/config.h --- a/xen/include/asm-arm/tegra/config.h Sun Feb 12 12:24:21 2012 +0900 +++ b/xen/include/asm-arm/tegra/config.h Sun Feb 12 15:04:06 2012 +0900 @@ -1,11 +1,6 @@ #ifndef __TEGRA_CONFIG_H__ #define __TEGRA_CONFIG_H__ -#define HZ 100 -#define CLOCK_TICK_RATE 1000000 +#define MAX_PHYS_CPUS 2 -#define MAX_PHYS_CPUS 2 - -#define BUILTIN_COMMAND_LINE_SIZE 256 -#define BUILTIN_COMMAND_LINE "" #endif diff -r 6af8a89c99cd xen/include/asm-arm/tegra/irqs.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xen/include/asm-arm/tegra/irqs.h Sun Feb 12 15:04:06 2012 +0900 @@ -0,0 +1,60 @@ +/* + * arch/arm/mach-tegra/include/mach/irqs.h + * + * Copyright (c) 2009, NVIDIA Corporation. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef __TEGRA_IRQS_H +#define __TEGRA_IRQS_H + +#define NR_IRQS 512 + +#define INT_PRI_BASE 32 +#define INT_RTC (INT_PRI_BASE + 2) +#define INT_USB (INT_PRI_BASE + 20) +#define INT_USB2 (INT_PRI_BASE + 21) +#define INT_APB_DMA (INT_PRI_BASE + 26) + +#define INT_SEC_BASE (INT_PRI_BASE + 32) +#define INT_GPIO1 (INT_SEC_BASE + 0) +#define INT_GPIO2 (INT_SEC_BASE + 1) +#define INT_GPIO3 (INT_SEC_BASE + 2) +#define INT_GPIO4 (INT_SEC_BASE + 3) +#define INT_TMR3 (INT_SEC_BASE + 9) +#define INT_TMR4 (INT_SEC_BASE + 10) +#define INT_SYS_STATS_MON (INT_SEC_BASE + 22) +#define INT_GPIO5 (INT_SEC_BASE + 23) + +#define INT_TRI_BASE (INT_SEC_BASE + 32) +#define INT_KBC (INT_TRI_BASE + 21) +#define INT_EXTERNAL_PMU (INT_TRI_BASE + 22) +#define INT_GPIO6 (INT_TRI_BASE + 23) +#define INT_GPIO7 (INT_TRI_BASE + 25) + +#define INT_QUAD_BASE (INT_TRI_BASE + 32) +#define INT_USB3 (INT_QUAD_BASE + 1) + +#define INT_GPIO_BASE (INT_QUAD_BASE + 32) +#define INT_GPIO_NR (28*8) + +#define INT_APBDMA_BASE (INT_GPIO_BASE + INT_GPIO_NR) +#define INT_APBDMA_NR (16) + +#define INT_SYS_NR (INT_GPIO_BASE - INT_PRI_BASE) +#define INT_SYS_SZ (INT_SEC_BASE - INT_PRI_BASE) + +#endif diff -r 6af8a89c99cd xen/include/asm-arm/tegra/smp.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xen/include/asm-arm/tegra/smp.h Sun Feb 12 15:04:06 2012 +0900 @@ -0,0 +1,7 @@ +#ifndef ASMARM_ARCH_SMP_H +#define ASMARM_ARCH_SMP_H + + +#include <asm/gic.h> + +#endif diff -r 6af8a89c99cd xen/include/asm-arm/tegra/tegra.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xen/include/asm-arm/tegra/tegra.h Sun Feb 12 15:04:06 2012 +0900 @@ -0,0 +1,75 @@ +#ifndef __TEGRA250_H__ +#define __TEGRA250_H__ + +#define TEGRA_ARM_CPU_BASE 0x50000000 +#define TEGRA_PPSB_DEVICE_BASE 0x60000000 +#define TEGRA_APB_DEVICE_BASE 0x70000000 + +#define TEGRA_ARM_PERIF_BASE 0x50040000 +#define TEGRA_ARM_PERIF_SIZE SZ_8K + +#define TEGRA_SCU_BASE 0x50040000 +#define TEGRA_SCU_SIZE SZ_256 + +#define TEGRA_GIC_PROC_IF_BASE 0x50040100 +#define TEGRA_GIC_PROC_IF_SIZE SZ_256 + +#define TEGRA_ARM_INT_DIST_BASE 0x50041000 +#define TEGRA_ARM_INT_DIST_SIZE SZ_4K + +#define TEGRA_PRIMARY_ICTLR_BASE 0x60004000 +#define TEGRA_PRIMARY_ICTLR_SIZE SZ_64 + +#define TEGRA_SECONDARY_ICTLR_BASE 0x60004100 +#define TEGRA_SECONDARY_ICTLR_SIZE SZ_64 + +#define TEGRA_TERTIARY_ICTLR_BASE 0x60004200 +#define TEGRA_TERTIARY_ICTLR_SIZE SZ_64 + +#define TEGRA_QUATERNARY_ICTLR_BASE 0x60004300 +#define TEGRA_QUATERNARY_ICTLR_SIZE SZ_64 + +#define TEGRA_TMR1_BASE 0x60005000 +#define TEGRA_TMR1_SIZE SZ_8 + +#define TEGRA_TMR2_BASE 0x60005008 +#define TEGRA_TMR2_SIZE SZ_8 + +#define TEGRA_TMRUS_BASE 0x60005010 +#define TEGRA_TMRUS_SIZE SZ_64 + +#define TEGRA_TMR3_BASE 0x60005050 +#define TEGRA_TMR3_SIZE SZ_8 + +#define TEGRA_TMR4_BASE 0x60005058 +#define TEGRA_TMR4_SIZE SZ_8 + +#define TEGRA_CLK_RESET_BASE 0x60006000 +#define TEGRA_CLK_RESET_SIZE SZ_4K + +#define TEGRA_FLOW_CTRL_BASE 0x60007000 +#define TEGRA_FLOW_CTRL_SIZE 20 + +#define TEGRA_GPIO_BASE 0x6000D000 +#define TEGRA_GPIO_SIZE SZ_4K + +#define TEGRA_EXCEPTION_VECTORS_BASE 0x6000F000 +#define TEGRA_EXCEPTION_VECTORS_SIZE SZ_4K + +#define ICTLR_CPU_IER_0 (0x20) +#define ICTLR_CPU_IER_SET_0 (0x24) +#define ICTLR_CPU_IER_CLR_0 (0x28) +#define ICTLR_CPU_IEP_CLASS_0 (0x2C) +#define ICTLR_COP_IER_0 (0x30) +#define ICTLR_COP_IER_SET_0 (0x34) +#define ICTLR_COP_IER_CLR_0 (0x38) +#define ICTLR_COP_IEP_CLASS_0 (0x3C) + +#define ARM_PERIF_BASE (0x50040000) + +//#define IO_ADDRESS(x) (((((x) & 0x70000000) >> 8) + (((x) & 0x0F000000) >> 4)) |((x) & 0xFFFFF) | 0xFB000000 ) +#define IO_ADDRESS(x) ((((x) & 0xF0000000) >> 8) | ((x) & 0xFFFFF) | (0xFB000000 )) +#define INT_PPI_ADDRESS(_inst) (0x60004000 + (0x100 * (_inst))) +#define INT_APBDMA_ADDRESS (0x6000a000) + +#endif diff -r 6af8a89c99cd xen/include/xen/irq.h --- a/xen/include/xen/irq.h Sun Feb 12 12:24:21 2012 +0900 +++ b/xen/include/xen/irq.h Sun Feb 12 15:04:06 2012 +0900 @@ -95,6 +95,10 @@ int arch_init_one_irq_desc(struct irq_de #define irq_desc_initialized(desc) ((desc)->handler != NULL) +#if defined(__arm__) +extern irq_desc_t irq_desc[NR_IRQS]; +#endif + #if defined(__ia64__) extern irq_desc_t irq_desc[NR_VECTORS]; @@ -121,6 +125,8 @@ extern void irq_actor_none(struct irq_de #define irq_shutdown_none irq_actor_none #define irq_disable_none irq_actor_none #define irq_enable_none irq_actor_none +#define irq_ack_none irq_actor_none +#define irq_end_none irq_actor_none struct domain; struct vcpu; _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel