#include "sim/builder.hh"
 #include "sim/param.hh"
 #include "sim/universe.hh"
+#include "dev/tsunamireg.h"
 
 using namespace std;
 
                 if(config.data[offset] & 0x1) {
                     *(uint32_t *)&config.data[offset] = (word_value & ~0x3) |
                         (config.data[offset] & 0x3);
-                    if (word_value) {
+
+                    if (word_value & ~0x1) {
                         // It's never been set
                         if (BARAddrs[barnum] == 0)
-                            AddMapping(word_value, BARSize[barnum]-1, MMU);
+                            AddMapping((word_value & ~0x1) + TSUNAMI_PCI0_IO,
+                                       BARSize[barnum]-1, MMU);
                         else
                             ChangeMapping(BARAddrs[barnum], BARSize[barnum]-1,
-                                          word_value, BARSize[barnum]-1, MMU);
-                        BARAddrs[barnum] = word_value;
+                                          (word_value & ~0x1) + TSUNAMI_PCI0_IO,
+                                          BARSize[barnum]-1, MMU);
+                        BARAddrs[barnum] = (word_value & ~0x1) + TSUNAMI_PCI0_IO;
                     }
 
                 } else {
                     // This is memory space, bottom four bits are read only
                     *(uint32_t *)&config.data[offset] = (word_value & ~0xF) |
                         (config.data[offset] & 0xF);
-                }
+
+                    if (word_value & ~0x3) {
+                        // It's never been set
+                        if (BARAddrs[barnum] == 0)
+                            AddMapping((word_value & ~0x3) + TSUNAMI_PCI0_MEMORY,
+                                       BARSize[barnum]-1, MMU);
+                        else
+                            ChangeMapping(BARAddrs[barnum], BARSize[barnum]-1,
+                                          (word_value & ~0x3) +
+                                          TSUNAMI_PCI0_MEMORY,
+                                          BARSize[barnum]-1, MMU);
+                        BARAddrs[barnum] = (word_value & ~0x3) +
+                                           TSUNAMI_PCI0_MEMORY;
+                    }
+                 }
             }
             break;
 
 
 #ifndef __TSUNAMIREG_H__
 #define __TSUNAMIREG_H__
 
+#define ALPHA_K0SEG_BASE  0xfffffc0000000000
+
 // CChip Registers
 #define TSDEV_CC_CSR    0x00
 #define TSDEV_CC_MTR    0x01
 #define RTC_CONTROL_REGISTERD   13     // control register D
 #define RTC_REGNUMBER_RTC_CR1   0x6A   // control register 1
 
+#define PCHIP_PCI0_MEMORY       0x10000000000
+#define PCHIP_PCI0_IO           0x101FC000000
+#define TSUNAMI_PCI0_MEMORY     ALPHA_K0SEG_BASE + PCHIP_PCI0_MEMORY
+#define TSUNAMI_PCI0_IO         ALPHA_K0SEG_BASE + PCHIP_PCI0_IO
+
 
 #endif // __TSUNAMIREG_H__