diff options
Diffstat (limited to 'usr/src/cmd/sgs/elfedit/modules/common/cap.c')
-rw-r--r-- | usr/src/cmd/sgs/elfedit/modules/common/cap.c | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/usr/src/cmd/sgs/elfedit/modules/common/cap.c b/usr/src/cmd/sgs/elfedit/modules/common/cap.c index 7430d4d84f..0cde92f90a 100644 --- a/usr/src/cmd/sgs/elfedit/modules/common/cap.c +++ b/usr/src/cmd/sgs/elfedit/modules/common/cap.c @@ -23,6 +23,7 @@ * Copyright 2010 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. * Copyright 2012 Milan Jurik. All rights reserved. + * Copyright 2022 Oxide Computer Company */ #include <ctype.h> @@ -60,6 +61,7 @@ typedef enum { CAP_CMD_T_HW1 = 5, /* cap:hw1 */ CAP_CMD_T_SF1 = 6, /* cap:sf1 */ CAP_CMD_T_HW2 = 7, /* cap:hw2 */ + CAP_CMD_T_HW3 = 8, /* cap:hw3 */ } CAP_CMD_T; @@ -532,6 +534,14 @@ print_cap(CAP_CMD_T cmd, int autoprint, ARGSTATE *argstate, ELFEDIT_MSG_ERR, 0)); printed = 1; continue; + case CA_SUNW_HW_3: + elfedit_printf(MSG_ORIG(MSG_FMT_STRNL), + conv_cap_val_hw3(cap->c_un.c_val, + argstate->obj_state->os_ehdr-> + e_machine, CONV_FMT_NOBKT, + &cap_val_buf.cap_val_hw3_buf)); + printed = 1; + continue; } } elfedit_printf(MSG_ORIG(MSG_FMT_HEXXWORDNL), @@ -843,6 +853,13 @@ cmd_body(CAP_CMD_T cmd, elfedit_obj_state_t *obj_state, MSG_ORIG(MSG_STR_VALUE), print_only, &print_type); break; + case CAP_CMD_T_HW3: + print_only = (argstate.argc == 0); + ndx = arg_to_index(&argstate, elfedit_atoconst_value_to_str( + ELFEDIT_CONST_CA, CA_SUNW_HW_3, 1), + MSG_ORIG(MSG_STR_VALUE), print_only, &print_type); + break; + default: /* Note expected: All commands should have been caught above */ elfedit_command_usage(); @@ -1024,6 +1041,14 @@ cmd_body(CAP_CMD_T cmd, elfedit_obj_state_t *obj_state, CA_SUNW_HW_2, ELFEDIT_CONST_HW2_SUNW); } break; + + case CAP_CMD_T_HW3: + { + ret = cap_set(&argstate, cap, ndx, cap_ndx, cap_name, + CA_SUNW_HW_3, ELFEDIT_CONST_HW3_SUNW); + } + break; + } /* @@ -1180,6 +1205,19 @@ cpl_hw2(elfedit_obj_state_t *obj_state, void *cpldata, int argc, elfedit_cpl_atoconst(cpldata, ELFEDIT_CONST_HW2_SUNW); } +static void +cpl_hw3(elfedit_obj_state_t *obj_state, void *cpldata, int argc, + const char *argv[], int num_opt) +{ + /* -capid id_name */ + if (argc <= num_opt) { + cpl_capid_opt(obj_state, cpldata, argc, argv, num_opt); + return; + } + + /* This routine allows multiple flags to be specified */ + elfedit_cpl_atoconst(cpldata, ELFEDIT_CONST_HW3_SUNW); +} /* * Implementation functions for the commands */ @@ -1231,6 +1269,12 @@ cmd_hw2(elfedit_obj_state_t *obj_state, int argc, const char *argv[]) return (cmd_body(CAP_CMD_T_HW2, obj_state, argc, argv)); } +static elfedit_cmdret_t +cmd_hw3(elfedit_obj_state_t *obj_state, int argc, const char *argv[]) +{ + return (cmd_body(CAP_CMD_T_HW3, obj_state, argc, argv)); +} + /*ARGSUSED*/ elfedit_module_t * elfedit_init(elfedit_module_version_t version) @@ -1406,6 +1450,15 @@ elfedit_init(elfedit_module_version_t version) { NULL } }; + /* cap:hw3 */ + static const char *name_hw3[] = { MSG_ORIG(MSG_CMD_HW3), NULL }; + static elfedit_cmd_optarg_t arg_hw3[] = { + { MSG_ORIG(MSG_STR_VALUE), + /* MSG_INTL(MSG_A1_HW3_VALUE) */ + ELFEDIT_I18NHDL(MSG_A1_HW3_VALUE), + ELFEDIT_CMDOA_F_OPT | ELFEDIT_CMDOA_F_MULT }, + { NULL } + }; static elfedit_cmd_t cmds[] = { /* cap:dump */ @@ -1472,6 +1525,14 @@ elfedit_init(elfedit_module_version_t version) ELFEDIT_I18NHDL(MSG_HELP_HW2), opt_ostyle_capid_bitop, arg_hw2 }, + /* cap:hw3 */ + { cmd_hw3, cpl_hw3, name_hw3, + /* MSG_INTL(MSG_DESC_HW3) */ + ELFEDIT_I18NHDL(MSG_DESC_HW3), + /* MSG_INTL(MSG_HELP_HW3) */ + ELFEDIT_I18NHDL(MSG_HELP_HW3), + opt_ostyle_capid_bitop, arg_hw3 }, + { NULL } }; |