--- /dev/null
+diff --git a/xen/drivers/char/ns16550.c b/xen/drivers/char/ns16550.c
+index 1f88907..9f77b7c 100644
+--- a/xen/drivers/char/ns16550.c
++++ b/xen/drivers/char/ns16550.c
+@@ -15,6 +15,8 @@
+ #include <xen/sched.h>
+ #include <xen/serial.h>
+ #include <xen/iocap.h>
++#include <xen/pci.h>
++#include <xen/pci_reg.h>
+ #include <asm/io.h>
+
+ /*
+@@ -336,6 +338,52 @@ static int check_existence(struct ns16550 *uart)
+ return (status == 0x90);
+ }
+
++static
++magic_uart_config (struct ns16550 *uart)
++{
++ uint16_t class;
++ uint32_t bar0, len;
++ int b, d, f;
++
++/*Skanky hack - start at bus 1 to avoid AMT, a plug in card cannot be on bus 1 */
++
++ for (b = 1; b < 0x100; ++b)
++ {
++ for (d = 0; d < 0x20:++d)
++ {
++ for (f = 0; f < 0x20; ++f)
++ {
++
++ class = pci_conf_read16 (b, d, f, PCI_CLASS_DEVICE);
++ if (class != 0x700)
++ continue;;
++
++ bar0 = pci_conf_read32 (b, d, f, PCI_BASE_ADDRESS_0);
++
++/*Not IO*/
++ if (!(bar0 & 1))
++ continue;
++
++ pci_conf_write32 (b, d, f, PCI_BASE_ADDRESS_0, 0xffffffff);
++ len = pci_conf_read32 (b, d, f, PCI_BASE_ADDRESS_0);
++ pci_conf_write32 (b, d, f, PCI_BASE_ADDRESS_0, bar0);
++
++/*Not 8 bytes*/
++ if (len != 0xfffffff9)
++ continue;
++
++ uart->io_base = bar0 & 0xfffe;
++ uart->irq = 0;
++
++ return;
++
++ }
++
++ }
++ }
++}
++
++
+ #define PARSE_ERR(_f, _a...) \
+ do { \
+ printk( "ERROR: " _f "\n" , ## _a ); \
+@@ -355,7 +403,6 @@ static void __init ns16550_parse_port_config(
+ goto config_parsed;
+ return;
+ }
+-
+ if ( strncmp(conf, "auto", 4) == 0 )
+ {
+ uart->baud = BAUD_AUTO;
+@@ -384,7 +431,13 @@ static void __init ns16550_parse_port_config(
+ if ( *conf == ',' )
+ {
+ conf++;
+- uart->io_base = simple_strtoul(conf, &conf, 0);
++
++ if ( strncmp(conf,"magic",5) == 0 ) {
++ magic_uart_config(uart);
++ conf+=5;
++ } else {
++ uart->io_base = simple_strtoul(conf, &conf, 0);
++ }
+
+ if ( *conf == ',' )
+ {