Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


f9c7d1aee87041d5d1f3f84f4175c72f277b9abc
[palacios.git] / palacios / src / devices / pci.c
1 /* 
2  * This file is part of the Palacios Virtual Machine Monitor developed
3  * by the V3VEE Project with funding from the United States National 
4  * Science Foundation and the Department of Energy.  
5  *
6  * The V3VEE Project is a joint project between Northwestern University
7  * and the University of New Mexico.  You can find out more at 
8  * http://www.v3vee.org
9  *
10  * Copyright (c) 2009, Jack Lange <jarusl@cs.northwestern.edu>
11  * Copyright (c) 2009, Lei Xia <lxia@northwestern.edu>
12  * Copyright (c) 2009, Chang Seok Bae <jhuell@gmail.com>
13  * Copyright (c) 2009, The V3VEE Project <http://www.v3vee.org> 
14  * All rights reserved.
15  *
16  * Author:  Jack Lange <jarusl@cs.northwestern.edu>
17  *          Lei Xia <lxia@northwestern.edu>
18  *          Chang Seok Bae <jhuell@gmail.com>
19  *
20  * This is free software.  You are permitted to use,
21  * redistribute, and modify it as specified in the file "V3VEE_LICENSE".
22  */ 
23  
24  
25
26 #include <palacios/vmm.h>
27 #include <palacios/vmm_types.h>
28 #include <palacios/vmm_io.h>
29 #include <palacios/vmm_intr.h>
30 #include <palacios/vmm_rbtree.h>
31 #include <palacios/vmm_dev_mgr.h>
32
33 #include <devices/pci.h>
34 #include <devices/pci_types.h>
35
36 #include <palacios/vm_guest.h>
37 #include <palacios/vm_guest_mem.h>
38
39
40 #include <devices/apic.h>
41
42
43 #ifndef V3_CONFIG_DEBUG_PCI
44 #undef PrintDebug
45 #define PrintDebug(fmt, args...)
46 #endif
47
48
49 #define CONFIG_ADDR_PORT    0x0cf8
50 #define CONFIG_DATA_PORT    0x0cfc
51
52 #define PCI_DEV_IO_PORT_BASE 0xc000
53
54 #define PCI_BUS_COUNT 1
55
56 // This must always be a multiple of 8
57 #define MAX_BUS_DEVICES 32
58
59 #define PCI_CAP_ID_MSI 0x05
60 #define PCI_CAP_ID_MSIX 0x11
61
62
63 struct pci_addr_reg {
64     union {
65         uint32_t val;
66         struct {
67             uint_t rsvd       : 2;
68             uint_t reg_num    : 6;
69             uint_t fn_num     : 3;
70             uint_t dev_num    : 5;
71             uint_t bus_num    : 8;
72             uint_t hi_reg_num : 4;
73             uint_t rsvd2      : 3;
74             uint_t enable     : 1;
75         } __attribute__((packed));
76     } __attribute__((packed));
77 } __attribute__((packed));
78
79
80
81
82
83 struct pci_bus {
84     int bus_num;
85
86     // Red Black tree containing all attached devices
87     struct rb_root devices;
88
89     // Bitmap of the allocated device numbers
90     uint8_t dev_map[MAX_BUS_DEVICES / 8];
91
92
93     int (*raise_pci_irq)(struct pci_device * pci_dev, void * dev_data, struct v3_irq * vec);
94     int (*lower_pci_irq)(struct pci_device * pci_dev, void * dev_data, struct v3_irq * vec);
95     void * irq_dev_data;
96 };
97
98
99
100 struct pci_internal {
101     // Configuration address register
102     struct pci_addr_reg addr_reg;
103
104     // Base IO Port which PCI devices will register with...
105     uint16_t dev_io_base; 
106
107     // Attached Busses
108     struct pci_bus bus_list[PCI_BUS_COUNT];
109 };
110
111
112
113 struct cfg_range_hook {
114     uint32_t start;
115     uint32_t length;
116
117     int (*write)(struct pci_device * pci_dev, uint32_t offset, 
118                  void * src, uint_t length, void * private_data);
119
120     int (*read)(struct pci_device * pci_dev, uint32_t offset, 
121                 void * dst, uint_t length, void * private_data);
122
123     void * private_data;
124
125     struct list_head list_node;
126 };
127
128
129
130 struct pci_cap {
131     uint8_t id;
132     uint32_t offset;
133     uint8_t enabled;
134
135     struct list_head cap_node;
136 };
137
138
139 // These mark read only fields in the pci config header. 
140 // If a bit is 1, then the field is writable in the header
141 /* Notes: 
142  * BIST is disabled by default (All writes to it will be dropped 
143  * Cardbus CIS is disabled (All writes are dropped)
144  * Writes to capability pointer are disabled
145  */
146 static uint8_t pci_hdr_write_mask_00[64] = { 0x00, 0x00, 0x00, 0x00, /* Device ID, Vendor ID */
147                                              0xbf, 0xff, 0x00, 0xf9, /* Command, status */
148                                              0x00, 0x00, 0x00, 0x00, /* Revision ID, Class code */
149                                              0x00, 0xff, 0x00, 0x00, /* CacheLine Size, Latency Timer, Header Type, BIST */
150                                              0xff, 0xff, 0xff, 0xff, /* BAR 0 */
151                                              0xff, 0xff, 0xff, 0xff, /* BAR 1 */
152                                              0xff, 0xff, 0xff, 0xff, /* BAR 2 */
153                                              0xff, 0xff, 0xff, 0xff, /* BAR 3 */
154                                              0xff, 0xff, 0xff, 0xff, /* BAR 4 */
155                                              0xff, 0xff, 0xff, 0xff, /* BAR 5 */
156                                              0x00, 0x00, 0x00, 0x00, /* CardBus CIS Ptr */
157                                              0xff, 0xff, 0xff, 0xff, /* SubSystem Vendor ID, SubSystem ID */
158                                              0xff, 0xff, 0xff, 0xff, /* ExpRom BAR */
159                                              0x00, 0x00, 0x00, 0x00, /* CAP ptr (0xfc to enable), RSVD */
160                                              0x00, 0x00, 0x00, 0x00, /* Reserved */
161                                              0xff, 0x00, 0x00, 0x00 /* INTR Line, INTR Pin, MIN_GNT, MAX_LAT */
162 }; 
163
164
165
166
167 #ifdef V3_CONFIG_DEBUG_PCI
168
169 static void pci_dump_state(struct pci_internal * pci_state) {
170     struct rb_node * node = v3_rb_first(&(pci_state->bus_list[0].devices));
171     struct pci_device * tmp_dev = NULL;
172     
173     PrintDebug(VM_NONE, VCORE_NONE, "===PCI: Dumping state Begin ==========\n");
174     
175     do {
176         tmp_dev = rb_entry(node, struct pci_device, dev_tree_node);
177
178         PrintDebug(VM_NONE, VCORE_NONE, "PCI Device Number: %d (%s):\n", tmp_dev->dev_num,  tmp_dev->name);
179         PrintDebug(VM_NONE, VCORE_NONE, "irq = %d\n", tmp_dev->config_header.intr_line);
180         PrintDebug(VM_NONE, VCORE_NONE, "Vend ID: 0x%x\n", tmp_dev->config_header.vendor_id);
181         PrintDebug(VM_NONE, VCORE_NONE, "Device ID: 0x%x\n", tmp_dev->config_header.device_id);
182
183     } while ((node = v3_rb_next(node)));
184     
185     PrintDebug(VM_NONE, VCORE_NONE, "====PCI: Dumping state End==========\n");
186 }
187
188 #endif
189
190
191
192
193 // Scan the dev_map bitmap for the first '0' bit
194 static int get_free_dev_num(struct pci_bus * bus) {
195     int i, j;
196
197     for (i = 0; i < sizeof(bus->dev_map); i++) {
198         PrintDebug(VM_NONE, VCORE_NONE, "i=%d\n", i);
199         if (bus->dev_map[i] != 0xff) {
200             // availability
201             for (j = 0; j < 8; j++) {
202                 PrintDebug(VM_NONE, VCORE_NONE, "\tj=%d\n", j);
203                 if (!(bus->dev_map[i] & (0x1 << j))) {
204                     return ((i * 8) + j);
205                 }
206             }
207         }
208     }
209
210     return -1;
211 }
212
213 static void allocate_dev_num(struct pci_bus * bus, int dev_num) {
214     int major = (dev_num / 8);
215     int minor = dev_num % 8;
216
217     bus->dev_map[major] |= (0x1 << minor);
218 }
219
220
221
222 static inline 
223 struct pci_device * __add_device_to_bus(struct pci_bus * bus, struct pci_device * dev) {
224
225   struct rb_node ** p = &(bus->devices.rb_node);
226   struct rb_node * parent = NULL;
227   struct pci_device * tmp_dev = NULL;
228
229   while (*p) {
230     parent = *p;
231     tmp_dev = rb_entry(parent, struct pci_device, dev_tree_node);
232
233     if (dev->devfn < tmp_dev->devfn) {
234       p = &(*p)->rb_left;
235     } else if (dev->devfn > tmp_dev->devfn) {
236       p = &(*p)->rb_right;
237     } else {
238       return tmp_dev;
239     }
240   }
241
242   rb_link_node(&(dev->dev_tree_node), parent, p);
243
244   return NULL;
245 }
246
247
248 static inline 
249 struct pci_device * add_device_to_bus(struct pci_bus * bus, struct pci_device * dev) {
250
251   struct pci_device * ret = NULL;
252
253   if ((ret = __add_device_to_bus(bus, dev))) {
254     return ret;
255   }
256
257   v3_rb_insert_color(&(dev->dev_tree_node), &(bus->devices));
258
259   allocate_dev_num(bus, dev->dev_num);
260
261   return NULL;
262 }
263
264
265 static struct pci_device * get_device(struct pci_bus * bus, uint8_t dev_num, uint8_t fn_num) {
266     struct rb_node * n = bus->devices.rb_node;
267     struct pci_device * dev = NULL;
268     uint8_t devfn = ((dev_num & 0x1f) << 3) | (fn_num & 0x7);
269
270     while (n) {
271         dev = rb_entry(n, struct pci_device, dev_tree_node);
272         
273         if (devfn < dev->devfn) {
274             n = n->rb_left;
275         } else if (devfn > dev->devfn) {
276             n = n->rb_right;
277         } else {
278             return dev;
279         }
280     }
281     
282     return NULL;
283 }
284
285
286
287
288 // There won't be many hooks at all, so unordered lists are acceptible for now 
289 static struct cfg_range_hook * find_cfg_range_hook(struct pci_device * pci, uint32_t start, uint32_t length) {
290     uint32_t end = start + length - 1; // end is inclusive
291     struct cfg_range_hook * hook = NULL;
292
293     list_for_each_entry(hook, &(pci->cfg_hooks), list_node) {
294         uint32_t hook_end = hook->start + hook->length - 1;
295         if (!((hook->start > end) || (hook_end < start))) {
296             return hook;
297         }
298     }
299     
300     return NULL;
301 }
302
303
304 int v3_pci_hook_config_range(struct pci_device * pci, 
305                              uint32_t start, uint32_t length, 
306                              int (*write)(struct pci_device * pci_dev, uint32_t offset, 
307                                                  void * src, uint_t length, void * private_data), 
308                              int (*read)(struct pci_device * pci_dev, uint32_t offset, 
309                                                 void * dst, uint_t length, void * private_data), 
310                              void * private_data) {
311     struct cfg_range_hook * hook = NULL;    
312     
313
314     if (find_cfg_range_hook(pci, start, length)) {
315         PrintError(VM_NONE, VCORE_NONE, "Tried to hook an already hooked config region\n");
316         return -1;
317     }
318     
319     hook = V3_Malloc(sizeof(struct cfg_range_hook));
320
321     if (!hook) {
322         PrintError(VM_NONE, VCORE_NONE, "Could not allocate range hook\n");
323         return -1;
324     }
325
326     memset(hook, 0, sizeof(struct cfg_range_hook));
327
328     hook->start = start;
329     hook->length = length;
330     hook->private_data = private_data;
331     hook->write = write;
332     hook->read = read;
333
334     list_add(&(hook->list_node), &(pci->cfg_hooks));
335
336     return 0;
337
338 }
339
340
341
342
343 // Note byte ordering: LSB -> MSB
344 static uint8_t msi_32_rw_bitmask[10] = { 0x00, 0x00,                     /* ID, next ptr */
345                                          0x71, 0x00,                     /* MSG CTRL */
346                                          0xfc, 0xff, 0xff, 0xff,         /* MSG ADDR */
347                                          0xff, 0xff};                    /* MSG DATA */
348
349 static uint8_t msi_64_rw_bitmask[14] = { 0x00, 0x00,                     /* ID, next ptr */
350                                          0x71, 0x00,                     /* MSG CTRL */
351                                          0xfc, 0xff, 0xff, 0xff,         /* MSG LO ADDR */
352                                          0xff, 0xff, 0xff, 0xff,         /* MSG HI ADDR */
353                                          0xff, 0xff};                    /* MSG DATA */
354
355 static uint8_t msi_64pervect_rw_bitmask[24] = { 0x00, 0x00,              /* ID, next ptr */
356                                                 0x71, 0x00,              /* MSG CTRL */
357                                                 0xfc, 0xff, 0xff, 0xff,  /* MSG LO CTRL */
358                                                 0xff, 0xff, 0xff, 0xff,  /* MSG HI ADDR */
359                                                 0xff, 0xff,              /* MSG DATA */
360                                                 0x00, 0x00,              /* RSVD */
361                                                 0xff, 0xff, 0xff, 0xff,  
362                                                 0x00, 0x00, 0x00, 0x00}; 
363
364 static uint8_t msix_rw_bitmask[12] = { 0x00, 0x00,                       /* ID, next ptr */
365                                        0x00, 0x80, 
366                                        0xff, 0xff, 0xff, 0xff,
367                                        0x08, 0xff, 0xff, 0xff};
368
369
370 /* I am completely guessing what the format is here. 
371    I only have version 1 of the PCIe spec and cannot download version 2 or 3 
372    without paying the PCI-SIG $3000 a year for membership. 
373    So this is just cobbled together from the version 1 spec and KVM. 
374 */ 
375
376
377 static uint8_t pciev1_rw_bitmask[20] = { 0x00, 0x00, /* ID, next ptr */
378                                          0x00, 0x00, /* PCIE CAP register */
379                                          0x00, 0x00, 0x00, 0x00, /* DEV CAP */
380                                          0xff, 0xff, /* DEV CTRL */
381                                          0x0f, 0x00, /* DEV STATUS */
382                                          0x00, 0x00, 0x00, 0x00, /* LINK CAP */
383                                          0xfb, 0x01, /* LINK CTRL */
384                                          0x00, 0x00  /* LINK STATUS */ 
385 };
386
387
388 static uint8_t pciev2_rw_bitmask[60] = { 0x00, 0x00, /* ID, next ptr */
389                                          0x00, 0x00, /* PCIE CAP register */
390                                          0x00, 0x00, 0x00, 0x00, /* DEV CAP */
391                                          0xff, 0xff, /* DEV CTRL */
392                                          0x0f, 0x00, /* DEV STATUS */
393                                          0x00, 0x00, 0x00, 0x00, /* LINK CAP */
394                                          0xfb, 0x01, /* LINK CTRL */
395                                          0x00, 0x00, /* LINK STATUS */ 
396                                          0x00, 0x00, 0x00, 0x00, /* SLOT CAP ?? */
397                                          0x00, 0x00, /* SLOT CTRL ?? */
398                                          0x00, 0x00, /* SLOT STATUS */
399                                          0x00, 0x00, /* ROOT CTRL */
400                                          0x00, 0x00, /* ROOT CAP */
401                                          0x00, 0x00, 0x00, 0x00, /* ROOT STATUS */
402                                          0x00, 0x00, 0x00, 0x00, /* WHO THE FUCK KNOWS */
403                                          0x00, 0x00, 0x00, 0x00, 
404                                          0x00, 0x00, 0x00, 0x00, 
405                                          0x00, 0x00, 0x00, 0x00, 
406                                          0x00, 0x00, 0x00, 0x00 
407 };
408
409 static uint8_t pm_rw_bitmask[] = { 0x00, 0x00, /* ID, next ptr */
410                                    0x00, 0x00, /* PWR MGMT CAPS */
411                                    0x03, 0x9f, /* PWR MGMT CTRL */
412                                    0x00, 0x00  /* PMCSR_BSE, Data */
413 };
414
415
416
417 int cap_write(struct pci_device * pci, uint32_t offset, void * src, uint_t length, void * private_data) {
418     struct pci_cap * cap = private_data;
419     uint32_t cap_offset = cap->offset;
420     pci_cap_type_t cap_type = cap->id;
421
422     uint32_t write_offset = offset - cap_offset;
423     void * cap_ptr = &(pci->config_space[cap_offset + 2]);    
424     int i = 0;
425
426     int msi_was_enabled = 0;
427     int msix_was_enabled = 0;
428
429
430     V3_Print(VM_NONE, VCORE_NONE, "CAP write trapped (val=%x, cfg_offset=%d, write_offset=%d)\n", *(uint32_t *)src, offset, write_offset);
431
432     if (cap_type == PCI_CAP_MSI) {
433         struct msi_msg_ctrl * msg_ctrl = cap_ptr;
434
435         if (msg_ctrl->msi_enable == 1) {
436             msi_was_enabled = 1;
437         }
438     } else if (cap_type == PCI_CAP_MSIX) {
439         struct msix_cap * msix_cap = cap_ptr;
440
441         if (msix_cap->msg_ctrl.msix_enable == 1) {
442             msix_was_enabled = 1;
443         }
444     }
445
446     for (i = 0; i < length; i++) {
447         uint8_t mask = 0;
448
449         if (cap_type == PCI_CAP_MSI) {
450             struct msi_msg_ctrl * msg_ctrl = cap_ptr;
451
452             V3_Print(VM_NONE, VCORE_NONE, "MSI Cap Ctrl=%x\n", *(uint16_t *)pci->msi_cap);
453             V3_Print(VM_NONE, VCORE_NONE, "MSI ADDR=%x\n", *(uint32_t *)(cap_ptr + 2));
454             V3_Print(VM_NONE, VCORE_NONE, "MSI HI ADDR=%x\n", *(uint32_t *)(cap_ptr + 6));
455             V3_Print(VM_NONE, VCORE_NONE, "MSI Data=%x\n", *(uint16_t *)(cap_ptr + 10));
456
457             if (msg_ctrl->cap_64bit) {
458                 if (msg_ctrl->per_vect_mask) {
459                     mask = msi_64pervect_rw_bitmask[write_offset];
460                 } else {
461                     mask = msi_64_rw_bitmask[write_offset];
462                 }
463             } else {
464                 mask = msi_32_rw_bitmask[write_offset];
465             }
466         } else if (cap_type == PCI_CAP_MSIX) {
467             mask = msix_rw_bitmask[write_offset];
468         } else if (cap_type == PCI_CAP_PCIE) {
469             struct pcie_cap_reg * pcie_cap = cap_ptr;
470
471             if (pcie_cap->version == 1) {
472                 mask = pciev1_rw_bitmask[write_offset];
473             } else if (pcie_cap->version == 2) {
474                 mask = pciev2_rw_bitmask[write_offset];
475             } else {
476                 return 0;
477             }
478         } else if (cap_type == PCI_CAP_PM) {
479             mask = pm_rw_bitmask[write_offset];
480         }
481
482         pci->config_space[offset + i] &= ~mask;
483         pci->config_space[offset + i] |= ((*(uint8_t *)(src + i)) & mask);
484
485         write_offset++;
486     }
487
488
489     if (pci->cmd_update) {
490
491         /* Detect changes to interrupt types for cmd updates */
492         if (cap_type == PCI_CAP_MSI) {
493             struct msi_msg_ctrl * msg_ctrl = cap_ptr;
494             
495             V3_Print(VM_NONE, VCORE_NONE, "msi_was_enabled=%d, msi_is_enabled=%d\n", msi_was_enabled,  msg_ctrl->msi_enable);
496
497             if ((msg_ctrl->msi_enable == 1) && (msi_was_enabled == 0)) {
498                 pci->irq_type = IRQ_MSI;
499                 pci->cmd_update(pci, PCI_CMD_MSI_ENABLE, msg_ctrl->mult_msg_enable, pci->priv_data);
500             } else if ((msg_ctrl->msi_enable == 0) && (msi_was_enabled == 1)) {
501                 pci->irq_type = IRQ_NONE;
502                 pci->cmd_update(pci, PCI_CMD_MSI_DISABLE, 0, pci->priv_data);
503             }
504         } else if (cap_type == PCI_CAP_MSIX) {
505             struct msix_cap * msix_cap = cap_ptr;
506
507             if ((msix_cap->msg_ctrl.msix_enable == 1) && (msix_was_enabled == 0)) {
508                 pci->irq_type = IRQ_MSIX;
509                 pci->cmd_update(pci, PCI_CMD_MSIX_ENABLE, msix_cap->msg_ctrl.table_size, pci->priv_data);
510             } else if ((msix_cap->msg_ctrl.msix_enable == 0) && (msix_was_enabled == 1)) {
511                 pci->irq_type = IRQ_NONE;
512                 pci->cmd_update(pci, PCI_CMD_MSIX_DISABLE, msix_cap->msg_ctrl.table_size, pci->priv_data);
513             }
514         }
515     }
516
517     return 0;
518 }
519
520
521 static int init_pci_cap(struct pci_device * pci, pci_cap_type_t cap_type, uint_t cap_offset) {
522     void * cap_ptr = &(pci->config_space[cap_offset + 2]);
523
524     if (cap_type == PCI_CAP_MSI) {
525         struct msi32_msg_addr * msi = cap_ptr;
526
527         // We only expose a basic 32 bit MSI interface
528         msi->msg_ctrl.msi_enable = 0;
529         msi->msg_ctrl.mult_msg_enable = 0;
530         msi->msg_ctrl.cap_64bit = 0;
531         msi->msg_ctrl.per_vect_mask = 0;
532         
533         msi->addr.val = 0; 
534         msi->data.val = 0;
535
536     } else if (cap_type == PCI_CAP_MSIX) {
537         
538         
539
540     } else if (cap_type == PCI_CAP_PCIE) {
541         struct pcie_cap_v2 * pcie = cap_ptr;
542         
543         // The v1 and v2 formats are identical for the first X bytes
544         // So we use the v2 struct, and only modify extended fields if v2 is detected
545         
546         pcie->dev_cap.fn_level_reset = 0;
547         
548         pcie->dev_ctrl.val &= 0x70e0; // only preserve max_payload_size and max_read_req_size untouched
549         pcie->dev_ctrl.relaxed_order_enable = 1;
550         pcie->dev_ctrl.no_snoop_enable = 1;
551
552         pcie->dev_status.val = 0;
553
554         pcie->link_cap.val &= 0x0003ffff;
555
556         pcie->link_status.val &= 0x03ff;
557         
558         if (pcie->pcie_cap.version >= 2) {
559             pcie->slot_cap = 0;
560             pcie->slot_ctrl = 0;
561             pcie->slot_status = 0;
562
563             pcie->root_ctrl = 0;
564             pcie->root_cap = 0;
565             pcie->root_status = 0;
566         }
567     } else if (cap_type == PCI_CAP_PM) {
568
569     }
570
571
572     return 0;
573 }
574
575
576 // enumerate all capabilities and disable them.
577 static int scan_pci_caps(struct pci_device * pci) {
578     uint_t cap_offset = pci->config_header.cap_ptr;
579         
580     V3_Print(VM_NONE, VCORE_NONE, "Scanning for Capabilities (cap_offset=%d)\n", cap_offset);
581
582     while (cap_offset != 0) {
583         uint8_t id = pci->config_space[cap_offset];
584         uint8_t next = pci->config_space[cap_offset + 1];
585
586         V3_Print(VM_NONE, VCORE_NONE, "Found Capability 0x%x at offset %d (0x%x)\n", 
587                  id, cap_offset, cap_offset);
588
589         struct pci_cap * cap = V3_Malloc(sizeof(struct pci_cap));
590
591         if (!cap) {
592             PrintError(VM_NONE, VCORE_NONE, "Error allocating PCI CAP info\n");
593             return -1;
594         }
595         memset(cap, 0, sizeof(struct pci_cap));
596         
597         cap->id = id;
598         cap->offset = cap_offset;
599
600         list_add(&(cap->cap_node), &(pci->capabilities));
601
602         // set correct init values 
603         init_pci_cap(pci, id, cap_offset);
604
605
606         // set to the next pointer
607         cap_offset = next;
608     }
609
610     // Disable Capabilities
611     pci->config_header.cap_ptr = 0;
612
613     // Hook Cap pointer to return cached config space value
614     if (v3_pci_hook_config_range(pci, 0x34, 1, 
615                                  NULL, NULL, NULL) == -1) {
616         PrintError(VM_NONE, VCORE_NONE, "Could not hook cap pointer\n");
617         return -1;
618     }
619     
620
621
622 /*
623     // Disable all PCIE extended capabilities for now
624     pci->config_space[0x100] = 0;
625     pci->config_space[0x101] = 0;
626     pci->config_space[0x102] = 0;
627     pci->config_space[0x103] = 0;
628 */  
629
630
631     return 0;
632
633 }
634
635 int v3_pci_enable_capability(struct pci_device * pci, pci_cap_type_t cap_type) {
636     uint32_t size = 0;
637     struct pci_cap * tmp_cap = NULL;
638     struct pci_cap * cap = NULL;
639     void * cap_ptr = NULL;
640
641
642     list_for_each_entry(tmp_cap, &(pci->capabilities), cap_node) {
643         if (tmp_cap->id == cap_type) {
644             cap = tmp_cap;
645             break;
646         }
647     }
648
649     if ((cap == NULL) || (cap->enabled)) {
650         return -1;
651     }
652
653
654     V3_Print(VM_NONE, VCORE_NONE, "Found Capability %x at %x (%d)\n", cap_type, cap->offset, cap->offset);
655
656     // found the capability
657
658     // mark it as enabled
659     cap->enabled = 1;
660
661     cap_ptr = &(pci->config_space[cap->offset + 2]);
662
663     if (cap_type == PCI_CAP_MSI) {
664         pci->msi_cap = cap_ptr;
665         
666         if (pci->msi_cap->cap_64bit) {
667             if (pci->msi_cap->per_vect_mask) {
668                 // 64 bit MSI w/ per vector masking
669                 size = 22;
670             } else {
671                 // 64 bit MSI
672                 size = 12;
673             }
674         } else {
675             // 32 bit MSI
676             size = 8;
677         }
678     } else if (cap_type == PCI_CAP_MSIX) {
679         pci->msix_cap = cap_ptr;
680         
681         // disable passthrough for MSIX BAR
682
683         pci->bar[pci->msix_cap->bir].type = PCI_BAR_MEM32;
684
685         size = 10;
686     } else if (cap_type == PCI_CAP_PCIE) {
687         struct pcie_cap_reg * pcie_cap = (struct pcie_cap_reg *)&(pci->config_space[cap->offset + 2]);
688
689         if (pcie_cap->version == 1) {
690             size = 20;
691         } else if (pcie_cap->version == 2) {
692             size = 60;
693         } else {
694             return -1;
695         }
696     } else if (cap_type == PCI_CAP_PM) {
697         size = 8;
698     }
699
700
701     V3_Print(VM_NONE, VCORE_NONE, "Hooking capability range (offset=%d, size=%d)\n", cap->offset, size);
702
703     if (v3_pci_hook_config_range(pci, cap->offset, size + 2, 
704                                  cap_write, NULL, cap) == -1) {
705         PrintError(VM_NONE, VCORE_NONE, "Could not hook config range (start=%d, size=%d)\n", 
706                    cap->offset + 2, size);
707         return -1;
708     }
709
710
711
712     // link it to the active capabilities list
713     pci->config_space[cap->offset + 1] = pci->config_header.cap_ptr;
714     pci->config_header.cap_ptr = cap->offset; // add to the head of the list
715
716     return 0;
717 }
718
719
720
721
722 static int addr_port_read(struct guest_info * core, ushort_t port, void * dst, uint_t length, void * priv_data) {
723     struct pci_internal * pci_state = priv_data;
724     int reg_offset = port & 0x3;
725     uint8_t * reg_addr = ((uint8_t *)&(pci_state->addr_reg.val)) + reg_offset;
726
727     PrintDebug(core->vm_info, core, "Reading PCI Address Port (%x): %x len=%d\n", port, pci_state->addr_reg.val, length);
728
729     if (reg_offset + length > 4) {
730         PrintError(core->vm_info, core, "Invalid Address port write\n");
731         return -1;
732     }
733
734     memcpy(dst, reg_addr, length);    
735
736     return length;
737 }
738
739
740 static int addr_port_write(struct guest_info * core, ushort_t port, void * src, uint_t length, void * priv_data) {
741     struct pci_internal * pci_state = priv_data;
742     int reg_offset = port & 0x3; 
743     uint8_t * reg_addr = ((uint8_t *)&(pci_state->addr_reg.val)) + reg_offset;
744
745     if (reg_offset + length > 4) {
746         PrintError(core->vm_info, core, "Invalid Address port write\n");
747         return -1;
748     }
749
750     // Set address register
751     memcpy(reg_addr, src, length);
752
753     PrintDebug(core->vm_info, core, "Writing PCI Address Port(%x): AddrReg=%x (op_val = %x, len=%d) \n", port, pci_state->addr_reg.val, *(uint32_t *)src, length);
754
755     return length;
756 }
757
758
759 static int data_port_read(struct guest_info * core, uint16_t port, void * dst, uint_t length, void * priv_data) {
760     struct pci_internal * pci_state =  priv_data;
761     struct pci_device * pci_dev = NULL;
762     uint_t reg_num =  (pci_state->addr_reg.hi_reg_num << 16) +(pci_state->addr_reg.reg_num << 2) + (port & 0x3);
763     int i = 0;
764     int bytes_left = length;
765
766     if (pci_state->addr_reg.bus_num != 0) {
767         memset(dst, 0xff, length);
768         return length;
769     }
770
771
772     pci_dev = get_device(&(pci_state->bus_list[0]), pci_state->addr_reg.dev_num, pci_state->addr_reg.fn_num);
773     
774     if (pci_dev == NULL) {
775         memset(dst, 0xff, length);
776         return length;
777     } 
778
779     PrintDebug(core->vm_info, core, "Reading PCI Data register. bus = %d, dev = %d, fn = %d, reg = %d (%x), cfg_reg = %x\n", 
780                pci_state->addr_reg.bus_num, 
781                pci_state->addr_reg.dev_num, 
782                pci_state->addr_reg.fn_num,
783                reg_num, reg_num, 
784                pci_state->addr_reg.val);
785
786
787     while (bytes_left > 0) {
788         struct cfg_range_hook * cfg_hook  = find_cfg_range_hook(pci_dev, reg_num + i, 1);
789         void * cfg_dst =  &(pci_dev->config_space[reg_num + i]);
790
791         if (cfg_hook) {
792             uint_t range_len = cfg_hook->length - ((reg_num + i) - cfg_hook->start);
793             range_len = (range_len > bytes_left) ? bytes_left : range_len;
794
795             if (cfg_hook->read) {
796                 cfg_hook->read(pci_dev, reg_num + i, cfg_dst, range_len, cfg_hook->private_data);
797             }
798             
799             bytes_left -= range_len;
800             i += range_len;
801         } else {
802             if (pci_dev->config_read) {
803                 if (pci_dev->config_read(pci_dev, reg_num + i, cfg_dst, 1, pci_dev->priv_data) != 0) {
804                     PrintError(core->vm_info, core, "Error in config_read from PCI device (%s)\n", pci_dev->name);
805                 }
806             }
807
808             bytes_left--;
809             i++;
810         } 
811     }       
812
813     memcpy(dst, &(pci_dev->config_space[reg_num]), length);
814             
815     PrintDebug(core->vm_info, core, "\tVal=%x, len=%d\n", *(uint32_t *)dst, length);
816
817     return length;
818 }
819
820
821
822 static int bar_update(struct pci_device * pci_dev, uint32_t offset, 
823                       void * src, uint_t length, void * private_data) {
824     struct v3_pci_bar * bar = (struct v3_pci_bar *)private_data;
825     int bar_offset = offset & ~0x03;
826     int bar_num = (bar_offset - 0x10) / 4;
827     uint32_t new_val = *(uint32_t *)src;
828     
829     PrintDebug(VM_NONE, VCORE_NONE, "Updating BAR Register  (Dev=%s) (bar=%d) (old_val=0x%x) (new_val=0x%x)\n", 
830                pci_dev->name, bar_num, bar->val, new_val);
831
832     // Cache the changes locally
833     memcpy(&(pci_dev->config_space[offset]), src, length);
834
835     if (bar->type == PCI_BAR_PASSTHROUGH) {
836         if (bar->bar_write(bar_num, (void *)(pci_dev->config_space + bar_offset), bar->private_data) == -1) {
837             PrintError(VM_NONE, VCORE_NONE, "Error in Passthrough bar write operation\n");
838             return -1;
839         }
840         
841         return 0;
842     }
843    
844     // Else we are a virtualized BAR
845
846     *(uint32_t *)(pci_dev->config_space + offset) &= bar->mask;
847
848     switch (bar->type) {
849         case PCI_BAR_IO: {
850             int i = 0;
851
852             PrintDebug(VM_NONE, VCORE_NONE, "\tRehooking %d IO ports from base 0x%x to 0x%x for %d ports\n",
853                        bar->num_ports, PCI_IO_BASE(bar->val), PCI_IO_BASE(new_val),
854                        bar->num_ports);
855                 
856             // only do this if pci device is enabled....
857             if (!(pci_dev->config_header.status & 0x1)) {
858                 PrintError(VM_NONE, VCORE_NONE, "PCI Device IO space not enabled\n");
859         break;
860             }
861
862             for (i = 0; i < bar->num_ports; i++) {
863
864                 PrintDebug(VM_NONE, VCORE_NONE, "Rehooking PCI IO port (old port=%u) (new port=%u)\n",  
865                            PCI_IO_BASE(bar->val) + i, PCI_IO_BASE(new_val) + i);
866
867                 v3_unhook_io_port(pci_dev->vm, PCI_IO_BASE(bar->val) + i);
868
869                 if (v3_hook_io_port(pci_dev->vm, PCI_IO_BASE(new_val) + i, 
870                                     bar->io_read, bar->io_write, 
871                                     bar->private_data) == -1) {
872
873                     PrintError(VM_NONE, VCORE_NONE, "Could not hook PCI IO port (old port=%u) (new port=%u)\n",  
874                                PCI_IO_BASE(bar->val) + i, PCI_IO_BASE(new_val) + i);
875                     v3_print_io_map(pci_dev->vm);
876                     return -1;
877                 }
878             }
879
880             bar->val = new_val;
881
882             break;
883         }
884         case PCI_BAR_MEM32: {
885             v3_unhook_mem(pci_dev->vm, V3_MEM_CORE_ANY, (addr_t)(bar->val));
886             
887             if (bar->mem_read) {
888                 v3_hook_full_mem(pci_dev->vm, V3_MEM_CORE_ANY, PCI_MEM32_BASE(new_val), 
889                                  PCI_MEM32_BASE(new_val) + (bar->num_pages * PAGE_SIZE_4KB),
890                                  bar->mem_read, bar->mem_write, pci_dev->priv_data);
891             } else {
892                 PrintError(VM_NONE, VCORE_NONE, "Write hooks not supported for PCI\n");
893                 return -1;
894             }
895
896             bar->val = new_val;
897
898             break;
899         }
900         case PCI_BAR_NONE: {
901             PrintDebug(VM_NONE, VCORE_NONE, "Reprogramming an unsupported BAR register (Dev=%s) (bar=%d) (val=%x)\n", 
902                        pci_dev->name, bar_num, new_val);
903             break;
904         }
905         default:
906             PrintError(VM_NONE, VCORE_NONE, "Invalid Bar Reg updated (bar=%d)\n", bar_num);
907             return -1;
908     }
909
910     return 0;
911 }
912
913
914 static int data_port_write(struct guest_info * core, uint16_t port, void * src, uint_t length, void * priv_data) {
915     struct pci_internal * pci_state = priv_data;
916     struct pci_device * pci_dev = NULL;
917     uint_t reg_num = (pci_state->addr_reg.hi_reg_num << 16) +(pci_state->addr_reg.reg_num << 2) + (port & 0x3);
918     int i = 0;
919     int ret = length;
920
921     if (pci_state->addr_reg.bus_num != 0) {
922         return length;
923     }
924
925     PrintDebug(VM_NONE, VCORE_NONE, "Writing PCI Data register. bus = %d, dev = %d, fn = %d, reg = %d (0x%x) addr_reg = 0x%x (val=0x%x, len=%d)\n", 
926                pci_state->addr_reg.bus_num, 
927                pci_state->addr_reg.dev_num, 
928                pci_state->addr_reg.fn_num,
929                reg_num, reg_num, 
930                pci_state->addr_reg.val,
931                *(uint32_t *)src, length);
932
933
934     pci_dev = get_device(&(pci_state->bus_list[0]), pci_state->addr_reg.dev_num, pci_state->addr_reg.fn_num);
935     
936     if (pci_dev == NULL) {
937         PrintError(VM_NONE, VCORE_NONE, "Writing configuration space for non-present device (dev_num=%d)\n", 
938                    pci_state->addr_reg.dev_num); 
939         return -1;
940     }
941
942     /* update the config space
943        If a hook has been registered for a given region, call the hook with the max write length
944     */ 
945     while (length > 0) {
946         struct cfg_range_hook * cfg_hook  = find_cfg_range_hook(pci_dev, reg_num + i, 1);
947
948         if (cfg_hook) {
949             uint_t range_len = cfg_hook->length - ((reg_num + i) - cfg_hook->start);
950             range_len = (range_len > length) ? length : range_len;
951             
952             if (cfg_hook->write) {
953                 cfg_hook->write(pci_dev, reg_num + i, (void *)(src + i), range_len, cfg_hook->private_data);
954             }
955
956             length -= range_len;
957             i += range_len;
958         } else {
959             // send the writes to the cached config space, and to the generic callback if present
960             uint8_t mask = 0xff;
961
962             if (reg_num < 64) {
963                 mask = pci_hdr_write_mask_00[reg_num + i];
964             }
965             
966             if (mask != 0) {
967                 uint8_t new_val = *(uint8_t *)(src + i);
968                 uint8_t old_val = pci_dev->config_space[reg_num + i];
969
970                 pci_dev->config_space[reg_num + i] = ((new_val & mask) | (old_val & ~mask));
971                 
972                 if (pci_dev->config_write) {
973                     pci_dev->config_write(pci_dev, reg_num + i, &(pci_dev->config_space[reg_num + i]), 1, pci_dev->priv_data);
974                 }
975             }       
976
977             length--;
978             i++;
979         }
980     }
981
982     return ret;
983 }
984
985
986
987 static int exp_rom_write(struct pci_device * pci_dev, uint32_t offset, 
988                          void * src, uint_t length, void * private_data) {
989     int bar_offset = offset & ~0x03;
990
991     if (pci_dev->exp_rom_update) {
992         pci_dev->exp_rom_update(pci_dev, (void *)(pci_dev->config_space + bar_offset), pci_dev->priv_data);
993         
994         return 0;
995     }
996
997     PrintError(VM_NONE, VCORE_NONE, "Expansion ROM update not handled. Will appear to not Exist\n");
998
999     return 0;
1000 }
1001
1002
1003 static int cmd_write(struct pci_device * pci_dev, uint32_t offset, 
1004                      void * src, uint_t length, void * private_data) {
1005
1006     int i = 0;
1007
1008     struct pci_cmd_reg old_cmd;
1009     struct pci_cmd_reg new_cmd;
1010     old_cmd.val = pci_dev->config_header.command;
1011
1012     for (i = 0; i < length; i++) {
1013         uint8_t mask = pci_hdr_write_mask_00[offset + i];
1014         uint8_t new_val = *(uint8_t *)(src + i);
1015         uint8_t old_val = pci_dev->config_space[offset + i];
1016
1017         pci_dev->config_space[offset + i] = ((new_val & mask) | (old_val & ~mask));
1018     }
1019
1020     new_cmd.val = pci_dev->config_header.command;
1021
1022
1023     if (pci_dev->cmd_update) {
1024         if ((new_cmd.intx_disable == 1) && (old_cmd.intx_disable == 0)) {
1025             pci_dev->irq_type = IRQ_NONE;
1026             pci_dev->cmd_update(pci_dev, PCI_CMD_INTX_DISABLE, 0, pci_dev->priv_data);
1027         } else if ((new_cmd.intx_disable == 0) && (old_cmd.intx_disable == 1)) {
1028             pci_dev->irq_type = IRQ_INTX;
1029             pci_dev->cmd_update(pci_dev, PCI_CMD_INTX_ENABLE, 0, pci_dev->priv_data);
1030         }
1031
1032
1033         if ((new_cmd.dma_enable == 1) && (old_cmd.dma_enable == 0)) {
1034             pci_dev->cmd_update(pci_dev, PCI_CMD_DMA_ENABLE, 0, pci_dev->priv_data);
1035         } else if ((new_cmd.dma_enable == 0) && (old_cmd.dma_enable == 1)) {
1036             pci_dev->cmd_update(pci_dev, PCI_CMD_DMA_DISABLE, 0, pci_dev->priv_data);
1037         }
1038     }
1039
1040     return 0;
1041 }
1042
1043
1044 static void init_pci_busses(struct pci_internal * pci_state) {
1045     int i;
1046
1047     for (i = 0; i < PCI_BUS_COUNT; i++) {
1048         pci_state->bus_list[i].bus_num = i;
1049         pci_state->bus_list[i].devices.rb_node = NULL;
1050         memset(pci_state->bus_list[i].dev_map, 0, sizeof(pci_state->bus_list[i].dev_map));
1051     }
1052 }
1053
1054
1055 static int pci_free(struct pci_internal * pci_state) {
1056     int i;
1057
1058
1059     // cleanup devices
1060     for (i = 0; i < PCI_BUS_COUNT; i++) {
1061         struct pci_bus * bus = &(pci_state->bus_list[i]);
1062         struct rb_node * node = v3_rb_first(&(bus->devices));
1063         struct pci_device * dev = NULL;
1064
1065         while (node) {
1066             dev = rb_entry(node, struct pci_device, dev_tree_node);
1067             node = v3_rb_next(node);
1068             
1069             v3_rb_erase(&(dev->dev_tree_node), &(bus->devices));
1070             
1071             // Free config range hooks
1072             { 
1073                 struct cfg_range_hook * hook = NULL;
1074                 struct cfg_range_hook * tmp = NULL;
1075                 list_for_each_entry_safe(hook, tmp, &(dev->cfg_hooks), list_node) {
1076                     list_del(&(hook->list_node));
1077                     V3_Free(hook);
1078                 }
1079             }
1080
1081             // Free caps
1082             {
1083                 struct pci_cap * cap = NULL;
1084                 struct pci_cap * tmp = NULL;
1085                 list_for_each_entry_safe(cap, tmp, &(dev->cfg_hooks), cap_node) {
1086                     list_del(&(cap->cap_node));
1087                     V3_Free(cap);
1088                 }
1089             }
1090
1091             V3_Free(dev);
1092         }
1093
1094     }
1095     
1096     V3_Free(pci_state);
1097     return 0;
1098 }
1099
1100 #ifdef V3_CONFIG_CHECKPOINT
1101
1102 #include <palacios/vmm_sprintf.h>
1103
1104 static int pci_save_extended(struct v3_chkpt *chkpt, char *id, void * private_data) {
1105     struct pci_internal * pci = (struct pci_internal *)private_data;
1106     struct v3_chkpt_ctx *ctx=0;
1107     char buf[128];
1108     int i = 0;    
1109
1110     ctx = v3_chkpt_open_ctx(chkpt,id);
1111
1112     if (!ctx) { 
1113       PrintError(VM_NONE, VCORE_NONE, "Unable to open base context on save\n");
1114       goto savefailout;
1115     }
1116
1117     V3_CHKPT_SAVE(ctx, "ADDR_REG", pci->addr_reg.val, savefailout);
1118     V3_CHKPT_SAVE(ctx, "IO_BASE", pci->dev_io_base, savefailout);
1119
1120     v3_chkpt_close_ctx(ctx); ctx=0;
1121
1122     for (i = 0; i < PCI_BUS_COUNT; i++) {
1123         struct pci_bus * bus = &(pci->bus_list[i]);
1124         struct rb_node * node = v3_rb_first(&(bus->devices));
1125         struct pci_device * dev = NULL;
1126
1127         snprintf(buf, 128, "%s-%d", id, i);
1128         
1129         ctx = v3_chkpt_open_ctx(chkpt, buf);
1130         
1131         if (!ctx) { 
1132           PrintError(VM_NONE, VCORE_NONE, "Failed to open context for %s\n", buf);
1133           goto savefailout;
1134         }
1135
1136         // nothing actually saved on the bus context... (later expansion)
1137
1138         v3_chkpt_close_ctx(ctx); ctx=0;
1139
1140         while (node) {
1141             int bar_idx = 0;
1142             dev = rb_entry(node, struct pci_device, dev_tree_node);
1143
1144             snprintf(buf, 128, "%s-%d.%d-%d", id, i, dev->dev_num, dev->fn_num);
1145
1146             ctx = v3_chkpt_open_ctx(chkpt, buf);
1147             
1148             if (!ctx) { 
1149               PrintError(VM_NONE, VCORE_NONE, "Failed to open context for device\n");
1150               goto savefailout;
1151             }
1152             
1153             V3_CHKPT_SAVE(ctx, "CONFIG_SPACE", dev->config_space, savefailout);
1154
1155             for (bar_idx = 0; bar_idx < 6; bar_idx++) {
1156                 snprintf(buf, 128, "BAR-%d", bar_idx);
1157                 V3_CHKPT_SAVE(ctx, buf, dev->bar[bar_idx].val, savefailout);
1158             }
1159             
1160             v3_chkpt_close_ctx(ctx); ctx=0;
1161
1162             node = v3_rb_next(node);
1163         }
1164     }
1165
1166 // goodout:
1167
1168     return 0;
1169     
1170  savefailout:
1171     PrintError(VM_NONE, VCORE_NONE, "Failed to save PCI\n");
1172     if (ctx) { v3_chkpt_close_ctx(ctx); }
1173     return -1;
1174
1175 }
1176
1177
1178 static int pci_load_extended(struct v3_chkpt *chkpt, char *id, void * private_data) {
1179     struct pci_internal * pci = (struct pci_internal *)private_data;
1180     struct v3_chkpt_ctx *ctx=0;
1181     char buf[128];
1182     int i = 0;    
1183     
1184     ctx = v3_chkpt_open_ctx(chkpt,id);
1185
1186     if (!ctx) { 
1187       PrintError(VM_NONE, VCORE_NONE, "Unable to open base context on load\n");
1188       goto loadfailout;
1189     }
1190
1191     V3_CHKPT_LOAD(ctx, "ADDR_REG", pci->addr_reg.val, loadfailout);
1192     V3_CHKPT_LOAD(ctx, "IO_BASE", pci->dev_io_base, loadfailout);
1193
1194     v3_chkpt_close_ctx(ctx); ctx=0;
1195
1196     for (i = 0; i < PCI_BUS_COUNT; i++) {
1197         struct pci_bus * bus = &(pci->bus_list[i]);
1198         struct rb_node * node = v3_rb_first(&(bus->devices));
1199         struct pci_device * dev = NULL;
1200
1201         snprintf(buf, 128, "pci-%d", i);
1202         
1203         ctx = v3_chkpt_open_ctx(chkpt, buf);
1204         
1205         if (!ctx) { 
1206           PrintError(VM_NONE, VCORE_NONE, "Failed to open context for %s\n", buf);
1207           goto loadfailout;
1208         }
1209
1210         // nothing actually saved on the bus context... (later expansion)
1211
1212         v3_chkpt_close_ctx(ctx); ctx=0;
1213
1214         while (node) {
1215             int bar_idx = 0;
1216             dev = rb_entry(node, struct pci_device, dev_tree_node);
1217
1218             snprintf(buf, 128, "pci-%d.%d-%d", i, dev->dev_num, dev->fn_num);
1219
1220             ctx = v3_chkpt_open_ctx(chkpt, buf);
1221             
1222             if (!ctx) { 
1223               PrintError(VM_NONE, VCORE_NONE, "Failed to open context for device\n");
1224               goto loadfailout;
1225             }
1226
1227             V3_CHKPT_LOAD(ctx, "CONFIG_SPACE", dev->config_space, loadfailout);
1228
1229             for (bar_idx = 0; bar_idx < 6; bar_idx++) {
1230                 snprintf(buf, 128, "BAR-%d", bar_idx);
1231                 V3_CHKPT_LOAD(ctx, buf, dev->bar[bar_idx].val, loadfailout);
1232             }
1233
1234             v3_chkpt_close_ctx(ctx); ctx=0;
1235
1236             node = v3_rb_next(node);
1237         }
1238     }
1239
1240 // goodout:
1241     return 0;
1242
1243  loadfailout:
1244     PrintError(VM_NONE, VCORE_NONE, "Failed to load PCI\n");
1245     if (ctx) { v3_chkpt_close_ctx(ctx); }
1246     return -1;
1247     
1248 }
1249
1250
1251 #endif
1252
1253
1254
1255
1256 static struct v3_device_ops dev_ops = {
1257     .free = (int (*)(void *))pci_free,
1258 #ifdef V3_CONFIG_CHECKPOINT
1259     .save_extended = pci_save_extended,
1260     .load_extended = pci_load_extended
1261 #endif
1262 };
1263
1264
1265
1266
1267 static int pci_init(struct v3_vm_info * vm, v3_cfg_tree_t * cfg) {
1268     struct pci_internal * pci_state = V3_Malloc(sizeof(struct pci_internal));
1269
1270     if (!pci_state) {
1271         PrintError(vm, VCORE_NONE, "Cannot allocate in init\n");
1272         return -1;
1273     }
1274
1275     int i = 0;
1276     char * dev_id = v3_cfg_val(cfg, "ID");
1277     int ret = 0;
1278     
1279     PrintDebug(vm, VCORE_NONE, "PCI internal at %p\n",(void *)pci_state);
1280     
1281     struct vm_device * dev = v3_add_device(vm, dev_id, &dev_ops, pci_state);
1282     
1283     if (dev == NULL) {
1284         PrintError(vm, VCORE_NONE, "Could not attach device %s\n", dev_id);
1285         V3_Free(pci_state);
1286         return -1;
1287     }
1288
1289     
1290     pci_state->addr_reg.val = 0; 
1291     pci_state->dev_io_base = PCI_DEV_IO_PORT_BASE;
1292
1293     init_pci_busses(pci_state);
1294     
1295     PrintDebug(vm, VCORE_NONE, "Sizeof config header=%d\n", (int)sizeof(struct pci_config_header));
1296     
1297     for (i = 0; i < 4; i++) {
1298         ret |= v3_dev_hook_io(dev, CONFIG_ADDR_PORT + i, &addr_port_read, &addr_port_write);
1299         ret |= v3_dev_hook_io(dev, CONFIG_DATA_PORT + i, &data_port_read, &data_port_write);
1300     }
1301     
1302     if (ret != 0) {
1303         PrintError(vm, VCORE_NONE, "Error hooking PCI IO ports\n");
1304         v3_remove_device(dev);
1305         return -1;
1306     }
1307
1308     return 0;
1309 }
1310
1311
1312 device_register("PCI", pci_init)
1313
1314
1315 static inline int init_bars(struct v3_vm_info * vm, struct pci_device * pci_dev) {
1316     int i = 0;
1317
1318     for (i = 0; i < 6; i++) {
1319         int bar_offset = 0x10 + (4 * i);
1320         struct v3_pci_bar * bar = &(pci_dev->bar[i]);
1321
1322         if (bar->type == PCI_BAR_IO) {
1323             int j = 0;
1324             bar->mask = (~((bar->num_ports) - 1)) | 0x01;
1325
1326             if (bar->default_base_port != 0xffff) {
1327                 bar->val = bar->default_base_port & bar->mask;
1328             } else {
1329                 bar->val = 0;
1330             }
1331
1332             bar->val |= 0x00000001;
1333
1334             for (j = 0; j < bar->num_ports; j++) {
1335                 // hook IO
1336                 if (bar->default_base_port != 0xffff) {
1337                     if (v3_hook_io_port(vm, bar->default_base_port + j,
1338                                         bar->io_read, bar->io_write, 
1339                                         bar->private_data) == -1) {
1340                         PrintError(vm, VCORE_NONE, "Could not hook default io port %x\n", bar->default_base_port + j);
1341                         return -1;
1342                     }
1343                 }
1344             }
1345
1346             *(uint32_t *)(pci_dev->config_space + bar_offset) = bar->val;
1347
1348         } else if (bar->type == PCI_BAR_MEM32) {
1349             bar->mask = ~((bar->num_pages << 12) - 1);
1350             bar->mask |= 0xf; // preserve the configuration flags
1351
1352             if (bar->default_base_addr != 0xffffffff) {
1353                 bar->val = bar->default_base_addr & bar->mask;
1354             } else {
1355                 bar->val = 0;
1356             }
1357
1358             // hook memory
1359             if (bar->mem_read) {
1360                 // full hook
1361                 v3_hook_full_mem(vm, V3_MEM_CORE_ANY, bar->default_base_addr,
1362                                  bar->default_base_addr + (bar->num_pages * PAGE_SIZE_4KB),
1363                                  bar->mem_read, bar->mem_write, pci_dev->priv_data);
1364             } else if (bar->mem_write) {
1365                 // write hook
1366                 PrintError(vm, VCORE_NONE, "Write hooks not supported for PCI devices\n");
1367                 return -1;
1368                 /*
1369                   v3_hook_write_mem(pci_dev->vm_dev->vm, bar->default_base_addr, 
1370                   bar->default_base_addr + (bar->num_pages * PAGE_SIZE_4KB),
1371                   bar->mem_write, pci_dev->vm_dev);
1372                 */
1373             } else {
1374                 // set the prefetchable flag...
1375                 bar->val |= 0x00000008;
1376             }
1377
1378
1379             *(uint32_t *)(pci_dev->config_space + bar_offset) = bar->val;
1380
1381         } else if (bar->type == PCI_BAR_MEM24) {
1382             PrintError(vm, VCORE_NONE, "16 Bit memory ranges not supported (reg: %d)\n", i);
1383             return -1;
1384         } else if (bar->type == PCI_BAR_NONE) {
1385             bar->val = 0x00000000;
1386             bar->mask = 0x00000000; // This ensures that all updates will be dropped
1387             *(uint32_t *)(pci_dev->config_space + bar_offset) = bar->val;
1388         } else if (bar->type == PCI_BAR_PASSTHROUGH) {
1389
1390             // Call the bar init function to get the local cached value
1391             bar->bar_init(i, &(bar->val), bar->private_data);
1392
1393             // Copy back changes it made
1394             *(uint32_t *)(pci_dev->config_space + bar_offset) = bar->val;
1395
1396         } else {
1397             PrintError(vm, VCORE_NONE, "Invalid BAR type for bar #%d\n", i);
1398             return -1;
1399         }
1400
1401         v3_pci_hook_config_range(pci_dev, bar_offset, 4, bar_update, NULL, bar);
1402     }
1403
1404     return 0;
1405 }
1406
1407
1408 int v3_pci_set_irq_bridge(struct  vm_device * pci_bus, int bus_num, 
1409                           int (*raise_pci_irq)(struct pci_device * pci_dev, void * dev_data, struct v3_irq * vec),
1410                           int (*lower_pci_irq)(struct pci_device * pci_dev, void * dev_data, struct v3_irq * vec),
1411                           void * priv_data) {
1412     struct pci_internal * pci_state = (struct pci_internal *)pci_bus->private_data;
1413
1414
1415     pci_state->bus_list[bus_num].raise_pci_irq = raise_pci_irq;
1416     pci_state->bus_list[bus_num].lower_pci_irq = lower_pci_irq;
1417     pci_state->bus_list[bus_num].irq_dev_data = priv_data;
1418
1419     return 0;
1420 }
1421
1422 int v3_pci_raise_irq(struct vm_device * pci_bus, struct pci_device * dev, uint32_t vec_index) {
1423    struct v3_irq vec;
1424
1425    vec.ack = NULL;
1426    vec.private_data = NULL;
1427    vec.irq = vec_index;
1428
1429    return v3_pci_raise_acked_irq(pci_bus, dev, vec);
1430 }
1431
1432 int v3_pci_lower_irq(struct vm_device * pci_bus, struct pci_device * dev, uint32_t vec_index) {
1433     struct v3_irq vec;
1434
1435     vec.irq = vec_index;
1436     vec.ack = NULL;
1437     vec.private_data = NULL;
1438     
1439     return v3_pci_lower_acked_irq(pci_bus, dev, vec);
1440 }
1441
1442 int v3_pci_raise_acked_irq(struct vm_device * pci_bus, struct pci_device * dev, struct v3_irq vec) {
1443    struct pci_internal * pci_state = (struct pci_internal *)pci_bus->private_data;
1444    struct pci_bus * bus = &(pci_state->bus_list[dev->bus_num]);
1445
1446
1447    if (dev->irq_type == IRQ_INTX) {
1448        return bus->raise_pci_irq(dev, bus->irq_dev_data, &vec);
1449    } else if (dev->irq_type == IRQ_MSI) {
1450        struct v3_gen_ipi ipi;
1451        struct msi_addr * addr = NULL;
1452        struct msi_data * data = NULL;       
1453        
1454        if (dev->msi_cap->cap_64bit) {
1455            if (dev->msi_cap->per_vect_mask) {
1456                struct msi64_pervec_msg_addr * msi = (void *)dev->msi_cap;
1457                addr = &(msi->addr);
1458                data = &(msi->data);
1459            } else {
1460                struct msi64_msg_addr * msi = (void *)dev->msi_cap;
1461                addr = &(msi->addr);
1462                data = &(msi->data);
1463            }
1464        } else {
1465            struct msi32_msg_addr * msi = (void *)dev->msi_cap;
1466            addr = &(msi->addr);
1467            data = &(msi->data);
1468        }
1469
1470        memset(&ipi, 0, sizeof(struct v3_gen_ipi));
1471
1472        // decode MSI fields into IPI
1473
1474        ipi.vector = data->vector + vec.irq;
1475        ipi.mode = data->del_mode;
1476        ipi.logical = addr->dst_mode;
1477        ipi.trigger_mode = data->trig_mode;
1478        ipi.dst_shorthand = 0;
1479        ipi.dst = addr->dst_id;
1480        
1481
1482        v3_apic_send_ipi(dev->vm, &ipi, dev->apic_dev);
1483
1484        return 0;       
1485    } else if (dev->irq_type == IRQ_MSIX) {
1486        addr_t msix_table_gpa = 0;
1487        struct msix_table * msix_table = NULL;
1488        uint_t bar_idx = dev->msix_cap->bir;
1489        struct v3_gen_ipi ipi;
1490        struct msi_addr * addr = NULL;
1491        struct msi_data * data = NULL;   
1492        
1493        if (dev->bar[bar_idx].type != PCI_BAR_MEM32) {
1494            PrintError(VM_NONE, VCORE_NONE, "Non 32bit MSIX BAR registers are not supported\n");
1495            return -1;
1496        }
1497
1498        msix_table_gpa = dev->bar[bar_idx].val;
1499        msix_table_gpa += dev->msix_cap->table_offset;
1500
1501        if (v3_gpa_to_hva(&(dev->vm->cores[0]), msix_table_gpa, (void *)&(msix_table)) != 0) {
1502            PrintError(VM_NONE, VCORE_NONE, "Could not translate MSIX Table GPA (%p)\n", (void *)msix_table_gpa);
1503            return -1;
1504        }
1505        
1506        memset(&ipi, 0, sizeof(struct v3_gen_ipi));
1507
1508        data = &(msix_table->entries[vec.irq].data);
1509        addr = &(msix_table->entries[vec.irq].addr);;
1510        
1511        // decode MSIX fields into IPI
1512        ipi.vector = data->vector + vec.irq;
1513        ipi.mode = data->del_mode;
1514        ipi.logical = addr->dst_mode;
1515        ipi.trigger_mode = data->trig_mode;
1516        ipi.dst_shorthand = 0;
1517        ipi.dst = addr->dst_id;
1518        
1519
1520
1521        V3_Print(VM_NONE, VCORE_NONE, "Decode MSIX\n");
1522
1523        v3_apic_send_ipi(dev->vm, &ipi, dev->apic_dev);
1524
1525        return 0;
1526    } 
1527    
1528    // Should never get here
1529    return -1;
1530
1531 }
1532
1533 int v3_pci_lower_acked_irq(struct vm_device * pci_bus, struct pci_device * dev, struct v3_irq vec) {
1534     if (dev->irq_type == IRQ_INTX) {
1535         struct pci_internal * pci_state = (struct pci_internal *)pci_bus->private_data;
1536         struct pci_bus * bus = &(pci_state->bus_list[dev->bus_num]);
1537         
1538         return bus->lower_pci_irq(dev, bus->irq_dev_data, &vec);
1539     } else {
1540         return -1;
1541     }
1542 }
1543
1544
1545 // if dev_num == -1, auto assign 
1546 struct pci_device * v3_pci_register_device(struct vm_device * pci,
1547                                            pci_device_type_t dev_type, 
1548                                            int bus_num,
1549                                            int dev_num,
1550                                            int fn_num,
1551                                            const char * name,
1552                                            struct v3_pci_bar * bars,
1553                                            int (*config_write)(struct pci_device * pci_dev, uint32_t reg_num, void * src, 
1554                                                                uint_t length, void * priv_data),
1555                                            int (*config_read)(struct pci_device * pci_dev, uint32_t reg_num, void * dst, 
1556                                                               uint_t length, void * priv_data),
1557                                            int (*cmd_update)(struct pci_device * pci_dev, pci_cmd_t cmd, uint64_t arg, void * priv_data),
1558                                            int (*exp_rom_update)(struct pci_device * pci_dev, uint32_t * src, void * priv_data),
1559                                            void * priv_data) {
1560
1561     struct pci_internal * pci_state = (struct pci_internal *)pci->private_data;
1562     struct pci_bus * bus = &(pci_state->bus_list[bus_num]);
1563     struct pci_device * pci_dev = NULL;
1564     int i;
1565
1566     if (dev_num > MAX_BUS_DEVICES) {
1567         PrintError(VM_NONE, VCORE_NONE, "Requested Invalid device number (%d)\n", dev_num);
1568         return NULL;
1569     }
1570
1571     if (dev_num == PCI_AUTO_DEV_NUM) {
1572         PrintDebug(VM_NONE, VCORE_NONE, "Searching for free device number\n");
1573         if ((dev_num = get_free_dev_num(bus)) == -1) {
1574             PrintError(VM_NONE, VCORE_NONE, "No more available PCI slots on bus %d\n", bus->bus_num);
1575             return NULL;
1576         }
1577     }
1578     
1579     PrintDebug(VM_NONE, VCORE_NONE, "Checking for PCI Device\n");
1580
1581     if (get_device(bus, dev_num, fn_num) != NULL) {
1582         PrintError(VM_NONE, VCORE_NONE, "PCI Device already registered at slot %d on bus %d\n", 
1583                    dev_num, bus->bus_num);
1584         return NULL;
1585     }
1586
1587     
1588     pci_dev = (struct pci_device *)V3_Malloc(sizeof(struct pci_device));
1589
1590     if (pci_dev == NULL) {
1591         PrintError(VM_NONE, VCORE_NONE, "Could not allocate pci device\n");
1592         return NULL;
1593     }
1594
1595     memset(pci_dev, 0, sizeof(struct pci_device));
1596
1597
1598     pci_dev->type = dev_type;
1599     
1600     switch (pci_dev->type) {
1601         case PCI_STD_DEVICE:
1602             pci_dev->config_header.header_type = 0x00;
1603             break;
1604         case PCI_MULTIFUNCTION:
1605             pci_dev->config_header.header_type = 0x80;
1606             break;
1607         default:
1608             PrintError(VM_NONE, VCORE_NONE, "Unhandled PCI Device Type: %d\n", dev_type);
1609             return NULL;
1610     }
1611
1612
1613
1614     pci_dev->bus_num = bus_num;
1615     pci_dev->dev_num = dev_num;
1616     pci_dev->fn_num = fn_num;
1617
1618     strncpy(pci_dev->name, name, sizeof(pci_dev->name));
1619     pci_dev->vm = pci->vm;
1620     pci_dev->priv_data = priv_data;
1621
1622     INIT_LIST_HEAD(&(pci_dev->cfg_hooks));
1623     INIT_LIST_HEAD(&(pci_dev->capabilities));
1624
1625     
1626     {
1627         // locate APIC for MSI/MSI-X
1628         pci_dev->apic_dev = v3_find_dev(pci->vm, "apic");
1629     }
1630
1631     // register update callbacks
1632     pci_dev->config_write = config_write;
1633     pci_dev->config_read = config_read;
1634     pci_dev->cmd_update = cmd_update;
1635     pci_dev->exp_rom_update = exp_rom_update;
1636
1637
1638
1639     if (config_read) {
1640         int i = 0;
1641
1642         // Only 256 bytes for now, should expand it in the future
1643         for (i = 0; i < 256; i++) {
1644             config_read(pci_dev, i, &(pci_dev->config_space[i]), 1, pci_dev->priv_data);
1645         }
1646     }
1647
1648     V3_Print(VM_NONE, VCORE_NONE, "Scanning for Capabilities\n");
1649
1650     // scan for caps
1651     scan_pci_caps(pci_dev);
1652
1653     pci_dev->irq_type = IRQ_INTX;
1654
1655     V3_Print(VM_NONE, VCORE_NONE, "Caps scanned\n");
1656
1657     // hook important regions
1658     v3_pci_hook_config_range(pci_dev, 0x30, 4, exp_rom_write, NULL, NULL);  // ExpRom
1659     v3_pci_hook_config_range(pci_dev, 0x04, 2, cmd_write, NULL, NULL);      // CMD Reg
1660     // * Status resets
1661     // * Drop BIST
1662     // 
1663
1664     
1665
1666     //copy bars
1667     for (i = 0; i < 6; i ++) {
1668         pci_dev->bar[i].type = bars[i].type;
1669         pci_dev->bar[i].private_data = bars[i].private_data;
1670
1671         if (pci_dev->bar[i].type == PCI_BAR_IO) {
1672             pci_dev->bar[i].num_ports = bars[i].num_ports;
1673
1674             // This is a horrible HACK becaues the BIOS is supposed to set the PCI base ports 
1675             // And if the BIOS doesn't, Linux just happily overlaps device port assignments
1676             if (bars[i].default_base_port != (uint16_t)-1) {
1677                 pci_dev->bar[i].default_base_port = bars[i].default_base_port;
1678             } else {
1679                 pci_dev->bar[i].default_base_port = pci_state->dev_io_base;
1680                 pci_state->dev_io_base += ( 0x100 * ((bars[i].num_ports / 0x100) + 1) );
1681             }
1682
1683             pci_dev->bar[i].io_read = bars[i].io_read;
1684             pci_dev->bar[i].io_write = bars[i].io_write;
1685         } else if (pci_dev->bar[i].type == PCI_BAR_MEM32) {
1686             pci_dev->bar[i].num_pages = bars[i].num_pages;
1687             pci_dev->bar[i].default_base_addr = bars[i].default_base_addr;
1688             pci_dev->bar[i].mem_read = bars[i].mem_read;
1689             pci_dev->bar[i].mem_write = bars[i].mem_write;
1690         } else if (pci_dev->bar[i].type == PCI_BAR_PASSTHROUGH) {
1691             pci_dev->bar[i].bar_init = bars[i].bar_init;
1692             pci_dev->bar[i].bar_write = bars[i].bar_write;
1693         } else {
1694             pci_dev->bar[i].num_pages = 0;
1695             pci_dev->bar[i].default_base_addr = 0;
1696             pci_dev->bar[i].mem_read = NULL;
1697             pci_dev->bar[i].mem_write = NULL;
1698         }
1699     }
1700
1701     if (init_bars(pci->vm, pci_dev) == -1) {
1702         PrintError(VM_NONE, VCORE_NONE, "could not initialize bar registers\n");
1703         return NULL;
1704     }
1705
1706     // add the device
1707     add_device_to_bus(bus, pci_dev);
1708
1709 #ifdef V3_CONFIG_DEBUG_PCI
1710     pci_dump_state(pci_state);
1711 #endif
1712
1713     return pci_dev;
1714 }
1715