39
39
#include "trace.h"
40
40
#include "hw/irq.h"
41
41
#include "sysemu/sev.h"
42
+ #include "migration/qemu-memfile.h"
43
+ #include "migration/savevm.h"
42
44
43
45
#include "hw/boards.h"
44
46
@@ -145,6 +147,10 @@ static bool kvm_has_mem_rw_flag;
145
147
static bool kvm_has_disk_rw_flag ;
146
148
#endif
147
149
150
+ #ifdef KVM_CAP_DEV_SNAPSHOT
151
+ static bool kvm_dev_snapshot ;
152
+ #endif
153
+
148
154
static const KVMCapabilityInfo kvm_required_capabilites [] = {
149
155
KVM_CAP_INFO (USER_MEMORY ),
150
156
KVM_CAP_INFO (DESTROY_MEMORY_REGION_WORKS ),
@@ -1522,6 +1528,7 @@ int kvm_has_mem_rw(void)
1522
1528
{
1523
1529
return kvm_has_mem_rw_flag ;
1524
1530
}
1531
+
1525
1532
int kvm_mem_rw (void * dest , const void * source , uint64_t size , int is_write )
1526
1533
{
1527
1534
struct kvm_mem_rw rw ;
@@ -1536,6 +1543,7 @@ int kvm_has_mem_rw(void)
1536
1543
{
1537
1544
return 0 ;
1538
1545
}
1546
+
1539
1547
int kvm_mem_rw (void * dest , const void * source , uint64_t size , int is_write )
1540
1548
{
1541
1549
return -1 ;
@@ -1547,6 +1555,7 @@ int kvm_has_disk_rw(void)
1547
1555
{
1548
1556
return kvm_has_disk_rw_flag ;
1549
1557
}
1558
+
1550
1559
int kvm_disk_rw (void * buffer , uint64_t sector , int count , int is_write )
1551
1560
{
1552
1561
int ret ;
@@ -1566,12 +1575,94 @@ int kvm_has_disk_rw(void)
1566
1575
{
1567
1576
return 0 ;
1568
1577
}
1578
+
1569
1579
int kvm_disk_rw (void * buffer , uint64_t sector , int count , int is_write )
1570
1580
{
1571
1581
return -1 ;
1572
1582
}
1573
1583
#endif
1574
1584
1585
+ #ifdef KVM_CAP_DEV_SNAPSHOT
1586
+
1587
+ static int kvm_dev_save_snapshot (void )
1588
+ {
1589
+ static bool unregistered = false;
1590
+ int ret = -1 ;
1591
+ struct kvm_dev_snapshot s ;
1592
+ size_t ssize ;
1593
+ Error * err = NULL ;
1594
+ QEMUFile * f = qemu_memfile_open ();
1595
+
1596
+ if (kvm_dev_snapshot && !unregistered ) {
1597
+ vmstate_unregister_blacklisted_devices ();
1598
+ unregistered = true;
1599
+ }
1600
+
1601
+ if (qemu_savevm_state (f , & err ) < 0 ) {
1602
+ if (err ) {
1603
+ error_report_err (err );
1604
+ abort ();
1605
+ }
1606
+ }
1607
+
1608
+ s .buffer = (uint64_t ) qemu_file_get_internal_storage (f , & ssize );
1609
+ if (!s .buffer ) {
1610
+ fprintf (stderr , "could not get internal storage\n" );
1611
+ abort ();
1612
+ }
1613
+ s .size = (uint32_t ) ssize ;
1614
+
1615
+ s .is_write = 1 ;
1616
+
1617
+ ret = kvm_vm_ioctl (kvm_state , KVM_DEV_SNAPSHOT , & s );
1618
+
1619
+ if (ret < 0 ) {
1620
+ fprintf (stderr , "Could not save device snapshot\n" );
1621
+ abort ();
1622
+ }
1623
+
1624
+ qemu_fclose (f );
1625
+ return ret ;
1626
+ }
1627
+
1628
+ static int kvm_dev_restore_snapshot_cb (void * buffer , size_t pos , size_t size )
1629
+ {
1630
+ struct kvm_dev_snapshot s ;
1631
+ s .buffer = (uintptr_t ) buffer ;
1632
+ s .size = size ;
1633
+ s .is_write = 0 ;
1634
+ s .pos = pos ;
1635
+
1636
+ return kvm_vm_ioctl (kvm_state , KVM_DEV_SNAPSHOT , & s );
1637
+ }
1638
+
1639
+ static int kvm_dev_restore_snapshot (void )
1640
+ {
1641
+ QEMUFile * f = qemu_memfile_open_ro (kvm_dev_restore_snapshot_cb );
1642
+ if (!f ) {
1643
+ return -1 ;
1644
+ }
1645
+
1646
+ if (qemu_loadvm_state (f ) < 0 ) {
1647
+ error_report ("Could not restore device state" );
1648
+ abort ();
1649
+ }
1650
+
1651
+ qemu_fclose (f );
1652
+ return 0 ;
1653
+ }
1654
+ #else
1655
+ static int kvm_dev_save_snapshot (void )
1656
+ {
1657
+ return -1 ;
1658
+ }
1659
+
1660
+ static int kvm_dev_restore_snapshot (void )
1661
+ {
1662
+ return -1 ;
1663
+ }
1664
+ #endif
1665
+
1575
1666
1576
1667
static int kvm_init (MachineState * ms )
1577
1668
{
@@ -1768,6 +1859,10 @@ static int kvm_init(MachineState *ms)
1768
1859
kvm_has_disk_rw_flag = kvm_check_extension (s , KVM_CAP_DISK_RW );
1769
1860
#endif
1770
1861
1862
+ #ifdef KVM_CAP_DEV_SNAPSHOT
1863
+ kvm_dev_snapshot = kvm_check_extension (s , KVM_CAP_DEV_SNAPSHOT );
1864
+ #endif
1865
+
1771
1866
kvm_state = s ;
1772
1867
1773
1868
/*
@@ -2144,6 +2239,23 @@ int kvm_cpu_exec(CPUState *cpu)
2144
2239
break ;
2145
2240
}
2146
2241
break ;
2242
+ case KVM_EXIT_FLUSH_DISK :
2243
+ bdrv_drain_all_begin ();
2244
+ bdrv_flush_all ();
2245
+ ret = 0 ;
2246
+ break ;
2247
+ case KVM_EXIT_SAVE_DEV_STATE :
2248
+ qemu_mutex_lock_iothread ();
2249
+ kvm_dev_save_snapshot ();
2250
+ qemu_mutex_unlock_iothread ();
2251
+ ret = 0 ;
2252
+ break ;
2253
+ case KVM_EXIT_RESTORE_DEV_STATE :
2254
+ qemu_mutex_lock_iothread ();
2255
+ kvm_dev_restore_snapshot ();
2256
+ qemu_mutex_unlock_iothread ();
2257
+ ret = 0 ;
2258
+ break ;
2147
2259
default :
2148
2260
DPRINTF ("kvm_arch_handle_exit\n" );
2149
2261
ret = kvm_arch_handle_exit (cpu , run );
0 commit comments