1 /*
2 * This file and its contents are supplied under the terms of the
3 * Common Development and Distribution License ("CDDL"), version 1.0.
4 * You may only use this file in accordance with the terms of version
5 * 1.0 of the CDDL.
6 *
7 * A full copy of the text of the CDDL should have accompanied this
8 * source. A copy of the CDDL is also available via the Internet at
9 * http://www.illumos.org/license/CDDL.
10 */
11
12 /*
13 * Copyright 2022 Oxide Computer Company
14 */
15
16 /*
17 * This is designed to allow us to execute print() and various dereferencing
18 * operations with bitfields. It reads the values from argc and passes them to
19 * functions that we can then take apart. Crtitically this uses bitfields
20 * constructed via CTF and not the D compiler.
21 */
22
23 #include <err.h>
24 #include <stdlib.h>
25 #include <stdint.h>
26 #include <stdlib.h>
27 #include <errno.h>
28
29 typedef struct bit0 {
30 uint32_t a:3;
31 uint32_t b:2;
32 uint32_t c:1;
33 uint32_t d:1;
34 uint32_t e:1;
35 uint32_t f:1;
36 uint32_t g:3;
37 uint32_t h:3;
38 uint32_t i:5;
39 uint32_t j:4;
40 uint32_t k:6;
41 uint32_t l:1;
42 uint32_t m:1;
43 } bit0_t;
44
45 typedef struct bit1 {
46 uint16_t a:1;
47 uint16_t b:8;
48 uint16_t c:3;
49 uint16_t d:2;
50 uint16_t e:1;
51 uint16_t f:1;
52 } bit1_t;
53
54 void
mumble(FILE * f,bit0_t * zero,bit1_t * one)55 mumble(FILE *f, bit0_t *zero, bit1_t *one)
56 {
57 (void) fprintf(f, "%u\n%u\n", zero->k, one->d);
58 }
59
60 int
main(int argc,char * argv[])61 main(int argc, char *argv[])
62 {
63 unsigned long l;
64 uint16_t u16;
65 uint32_t u32;
66 FILE *f;
67
68 if (argc != 3) {
69 errx(EXIT_FAILURE, "Need two ints");
70 }
71
72 f = fopen("/dev/null", "rw+");
73 if (f == NULL) {
74 err(EXIT_FAILURE, "failed to open /dev/null");
75 }
76
77 errno = 0;
78 l = strtoul(argv[1], NULL, 0);
79 if (errno != 0 || l == 0 || l > UINT16_MAX) {
80 errx(EXIT_FAILURE, "invalid u16 value: %s", argv[1]);
81 }
82 u16 = (uint16_t)l;
83
84 l = strtoul(argv[2], NULL, 0);
85 if (errno != 0 || l == 0 || l > UINT32_MAX) {
86 errx(EXIT_FAILURE, "invalid u32 value: %s", argv[1]);
87 }
88 u32 = (uint32_t)l;
89 mumble(f, (bit0_t *)&u32, (bit1_t *)&u16);
90
91 return (0);
92 }
93