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.


c911639b05750bf75ed5bafdc3e726e07af2d9d8
[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             }
860
861             for (i = 0; i < bar->num_ports; i++) {
862
863                 PrintDebug(VM_NONE, VCORE_NONE, "Rehooking PCI IO port (old port=%u) (new port=%u)\n",  
864                            PCI_IO_BASE(bar->val) + i, PCI_IO_BASE(new_val) + i);
865
866                 v3_unhook_io_port(pci_dev->vm, PCI_IO_BASE(bar->val) + i);
867
868                 if (v3_hook_io_port(pci_dev->vm, PCI_IO_BASE(new_val) + i, 
869                                     bar->io_read, bar->io_write, 
870                                     bar->private_data) == -1) {
871
872                     PrintError(VM_NONE, VCORE_NONE, "Could not hook PCI IO port (old port=%u) (new port=%u)\n",  
873                                PCI_IO_BASE(bar->val) + i, PCI_IO_BASE(new_val) + i);
874                     v3_print_io_map(pci_dev->vm);
875                     return -1;
876                 }
877             }
878
879             bar->val = new_val;
880
881             break;
882         }
883         case PCI_BAR_MEM32: {
884             v3_unhook_mem(pci_dev->vm, V3_MEM_CORE_ANY, (addr_t)(bar->val));
885             
886             if (bar->mem_read) {
887                 v3_hook_full_mem(pci_dev->vm, V3_MEM_CORE_ANY, PCI_MEM32_BASE(new_val), 
888                                  PCI_MEM32_BASE(new_val) + (bar->num_pages * PAGE_SIZE_4KB),
889                                  bar->mem_read, bar->mem_write, pci_dev->priv_data);
890             } else {
891                 PrintError(VM_NONE, VCORE_NONE, "Write hooks not supported for PCI\n");
892                 return -1;
893             }
894
895             bar->val = new_val;
896
897             break;
898         }
899         case PCI_BAR_NONE: {
900             PrintDebug(VM_NONE, VCORE_NONE, "Reprogramming an unsupported BAR register (Dev=%s) (bar=%d) (val=%x)\n", 
901                        pci_dev->name, bar_num, new_val);
902             break;
903         }
904         default:
905             PrintError(VM_NONE, VCORE_NONE, "Invalid Bar Reg updated (bar=%d)\n", bar_num);
906             return -1;
907     }
908
909     return 0;
910 }
911
912
913 static int data_port_write(struct guest_info * core, uint16_t port, void * src, uint_t length, void * priv_data) {
914     struct pci_internal * pci_state = priv_data;
915     struct pci_device * pci_dev = NULL;
916     uint_t reg_num = (pci_state->addr_reg.hi_reg_num << 16) +(pci_state->addr_reg.reg_num << 2) + (port & 0x3);
917     int i = 0;
918     int ret = length;
919
920     if (pci_state->addr_reg.bus_num != 0) {
921         return length;
922     }
923
924     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", 
925                pci_state->addr_reg.bus_num, 
926                pci_state->addr_reg.dev_num, 
927                pci_state->addr_reg.fn_num,
928                reg_num, reg_num, 
929                pci_state->addr_reg.val,
930                *(uint32_t *)src, length);
931
932
933     pci_dev = get_device(&(pci_state->bus_list[0]), pci_state->addr_reg.dev_num, pci_state->addr_reg.fn_num);
934     
935     if (pci_dev == NULL) {
936         PrintError(VM_NONE, VCORE_NONE, "Writing configuration space for non-present device (dev_num=%d)\n", 
937                    pci_state->addr_reg.dev_num); 
938         return -1;
939     }
940
941     /* update the config space
942        If a hook has been registered for a given region, call the hook with the max write length
943     */ 
944     while (length > 0) {
945         struct cfg_range_hook * cfg_hook  = find_cfg_range_hook(pci_dev, reg_num + i, 1);
946
947         if (cfg_hook) {
948             uint_t range_len = cfg_hook->length - ((reg_num + i) - cfg_hook->start);
949             range_len = (range_len > length) ? length : range_len;
950             
951             if (cfg_hook->write) {
952                 cfg_hook->write(pci_dev, reg_num + i, (void *)(src + i), range_len, cfg_hook->private_data);
953             }
954
955             length -= range_len;
956             i += range_len;
957         } else {
958             // send the writes to the cached config space, and to the generic callback if present
959             uint8_t mask = 0xff;
960
961             if (reg_num < 64) {
962                 mask = pci_hdr_write_mask_00[reg_num + i];
963             }
964             
965             if (mask != 0) {
966                 uint8_t new_val = *(uint8_t *)(src + i);
967                 uint8_t old_val = pci_dev->config_space[reg_num + i];
968
969                 pci_dev->config_space[reg_num + i] = ((new_val & mask) | (old_val & ~mask));
970                 
971                 if (pci_dev->config_write) {
972                     pci_dev->config_write(pci_dev, reg_num + i, &(pci_dev->config_space[reg_num + i]), 1, pci_dev->priv_data);
973                 }
974             }       
975
976             length--;
977             i++;
978         }
979     }
980
981     return ret;
982 }
983
984
985
986 static int exp_rom_write(struct pci_device * pci_dev, uint32_t offset, 
987                          void * src, uint_t length, void * private_data) {
988     int bar_offset = offset & ~0x03;
989
990     if (pci_dev->exp_rom_update) {
991         pci_dev->exp_rom_update(pci_dev, (void *)(pci_dev->config_space + bar_offset), pci_dev->priv_data);
992         
993         return 0;
994     }
995
996     PrintError(VM_NONE, VCORE_NONE, "Expansion ROM update not handled. Will appear to not Exist\n");
997
998     return 0;
999 }
1000
1001
1002 static int cmd_write(struct pci_device * pci_dev, uint32_t offset, 
1003                      void * src, uint_t length, void * private_data) {
1004
1005     int i = 0;
1006
1007     struct pci_cmd_reg old_cmd;
1008     struct pci_cmd_reg new_cmd;
1009     old_cmd.val = pci_dev->config_header.command;
1010
1011     for (i = 0; i < length; i++) {
1012         uint8_t mask = pci_hdr_write_mask_00[offset + i];
1013         uint8_t new_val = *(uint8_t *)(src + i);
1014         uint8_t old_val = pci_dev->config_space[offset + i];
1015
1016         pci_dev->config_space[offset + i] = ((new_val & mask) | (old_val & ~mask));
1017     }
1018
1019     new_cmd.val = pci_dev->config_header.command;
1020
1021
1022     if (pci_dev->cmd_update) {
1023         if ((new_cmd.intx_disable == 1) && (old_cmd.intx_disable == 0)) {
1024             pci_dev->irq_type = IRQ_NONE;
1025             pci_dev->cmd_update(pci_dev, PCI_CMD_INTX_DISABLE, 0, pci_dev->priv_data);
1026         } else if ((new_cmd.intx_disable == 0) && (old_cmd.intx_disable == 1)) {
1027             pci_dev->irq_type = IRQ_INTX;
1028             pci_dev->cmd_update(pci_dev, PCI_CMD_INTX_ENABLE, 0, pci_dev->priv_data);
1029         }
1030
1031
1032         if ((new_cmd.dma_enable == 1) && (old_cmd.dma_enable == 0)) {
1033             pci_dev->cmd_update(pci_dev, PCI_CMD_DMA_ENABLE, 0, pci_dev->priv_data);
1034         } else if ((new_cmd.dma_enable == 0) && (old_cmd.dma_enable == 1)) {
1035             pci_dev->cmd_update(pci_dev, PCI_CMD_DMA_DISABLE, 0, pci_dev->priv_data);
1036         }
1037     }
1038
1039     return 0;
1040 }
1041
1042
1043 static void init_pci_busses(struct pci_internal * pci_state) {
1044     int i;
1045
1046     for (i = 0; i < PCI_BUS_COUNT; i++) {
1047         pci_state->bus_list[i].bus_num = i;
1048         pci_state->bus_list[i].devices.rb_node = NULL;
1049         memset(pci_state->bus_list[i].dev_map, 0, sizeof(pci_state->bus_list[i].dev_map));
1050     }
1051 }
1052
1053
1054 static int pci_free(struct pci_internal * pci_state) {
1055     int i;
1056
1057
1058     // cleanup devices
1059     for (i = 0; i < PCI_BUS_COUNT; i++) {
1060         struct pci_bus * bus = &(pci_state->bus_list[i]);
1061         struct rb_node * node = v3_rb_first(&(bus->devices));
1062         struct pci_device * dev = NULL;
1063
1064         while (node) {
1065             dev = rb_entry(node, struct pci_device, dev_tree_node);
1066             node = v3_rb_next(node);
1067             
1068             v3_rb_erase(&(dev->dev_tree_node), &(bus->devices));
1069             
1070             // Free config range hooks
1071             { 
1072                 struct cfg_range_hook * hook = NULL;
1073                 struct cfg_range_hook * tmp = NULL;
1074                 list_for_each_entry_safe(hook, tmp, &(dev->cfg_hooks), list_node) {
1075                     list_del(&(hook->list_node));
1076                     V3_Free(hook);
1077                 }
1078             }
1079
1080             // Free caps
1081             {
1082                 struct pci_cap * cap = NULL;
1083                 struct pci_cap * tmp = NULL;
1084                 list_for_each_entry_safe(cap, tmp, &(dev->cfg_hooks), cap_node) {
1085                     list_del(&(cap->cap_node));
1086                     V3_Free(cap);
1087                 }
1088             }
1089
1090             V3_Free(dev);
1091         }
1092
1093     }
1094     
1095     V3_Free(pci_state);
1096     return 0;
1097 }
1098
1099 #ifdef V3_CONFIG_CHECKPOINT
1100
1101 #include <palacios/vmm_sprintf.h>
1102
1103 static int pci_save_extended(struct v3_chkpt *chkpt, char *id, void * private_data) {
1104     struct pci_internal * pci = (struct pci_internal *)private_data;
1105     struct v3_chkpt_ctx *ctx=0;
1106     char buf[128];
1107     int i = 0;    
1108
1109     ctx = v3_chkpt_open_ctx(chkpt,id);
1110
1111     if (!ctx) { 
1112       PrintError(VM_NONE, VCORE_NONE, "Unable to open base context on save\n");
1113       goto savefailout;
1114     }
1115
1116     V3_CHKPT_SAVE(ctx, "ADDR_REG", pci->addr_reg.val, savefailout);
1117     V3_CHKPT_SAVE(ctx, "IO_BASE", pci->dev_io_base, savefailout);
1118
1119     v3_chkpt_close_ctx(ctx); ctx=0;
1120
1121     for (i = 0; i < PCI_BUS_COUNT; i++) {
1122         struct pci_bus * bus = &(pci->bus_list[i]);
1123         struct rb_node * node = v3_rb_first(&(bus->devices));
1124         struct pci_device * dev = NULL;
1125
1126         snprintf(buf, 128, "%s-%d", id, i);
1127         
1128         ctx = v3_chkpt_open_ctx(chkpt, buf);
1129         
1130         if (!ctx) { 
1131           PrintError(VM_NONE, VCORE_NONE, "Failed to open context for %s\n", buf);
1132           goto savefailout;
1133         }
1134
1135         // nothing actually saved on the bus context... (later expansion)
1136
1137         v3_chkpt_close_ctx(ctx); ctx=0;
1138
1139         while (node) {
1140             int bar_idx = 0;
1141             dev = rb_entry(node, struct pci_device, dev_tree_node);
1142
1143             snprintf(buf, 128, "%s-%d.%d-%d", id, i, dev->dev_num, dev->fn_num);
1144
1145             ctx = v3_chkpt_open_ctx(chkpt, buf);
1146             
1147             if (!ctx) { 
1148               PrintError(VM_NONE, VCORE_NONE, "Failed to open context for device\n");
1149               goto savefailout;
1150             }
1151             
1152             V3_CHKPT_SAVE(ctx, "CONFIG_SPACE", dev->config_space, savefailout);
1153
1154             for (bar_idx = 0; bar_idx < 6; bar_idx++) {
1155                 snprintf(buf, 128, "BAR-%d", bar_idx);
1156                 V3_CHKPT_SAVE(ctx, buf, dev->bar[bar_idx].val, savefailout);
1157             }
1158             
1159             v3_chkpt_close_ctx(ctx); ctx=0;
1160
1161             node = v3_rb_next(node);
1162         }
1163     }
1164
1165 // goodout:
1166
1167     return 0;
1168     
1169  savefailout:
1170     PrintError(VM_NONE, VCORE_NONE, "Failed to save PCI\n");
1171     if (ctx) { v3_chkpt_close_ctx(ctx); }
1172     return -1;
1173
1174 }
1175
1176
1177 static int pci_load_extended(struct v3_chkpt *chkpt, char *id, void * private_data) {
1178     struct pci_internal * pci = (struct pci_internal *)private_data;
1179     struct v3_chkpt_ctx *ctx=0;
1180     char buf[128];
1181     int i = 0;    
1182     
1183     ctx = v3_chkpt_open_ctx(chkpt,id);
1184
1185     if (!ctx) { 
1186       PrintError(VM_NONE, VCORE_NONE, "Unable to open base context on load\n");
1187       goto loadfailout;
1188     }
1189
1190     V3_CHKPT_LOAD(ctx, "ADDR_REG", pci->addr_reg.val, loadfailout);
1191     V3_CHKPT_LOAD(ctx, "IO_BASE", pci->dev_io_base, loadfailout);
1192
1193     v3_chkpt_close_ctx(ctx); ctx=0;
1194
1195     for (i = 0; i < PCI_BUS_COUNT; i++) {
1196         struct pci_bus * bus = &(pci->bus_list[i]);
1197         struct rb_node * node = v3_rb_first(&(bus->devices));
1198         struct pci_device * dev = NULL;
1199
1200         snprintf(buf, 128, "pci-%d", i);
1201         
1202         ctx = v3_chkpt_open_ctx(chkpt, buf);
1203         
1204         if (!ctx) { 
1205           PrintError(VM_NONE, VCORE_NONE, "Failed to open context for %s\n", buf);
1206           goto loadfailout;
1207         }
1208
1209         // nothing actually saved on the bus context... (later expansion)
1210
1211         v3_chkpt_close_ctx(ctx); ctx=0;
1212
1213         while (node) {
1214             int bar_idx = 0;
1215             dev = rb_entry(node, struct pci_device, dev_tree_node);
1216
1217             snprintf(buf, 128, "pci-%d.%d-%d", i, dev->dev_num, dev->fn_num);
1218
1219             ctx = v3_chkpt_open_ctx(chkpt, buf);
1220             
1221             if (!ctx) { 
1222               PrintError(VM_NONE, VCORE_NONE, "Failed to open context for device\n");
1223               goto loadfailout;
1224             }
1225
1226             V3_CHKPT_LOAD(ctx, "CONFIG_SPACE", dev->config_space, loadfailout);
1227
1228             for (bar_idx = 0; bar_idx < 6; bar_idx++) {
1229                 snprintf(buf, 128, "BAR-%d", bar_idx);
1230                 V3_CHKPT_LOAD(ctx, buf, dev->bar[bar_idx].val, loadfailout);
1231             }
1232
1233             v3_chkpt_close_ctx(ctx); ctx=0;
1234
1235             node = v3_rb_next(node);
1236         }
1237     }
1238
1239 // goodout:
1240     return 0;
1241
1242  loadfailout:
1243     PrintError(VM_NONE, VCORE_NONE, "Failed to load PCI\n");
1244     if (ctx) { v3_chkpt_close_ctx(ctx); }
1245     return -1;
1246     
1247 }
1248
1249
1250 #endif
1251
1252
1253
1254
1255 static struct v3_device_ops dev_ops = {
1256     .free = (int (*)(void *))pci_free,
1257 #ifdef V3_CONFIG_CHECKPOINT
1258     .save_extended = pci_save_extended,
1259     .load_extended = pci_load_extended
1260 #endif
1261 };
1262
1263
1264
1265
1266 static int pci_init(struct v3_vm_info * vm, v3_cfg_tree_t * cfg) {
1267     struct pci_internal * pci_state = V3_Malloc(sizeof(struct pci_internal));
1268
1269     if (!pci_state) {
1270         PrintError(vm, VCORE_NONE, "Cannot allocate in init\n");
1271         return -1;
1272     }
1273
1274     int i = 0;
1275     char * dev_id = v3_cfg_val(cfg, "ID");
1276     int ret = 0;
1277     
1278     PrintDebug(vm, VCORE_NONE, "PCI internal at %p\n",(void *)pci_state);
1279     
1280     struct vm_device * dev = v3_add_device(vm, dev_id, &dev_ops, pci_state);
1281     
1282     if (dev == NULL) {
1283         PrintError(vm, VCORE_NONE, "Could not attach device %s\n", dev_id);
1284         V3_Free(pci_state);
1285         return -1;
1286     }
1287
1288     
1289     pci_state->addr_reg.val = 0; 
1290     pci_state->dev_io_base = PCI_DEV_IO_PORT_BASE;
1291
1292     init_pci_busses(pci_state);
1293     
1294     PrintDebug(vm, VCORE_NONE, "Sizeof config header=%d\n", (int)sizeof(struct pci_config_header));
1295     
1296     for (i = 0; i < 4; i++) {
1297         ret |= v3_dev_hook_io(dev, CONFIG_ADDR_PORT + i, &addr_port_read, &addr_port_write);
1298         ret |= v3_dev_hook_io(dev, CONFIG_DATA_PORT + i, &data_port_read, &data_port_write);
1299     }
1300     
1301     if (ret != 0) {
1302         PrintError(vm, VCORE_NONE, "Error hooking PCI IO ports\n");
1303         v3_remove_device(dev);
1304         return -1;
1305     }
1306
1307     return 0;
1308 }
1309
1310
1311 device_register("PCI", pci_init)
1312
1313
1314 static inline int init_bars(struct v3_vm_info * vm, struct pci_device * pci_dev) {
1315     int i = 0;
1316
1317     for (i = 0; i < 6; i++) {
1318         int bar_offset = 0x10 + (4 * i);
1319         struct v3_pci_bar * bar = &(pci_dev->bar[i]);
1320
1321         if (bar->type == PCI_BAR_IO) {
1322             int j = 0;
1323             bar->mask = (~((bar->num_ports) - 1)) | 0x01;
1324
1325             if (bar->default_base_port != 0xffff) {
1326                 bar->val = bar->default_base_port & bar->mask;
1327             } else {
1328                 bar->val = 0;
1329             }
1330
1331             bar->val |= 0x00000001;
1332
1333             for (j = 0; j < bar->num_ports; j++) {
1334                 // hook IO
1335                 if (bar->default_base_port != 0xffff) {
1336                     if (v3_hook_io_port(vm, bar->default_base_port + j,
1337                                         bar->io_read, bar->io_write, 
1338                                         bar->private_data) == -1) {
1339                         PrintError(vm, VCORE_NONE, "Could not hook default io port %x\n", bar->default_base_port + j);
1340                         return -1;
1341                     }
1342                 }
1343             }
1344
1345             *(uint32_t *)(pci_dev->config_space + bar_offset) = bar->val;
1346
1347         } else if (bar->type == PCI_BAR_MEM32) {
1348             bar->mask = ~((bar->num_pages << 12) - 1);
1349             bar->mask |= 0xf; // preserve the configuration flags
1350
1351             if (bar->default_base_addr != 0xffffffff) {
1352                 bar->val = bar->default_base_addr & bar->mask;
1353             } else {
1354                 bar->val = 0;
1355             }
1356
1357             // hook memory
1358             if (bar->mem_read) {
1359                 // full hook
1360                 v3_hook_full_mem(vm, V3_MEM_CORE_ANY, bar->default_base_addr,
1361                                  bar->default_base_addr + (bar->num_pages * PAGE_SIZE_4KB),
1362                                  bar->mem_read, bar->mem_write, pci_dev->priv_data);
1363             } else if (bar->mem_write) {
1364                 // write hook
1365                 PrintError(vm, VCORE_NONE, "Write hooks not supported for PCI devices\n");
1366                 return -1;
1367                 /*
1368                   v3_hook_write_mem(pci_dev->vm_dev->vm, bar->default_base_addr, 
1369                   bar->default_base_addr + (bar->num_pages * PAGE_SIZE_4KB),
1370                   bar->mem_write, pci_dev->vm_dev);
1371                 */
1372             } else {
1373                 // set the prefetchable flag...
1374                 bar->val |= 0x00000008;
1375             }
1376
1377
1378             *(uint32_t *)(pci_dev->config_space + bar_offset) = bar->val;
1379
1380         } else if (bar->type == PCI_BAR_MEM24) {
1381             PrintError(vm, VCORE_NONE, "16 Bit memory ranges not supported (reg: %d)\n", i);
1382             return -1;
1383         } else if (bar->type == PCI_BAR_NONE) {
1384             bar->val = 0x00000000;
1385             bar->mask = 0x00000000; // This ensures that all updates will be dropped
1386             *(uint32_t *)(pci_dev->config_space + bar_offset) = bar->val;
1387         } else if (bar->type == PCI_BAR_PASSTHROUGH) {
1388
1389             // Call the bar init function to get the local cached value
1390             bar->bar_init(i, &(bar->val), bar->private_data);
1391
1392             // Copy back changes it made
1393             *(uint32_t *)(pci_dev->config_space + bar_offset) = bar->val;
1394
1395         } else {
1396             PrintError(vm, VCORE_NONE, "Invalid BAR type for bar #%d\n", i);
1397             return -1;
1398         }
1399
1400         v3_pci_hook_config_range(pci_dev, bar_offset, 4, bar_update, NULL, bar);
1401     }
1402
1403     return 0;
1404 }
1405
1406
1407 int v3_pci_set_irq_bridge(struct  vm_device * pci_bus, int bus_num, 
1408                           int (*raise_pci_irq)(struct pci_device * pci_dev, void * dev_data, struct v3_irq * vec),
1409                           int (*lower_pci_irq)(struct pci_device * pci_dev, void * dev_data, struct v3_irq * vec),
1410                           void * priv_data) {
1411     struct pci_internal * pci_state = (struct pci_internal *)pci_bus->private_data;
1412
1413
1414     pci_state->bus_list[bus_num].raise_pci_irq = raise_pci_irq;
1415     pci_state->bus_list[bus_num].lower_pci_irq = lower_pci_irq;
1416     pci_state->bus_list[bus_num].irq_dev_data = priv_data;
1417
1418     return 0;
1419 }
1420
1421 int v3_pci_raise_irq(struct vm_device * pci_bus, struct pci_device * dev, uint32_t vec_index) {
1422    struct v3_irq vec;
1423
1424    vec.ack = NULL;
1425    vec.private_data = NULL;
1426    vec.irq = vec_index;
1427
1428    return v3_pci_raise_acked_irq(pci_bus, dev, vec);
1429 }
1430
1431 int v3_pci_lower_irq(struct vm_device * pci_bus, struct pci_device * dev, uint32_t vec_index) {
1432     struct v3_irq vec;
1433
1434     vec.irq = vec_index;
1435     vec.ack = NULL;
1436     vec.private_data = NULL;
1437     
1438     return v3_pci_lower_acked_irq(pci_bus, dev, vec);
1439 }
1440
1441 int v3_pci_raise_acked_irq(struct vm_device * pci_bus, struct pci_device * dev, struct v3_irq vec) {
1442    struct pci_internal * pci_state = (struct pci_internal *)pci_bus->private_data;
1443    struct pci_bus * bus = &(pci_state->bus_list[dev->bus_num]);
1444
1445
1446    if (dev->irq_type == IRQ_INTX) {
1447        return bus->raise_pci_irq(dev, bus->irq_dev_data, &vec);
1448    } else if (dev->irq_type == IRQ_MSI) {
1449        struct v3_gen_ipi ipi;
1450        struct msi_addr * addr = NULL;
1451        struct msi_data * data = NULL;       
1452        
1453        if (dev->msi_cap->cap_64bit) {
1454            if (dev->msi_cap->per_vect_mask) {
1455                struct msi64_pervec_msg_addr * msi = (void *)dev->msi_cap;
1456                addr = &(msi->addr);
1457                data = &(msi->data);
1458            } else {
1459                struct msi64_msg_addr * msi = (void *)dev->msi_cap;
1460                addr = &(msi->addr);
1461                data = &(msi->data);
1462            }
1463        } else {
1464            struct msi32_msg_addr * msi = (void *)dev->msi_cap;
1465            addr = &(msi->addr);
1466            data = &(msi->data);
1467        }
1468
1469        memset(&ipi, 0, sizeof(struct v3_gen_ipi));
1470
1471        // decode MSI fields into IPI
1472
1473        ipi.vector = data->vector + vec.irq;
1474        ipi.mode = data->del_mode;
1475        ipi.logical = addr->dst_mode;
1476        ipi.trigger_mode = data->trig_mode;
1477        ipi.dst_shorthand = 0;
1478        ipi.dst = addr->dst_id;
1479        
1480
1481        v3_apic_send_ipi(dev->vm, &ipi, dev->apic_dev);
1482
1483        return 0;       
1484    } else if (dev->irq_type == IRQ_MSIX) {
1485        addr_t msix_table_gpa = 0;
1486        struct msix_table * msix_table = NULL;
1487        uint_t bar_idx = dev->msix_cap->bir;
1488        struct v3_gen_ipi ipi;
1489        struct msi_addr * addr = NULL;
1490        struct msi_data * data = NULL;   
1491        
1492        if (dev->bar[bar_idx].type != PCI_BAR_MEM32) {
1493            PrintError(VM_NONE, VCORE_NONE, "Non 32bit MSIX BAR registers are not supported\n");
1494            return -1;
1495        }
1496
1497        msix_table_gpa = dev->bar[bar_idx].val;
1498        msix_table_gpa += dev->msix_cap->table_offset;
1499
1500        if (v3_gpa_to_hva(&(dev->vm->cores[0]), msix_table_gpa, (void *)&(msix_table)) != 0) {
1501            PrintError(VM_NONE, VCORE_NONE, "Could not translate MSIX Table GPA (%p)\n", (void *)msix_table_gpa);
1502            return -1;
1503        }
1504        
1505        memset(&ipi, 0, sizeof(struct v3_gen_ipi));
1506
1507        data = &(msix_table->entries[vec.irq].data);
1508        addr = &(msix_table->entries[vec.irq].addr);;
1509        
1510        // decode MSIX fields into IPI
1511        ipi.vector = data->vector + vec.irq;
1512        ipi.mode = data->del_mode;
1513        ipi.logical = addr->dst_mode;
1514        ipi.trigger_mode = data->trig_mode;
1515        ipi.dst_shorthand = 0;
1516        ipi.dst = addr->dst_id;
1517        
1518
1519
1520        V3_Print(VM_NONE, VCORE_NONE, "Decode MSIX\n");
1521
1522        v3_apic_send_ipi(dev->vm, &ipi, dev->apic_dev);
1523
1524        return 0;
1525    } 
1526    
1527    // Should never get here
1528    return -1;
1529
1530 }
1531
1532 int v3_pci_lower_acked_irq(struct vm_device * pci_bus, struct pci_device * dev, struct v3_irq vec) {
1533     if (dev->irq_type == IRQ_INTX) {
1534         struct pci_internal * pci_state = (struct pci_internal *)pci_bus->private_data;
1535         struct pci_bus * bus = &(pci_state->bus_list[dev->bus_num]);
1536         
1537         return bus->lower_pci_irq(dev, bus->irq_dev_data, &vec);
1538     } else {
1539         return -1;
1540     }
1541 }
1542
1543
1544 // if dev_num == -1, auto assign 
1545 struct pci_device * v3_pci_register_device(struct vm_device * pci,
1546                                            pci_device_type_t dev_type, 
1547                                            int bus_num,
1548                                            int dev_num,
1549                                            int fn_num,
1550                                            const char * name,
1551                                            struct v3_pci_bar * bars,
1552                                            int (*config_write)(struct pci_device * pci_dev, uint32_t reg_num, void * src, 
1553                                                                uint_t length, void * priv_data),
1554                                            int (*config_read)(struct pci_device * pci_dev, uint32_t reg_num, void * dst, 
1555                                                               uint_t length, void * priv_data),
1556                                            int (*cmd_update)(struct pci_device * pci_dev, pci_cmd_t cmd, uint64_t arg, void * priv_data),
1557                                            int (*exp_rom_update)(struct pci_device * pci_dev, uint32_t * src, void * priv_data),
1558                                            void * priv_data) {
1559
1560     struct pci_internal * pci_state = (struct pci_internal *)pci->private_data;
1561     struct pci_bus * bus = &(pci_state->bus_list[bus_num]);
1562     struct pci_device * pci_dev = NULL;
1563     int i;
1564
1565     if (dev_num > MAX_BUS_DEVICES) {
1566         PrintError(VM_NONE, VCORE_NONE, "Requested Invalid device number (%d)\n", dev_num);
1567         return NULL;
1568     }
1569
1570     if (dev_num == PCI_AUTO_DEV_NUM) {
1571         PrintDebug(VM_NONE, VCORE_NONE, "Searching for free device number\n");
1572         if ((dev_num = get_free_dev_num(bus)) == -1) {
1573             PrintError(VM_NONE, VCORE_NONE, "No more available PCI slots on bus %d\n", bus->bus_num);
1574             return NULL;
1575         }
1576     }
1577     
1578     PrintDebug(VM_NONE, VCORE_NONE, "Checking for PCI Device\n");
1579
1580     if (get_device(bus, dev_num, fn_num) != NULL) {
1581         PrintError(VM_NONE, VCORE_NONE, "PCI Device already registered at slot %d on bus %d\n", 
1582                    dev_num, bus->bus_num);
1583         return NULL;
1584     }
1585
1586     
1587     pci_dev = (struct pci_device *)V3_Malloc(sizeof(struct pci_device));
1588
1589     if (pci_dev == NULL) {
1590         PrintError(VM_NONE, VCORE_NONE, "Could not allocate pci device\n");
1591         return NULL;
1592     }
1593
1594     memset(pci_dev, 0, sizeof(struct pci_device));
1595
1596
1597     pci_dev->type = dev_type;
1598     
1599     switch (pci_dev->type) {
1600         case PCI_STD_DEVICE:
1601             pci_dev->config_header.header_type = 0x00;
1602             break;
1603         case PCI_MULTIFUNCTION:
1604             pci_dev->config_header.header_type = 0x80;
1605             break;
1606         default:
1607             PrintError(VM_NONE, VCORE_NONE, "Unhandled PCI Device Type: %d\n", dev_type);
1608             return NULL;
1609     }
1610
1611
1612
1613     pci_dev->bus_num = bus_num;
1614     pci_dev->dev_num = dev_num;
1615     pci_dev->fn_num = fn_num;
1616
1617     strncpy(pci_dev->name, name, sizeof(pci_dev->name));
1618     pci_dev->vm = pci->vm;
1619     pci_dev->priv_data = priv_data;
1620
1621     INIT_LIST_HEAD(&(pci_dev->cfg_hooks));
1622     INIT_LIST_HEAD(&(pci_dev->capabilities));
1623
1624     
1625     {
1626         // locate APIC for MSI/MSI-X
1627         pci_dev->apic_dev = v3_find_dev(pci->vm, "apic");
1628     }
1629
1630     // register update callbacks
1631     pci_dev->config_write = config_write;
1632     pci_dev->config_read = config_read;
1633     pci_dev->cmd_update = cmd_update;
1634     pci_dev->exp_rom_update = exp_rom_update;
1635
1636
1637
1638     if (config_read) {
1639         int i = 0;
1640
1641         // Only 256 bytes for now, should expand it in the future
1642         for (i = 0; i < 256; i++) {
1643             config_read(pci_dev, i, &(pci_dev->config_space[i]), 1, pci_dev->priv_data);
1644         }
1645     }
1646
1647     V3_Print(VM_NONE, VCORE_NONE, "Scanning for Capabilities\n");
1648
1649     // scan for caps
1650     scan_pci_caps(pci_dev);
1651
1652     pci_dev->irq_type = IRQ_INTX;
1653
1654     V3_Print(VM_NONE, VCORE_NONE, "Caps scanned\n");
1655
1656     // hook important regions
1657     v3_pci_hook_config_range(pci_dev, 0x30, 4, exp_rom_write, NULL, NULL);  // ExpRom
1658     v3_pci_hook_config_range(pci_dev, 0x04, 2, cmd_write, NULL, NULL);      // CMD Reg
1659     // * Status resets
1660     // * Drop BIST
1661     // 
1662
1663     
1664
1665     //copy bars
1666     for (i = 0; i < 6; i ++) {
1667         pci_dev->bar[i].type = bars[i].type;
1668         pci_dev->bar[i].private_data = bars[i].private_data;
1669
1670         if (pci_dev->bar[i].type == PCI_BAR_IO) {
1671             pci_dev->bar[i].num_ports = bars[i].num_ports;
1672
1673             // This is a horrible HACK becaues the BIOS is supposed to set the PCI base ports 
1674             // And if the BIOS doesn't, Linux just happily overlaps device port assignments
1675             if (bars[i].default_base_port != (uint16_t)-1) {
1676                 pci_dev->bar[i].default_base_port = bars[i].default_base_port;
1677             } else {
1678                 pci_dev->bar[i].default_base_port = pci_state->dev_io_base;
1679                 pci_state->dev_io_base += ( 0x100 * ((bars[i].num_ports / 0x100) + 1) );
1680             }
1681
1682             pci_dev->bar[i].io_read = bars[i].io_read;
1683             pci_dev->bar[i].io_write = bars[i].io_write;
1684         } else if (pci_dev->bar[i].type == PCI_BAR_MEM32) {
1685             pci_dev->bar[i].num_pages = bars[i].num_pages;
1686             pci_dev->bar[i].default_base_addr = bars[i].default_base_addr;
1687             pci_dev->bar[i].mem_read = bars[i].mem_read;
1688             pci_dev->bar[i].mem_write = bars[i].mem_write;
1689         } else if (pci_dev->bar[i].type == PCI_BAR_PASSTHROUGH) {
1690             pci_dev->bar[i].bar_init = bars[i].bar_init;
1691             pci_dev->bar[i].bar_write = bars[i].bar_write;
1692         } else {
1693             pci_dev->bar[i].num_pages = 0;
1694             pci_dev->bar[i].default_base_addr = 0;
1695             pci_dev->bar[i].mem_read = NULL;
1696             pci_dev->bar[i].mem_write = NULL;
1697         }
1698     }
1699
1700     if (init_bars(pci->vm, pci_dev) == -1) {
1701         PrintError(VM_NONE, VCORE_NONE, "could not initialize bar registers\n");
1702         return NULL;
1703     }
1704
1705     // add the device
1706     add_device_to_bus(bus, pci_dev);
1707
1708 #ifdef V3_CONFIG_DEBUG_PCI
1709     pci_dump_state(pci_state);
1710 #endif
1711
1712     return pci_dev;
1713 }
1714