diff options
-rw-r--r-- | common/ccd_config.c | 16 | ||||
-rw-r--r-- | extra/usb_updater/gsctool.c | 10 | ||||
-rw-r--r-- | include/ccd_config.h | 5 |
3 files changed, 22 insertions, 9 deletions
diff --git a/common/ccd_config.c b/common/ccd_config.c index 98bcae48d2..fa7c1cb133 100644 --- a/common/ccd_config.c +++ b/common/ccd_config.c @@ -162,7 +162,10 @@ static void raw_set_flag(enum ccd_flag flag, int value) static enum ccd_capability_state raw_get_cap(enum ccd_capability cap, int translate_default) { - int c = (config.capabilities[cap / 4] >> (2 * (cap % 4))) & 3; + const uint32_t index = cap / CCD_CAPS_PER_BYTE; + const uint32_t shift = (cap % CCD_CAPS_PER_BYTE) * CCD_CAP_BITS; + + int c = (config.capabilities[index] >> shift) & CCD_CAP_BITMASK; if (c == CCD_CAP_STATE_DEFAULT && translate_default) c = cap_info[cap].default_state; @@ -182,8 +185,11 @@ static enum ccd_capability_state raw_get_cap(enum ccd_capability cap, static void raw_set_cap(enum ccd_capability cap, enum ccd_capability_state state) { - config.capabilities[cap / 4] &= ~(3 << (2 * (cap % 4))); - config.capabilities[cap / 4] |= (state & 3) << (2 * (cap % 4)); + const uint32_t index = cap / CCD_CAPS_PER_BYTE; + const uint32_t shift = (cap % CCD_CAPS_PER_BYTE) * CCD_CAP_BITS; + + config.capabilities[index] &= ~(CCD_CAP_BITMASK << shift); + config.capabilities[index] |= (state & CCD_CAP_BITMASK) << shift; } /** @@ -1312,8 +1318,8 @@ static enum vendor_cmd_rc ccd_get_info(struct vendor_cmd_params *p) int shift; /* Each capability takes 2 bits. */ - index = i / (32/2); - shift = (i % (32/2)) * 2; + index = i / (32 / CCD_CAP_BITS); + shift = (i % (32 / CCD_CAP_BITS)) * CCD_CAP_BITS; response.ccd_caps_current[index] |= raw_get_cap(i, 1) << shift; response.ccd_caps_defaults[index] |= cap_info[i].default_state << shift; diff --git a/extra/usb_updater/gsctool.c b/extra/usb_updater/gsctool.c index 1f53adde16..66b859f675 100644 --- a/extra/usb_updater/gsctool.c +++ b/extra/usb_updater/gsctool.c @@ -1532,11 +1532,13 @@ static void print_ccd_info(void *response, size_t response_size) int cap_current; int cap_default; - index = i / (32/2); - shift = (i % (32/2)) * 2; + index = i / (32 / CCD_CAP_BITS); + shift = (i % (32 / CCD_CAP_BITS)) * CCD_CAP_BITS; - cap_current = (ccd_info.ccd_caps_current[index] >> shift) & 3; - cap_default = (ccd_info.ccd_caps_defaults[index] >> shift) & 3; + cap_current = (ccd_info.ccd_caps_current[index] >> shift) + & CCD_CAP_BITMASK; + cap_default = (ccd_info.ccd_caps_defaults[index] >> shift) + & CCD_CAP_BITMASK; if (ccd_info.ccd_force_disabled) { is_enabled = 0; diff --git a/include/ccd_config.h b/include/ccd_config.h index 7c377f394f..4cc84ae770 100644 --- a/include/ccd_config.h +++ b/include/ccd_config.h @@ -172,6 +172,11 @@ struct ccd_capability_info { #define CCD_STATE_NAMES { "Locked", "Unlocked", "Opened" } #define CCD_CAP_STATE_NAMES { "Default", "Always", "UnlessLocked", "IfOpened" } +/* Macros regarding ccd_capabilities */ +#define CCD_CAP_BITS 2 +#define CCD_CAP_BITMASK ((1 << CCD_CAP_BITS) - 1) +#define CCD_CAPS_PER_BYTE (8 / CCD_CAP_BITS) + /* * Subcommand code, used to pass different CCD commands using the same TPM * vendor command. |