arch/powerpc/kvm/test-guest-state-buffer.c

Source file repositories/reference/linux-study-clean/arch/powerpc/kvm/test-guest-state-buffer.c

File Facts

System
Linux kernel
Corpus path
arch/powerpc/kvm/test-guest-state-buffer.c
Extension
.c
Size
15637 bytes
Lines
544
Domain
Architecture Layer
Bucket
arch/powerpc
Inferred role
Architecture Layer: implementation source
Status
source implementation candidate

Why This File Exists

CPU and platform-specific kernel glue: boot entry, traps, syscall entry, interrupts, page tables, context switch, and low-level barriers.

Dependency Surface

Detected Declarations

Annotated Snippet

struct kvmppc_gs_msg_test1_data {
	u64 a;
	u32 b;
	struct kvmppc_gs_part_table c;
	struct kvmppc_gs_proc_table d;
	struct kvmppc_gs_buff_info e;
};

static size_t test1_get_size(struct kvmppc_gs_msg *gsm)
{
	size_t size = 0;
	u16 ids[] = {
		KVMPPC_GSID_PARTITION_TABLE,
		KVMPPC_GSID_PROCESS_TABLE,
		KVMPPC_GSID_RUN_INPUT,
		KVMPPC_GSID_GPR(0),
		KVMPPC_GSID_CR,
	};

	for (int i = 0; i < ARRAY_SIZE(ids); i++)
		size += kvmppc_gse_total_size(kvmppc_gsid_size(ids[i]));
	return size;
}

static int test1_fill_info(struct kvmppc_gs_buff *gsb,
			   struct kvmppc_gs_msg *gsm)
{
	struct kvmppc_gs_msg_test1_data *data = gsm->data;

	if (kvmppc_gsm_includes(gsm, KVMPPC_GSID_GPR(0)))
		kvmppc_gse_put_u64(gsb, KVMPPC_GSID_GPR(0), data->a);

	if (kvmppc_gsm_includes(gsm, KVMPPC_GSID_CR))
		kvmppc_gse_put_u32(gsb, KVMPPC_GSID_CR, data->b);

	if (kvmppc_gsm_includes(gsm, KVMPPC_GSID_PARTITION_TABLE))
		kvmppc_gse_put_part_table(gsb, KVMPPC_GSID_PARTITION_TABLE,
					  data->c);

	if (kvmppc_gsm_includes(gsm, KVMPPC_GSID_PROCESS_TABLE))
		kvmppc_gse_put_proc_table(gsb, KVMPPC_GSID_PARTITION_TABLE,
					  data->d);

	if (kvmppc_gsm_includes(gsm, KVMPPC_GSID_RUN_INPUT))
		kvmppc_gse_put_buff_info(gsb, KVMPPC_GSID_RUN_INPUT, data->e);

	return 0;
}

static int test1_refresh_info(struct kvmppc_gs_msg *gsm,
			      struct kvmppc_gs_buff *gsb)
{
	struct kvmppc_gs_parser gsp = { 0 };
	struct kvmppc_gs_msg_test1_data *data = gsm->data;
	struct kvmppc_gs_elem *gse;
	int rc;

	rc = kvmppc_gse_parse(&gsp, gsb);
	if (rc < 0)
		return rc;

	gse = kvmppc_gsp_lookup(&gsp, KVMPPC_GSID_GPR(0));
	if (gse)
		data->a = kvmppc_gse_get_u64(gse);

	gse = kvmppc_gsp_lookup(&gsp, KVMPPC_GSID_CR);
	if (gse)
		data->b = kvmppc_gse_get_u32(gse);

	return 0;
}

static struct kvmppc_gs_msg_ops gs_msg_test1_ops = {
	.get_size = test1_get_size,
	.fill_info = test1_fill_info,
	.refresh_info = test1_refresh_info,
};

static void test_gs_msg(struct kunit *test)
{
	struct kvmppc_gs_msg_test1_data test1_data = {
		.a = 0xdeadbeef,
		.b = 0x1,
	};
	struct kvmppc_gs_msg *gsm;
	struct kvmppc_gs_buff *gsb;

	gsm = kvmppc_gsm_new(&gs_msg_test1_ops, &test1_data, GSM_SEND,
			     GFP_KERNEL);
	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, gsm);

Annotation

Implementation Notes