@@ -85,6 +85,9 @@ static void compare_vcpu_events(struct kvm_vcpu_events *left,
85
85
{
86
86
}
87
87
88
+ #define TEST_SYNC_FIELDS (KVM_SYNC_X86_REGS|KVM_SYNC_X86_SREGS|KVM_SYNC_X86_EVENTS)
89
+ #define INVALID_SYNC_FIELD 0x80000000
90
+
88
91
int main (int argc , char * argv [])
89
92
{
90
93
struct kvm_vm * vm ;
@@ -98,25 +101,44 @@ int main(int argc, char *argv[])
98
101
setbuf (stdout , NULL );
99
102
100
103
cap = kvm_check_cap (KVM_CAP_SYNC_REGS );
101
- TEST_ASSERT ((unsigned long )cap == KVM_SYNC_X86_VALID_FIELDS ,
102
- "KVM_CAP_SYNC_REGS (0x%x) != KVM_SYNC_X86_VALID_FIELDS (0x%lx)\n" ,
103
- cap , KVM_SYNC_X86_VALID_FIELDS );
104
+ if ((cap & TEST_SYNC_FIELDS ) != TEST_SYNC_FIELDS ) {
105
+ fprintf (stderr , "KVM_CAP_SYNC_REGS not supported, skipping test\n" );
106
+ exit (KSFT_SKIP );
107
+ }
108
+ if ((cap & INVALID_SYNC_FIELD ) != 0 ) {
109
+ fprintf (stderr , "The \"invalid\" field is not invalid, skipping test\n" );
110
+ exit (KSFT_SKIP );
111
+ }
104
112
105
113
/* Create VM */
106
114
vm = vm_create_default (VCPU_ID , guest_code );
107
115
108
116
run = vcpu_state (vm , VCPU_ID );
109
117
110
118
/* Request reading invalid register set from VCPU. */
111
- run -> kvm_valid_regs = KVM_SYNC_X86_VALID_FIELDS << 1 ;
119
+ run -> kvm_valid_regs = INVALID_SYNC_FIELD ;
120
+ rv = _vcpu_run (vm , VCPU_ID );
121
+ TEST_ASSERT (rv < 0 && errno == EINVAL ,
122
+ "Invalid kvm_valid_regs did not cause expected KVM_RUN error: %d\n" ,
123
+ rv );
124
+ vcpu_state (vm , VCPU_ID )-> kvm_valid_regs = 0 ;
125
+
126
+ run -> kvm_valid_regs = INVALID_SYNC_FIELD | TEST_SYNC_FIELDS ;
112
127
rv = _vcpu_run (vm , VCPU_ID );
113
128
TEST_ASSERT (rv < 0 && errno == EINVAL ,
114
129
"Invalid kvm_valid_regs did not cause expected KVM_RUN error: %d\n" ,
115
130
rv );
116
131
vcpu_state (vm , VCPU_ID )-> kvm_valid_regs = 0 ;
117
132
118
133
/* Request setting invalid register set into VCPU. */
119
- run -> kvm_dirty_regs = KVM_SYNC_X86_VALID_FIELDS << 1 ;
134
+ run -> kvm_dirty_regs = INVALID_SYNC_FIELD ;
135
+ rv = _vcpu_run (vm , VCPU_ID );
136
+ TEST_ASSERT (rv < 0 && errno == EINVAL ,
137
+ "Invalid kvm_dirty_regs did not cause expected KVM_RUN error: %d\n" ,
138
+ rv );
139
+ vcpu_state (vm , VCPU_ID )-> kvm_dirty_regs = 0 ;
140
+
141
+ run -> kvm_dirty_regs = INVALID_SYNC_FIELD | TEST_SYNC_FIELDS ;
120
142
rv = _vcpu_run (vm , VCPU_ID );
121
143
TEST_ASSERT (rv < 0 && errno == EINVAL ,
122
144
"Invalid kvm_dirty_regs did not cause expected KVM_RUN error: %d\n" ,
@@ -125,7 +147,7 @@ int main(int argc, char *argv[])
125
147
126
148
/* Request and verify all valid register sets. */
127
149
/* TODO: BUILD TIME CHECK: TEST_ASSERT(KVM_SYNC_X86_NUM_FIELDS != 3); */
128
- run -> kvm_valid_regs = KVM_SYNC_X86_VALID_FIELDS ;
150
+ run -> kvm_valid_regs = TEST_SYNC_FIELDS ;
129
151
rv = _vcpu_run (vm , VCPU_ID );
130
152
TEST_ASSERT (run -> exit_reason == KVM_EXIT_IO ,
131
153
"Unexpected exit reason: %u (%s),\n" ,
@@ -146,7 +168,7 @@ int main(int argc, char *argv[])
146
168
run -> s .regs .sregs .apic_base = 1 << 11 ;
147
169
/* TODO run->s.regs.events.XYZ = ABC; */
148
170
149
- run -> kvm_valid_regs = KVM_SYNC_X86_VALID_FIELDS ;
171
+ run -> kvm_valid_regs = TEST_SYNC_FIELDS ;
150
172
run -> kvm_dirty_regs = KVM_SYNC_X86_REGS | KVM_SYNC_X86_SREGS ;
151
173
rv = _vcpu_run (vm , VCPU_ID );
152
174
TEST_ASSERT (run -> exit_reason == KVM_EXIT_IO ,
@@ -172,7 +194,7 @@ int main(int argc, char *argv[])
172
194
/* Clear kvm_dirty_regs bits, verify new s.regs values are
173
195
* overwritten with existing guest values.
174
196
*/
175
- run -> kvm_valid_regs = KVM_SYNC_X86_VALID_FIELDS ;
197
+ run -> kvm_valid_regs = TEST_SYNC_FIELDS ;
176
198
run -> kvm_dirty_regs = 0 ;
177
199
run -> s .regs .regs .r11 = 0xDEADBEEF ;
178
200
rv = _vcpu_run (vm , VCPU_ID );
@@ -211,7 +233,7 @@ int main(int argc, char *argv[])
211
233
* with kvm_sync_regs values.
212
234
*/
213
235
run -> kvm_valid_regs = 0 ;
214
- run -> kvm_dirty_regs = KVM_SYNC_X86_VALID_FIELDS ;
236
+ run -> kvm_dirty_regs = TEST_SYNC_FIELDS ;
215
237
run -> s .regs .regs .r11 = 0xBBBB ;
216
238
rv = _vcpu_run (vm , VCPU_ID );
217
239
TEST_ASSERT (run -> exit_reason == KVM_EXIT_IO ,
0 commit comments