15103e761SPatrick Mooney /*
25103e761SPatrick Mooney  * This file and its contents are supplied under the terms of the
35103e761SPatrick Mooney  * Common Development and Distribution License ("CDDL"), version 1.0.
45103e761SPatrick Mooney  * You may only use this file in accordance with the terms of version
55103e761SPatrick Mooney  * 1.0 of the CDDL.
65103e761SPatrick Mooney  *
75103e761SPatrick Mooney  * A full copy of the text of the CDDL should have accompanied this
85103e761SPatrick Mooney  * source.  A copy of the CDDL is also available via the Internet at
95103e761SPatrick Mooney  * http://www.illumos.org/license/CDDL.
105103e761SPatrick Mooney  */
115103e761SPatrick Mooney 
125103e761SPatrick Mooney /*
13a1d41cf9SPatrick Mooney  * Copyright 2023 Oxide Computer Company
145103e761SPatrick Mooney  */
155103e761SPatrick Mooney 
165103e761SPatrick Mooney #ifndef _IN_GUEST_H_
175103e761SPatrick Mooney #define	_IN_GUEST_H_
185103e761SPatrick Mooney 
195103e761SPatrick Mooney #include "payload_common.h"
205103e761SPatrick Mooney 
215103e761SPatrick Mooney struct vmctx *test_initialize(const char *);
224ac713daSLuqman Aden struct vmctx *test_initialize_flags(const char *, uint64_t);
2372473353SPatrick Mooney void test_reinitialize(struct vmctx *, uint64_t);
244ac713daSLuqman Aden void test_cleanup(bool);
25a1d41cf9SPatrick Mooney void test_fail(void);
265103e761SPatrick Mooney void test_fail_errno(int err, const char *msg);
275103e761SPatrick Mooney void test_fail_msg(const char *fmt, ...);
285103e761SPatrick Mooney void test_fail_vmexit(const struct vm_exit *vexit);
295103e761SPatrick Mooney void test_pass(void);
30a1d41cf9SPatrick Mooney const char *test_msg_get(struct vmctx *);
31a1d41cf9SPatrick Mooney void test_msg_print(struct vmctx *);
325103e761SPatrick Mooney 
33*32640292SAndy Fiddaman int test_setup_vcpu(struct vcpu *, uint64_t, uint64_t);
345103e761SPatrick Mooney 
355103e761SPatrick Mooney enum vm_exit_kind {
365103e761SPatrick Mooney 	/* Otherwise empty vmexit which should result in immediate re-entry */
375103e761SPatrick Mooney 	VEK_REENTR,
385103e761SPatrick Mooney 	/* Write to IOP_TEST_RESULT port with success value (0) */
395103e761SPatrick Mooney 	VEK_TEST_PASS,
405103e761SPatrick Mooney 	/* Write to IOP_TEST_RESULT port with failure value (non-zero) */
415103e761SPatrick Mooney 	VEK_TEST_FAIL,
42a1d41cf9SPatrick Mooney 	/* Payload emitted a message via IOP_TEST_MSG port */
43a1d41cf9SPatrick Mooney 	VEK_TEST_MSG,
445103e761SPatrick Mooney 	/* Test specific logic must handle exit data */
455103e761SPatrick Mooney 	VEK_UNHANDLED,
465103e761SPatrick Mooney };
475103e761SPatrick Mooney 
48*32640292SAndy Fiddaman enum vm_exit_kind test_run_vcpu(struct vcpu *, struct vm_entry *,
495103e761SPatrick Mooney     struct vm_exit *);
505103e761SPatrick Mooney 
515103e761SPatrick Mooney void ventry_fulfill_inout(const struct vm_exit *, struct vm_entry *, uint32_t);
525103e761SPatrick Mooney void ventry_fulfill_mmio(const struct vm_exit *, struct vm_entry *, uint64_t);
535103e761SPatrick Mooney 
545103e761SPatrick Mooney bool vexit_match_inout(const struct vm_exit *, bool, uint16_t, uint_t,
555103e761SPatrick Mooney     uint32_t *);
565103e761SPatrick Mooney bool vexit_match_mmio(const struct vm_exit *, bool, uint64_t, uint_t,
575103e761SPatrick Mooney     uint64_t *);
585103e761SPatrick Mooney 
595103e761SPatrick Mooney #endif /* _IN_GUEST_H_ */
60