@@ -2107,6 +2107,57 @@ void kvm_irq_line(struct kvm_vm *vm, uint32_t irq, int level)
2107
2107
TEST_ASSERT (ret >= 0 , "KVM_IRQ_LINE failed, rc: %i errno: %i" , ret , errno );
2108
2108
}
2109
2109
2110
+ struct kvm_irq_routing * kvm_gsi_routing_create (void )
2111
+ {
2112
+ struct kvm_irq_routing * routing ;
2113
+ size_t size ;
2114
+
2115
+ size = sizeof (struct kvm_irq_routing );
2116
+ /* Allocate space for the max number of entries: this wastes 196 KBs. */
2117
+ size += KVM_MAX_IRQ_ROUTES * sizeof (struct kvm_irq_routing_entry );
2118
+ routing = calloc (1 , size );
2119
+ assert (routing );
2120
+
2121
+ return routing ;
2122
+ }
2123
+
2124
+ void kvm_gsi_routing_irqchip_add (struct kvm_irq_routing * routing ,
2125
+ uint32_t gsi , uint32_t pin )
2126
+ {
2127
+ int i ;
2128
+
2129
+ assert (routing );
2130
+ assert (routing -> nr < KVM_MAX_IRQ_ROUTES );
2131
+
2132
+ i = routing -> nr ;
2133
+ routing -> entries [i ].gsi = gsi ;
2134
+ routing -> entries [i ].type = KVM_IRQ_ROUTING_IRQCHIP ;
2135
+ routing -> entries [i ].flags = 0 ;
2136
+ routing -> entries [i ].u .irqchip .irqchip = 0 ;
2137
+ routing -> entries [i ].u .irqchip .pin = pin ;
2138
+ routing -> nr ++ ;
2139
+ }
2140
+
2141
+ int _kvm_gsi_routing_write (struct kvm_vm * vm , struct kvm_irq_routing * routing )
2142
+ {
2143
+ int ret ;
2144
+
2145
+ assert (routing );
2146
+ ret = ioctl (vm_get_fd (vm ), KVM_SET_GSI_ROUTING , routing );
2147
+ free (routing );
2148
+
2149
+ return ret ;
2150
+ }
2151
+
2152
+ void kvm_gsi_routing_write (struct kvm_vm * vm , struct kvm_irq_routing * routing )
2153
+ {
2154
+ int ret ;
2155
+
2156
+ ret = _kvm_gsi_routing_write (vm , routing );
2157
+ TEST_ASSERT (ret == 0 , "KVM_SET_GSI_ROUTING failed, rc: %i errno: %i" ,
2158
+ ret , errno );
2159
+ }
2160
+
2110
2161
/*
2111
2162
* VM Dump
2112
2163
*
0 commit comments