[svsm-devel] [EXTERNAL] Extended Interrupt Information

Melody (Huibo) Wang huibo.wang at amd.com
Tue May 6 00:31:41 CEST 2025


Thanks for confirming, it helps. :)

Thanks,
Melody

On 5/5/2025 3:19 PM, Jon Lange wrote:
> I believe your definitions are correct.
> 
> -Jon
> 
> -----Original Message-----
> From: Melody (Huibo) Wang <huibo.wang at amd.com> 
> Sent: Sunday, May 4, 2025 1:28 PM
> To: Jon Lange <jlange at microsoft.com>
> Cc: Lendacky, Thomas <Thomas.Lendacky at amd.com>; Jörg Rödel <joro at 8bytes.org>; svsm-devel at coconut-svsm.dev
> Subject: [EXTERNAL] Extended Interrupt Information
> 
> Hi Jon,
> 
> I have written a small C program that implements the new #HV doorbell page with extended interrupt information. 
> 
> Could you please confirm that my reading of the spec is correct, especially fields layout and order? 
> 
> #include <errno.h>
> #include <stdio.h>
> #include <stdlib.h>
> #include <string.h>
> #include <assert.h>
> 
> #define PAGE_SIZE		4096
> 
> #define DIV_ROUND_UP(n,d)	(((n) + (d) - 1) / (d))
> 
> #define BITS_PER_TYPE(type)	(sizeof(type) * 8)
> #define BITS_TO_LONGS(nr)	DIV_ROUND_UP(nr, BITS_PER_TYPE(long))
> 
> #define DECLARE_BITMAP(name,bits) \
> 	unsigned long name[BITS_TO_LONGS(bits)]
> 
> typedef unsigned char u8;
> typedef unsigned short u16;
> 
> /*
>  * Hypervisor doorbell page:
>  *
>  * Used when restricted injection is enabled for a VM. One page in size that
>  * is shared between the guest and hypervisor to communicate exception and
>  * interrupt events.
>  */
> struct ext_irq_desc {
> 	/* first 16-bit word */
> 	struct {
> 		u16 si_vector:		8,
> 		    nmi:		1,
> 		    mce:		1,
> 		    trigger_mode:	1,
> 		    reserved1:		3,
> 		    multi_interrupts:	1,
> 		    reserved2:		1;
> 	} word0;
> 
> 	/* Second 16-bit word */
> 	struct {
> 		u16 reserved5:		15,
> 		    interrupt_vector:	1;
> 	} word1;
> 
> 	/*
> 	 * Set the corresponding vmpl?_irq bit in inj_info after setting
> 	 * multiple bits here.
> 	 */
>         u16 interrupt_bit_vector[14];
> 
> 	/*
> 	 * Reserved for future use.
> 	 * TODO: Code should check them and fail if set.
> 	 */
>         u8 reserved6[32];
> } __attribute__((packed));
> 
> struct hvdb {
> 	/* first 16-bit word PendingEvent */
> 	struct {
> 		/* Non-maskable event indicators */
> 		u16 reserved1:          8,
> 		nmi:                    1,
> 		mce:                    1,
> 		reserved2:              5,
> 		no_further_signal:      1;
> 	} pending_event;
> 
> 	/* Second 16-bit word InjectionInfo */
> 	union {
> 		struct {
> 			u16 no_eoi_required:	1,
> 			    reserved3:		7,
> 			    vmpl1_irq:		1,
> 			    vmpl2_irq:		1,
> 			    vmpl3_irq:		1,
> 			    reserved4:		4;
> 		} inj_info;
> 		u16 injection_info;
> 	};
> 
> 	/* IRQ info associated with the SVSM itself */
> 	/* XXX: code should enforce bytes [32-63] are zero */
> 	u8 svsm_irq_info[64 - 4];
> 
> 	/* VMPL[1-3] extended IRQ descriptors */
>         struct ext_irq_desc irqs[3];
> 
>         /* Remainder of the page is for software use */
>         u8 reserved[PAGE_SIZE - 256];
> } __attribute__((packed));
> 
> int main(void)
> {
> 	struct hvdb h = { };
> 
> 	assert(sizeof(struct ext_irq_desc) == 64);
> 
> 	printf("sizeof(struct ext_irq_desc): %zu\n", sizeof(struct ext_irq_desc));
> 
> 	h.inj_info.no_eoi_required = 1;
> 	h.inj_info.vmpl3_irq = 1;
> 
> 	printf("injection_info: 0x%x\n", h.injection_info);
> 
> 	return 0;
> }
> 
> 
> Thanks,
> Melody



More information about the Svsm-devel mailing list