Skip to content

Commit 72fb08f

Browse files
haitaohuangCopilot
andcommitted
refactor(migtd): unify mig and rebind buffer
Add init_td_info [u8; 512] field to MigtdMigrationInformation so both migration and rebinding use the same VMM request buffer layout. Delete RebindingInfo, InitData, and init_data.rs. Widen policy_v2 cfg gates that were incorrectly restricted to vmcall-raw only. Peer-to-peer wire protocol is unchanged. Signed-off-by: Haitao Huang <haitaohuang@microsoft.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 8025c04 commit 72fb08f

10 files changed

Lines changed: 330 additions & 461 deletions

File tree

src/migtd/src/bin/migtd/cvmemu.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -381,23 +381,23 @@ fn parse_commandline_args() {
381381
target_td_uuid[2] as u64,
382382
target_td_uuid[3] as u64,
383383
];
384-
let rebinding_src = if is_source { 1u8 } else { 0u8 };
384+
let migration_source = if is_source { 1u8 } else { 0u8 };
385385

386386
// Queue emulated requests based on selected operation
387387
match operation {
388388
"migration" => {
389389
log::info!(
390390
"Setting up migration flow (EnableLogArea → GetTDReport → StartMigration)\n"
391391
);
392-
set_emulated_start_migration(mig_request_id, rebinding_src, td_uuid, binding_handle);
392+
set_emulated_start_migration(mig_request_id, migration_source, td_uuid, binding_handle);
393393
}
394394
"rebind-prepare" => {
395395
log::info!(
396396
"Setting up rebind-prepare flow (EnableLogArea → GetMigtdData → StartRebinding)\n"
397397
);
398398
set_emulated_start_rebinding(
399399
mig_request_id,
400-
rebinding_src,
400+
migration_source,
401401
0, // MIGTD_REBIND_OP_PREPARE
402402
td_uuid,
403403
binding_handle,
@@ -409,7 +409,7 @@ fn parse_commandline_args() {
409409
);
410410
set_emulated_start_rebinding(
411411
mig_request_id,
412-
rebinding_src,
412+
migration_source,
413413
1, // MIGTD_REBIND_OP_FINALIZE
414414
td_uuid,
415415
binding_handle,

src/migtd/src/mig_policy.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -723,10 +723,12 @@ mod v2 {
723723

724724
/// Per GHCI 1.5: Verify initMigtdData.MROWNER matches own policy signer key hash
725725
/// and initMigtdData.MROWNERCONFIG <= own policy SVN.
726+
#[cfg(feature = "main")]
726727
pub fn verify_init_migtd_data_policy_binding(
727-
init_data: &crate::migration::init_data::InitData,
728+
init_td_info: &[u8; crate::migration::TD_INFO_SIZE],
728729
) -> Result<(), PolicyError> {
729730
use crate::config::get_policy_issuer_chain;
731+
use crate::migration::{td_info_mrowner, td_info_mrownerconfig};
730732

731733
let policy = get_verified_policy().ok_or(PolicyError::InvalidParameter)?;
732734
let my_policy_svn = policy.policy_data.get_policy_svn();
@@ -735,12 +737,12 @@ mod v2 {
735737
let policy_issuer_chain = get_policy_issuer_chain().ok_or(PolicyError::InvalidParameter)?;
736738
let policy_key_hash = crypto::get_policy_signer_key_hash(policy_issuer_chain)
737739
.map_err(|_| PolicyError::InvalidCollateral)?;
738-
if init_data.mrowner() != policy_key_hash {
740+
if td_info_mrowner(init_td_info) != &policy_key_hash {
739741
return Err(PolicyError::PolicyHashMismatch);
740742
}
741743

742744
// Check MROWNERCONFIG (init policy_svn) <= my policy_svn
743-
let init_mrownerconfig = init_data.mrownerconfig();
745+
let init_mrownerconfig = td_info_mrownerconfig(init_td_info);
744746
let mut init_svn_bytes = [0u8; 4];
745747
init_svn_bytes.copy_from_slice(&init_mrownerconfig[..4]);
746748
let init_policy_svn = u32::from_le_bytes(init_svn_bytes);

src/migtd/src/migration/data.rs

Lines changed: 10 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,6 @@
22
//
33
// SPDX-License-Identifier: BSD-2-Clause-Patent
44

5-
#[cfg(feature = "policy_v2")]
6-
use crate::migration::init_data::InitData;
7-
#[cfg(all(feature = "main", feature = "vmcall-raw", feature = "policy_v2"))]
8-
use crate::migration::rebinding::RebindingInfo;
9-
105
use super::*;
116
#[cfg(feature = "vmcall-raw")]
127
use bitfield_struct::bitfield;
@@ -260,7 +255,7 @@ pub struct RequestDataBuffer<'a> {
260255
pub enum WaitForRequestResponse {
261256
StartMigration(MigrationInformation),
262257
#[cfg(all(feature = "main", feature = "policy_v2"))]
263-
StartRebinding(RebindingInfo),
258+
StartRebinding(MigtdMigrationInformation),
264259
GetTdReport(ReportInfo),
265260
EnableLogArea(EnableLogAreaInfo),
266261
#[cfg(feature = "policy_v2")]
@@ -269,8 +264,6 @@ pub enum WaitForRequestResponse {
269264

270265
pub struct MigrationInformation {
271266
pub mig_info: MigtdMigrationInformation,
272-
#[cfg(feature = "policy_v2")]
273-
pub init_migtd_data: Option<InitData>,
274267
#[cfg(all(
275268
not(feature = "vmcall-raw"),
276269
any(feature = "vmcall-vsock", feature = "virtio-vsock")
@@ -361,16 +354,12 @@ fn create_migration_information(
361354
policy_info_hob: Option<&[u8]>,
362355
) -> Option<MigrationInformation> {
363356
let mig_info_data = hob_lib::get_guid_data(mig_info_hob?)?;
364-
let mig_info = mig_info_data.pread::<MigtdMigrationInformation>(0).ok()?;
365-
366-
// Per GHCI 1.5: if has_init_data == 1, InitData blob follows MigtdMigrationInformation
367357
#[cfg(feature = "policy_v2")]
368-
let init_migtd_data = if mig_info.has_init_data == 1 {
369-
let offset = size_of::<MigtdMigrationInformation>();
370-
InitData::read_from_bytes(mig_info_data.get(offset..)?)
371-
} else {
372-
None
373-
};
358+
let mig_info =
359+
MigtdMigrationInformation::read_from_bytes(mig_info_data.len() as u32, mig_info_data)
360+
.ok()?;
361+
#[cfg(not(feature = "policy_v2"))]
362+
let mig_info = mig_info_data.pread::<MigtdMigrationInformation>(0).ok()?;
374363

375364
#[cfg(any(feature = "vmcall-vsock", feature = "virtio-vsock"))]
376365
let mig_socket_info = hob_lib::get_guid_data(mig_socket_hob?)?
@@ -392,8 +381,6 @@ fn create_migration_information(
392381

393382
Some(MigrationInformation {
394383
mig_info,
395-
#[cfg(feature = "policy_v2")]
396-
init_migtd_data,
397384
#[cfg(any(feature = "vmcall-vsock", feature = "virtio-vsock"))]
398385
mig_socket_info,
399386
mig_policy,
@@ -533,7 +520,7 @@ mod test {
533520
#[test]
534521
fn test_read_mig_info_duplicate_mig_info_hob() {
535522
// Create mock HOB data
536-
let mut hob_data = vec![0u8; 1024];
523+
let mut hob_data = vec![0u8; 2048];
537524
let mut offset = 0;
538525

539526
// Add Migration Information HOB
@@ -710,7 +697,7 @@ mod test {
710697
#[test]
711698
fn test_read_mig_info_invalid_hob_length() {
712699
// Create mock HOB data
713-
let mut hob_data = vec![0u8; 256];
700+
let mut hob_data = vec![0u8; 1024];
714701
let mut offset = 0;
715702

716703
// Add Migration Information HOB
@@ -750,6 +737,8 @@ mod test {
750737
binding_handle: 0,
751738
mig_policy_id: 0,
752739
communication_id: 0,
740+
#[cfg(feature = "policy_v2")]
741+
init_td_info: [0u8; TD_INFO_SIZE],
753742
};
754743
hob.pwrite(mig_info_hob, *offset).unwrap();
755744
*offset += size_of::<GuidExtension>();

src/migtd/src/migration/init_data.rs

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

0 commit comments

Comments
 (0)