]> FriiDump Source - friidump.git/blob - libfriidump/xbox_region.c
Document exact-release Linux hardware validation
[friidump.git] / libfriidump / xbox_region.c
1 #include "xbox_region.h"
2
3 #include <stdio.h>
4 #include <string.h>
5
6 #define XBOX_REGION_KNOWN_MASK \
7     (XB_REGION_US_CANADA | XB_REGION_JAPAN | \
8      XB_REGION_EUROPE_AU_NZ | XB_REGION_REST_OF_WORLD | \
9      XB_REGION_MANUFACTURING)
10
11 static void xbox_region_append(char *output,
12                                size_t output_size,
13                                const char *text,
14                                int *have_text)
15 {
16     size_t used;
17
18     if (!output || output_size == 0 || !text || !have_text)
19         return;
20
21     used = strlen(output);
22     if (used >= output_size - 1)
23         return;
24
25     if (*have_text) {
26         snprintf(output + used, output_size - used, "; ");
27         used = strlen(output);
28         if (used >= output_size - 1)
29             return;
30     }
31
32     snprintf(output + used, output_size - used, "%s", text);
33     *have_text = 1;
34 }
35
36 int xbox_region_format(uint32_t mask, char *output, size_t output_size)
37 {
38     uint32_t execution_mask;
39     uint32_t unknown_mask;
40     int have_text;
41     char unknown[32];
42
43     if (!output || output_size == 0)
44         return 0;
45
46     output[0] = '\0';
47     have_text = 0;
48     execution_mask = mask & 0x7fffffffU;
49
50     if (execution_mask == 0x7fffffffU) {
51         xbox_region_append(output, output_size, "Region Free", &have_text);
52     } else if (execution_mask == 0U) {
53         xbox_region_append(output, output_size, "None (Locked)", &have_text);
54     } else {
55         if (mask & XB_REGION_US_CANADA)
56             xbox_region_append(output, output_size, "North America", &have_text);
57         if (mask & XB_REGION_JAPAN)
58             xbox_region_append(output, output_size, "Japan", &have_text);
59         if (mask & XB_REGION_EUROPE_AU_NZ)
60             xbox_region_append(output, output_size,
61                                "Europe/Australia/New Zealand", &have_text);
62         if (mask & XB_REGION_REST_OF_WORLD)
63             xbox_region_append(output, output_size,
64                                "Rest of World", &have_text);
65     }
66
67     if (mask & XB_REGION_MANUFACTURING)
68         xbox_region_append(output, output_size, "Manufacturing", &have_text);
69
70     unknown_mask = mask & ~((uint32_t)XBOX_REGION_KNOWN_MASK);
71     if (execution_mask != 0x7fffffffU && unknown_mask != 0U) {
72         snprintf(unknown, sizeof(unknown), "Unknown flags 0x%08x",
73                  unknown_mask);
74         xbox_region_append(output, output_size, unknown, &have_text);
75     }
76
77     return 1;
78 }