@@ -115,17 +115,6 @@ static uint64_t get_vbar_base(const struct pci_vdev *vdev, uint32_t idx)
115
115
return pci_bar_2_bar_base (& vdev -> bar [0 ], vdev -> nr_bars , idx );
116
116
}
117
117
118
- /**
119
- * @brief get pbar's full address in 64-bit
120
- * For 64-bit MMIO bar, its lower 32-bits base address and upper 32-bits base are combined
121
- * into one 64-bit base address
122
- * @pre pdev != NULL
123
- */
124
- static uint64_t get_pbar_base (const struct pci_pdev * pdev , uint32_t idx )
125
- {
126
- return pci_bar_2_bar_base (& pdev -> bar [0 ], pdev -> nr_bars , idx );
127
- }
128
-
129
118
/**
130
119
* @pre vdev != NULL
131
120
*/
@@ -143,17 +132,12 @@ void vdev_pt_read_cfg(const struct pci_vdev *vdev, uint32_t offset, uint32_t byt
143
132
* @pre vdev != NULL
144
133
* @pre vdev->vpci != NULL
145
134
* @pre vdev->vpci->vm != NULL
146
- * @pre vdev->pdev != NULL
147
- * @pre vdev->pdev->msix.table_bar < vdev->nr_bars
148
135
*/
149
136
static void vdev_pt_remap_msix_table_vbar (struct pci_vdev * vdev )
150
137
{
151
138
uint32_t i ;
152
139
struct pci_msix * msix = & vdev -> msix ;
153
- struct pci_pdev * pdev = vdev -> pdev ;
154
- struct pci_bar * pbar ;
155
-
156
- ASSERT (vdev -> pdev -> msix .table_bar < vdev -> nr_bars , "msix->table_bar is out of range" );
140
+ struct pci_bar * vbar ;
157
141
158
142
/* Mask all table entries */
159
143
for (i = 0U ; i < msix -> table_count ; i ++ ) {
@@ -162,17 +146,17 @@ static void vdev_pt_remap_msix_table_vbar(struct pci_vdev *vdev)
162
146
msix -> table_entries [i ].data = 0U ;
163
147
}
164
148
165
- pbar = & pdev -> bar [msix -> table_bar ];
166
- if (pbar != NULL ) {
167
- uint64_t pbar_base = get_pbar_base ( pdev , msix -> table_bar ) ; /* pbar (hpa) */
149
+ vbar = & vdev -> bar [msix -> table_bar ];
150
+ if (vbar -> size != 0UL ) {
151
+ uint64_t pbar_base = vbar -> base_hpa ; /* pbar (hpa) */
168
152
169
153
msix -> mmio_hpa = pbar_base ;
170
154
if (is_prelaunched_vm (vdev -> vpci -> vm )) {
171
155
msix -> mmio_gpa = get_vbar_base (vdev , msix -> table_bar );
172
156
} else {
173
157
msix -> mmio_gpa = sos_vm_hpa2gpa (pbar_base );
174
158
}
175
- msix -> mmio_size = pbar -> size ;
159
+ msix -> mmio_size = vbar -> size ;
176
160
}
177
161
178
162
/*
@@ -279,7 +263,7 @@ static void vdev_pt_remap_generic_mem_vbar(struct pci_vdev *vdev, uint32_t idx)
279
263
/* If a new vbar is set (nonzero), set the EPT mapping accordingly */
280
264
if (vbar_base != 0UL ) {
281
265
uint64_t hpa = gpa2hpa (vdev -> vpci -> vm , vbar_base );
282
- uint64_t pbar_base = get_pbar_base ( vdev -> pdev , idx ) ; /* pbar (hpa) */
266
+ uint64_t pbar_base = vbar -> base_hpa ; /* pbar (hpa) */
283
267
284
268
if (hpa != pbar_base ) {
285
269
/* Unmap the existing mapping for new vbar */
@@ -489,13 +473,14 @@ void init_vdev_pt(struct pci_vdev *vdev)
489
473
vbar -> size = 0UL ;
490
474
vbar -> reg .value = pbar -> reg .value ;
491
475
vbar -> is_64bit_high = pbar -> is_64bit_high ;
476
+ vbar -> base_hpa = pbar -> base_hpa ;
492
477
493
478
if (pbar -> is_64bit_high ) {
494
479
ASSERT (idx > 0U , "idx for upper 32-bit of the 64-bit bar should be greater than 0!" );
495
480
496
481
if (is_sos_vm (vdev -> vpci -> vm )) {
497
482
/* For SOS: vbar base (GPA) = pbar base (HPA) */
498
- vbar_base = get_pbar_base ( vdev -> pdev , idx ) ;
483
+ vbar_base = vdev -> bar [ idx - 1U ]. base_hpa ;
499
484
} else if (idx > 0U ) {
500
485
/* For pre-launched VMs: vbar base is predefined in vm_config */
501
486
vbar_base = vdev -> pci_dev_config -> vbar_base [idx - 1U ];
@@ -519,7 +504,7 @@ void init_vdev_pt(struct pci_vdev *vdev)
519
504
520
505
if (is_sos_vm (vdev -> vpci -> vm )) {
521
506
/* For SOS: vbar base (GPA) = pbar base (HPA) */
522
- vbar_base = get_pbar_base ( vdev -> pdev , idx ) ;
507
+ vbar_base = vbar -> base_hpa ;
523
508
} else {
524
509
/* For pre-launched VMs: vbar base is predefined in vm_config */
525
510
vbar_base = vdev -> pci_dev_config -> vbar_base [idx ];
@@ -529,7 +514,7 @@ void init_vdev_pt(struct pci_vdev *vdev)
529
514
530
515
case PCIBAR_IO_SPACE :
531
516
vbar -> size = pbar -> size ;
532
- vdev_pt_write_vbar (vdev , pci_bar_offset (idx ), (uint32_t )get_pbar_base ( vdev -> pdev , idx ) );
517
+ vdev_pt_write_vbar (vdev , pci_bar_offset (idx ), (uint32_t )vbar -> base_hpa );
533
518
break ;
534
519
535
520
default :
0 commit comments