7
7
#![ cfg_attr( not( test) , no_main) ]
8
8
#![ allow( unused_imports) ]
9
9
10
+ #[ macro_use]
10
11
extern crate alloc;
11
12
use alloc:: boxed:: Box ;
12
13
use alloc:: vec:: Vec ;
13
14
use asm:: { empty_exception_handler, empty_exception_handler_size} ;
14
15
use core:: ffi:: c_void;
15
16
use core:: mem:: size_of;
16
17
use core:: panic:: PanicInfo ;
18
+ use e820:: E820Table ;
17
19
use memory:: Memory ;
20
+ use td:: ap_set_payload;
18
21
use td_exception:: idt:: { load_idtr, DescriptorTablePointer , Idt , IdtEntry } ;
22
+ use td_layout:: runtime:: exec:: PAYLOAD_SIZE ;
23
+ use td_shim:: e820:: E820Type ;
19
24
use td_shim:: event_log:: CCEL_CC_TYPE_TDX ;
20
25
use x86_64:: instructions:: hlt;
21
26
use x86_64:: registers:: segmentation:: { Segment , CS } ;
@@ -28,7 +33,7 @@ use zerocopy::{AsBytes, ByteSlice, FromBytes};
28
33
use cc_measurement:: { log:: CcEventLogWriter , EV_EFI_HANDOFF_TABLES2 , EV_PLATFORM_CONFIG_FLAGS } ;
29
34
use td_layout:: build_time:: { self , * } ;
30
35
use td_layout:: memslice:: { self , SliceType } ;
31
- use td_layout:: RuntimeMemoryLayout ;
36
+ use td_layout:: { mailbox , RuntimeMemoryLayout } ;
32
37
use td_shim:: event_log:: { log_hob_list, log_payload_binary, log_payload_parameter} ;
33
38
use td_shim:: {
34
39
speculation_barrier, PayloadInfo , TdPayloadInfoHobType , TD_ACPI_TABLE_HOB_GUID ,
@@ -151,6 +156,7 @@ pub extern "win64" fn _start(
151
156
& mut mem,
152
157
& mut td_event_log,
153
158
& dynamic_info. acpi_tables ,
159
+ num_vcpus,
154
160
) ;
155
161
156
162
panic ! ( "payload entry() should not return here, deadloop!!!" ) ;
@@ -207,6 +213,7 @@ fn boot_builtin_payload(
207
213
mem : & mut memory:: Memory ,
208
214
event_log : & mut CcEventLogWriter ,
209
215
acpi_tables : & Vec < & [ u8 ] > ,
216
+ num_vcpus : u32 ,
210
217
) {
211
218
// Get and parse image file from the payload firmware volume.
212
219
let fv_buffer = memslice:: get_mem_slice ( memslice:: SliceType :: ShimPayload ) ;
@@ -230,6 +237,10 @@ fn boot_builtin_payload(
230
237
// Create an EV_SEPARATOR event to mark the end of the td-shim events
231
238
event_log. create_seperator ( ) ;
232
239
240
+ if cfg ! ( feature = "multi-payload" ) {
241
+ mp:: launch_payload_per_cpu ( mem, payload_bin, acpi_tables, num_vcpus) ;
242
+ }
243
+
233
244
let payload = mem. get_dynamic_mem_slice_mut ( memslice:: SliceType :: Payload ) ;
234
245
let relocation_info = ipl:: find_and_report_entry_point ( mem, payload_bin, payload)
235
246
. expect ( "Entry point not found!" ) ;
@@ -241,8 +252,11 @@ fn boot_builtin_payload(
241
252
payload_hob_region. size as u64 ,
242
253
) ;
243
254
255
+ let payload_hob = mem. get_dynamic_mem_slice_mut ( SliceType :: Acpi ) ;
256
+ let e820 = mem. create_e820 ( ) ;
244
257
// Prepare the HOB list to run the image
245
- payload_hob:: build_payload_hob ( acpi_tables, & mem) . expect ( "Fail to create payload HOB" ) ;
258
+ payload_hob:: build_payload_hob ( payload_hob, acpi_tables, & e820)
259
+ . expect ( "Fail to create payload HOB" ) ;
246
260
247
261
// Finally let's switch stack and jump to the image entry point...
248
262
log:: info!(
@@ -258,30 +272,12 @@ fn boot_builtin_payload(
258
272
// Relocate Mailbox along side with the AP function
259
273
td:: relocate_mailbox ( mailbox) ;
260
274
261
- match relocation_info. image_type {
262
- ExecutablePayloadType :: Elf => {
263
- let entry = unsafe {
264
- core:: mem:: transmute :: < u64 , extern "sysv64" fn ( u64 , u64 ) > (
265
- relocation_info. entry_point ,
266
- )
267
- } ;
268
- entry (
269
- payload_hob_region. base_address as u64 ,
270
- payload. as_ptr ( ) as u64 ,
271
- ) ;
272
- }
273
- ExecutablePayloadType :: PeCoff => {
274
- let entry = unsafe {
275
- core:: mem:: transmute :: < u64 , extern "win64" fn ( u64 , u64 ) > (
276
- relocation_info. entry_point ,
277
- )
278
- } ;
279
- entry (
280
- payload_hob_region. base_address as u64 ,
281
- payload. as_ptr ( ) as u64 ,
282
- ) ;
283
- }
284
- } ;
275
+ ipl:: jump_to_payload_entry (
276
+ relocation_info. entry_point ,
277
+ relocation_info. image_type as u8 ,
278
+ payload_hob_region. base_address as u64 ,
279
+ payload. as_ptr ( ) as u64 ,
280
+ ) ;
285
281
}
286
282
287
283
// Reuse mailbox for the IDT used before payload setup its own one.
0 commit comments