Skip to content

Commit 1d5fb86

Browse files
committed
Snapshot: Add snapshot user client and daemon stub
1 parent b3d204d commit 1d5fb86

13 files changed

+601
-46
lines changed

MacHyperVSupport.xcodeproj/project.pbxproj

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,12 @@
108108
41AD091C2D74BAB900E1F91F /* HyperVSnapshot.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 41AD09192D74BAB900E1F91F /* HyperVSnapshot.cpp */; };
109109
41AD091D2D74BAB900E1F91F /* HyperVSnapshot.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 41AD091A2D74BAB900E1F91F /* HyperVSnapshot.hpp */; };
110110
41AD091E2D74BAB900E1F91F /* HyperVSnapshot.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 41AD091A2D74BAB900E1F91F /* HyperVSnapshot.hpp */; };
111+
41AD09232D74D43B00E1F91F /* HyperVSnapshotUserClient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 41AD09212D74D43B00E1F91F /* HyperVSnapshotUserClient.cpp */; };
112+
41AD09242D74D43B00E1F91F /* HyperVSnapshotUserClient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 41AD09212D74D43B00E1F91F /* HyperVSnapshotUserClient.cpp */; };
113+
41AD09252D74D43B00E1F91F /* HyperVSnapshotUserClientInternal.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 41AD09222D74D43B00E1F91F /* HyperVSnapshotUserClientInternal.hpp */; };
114+
41AD09262D74D43B00E1F91F /* HyperVSnapshotUserClientInternal.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 41AD09222D74D43B00E1F91F /* HyperVSnapshotUserClientInternal.hpp */; };
115+
41AD09292D74D74A00E1F91F /* HyperVSnapshotUserClientPrivate.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 41AD09282D74D74A00E1F91F /* HyperVSnapshotUserClientPrivate.cpp */; };
116+
41AD092A2D74D74A00E1F91F /* HyperVSnapshotUserClientPrivate.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 41AD09282D74D74A00E1F91F /* HyperVSnapshotUserClientPrivate.cpp */; };
111117
41AE1D0E289C95A9001A7B42 /* HyperVCPU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 41AE1D0C289C95A9001A7B42 /* HyperVCPU.cpp */; };
112118
41AE1D0F289C95A9001A7B42 /* HyperVCPU.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 41AE1D0C289C95A9001A7B42 /* HyperVCPU.cpp */; };
113119
41AE1D10289C95A9001A7B42 /* HyperVCPU.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 41AE1D0D289C95A9001A7B42 /* HyperVCPU.hpp */; };
@@ -733,7 +739,12 @@
733739
41AD09192D74BAB900E1F91F /* HyperVSnapshot.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = HyperVSnapshot.cpp; sourceTree = "<group>"; };
734740
41AD091A2D74BAB900E1F91F /* HyperVSnapshot.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = HyperVSnapshot.hpp; sourceTree = "<group>"; };
735741
41AD091F2D74BBBD00E1F91F /* HyperVSnapshotRegs.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = HyperVSnapshotRegs.hpp; sourceTree = "<group>"; };
736-
41AD09202D74BD7F00E1F91F /* HyperVSnapshotRegsUser.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HyperVSnapshotRegsUser.h; sourceTree = "<group>"; };
742+
41AD09212D74D43B00E1F91F /* HyperVSnapshotUserClient.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = HyperVSnapshotUserClient.cpp; sourceTree = "<group>"; };
743+
41AD09222D74D43B00E1F91F /* HyperVSnapshotUserClientInternal.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = HyperVSnapshotUserClientInternal.hpp; sourceTree = "<group>"; };
744+
41AD09272D74D48F00E1F91F /* HyperVSnapshotUserClient.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HyperVSnapshotUserClient.h; sourceTree = "<group>"; };
745+
41AD09282D74D74A00E1F91F /* HyperVSnapshotUserClientPrivate.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = HyperVSnapshotUserClientPrivate.cpp; sourceTree = "<group>"; };
746+
41AD092B2D77E53B00E1F91F /* fish.goldfish64.hvsnapshotd.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = fish.goldfish64.hvsnapshotd.plist; sourceTree = "<group>"; };
747+
41AD092C2D77E53B00E1F91F /* postinstall */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = postinstall; sourceTree = "<group>"; };
737748
41AE1CFF28974C7E001A7B42 /* package.tool */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = package.tool; sourceTree = "<group>"; };
738749
41AE1D0C289C95A9001A7B42 /* HyperVCPU.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = HyperVCPU.cpp; sourceTree = "<group>"; };
739750
41AE1D0D289C95A9001A7B42 /* HyperVCPU.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = HyperVCPU.hpp; sourceTree = "<group>"; };
@@ -965,9 +976,9 @@
965976
isa = PBXGroup;
966977
children = (
967978
41B371732896CD5F00D348B5 /* hvdebug.h */,
968-
4191F6FA28F504B000809232 /* hvfilecopyd */,
969979
4191F6E128F32E5200809232 /* hviokit.c */,
970980
4191F6E028F32E5200809232 /* hviokit.h */,
981+
4191F6FA28F504B000809232 /* hvfilecopyd */,
971982
415D990728F3261D0078FA71 /* hvshutdownd */,
972983
41AD09002D74AE7500E1F91F /* hvsnapshotd */,
973984
4191F6E328F4E52500809232 /* hvtimesyncd */,
@@ -1118,7 +1129,9 @@
11181129
41AD09002D74AE7500E1F91F /* hvsnapshotd */ = {
11191130
isa = PBXGroup;
11201131
children = (
1132+
41AD092B2D77E53B00E1F91F /* fish.goldfish64.hvsnapshotd.plist */,
11211133
41AD09012D74AE9300E1F91F /* hvsnapshotd.c */,
1134+
41AD092C2D77E53B00E1F91F /* postinstall */,
11221135
);
11231136
path = hvsnapshotd;
11241137
sourceTree = "<group>";
@@ -1129,7 +1142,10 @@
11291142
41AD09192D74BAB900E1F91F /* HyperVSnapshot.cpp */,
11301143
41AD091A2D74BAB900E1F91F /* HyperVSnapshot.hpp */,
11311144
41AD091F2D74BBBD00E1F91F /* HyperVSnapshotRegs.hpp */,
1132-
41AD09202D74BD7F00E1F91F /* HyperVSnapshotRegsUser.h */,
1145+
41AD09212D74D43B00E1F91F /* HyperVSnapshotUserClient.cpp */,
1146+
41AD09272D74D48F00E1F91F /* HyperVSnapshotUserClient.h */,
1147+
41AD09222D74D43B00E1F91F /* HyperVSnapshotUserClientInternal.hpp */,
1148+
41AD09282D74D74A00E1F91F /* HyperVSnapshotUserClientPrivate.cpp */,
11331149
);
11341150
path = Snapshot;
11351151
sourceTree = "<group>";
@@ -1444,6 +1460,7 @@
14441460
41F9B8F12849792200E0DCB2 /* HyperVPCIBridge.hpp in Headers */,
14451461
41F2E3FB2665B42200CE26CE /* kern_policy.hpp in Headers */,
14461462
41F2E3FE2665B42200CE26CE /* kern_iokit.hpp in Headers */,
1463+
41AD09252D74D43B00E1F91F /* HyperVSnapshotUserClientInternal.hpp in Headers */,
14471464
817C3CB928EB754C002EA298 /* HyperVFileCopy.hpp in Headers */,
14481465
41F2E4102665B42200CE26CE /* kern_patcher.hpp in Headers */,
14491466
417CEDED28F31FF300D0F6A8 /* HyperVICUserClient.hpp in Headers */,
@@ -1511,6 +1528,7 @@
15111528
41BF45E7288CDF1200813670 /* kern_time.hpp in Headers */,
15121529
41BF45E8288CDF1200813670 /* HyperVPCIBridge.hpp in Headers */,
15131530
41BF45E9288CDF1200813670 /* kern_policy.hpp in Headers */,
1531+
41AD09262D74D43B00E1F91F /* HyperVSnapshotUserClientInternal.hpp in Headers */,
15141532
41BF45EB288CDF1200813670 /* kern_iokit.hpp in Headers */,
15151533
41BF45EC288CDF1200813670 /* kern_patcher.hpp in Headers */,
15161534
417CEDEE28F31FF300D0F6A8 /* HyperVICUserClient.hpp in Headers */,
@@ -2108,8 +2126,8 @@
21082126
isa = PBXSourcesBuildPhase;
21092127
buildActionMask = 2147483647;
21102128
files = (
2111-
41AD090C2D74AEB300E1F91F /* hvsnapshotd.c in Sources */,
21122129
41AD09042D74AE9E00E1F91F /* hviokit.c in Sources */,
2130+
41AD090C2D74AEB300E1F91F /* hvsnapshotd.c in Sources */,
21132131
);
21142132
runOnlyForDeploymentPostprocessing = 0;
21152133
};
@@ -2150,7 +2168,9 @@
21502168
41AD08AE2D6D6FE500E1F91F /* HyperVACPIPlatformExpertShim.cpp in Sources */,
21512169
41F2E43C2666E6A100CE26CE /* HyperVGraphicsBridge.cpp in Sources */,
21522170
417CEDD428E22C5400D0F6A8 /* HyperVTimeSync.cpp in Sources */,
2171+
41AD09232D74D43B00E1F91F /* HyperVSnapshotUserClient.cpp in Sources */,
21532172
41E2EC78263F894300BBE18F /* HyperVControllerInterrupts.cpp in Sources */,
2173+
41AD09292D74D74A00E1F91F /* HyperVSnapshotUserClientPrivate.cpp in Sources */,
21542174
416E429D265751CC006DED6D /* HyperVVMBusDevicePrivate.cpp in Sources */,
21552175
41CF8A6F2ADB89A9002AC7A4 /* HyperVPCIBridgeDevProps.cpp in Sources */,
21562176
4191F6F528F4E71A00809232 /* HyperVTimeSyncUserClient.cpp in Sources */,
@@ -2203,7 +2223,9 @@
22032223
41AD08AF2D6D6FE600E1F91F /* HyperVACPIPlatformExpertShim.cpp in Sources */,
22042224
41BF4618288CDF1200813670 /* HyperVGraphicsBridge.cpp in Sources */,
22052225
417CEDD528E22C5400D0F6A8 /* HyperVTimeSync.cpp in Sources */,
2226+
41AD09242D74D43B00E1F91F /* HyperVSnapshotUserClient.cpp in Sources */,
22062227
41BF4619288CDF1200813670 /* HyperVControllerInterrupts.cpp in Sources */,
2228+
41AD092A2D74D74A00E1F91F /* HyperVSnapshotUserClientPrivate.cpp in Sources */,
22072229
41BF461A288CDF1200813670 /* HyperVVMBusDevicePrivate.cpp in Sources */,
22082230
41CF8A702ADB89A9002AC7A4 /* HyperVPCIBridgeDevProps.cpp in Sources */,
22092231
4191F6F628F4E71A00809232 /* HyperVTimeSyncUserClient.cpp in Sources */,

MacHyperVSupport/Info.plist

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,7 @@
223223
<key>IOProviderClass</key>
224224
<string>HyperVVMBusDevice</string>
225225
<key>IOUserClientClass</key>
226-
<string>HyperVFileCopyUserClient</string>
226+
<string>HyperVSnapshotUserClient</string>
227227
</dict>
228228
<key>HyperVStorageIDE</key>
229229
<dict>

MacHyperVSupport/IntegrationComponents/Snapshot/HyperVSnapshot.cpp

Lines changed: 40 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -38,18 +38,21 @@ void HyperVSnapshot::stop(IOService *provider) {
3838
}
3939

4040
bool HyperVSnapshot::open(IOService *forClient, IOOptionBits options, void *arg) {
41-
41+
HyperVSnapshotUserClient *hvSnapshotUserClient = OSDynamicCast(HyperVSnapshotUserClient, forClient);
42+
if ((hvSnapshotUserClient == nullptr) || (_userClientInstance != nullptr)) {
43+
return false;
44+
}
4245

4346
if (!super::open(forClient, options, arg)) {
4447
return false;
4548
}
4649

47-
50+
_userClientInstance = hvSnapshotUserClient;
4851
return true;
4952
}
5053

5154
void HyperVSnapshot::close(IOService *forClient, IOOptionBits options) {
52-
55+
_userClientInstance = nullptr;
5356
super::close(forClient, options);
5457
}
5558

@@ -70,15 +73,46 @@ void HyperVSnapshot::handlePacket(VMBusPacketHeader *pktHeader, UInt32 pktHeader
7073

7174
case kVMBusICMessageTypeSnapshot:
7275
HVDBGLOG("Attempting snapshot operation type %u", snapshotMsg->snapshotHeader.type);
73-
snapshotMsg->icHeader.status = kHyperVStatusFailure;
74-
76+
if (_userClientInstance == nullptr) {
77+
HVSYSLOG("Unable to perform snapshot (snapshot daemon is not running)");
78+
snapshotMsg->icHeader.status = kHyperVStatusFailure;
79+
break;
80+
}
81+
7582
switch (snapshotMsg->snapshotHeader.type) {
83+
case kHyperVSnapshotMessageTypeHotBackup:
84+
HVDBGLOG("Hot backup is starting");
85+
if (pktDataLength < sizeof (snapshotMsg->checkFeature)) {
86+
HVSYSLOG("Hot backup request packet is invalid size (%u bytes)", pktDataLength);
87+
status = kIOReturnUnsupported;
88+
break;
89+
}
90+
91+
status = _userClientInstance->checkSnapshotAbility();
92+
if (status == kIOReturnSuccess) {
93+
snapshotMsg->checkFeature.flags = kHyperVSnapshotMessageCheckFeatureFlagNoAutoRecovery;
94+
}
95+
break;
96+
97+
case kHyperVSnapshotMessageTypeFreeze:
98+
HVDBGLOG("Filesystem freeze requested");
99+
status = _userClientInstance->doFreeze();
100+
break;
101+
102+
case kHyperVSnapshotMessageTypeThaw:
103+
HVDBGLOG("Filesystem thaw requested");
104+
status = _userClientInstance->doThaw();
105+
break;
106+
76107
default:
77108
HVDBGLOG("Unknown snapshot operation type %u", snapshotMsg->snapshotHeader.type);
78109
status = kIOReturnUnsupported;
79110
break;
80111
}
81-
112+
113+
//
114+
// Report status to Hyper-V.
115+
//
82116
switch (status) {
83117
case kIOReturnSuccess:
84118
snapshotMsg->icHeader.status = kHyperVStatusSuccess;

MacHyperVSupport/IntegrationComponents/Snapshot/HyperVSnapshot.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,16 @@
1010

1111
#include "HyperVICService.hpp"
1212
#include "HyperVSnapshotRegs.hpp"
13+
#include "HyperVSnapshotUserClientInternal.hpp"
1314

1415
class HyperVSnapshot : public HyperVICService {
1516
OSDeclareDefaultStructors(HyperVSnapshot);
1617
HVDeclareLogFunctionsVMBusChild("snap");
1718
typedef HyperVICService super;
1819

20+
private:
21+
HyperVSnapshotUserClient *_userClientInstance = nullptr;
22+
1923
protected:
2024
void handlePacket(VMBusPacketHeader *pktHeader, UInt32 pktHeaderLength, UInt8 *pktData, UInt32 pktDataLength) APPLE_KEXT_OVERRIDE;
2125

MacHyperVSupport/IntegrationComponents/Snapshot/HyperVSnapshotRegs.hpp

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,29 @@
99
#define HyperVSnapshotRegs_hpp
1010

1111
#include "HyperVIC.hpp"
12-
#include "HyperVSnapshotRegsUser.h"
1312

1413
//
1514
// Snapshot versions.
1615
//
1716
#define kHyperVSnapshotVersionV5_0 VMBUS_VERSION(5, 0)
1817

18+
//
19+
// Snapshot message types.
20+
//
21+
typedef enum : UInt8 {
22+
kHyperVSnapshotMessageTypeCreate = 0,
23+
kHyperVSnapshotMessageTypeDelete = 1,
24+
// Hot backup is starting.
25+
kHyperVSnapshotMessageTypeHotBackup = 2,
26+
kHyperVSnapshotMessageTypeGetDMInfo = 3,
27+
kHyperVSnapshotMessageTypeBUComplete = 4,
28+
// All filesystems are to be frozen.
29+
kHyperVSnapshotMessageTypeFreeze = 5,
30+
// All filesystems are to be thawed.
31+
kHyperVSnapshotMessageTypeThaw = 6,
32+
kHyperVSnapshotMessageTypeAutoRecover = 7
33+
} HyperVSnapshotMessageType;
34+
1935
//
2036
// Snapshot message header.
2137
//
@@ -29,6 +45,10 @@ typedef struct __attribute__((packed)) {
2945
UInt8 reserved[7];
3046
} HyperVSnapshotMessageHeader;
3147

48+
//
49+
// Supported feature check, sent in response to kHyperVSnapshotMessageTypeHotBackup.
50+
//
51+
#define kHyperVSnapshotMessageCheckFeatureFlagNoAutoRecovery 0x5
3252
typedef struct __attribute__((packed)) {
3353
// Snapshot message header.
3454
HyperVSnapshotMessageHeader header;

MacHyperVSupport/IntegrationComponents/Snapshot/HyperVSnapshotRegsUser.h

Lines changed: 0 additions & 30 deletions
This file was deleted.

0 commit comments

Comments
 (0)