xstate
xstate_free(struct xstate *xstate)
free(xstate->area.buf);
xstate_ymm_read(struct xstate *xstate, int regno, struct ymm *rd)
struct u128 *xmm = (struct u128 *)(xstate->area.buf +
xstate->components[XSTATE_COMPONENT_SSE].offset);
struct u128 *ymm = (struct u128 *)(xstate->area.buf +
xstate->components[XSTATE_COMPONENT_AVX].offset);
xstate_ymm_write(struct xstate *xstate, int regno, struct ymm *wr)
struct u128 *xmm = (struct u128 *)(xstate->area.buf +
xstate->components[XSTATE_COMPONENT_SSE].offset);
struct u128 *ymm = (struct u128 *)(xstate->area.buf +
xstate->components[XSTATE_COMPONENT_AVX].offset);
test_ymm_get(struct xstate *xstate)
if (xstate_init(xstate, pid))
xstate->area.buf, xstate->area.size) == -1)
xstate_ymm_read(xstate, i, &ymm[i]);
xstate_free(xstate);
test_ymm_set(struct xstate *xstate)
if (xstate_init(xstate, pid))
xstate->area.buf, xstate->area.size) == -1)
xstate_ymm_write(xstate, i, &ymm);
xstate->area.buf, xstate->area.size) == -1)
xstate_free(xstate);
int (*test)(struct xstate *);
struct xstate xstate;
return tests[i].test(&xstate);
xstate_init(struct xstate *xstate, pid_t pid)
memset(xstate, 0, sizeof(*xstate));
xstate->area.buf = malloc(info.xsave_len);
xstate->area.size = info.xsave_len;
xstate->components[XSTATE_COMPONENT_SSE].supported = 1;
xstate->components[XSTATE_COMPONENT_SSE].offset = 160;
xstate->components[XSTATE_COMPONENT_SSE].size = 256;
xstate->components[XSTATE_COMPONENT_AVX].supported = 1;
xstate->components[XSTATE_COMPONENT_AVX].offset = leaf.b;
xstate->components[XSTATE_COMPONENT_AVX].size = leaf.a;