@@ -48,6 +48,16 @@ struct reg_sublist {
48
48
__u64 rejects_set_n ;
49
49
};
50
50
51
+ struct feature_id_reg {
52
+ __u64 reg ;
53
+ __u64 id_reg ;
54
+ __u64 feat_shift ;
55
+ __u64 feat_min ;
56
+ };
57
+
58
+ static struct feature_id_reg feat_id_regs [] = {
59
+ };
60
+
51
61
struct vcpu_config {
52
62
char * name ;
53
63
struct reg_sublist sublists [];
@@ -68,7 +78,8 @@ static int vcpu_configs_n;
68
78
69
79
#define for_each_missing_reg (i ) \
70
80
for ((i) = 0; (i) < blessed_n; ++(i)) \
71
- if (!find_reg(reg_list->reg, reg_list->n, blessed_reg[i]))
81
+ if (!find_reg(reg_list->reg, reg_list->n, blessed_reg[i])) \
82
+ if (check_supported_feat_reg(vcpu, blessed_reg[i]))
72
83
73
84
#define for_each_new_reg (i ) \
74
85
for_each_reg_filtered(i) \
@@ -132,6 +143,25 @@ static bool find_reg(__u64 regs[], __u64 nr_regs, __u64 reg)
132
143
return false;
133
144
}
134
145
146
+ static bool check_supported_feat_reg (struct kvm_vcpu * vcpu , __u64 reg )
147
+ {
148
+ int i , ret ;
149
+ __u64 data , feat_val ;
150
+
151
+ for (i = 0 ; i < ARRAY_SIZE (feat_id_regs ); i ++ ) {
152
+ if (feat_id_regs [i ].reg == reg ) {
153
+ ret = __vcpu_get_reg (vcpu , feat_id_regs [i ].id_reg , & data );
154
+ if (ret < 0 )
155
+ return false;
156
+
157
+ feat_val = ((data >> feat_id_regs [i ].feat_shift ) & 0xf );
158
+ return feat_val >= feat_id_regs [i ].feat_min ;
159
+ }
160
+ }
161
+
162
+ return true;
163
+ }
164
+
135
165
static const char * str_with_index (const char * template , __u64 index )
136
166
{
137
167
char * str , * p ;
0 commit comments