[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Embedded-pv-devel] Xen bring up on TI DRA7xxx (J6) EVM



Hi Andril,

Thanks for the reply. I tried the u-boot patch suggested by you and also added the fdt entries for psci. Tried with the GLSDK6 (ti-glsdk_dra7xx-evm_6_10_00_02) kernel and I saw some progress in the booting. I added PPI interrupt in the dra7.dtsi file to the gic node -
interrupts = <1 9 0xf04>;

Now I am able to see the Xen console but dom0 kernel panics during "reserve_bootmem()" function execution. Here is the latest log -

U-Boot# fdt print /psci
psci {
ÂÂÂÂÂÂÂ cpu_on = <0x00000002>;
ÂÂÂÂÂÂÂ method = "hvc";
ÂÂÂÂÂÂÂ compatible = "arm,psci";
};
U-Boot# fdt print /chosen
chosen {
ÂÂÂÂÂÂÂ #size-cells = <0x00000001>;
ÂÂÂÂÂÂÂ #address-cells = <0x00000001>;
ÂÂÂÂÂÂÂ xen,dom0-bootargs = "console=hvc0 earlyprintk=xen debug ignore_loglevel root=/dev/mmcblk0p2 rw rootwait fixrtc";
ÂÂÂÂÂÂÂ xen,xen-bootargs = "sync_console console=dtuart dtuart=serial0";
ÂÂÂÂÂÂÂ modules {
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ module@0 {
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ reg = <0xa0000000 0x004b0000>;
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ compatible = "xen,linux-zimage", "xen,multiboot-module";
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ };
ÂÂÂÂÂÂÂ };
};
U-Boot# bootm $xen_addr_r - $dtb_addr_r
## Booting kernel from Legacy Image at 90000000 ...
ÂÂ Image Name:ÂÂ Xen-Trial-4.5
ÂÂ Image Type:ÂÂ ARM Linux Kernel Image (uncompressed)
ÂÂ Data Size:ÂÂÂ 689004 Bytes = 672.9 KiB
ÂÂ Load Address: 80200000
ÂÂ Entry Point:Â 80200000
ÂÂ Verifying Checksum ... OK
## Flattened Device Tree blob at 825f0000
ÂÂ Booting using the fdt blob at 0x825f0000
ÂÂ Loading Kernel Image ... OK
ÂÂ reserving fdt memory region: addr=825f0000 size=17000
ÂÂ Loading Device Tree to 8ffe6000, end 8fffffff ... OK
## Transferring control to Linux (at address 80200000)...

Starting kernel ...

- UART enabled -
- CPU 00000000 booting -
- Xen starting in Hyp mode -
- Zero BSS -
- Setting up control registers -
- Turning on paging -
- Ready -
(XEN) Checking for initrd in /chosen
(XEN) RAM: 0000000080000000 - 00000000dfffffff
(XEN)
(XEN) MODULE[0]: 000000008ffe6000 - 000000008fffd000 Device Tree
(XEN) MODULE[1]: 00000000a0000000 - 00000000a04b0000 Kernel
(XEN)Â RESVD[0]: 00000000825f0000 - 0000000082607000
(XEN)Â RESVD[1]: 000000008ffe6000 - 000000008fffd000
(XEN)
(XEN) Command line: sync_console console=dtuart dtuart=serial0
(XEN) Placing Xen at 0x00000000dfe00000-0x00000000e0000000
(XEN) Update BOOTMOD_XEN from 0000000080200000-00000000802f1701 => 00000000dfe00000-00000000dfef1701
(XEN) Xen heap: 00000000da000000-00000000de000000 (16384 pages)
(XEN) Dom heap: 376832 pages
(XEN) Domain heap initialised
(XEN) Looking for UART console serial0
ÂXen 4.5.1-rc1
(XEN) Xen version 4.5.1-rc1 (akshay@) (arm-linux-gnueabihf-gcc (crosstool-NG linaro-1.13.1-4.7-2013.03-20130313 - Linaro GCC 2013.03) 4.7.3 20130226 (prerelease)) debug=y Thu May 21 10:04:40 IST 2015
(XEN) Latest ChangeSet: Mon May 18 16:18:42 2015 +0200 git:0c4e0ef
(XEN) Console output is synchronous.
(XEN) Processor: 412fc0f2: "ARM Limited", variant: 0x2, part 0xc0f, rev 0x2
(XEN) 32-bit Execution:
(XEN)ÂÂ Processor Features: 00001131:00011011
(XEN)ÂÂÂÂ Instruction Sets: AArch32 A32 Thumb Thumb-2 ThumbEE Jazelle
(XEN)ÂÂÂÂ Extensions: GenericTimer Security
(XEN)ÂÂ Debug Features: 02010555
(XEN)ÂÂ Auxiliary Features: 00000000
(XEN)ÂÂ Memory Model Features: 10201105 20000000 01240000 02102211
(XEN)Â ISA Features: 02101110 13112111 21232041 11112131 10011142 00000000
(XEN) Platform: TI DRA7
(XEN) /psci method must be smc, but is: "hvc"
(XEN) Set AuxCoreBoot1 to 00000000dfe0004c (0020004c)
(XEN) Set AuxCoreBoot0 to 0x20
(XEN) Generic Timer IRQ: phys=30 hyp=26 virt=27
(XEN) Using generic timer at 6144 KHz
(XEN) GICv2 initialization:
(XEN)ÂÂÂÂÂÂÂÂ gic_dist_addr=0000000048211000
(XEN)ÂÂÂÂÂÂÂÂ gic_cpu_addr=0000000048212000
(XEN)ÂÂÂÂÂÂÂÂ gic_hyp_addr=0000000048214000
(XEN)ÂÂÂÂÂÂÂÂ gic_vcpu_addr=0000000048216000
(XEN)ÂÂÂÂÂÂÂÂ gic_maintenance_irq=25
(XEN) GICv2: 192 lines, 2 cpus, secure (IID 0000043b).
(XEN) Using scheduler: SMP Credit Scheduler (credit)
(XEN) I/O virtualisation disabled
(XEN) Allocated console ring of 16 KiB.
(XEN) VFP implementer 0x41 architecture 4 part 0x30 variant 0xf rev 0x0
(XEN) Bringing up CPU1
- CPU 00000001 booting -
- Xen starting in Hyp mode -
- Setting up control registers -
- Turning on paging -
- Ready -
(XEN) CPU 1 booted.
(XEN) Brought up 2 CPUs
(XEN) P2M: 40-bit IPA
(XEN) P2M: 3 levels with order-1 root, VTCR 0x80003558
(XEN) *** LOADING DOMAIN 0 ***
(XEN) Loading kernel from boot module @ 00000000a0000000
(XEN) Allocating 1:1 mappings totalling 128MB for dom0:
(XEN) BANK[0] 0x000000a8000000-0x000000b0000000 (128MB)
(XEN) Loading zImage from 00000000a0000000 to 00000000afa00000-00000000afeaa158
(XEN) Loading dom0 DTB to 0x00000000af800000-0x00000000af815904
(XEN) Scrubbing Free RAM on 1 nodes using 2 CPUs
(XEN) ......done.
(XEN) Initial low memory virq threshold set at 0x4000 pages.
(XEN) Std. Loglevel: All
(XEN) Guest Loglevel: All
(XEN) **********************************************
(XEN) ******* WARNING: CONSOLE OUTPUT IS SYNCHRONOUS
(XEN) ******* This option is intended to aid debugging of Xen by ensuring
(XEN) ******* that all output is synchronously delivered on the serial line.
(XEN) ******* However it can introduce SIGNIFICANT latencies and affect
(XEN) ******* timekeeping. It is NOT recommended for production use!
(XEN) **********************************************
(XEN) 3... 2... 1...
(XEN) *** Serial input -> DOM0 (type 'CTRL-a' three times to switch input to Xen)
(XEN) Freed 252kB init memory.
Booting Linux on physical CPU 0x0
Linux version 3.12.25-28678-gbe43a19-dirty (akshay@akshay-desktop) (gcc version 4.7.3 20130226 (prerelease) (crosstool-NG linaro-1.13.1-4.7-2013.03-20130313 - Linaro GCC 2013.03) ) #9 SMP PREEMPT Fri May 22 18:19:32 IST 2015
CPU: ARMv7 Processor [412fc0f2] revision 2 (ARMv7), cr=10c5387d
CPU: PIPT / VIPT nonaliasing data cache, PIPT instruction cache
Machine: Jacinto6 evm board, model: TI DRA7
debug: ignoring loglevel setting.
cma: CMA: reserved 64 MiB at 99000000
cma: CMA: reserved 56 MiB at 95800000
cma: CMA: reserved 8 MiB at 9f000000
cma: CMA: reserved 32 MiB at 9d000000
cma: CMA: reserved 24 MiB at ae000000
Memory policy: ECC disabled, Data cache writealloc
BUG: not creating mapping for 0x99000000 at 0xb1000000 in user region
BUG: not creating mapping for 0x95800000 at 0xad800000 in user region
BUG: not creating mapping for 0x9f000000 at 0xb7000000 in user region
BUG: not creating mapping for 0x9d000000 at 0xb5000000 in user region
OMAP4: Map 0xafe00000 to 0xfe600000 for dram barrier
------------[ cut here ]------------
Kernel BUG at c08d71c0 [verbose debug info unavailable]
Internal error: Oops - BUG: 0 [#1] PREEMPT SMP ARM
Modules linked in:
CPU: 0 PID: 0 Comm: swapper Not tainted 3.12.25-28678-gbe43a19-dirty #9
task: c091efa0 ti: c0914000 task.ti: c0914000
PC is at mark_bootmem+0xd4/0xec
LR is at reserve_bootmem+0x2c/0x30
pc : [<c08d71c0>]ÂÂÂ lr : [<c08d7c10>]ÂÂÂ psr: 600001d3
sp : c0915e78Â ip : c0915eb8Â fp : c0915eb4
r10: 00000001Â r9 : 0009f800Â r8 : 00008000
r7 : 00095800Â r6 : c0904ca4Â r5 : 00095800Â r4 : c0904c90
r3 : c0904ca4Â r2 : 00000001Â r1 : 0009f800Â r0 : 00095800
Flags: nZCv IRQs off FIQs off Mode SVC_32 ISA ARM Segment kernel
Control: 10c5387d Table: a800406a DAC: 00000015
Process swapper (pid: 0, stack limit = 0xc0914248)
Stack: (0xc0915e78 to 0xc0916000)
5e60:ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ 00000000 c0915e88
5e80: 000afe00 00000000 c0915ea4 000b0000 c09bb194 000a8000 000b0000 00008000
5ea0: 0000940e c095f218 c0915ec4 c0915eb8 c08d7c10 c08d70f8 c0915f04 c0915ec8
5ec0: c08be77c c08d7bf0 00000000 00001000 c0915eec c0915ee0 c08d8178 c08d812c
5ee0: 00000000 c099ce3c c7ded000 c095f088 000004df c08f7c10 c0915f54 c0915f08
5f00: c08c016c c08be624 c0915fcc 0000045f c08f7c10 00000653 ffff1000 000afdf1
5f20: 00001000 00000007 c08be5d4 c099cdd0 c0008000 c08f7c10 80000200 c0915fcc
5f40: c095f218 c08f9cb8 c0915fb4 c0915f58 c08bc1dc c08bf99c 00000000 10c5387d
5f60: c099c1c0 00000000 ffffffff e7ffffff 412fc0f2 00000000 c0915fa4 c0915f88
5f80: c0674378 c007d36c c07e15e4 00000001 c099c1c0 00000000 ffffffff e7ffffff
5fa0: 412fc0f2 00000000 c0915ff4 c0915fb8 c08b88b0 c08bbd98 00000000 00000000
5fc0: 00000000 00000000 00000000 c08f9cb8 00000000 10c5387d c091c494 c08f9cb4
5fe0: c091ff9c a800406a 00000000 c0915ff8 a8008074 c08b8840 00000000 00000000
Backtrace:
[<c08d70ec>] (mark_bootmem+0x0/0xec) from [<c08d7c10>] (reserve_bootmem+0x2c/0x30)
[<c08d7be4>] (reserve_bootmem+0x0/0x30) from [<c08be77c>] (bootmem_init+0x164/0x288)
[<c08be618>] (bootmem_init+0x0/0x288) from [<c08c016c>] (paging_init+0x7dc/0x894)
[<c08bf990>] (paging_init+0x0/0x894) from [<c08bc1dc>] (setup_arch+0x450/0x960)
[<c08bbd8c>] (setup_arch+0x0/0x960) from [<c08b88b0>] (start_kernel+0x7c/0x310)
[<c08b8834>] (start_kernel+0x0/0x310) from [<a8008074>] (0xa8008074)
Âr8:a800406a r7:c091ff9c r6:c08f9cb4 r5:c091c494 r4:10c5387d
Code: e2444014 e2843014 e1530006 1affffd7 (e7f001f2)
---[ end trace 1b75b31a2719ed1c ]---
Kernel panic - not syncing: Attempted to kill the idle task!

Is there anything I am missing in the kernel? You had mentioned about "hypervisor" node in the device tree along with chosen and psci nodes. Could you provide more information on that?

Thank you,
Akshay

On Wed, May 20, 2015 at 7:53 PM, Andrii Anisov <andrii.anisov@xxxxxxxxxxxxxxx> wrote:
Akshay,

At this point we are in the middle of GLSDK7 bringup with XEN, we were using GLSDK6 in our live demo. Moreover we even do not use GLSDK6 u-boot for our demo, derived at some point fromÂ

I would give you some hints to let you go further, more detailed description we would release once we done with GLSDK7.Â

You took wrong u-boot patch to switch OMAP like SoC to HYP mode. This oneÂhttp://u-boot.10912.n7.nabble.com/RFD-OMAP5-Working-HYP-mode-td163302.html is much closer to what you need, because it switches both cores to HYP and you do not need correspondent changes to XEN itself. Long time ago XEN community decided to lay on bootloader to switch to HYP mode all cores instead of keepin this code in hypervisor.

Except choosen and hypervisor nodes in device tree you would need also:
psci {
        compatible = "arm,psci";
        method = "hvc";
        cpu_on = <2>;
    };

And enablingÂÂCONFIG_ARM_PSCI=y in defconfig in order to have SMP in Linux.


Andrii Anisov | Team Lead
GlobalLogic
Kyiv, 03038, Protasov Business Park, M.Grinchenka, 2/1
P +38.044.492.9695x3664Â M +380505738852 ÂS andriyanisov
www.globallogic.com

http://www.globallogic.com/email_disclaimer.txt

On Wed, May 20, 2015 at 2:21 PM, akshay bhat <akshayabhat@xxxxxxxxx> wrote:
Hi,

I am trying to bring up on TI J6 EVM. Here are the steps I followed -
1. Cloned Xen from git://xenbits.xen.org/xen.git (checked out revision tag - xen-4.5.1-rc1).
2. Downloaded the TI GLSDK from - http://downloads.ti.com/dsps/dsps_public_sw/glsdk/7_00_00_04/index_FDS.html
ÂÂÂÂ U-boot version -Â 2014.07
ÂÂÂÂ Linux Kernel version - 3.14.31
3. Applied HYP mode patch to u-boot from - http://lists.denx.de/pipermail/u-boot/2015-January/202920.html which boots CPU0 in HYP mode.
4. Compiled Xen with - make dist-xen XEN_TARGET_ARCH=arm32 CROSS_COMPILE=arm-linux-gnueabihf- CONFIG_EARLY_PRINTK=dra7 debug=y
ÂÂÂ and mkimage -A arm -T kernel -a 0x80200000 -e 0x80200000 -C none -n "Xen-Trial-4.5" -d "xen/xen" xen-uImage
5. Enabled XEN related options in the kernel config and compiled the Linux kernel and generated zImage and dra7-evm-lcd7.dtb (no changes in the TI Kernel source).
6. Booted the board with the above images and used the env settings from - http://wiki.xenproject.org/wiki/Xen_ARM_with_Virtualization_Extensions/OMAP5432_uEVM

When I tried to boot XEN with the steps above, Xen hung with the error -
(XEN) Using generic timer at 0 KHz
(XEN) GICv2 initialization:
(XEN)ÂÂÂÂÂÂÂÂ gic_dist_addr=0000000048211000
(XEN)ÂÂÂÂÂÂÂÂ gic_cpu_addr=0000000048212000
(XEN)ÂÂÂÂÂÂÂÂ gic_hyp_addr=0000000048214000
(XEN)ÂÂÂÂÂÂÂÂ gic_vcpu_addr=0000000048216000
(XEN)ÂÂÂÂÂÂÂÂ gic_maintenance_irq=25
(XEN) GICv2: 192 lines, 2 cpus, secure (IID 0000043b).
(XEN) Using scheduler: SMP Credit Scheduler (credit)
(XEN) I/O virtualisation disabled
(XEN) Allocated console ring of 16 KiB.
(XEN) VFP implementer 0x41 architecture 4 part 0x30 variant 0xf rev 0x0
(XEN) Bringing up CPU1
- CPU 00000001 booting -
- Xen must be entered in NS Hyp mode -
- Boot failed -

So, CPU1 was still in non-HYP mode. Then I applied the patch from - http://lists.xen.org/archives/html/xen-devel/2014-02/msg01575.html
Now CPU1 boots up but nothing happens after that. Here is the log -

U-Boot# fdt print /chosen
chosen {
ÂÂÂÂÂÂÂ #size-cells = <0x00000001>;
ÂÂÂÂÂÂÂ #address-cells = <0x00000001>;
ÂÂÂÂÂÂÂ xen,dom0-bootargs = "console=hvc0 earlyprintk=xen debug ignore_loglevel root=/dev/mmcblk0p2 rw rootwait fixrtc";
ÂÂÂÂÂÂÂ xen,xen-bootargs = "sync_console console=dtuart dtuart=serial2";
ÂÂÂÂÂÂÂ bootargs = "elevator=noop console=ttyO0,115200n8 root=/dev/mmcblk1p2 rw rootwait earlyprintk fixrtc omapdrm.num_crtc=2 consoleblank=0 cma=64M rootfstype=ext4";
ÂÂÂÂÂÂÂ modules {
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ module@0 {
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ reg = <0xa0000000 0x004b0000>;
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ compatible = "xen,linux-zimage", "xen,multiboot-module";
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ };
ÂÂÂÂÂÂÂ };
};
U-Boot# bootm $xen_addr_r - $dtb_addr_r
## Booting kernel from Legacy Image at 90000000 ...
ÂÂ Image Name:ÂÂ Xen-Trial-4.5
ÂÂ Image Type:ÂÂ ARM Linux Kernel Image (uncompressed)
ÂÂ Data Size:ÂÂÂ 689004 Bytes = 672.9 KiB
ÂÂ Load Address: 80200000
ÂÂ Entry Point:Â 80200000
ÂÂ Verifying Checksum ... OK
## Flattened Device Tree blob at 825f0000
ÂÂ Booting using the fdt blob at 0x825f0000
ÂÂ Loading Kernel Image ... OK
ÂÂ reserving fdt memory region: addr=825f0000 size=17000
ÂÂ Loading Device Tree to 8ffe6000, end 8fffffff ... OK

Starting kernel ...

- UART enabled -
- CPU 00000000 booting -
- Xen starting in Hyp mode -
- Zero BSS -
- Setting up control registers -
- Turning on paging -
- Ready -
(XEN) Checking for initrd in /chosen
(XEN) RAM: 0000000080000000 - 00000000dfffffff
(XEN)
(XEN) MODULE[0]: 000000008ffe6000 - 000000008fffd000 Device Tree
(XEN) MODULE[1]: 00000000a0000000 - 00000000a04b0000 Kernel
(XEN)Â RESVD[0]: 00000000825f0000 - 0000000082607000
(XEN)Â RESVD[1]: 000000008ffe6000 - 000000008fffd000
(XEN)
(XEN) Command line: sync_console console=dtuart dtuart=serial2
(XEN) Placing Xen at 0x00000000dfe00000-0x00000000e0000000
(XEN) Update BOOTMOD_XEN from 0000000080200000-00000000802f1701 => 00000000dfe00000-00000000dfef1701
(XEN) Xen heap: 00000000da000000-00000000de000000 (16384 pages)
(XEN) Dom heap: 376832 pages
(XEN) Domain heap initialised
(XEN) Looking for UART console serial2
(XEN) omap-uart: Unable to retrieve the IRQ
(XEN) Unable to initialize serial: -22
(XEN) Bad console= option 'dtuart'
ÂXen 4.5.1-rc1
(XEN) Xen version 4.5.1-rc1 (akshay@) (arm-linux-gnueabihf-gcc (crosstool-NG linaro-1.13.1-4.7-2013.03-20130313 - Linaro GCC 2013.03) 4.7.3 20130226 (prerelease)) debug=y Wed May 20 16:37:47 IST 2015
(XEN) Latest ChangeSet: Mon May 18 16:18:42 2015 +0200 git:0c4e0ef-dirty
(XEN) Console output is synchronous.
(XEN) Processor: 412fc0f2: "ARM Limited", variant: 0x2, part 0xc0f, rev 0x2
(XEN) 32-bit Execution:
(XEN)ÂÂ Processor Features: 00001131:00011011
(XEN)ÂÂÂÂ Instruction Sets: AArch32 A32 Thumb Thumb-2 ThumbEE Jazelle
(XEN)ÂÂÂÂ Extensions: GenericTimer Security
(XEN)ÂÂ Debug Features: 02010555
(XEN)ÂÂ Auxiliary Features: 00000000
(XEN)ÂÂ Memory Model Features: 10201105 20000000 01240000 02102211
(XEN)Â ISA Features: 02101110 13112111 21232041 11112131 10011142 00000000
(XEN) Platform: TI DRA7
(XEN) Set AuxCoreBoot1 to 00000000dfe0004c (0020004c)
(XEN) Set AuxCoreBoot0 to 0x20
(XEN) Generic Timer IRQ: phys=30 hyp=26 virt=27
(XEN) Using generic timer at 0 KHz
(XEN) GICv2 initialization:
(XEN)ÂÂÂÂÂÂÂÂ gic_dist_addr=0000000048211000
(XEN)ÂÂÂÂÂÂÂÂ gic_cpu_addr=0000000048212000
(XEN)ÂÂÂÂÂÂÂÂ gic_hyp_addr=0000000048214000
(XEN)ÂÂÂÂÂÂÂÂ gic_vcpu_addr=0000000048216000
(XEN)ÂÂÂÂÂÂÂÂ gic_maintenance_irq=25
(XEN) GICv2: 192 lines, 2 cpus, secure (IID 0000043b).
(XEN) Using scheduler: SMP Credit Scheduler (credit)
(XEN) I/O virtualisation disabled
(XEN) Allocated console ring of 16 KiB.
(XEN) VFP implementer 0x41 architecture 4 part 0x30 variant 0xf rev 0x0
(XEN) Bringing up CPU1
- CPU 00000001 booting -
- NOT HYP, setting it ... -
- Xen starting in Hyp mode -
- Setting up control registers -
- Turning on paging -
- Ready -
(XEN) CPU 1 booted.

After this nothing happens on the console.

Please could anyone help me out with this issue? Am I missing any patches in u-boot/Xen/Kernel?
Is there any Wiki page with full instructions to bring up Xen on DRA7xx?

--

Thank You,
Akshay



_______________________________________________
Embedded-pv-devel mailing list
Embedded-pv-devel@xxxxxxxxxxxxxxxxxxxx
http://lists.xenproject.org/cgi-bin/mailman/listinfo/embedded-pv-devel





_______________________________________________
Embedded-pv-devel mailing list
Embedded-pv-devel@xxxxxxxxxxxxxxxxxxxx
http://lists.xenproject.org/cgi-bin/mailman/listinfo/embedded-pv-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.