d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur/*
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * CDDL HEADER START
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur *
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * The contents of this file are subject to the terms of the
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * Common Development and Distribution License (the "License").
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * You may not use this file except in compliance with the License.
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur *
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * or http://www.opensolaris.org/os/licensing.
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * See the License for the specific language governing permissions
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * and limitations under the License.
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur *
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * When distributing Covered Code, include this CDDL HEADER in each
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * If applicable, add the following below this CDDL HEADER, with the
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * fields enclosed by brackets "[]" replaced with your own identifying
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * information: Portions Copyright [yyyy] [name of copyright owner]
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur *
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * CDDL HEADER END
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur/*
5cd376e8b7030707d78315f63adb4bb2b4d9963eJimmy Vetayases * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
33f5ff17089e3a43e6e730bf80384c233123dbd9Milan Jurik * Copyright 2012 Milan Jurik. All rights reserved.
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur/*
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * This is the user interface module for the pcitool. It checks commandline
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * arguments and options and stores them in a pcitool_uiargs_t structure passed
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * back to the rest of the program for processing.
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur *
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * Please see pcitool_usage.c for a complete commandline description.
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur#include <stdio.h>
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur#include <stdlib.h>
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur#include <unistd.h>
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur#include <sys/inttypes.h>
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur#include <sys/types.h>
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur#include <sys/param.h>
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur#include <strings.h>
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur#include <errno.h>
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur#include <sys/pci.h>
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur#include <sys/pci_tools.h>
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur#include "pcitool_ui.h"
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur/*
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * Uncomment the following for useful debugging / development options for this
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * module only.
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur/* #define DEBUG 1 */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur/* #define STANDALONE 1 */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
500b1e787b108592a37e3d54dc9b5e676de5386dAlan Adamson, SD OSSD#define DEVNAME_START_PCI "/pci"
500b1e787b108592a37e3d54dc9b5e676de5386dAlan Adamson, SD OSSD#define DEVNAME_START_NIU "/niu"
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur/* Default read/write size when -s not specified. */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur#define DEFAULT_SIZE 4
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur/* For get_value64 */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur#define HEX_ONLY B_TRUE
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur#define BASE_BY_PREFIX B_FALSE
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur#define BITS_PER_BYTE 8
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur/*
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * This defines which main options can be specified by the user.
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * Options with colons after them require arguments.
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur */
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yanstatic char *opt_string = ":n:d:i:m:p:rw:o:s:e:b:vaqlcxgy";
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur/* This defines options used singly and only by themselves (no nexus). */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaurstatic char *no_dev_opt_string = "ahpqv";
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaurstatic void print_bad_option(char *argv[], int optopt, char *optarg);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaurstatic boolean_t get_confirmation(void);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaurstatic int get_value64(char *value_str, uint64_t *value, boolean_t hex_only);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaurstatic int parse_nexus_opts(char *input, uint64_t *flags_arg, uint8_t *bank_arg,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur uint64_t *base_addr_arg);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaurstatic int extract_bdf_arg(char *cvalue, char *fld, uint64_t fld_flag,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur uint64_t *all_flags, uint8_t *ivalue);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaurstatic int extract_bdf(char *value, char **bvalue_p, char **dvalue_p,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur char **fvalue_p);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaurstatic int parse_device_opts(char *input, uint64_t *flags_arg,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur uint8_t *bus_arg, uint8_t *device_arg, uint8_t *func_arg,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur uint8_t *bank_arg);
7ff178cd8db129d385d3177eb20744d3b6efc59bJimmy Vetayasesstatic int parse_ino_opts(char *input, uint64_t *flags_arg,
7ff178cd8db129d385d3177eb20744d3b6efc59bJimmy Vetayases uint32_t *cpu_arg, uint8_t *ino_arg);
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yanstatic int parse_msi_opts(char *input, uint64_t *flags_arg, uint16_t *msi_arg);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaurstatic int parse_intr_set_opts(char *input, uint64_t *flags_arg,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur uint32_t *cpu_arg);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaurstatic int parse_probeone_opts(char *input, uint64_t *flags_arg,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur uint8_t *bus_arg, uint8_t *device_arg, uint8_t *func_arg);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur#ifdef DEBUG
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaurvoid dump_struct(pcitool_uiargs_t *dump_this);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur#endif
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur/* Exported functions. */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur/*
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * Main commandline argument parsing routine.
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur *
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * Takes argc and argv straight from the commandline.
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * Returns a pcitool_uiargs_t with flags of options specified, and values
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * associated with them.
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaurint
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaurget_commandline_args(int argc, char *argv[], pcitool_uiargs_t *parsed_args)
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur{
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur int c; /* Current option being processed. */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur boolean_t error = B_FALSE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur boolean_t confirm = B_FALSE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur uint64_t recv64;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /* Needed for getopt(3C) */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur extern char *optarg; /* Current commandline string. */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur extern int optind; /* Index of current commandline string. */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur extern int optopt; /* Option (char) which is missing an operand. */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur extern int opterr; /* Set to 0 to disable getopt err reporting. */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur opterr = 0;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur bzero(parsed_args, sizeof (pcitool_uiargs_t));
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /* No args. probe mode accounting for bus ranges, nonverbose. */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (argc == 1) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur usage(argv[0]);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur parsed_args->flags = 0;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur return (SUCCESS);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /* 1st arg is not a device name. */
500b1e787b108592a37e3d54dc9b5e676de5386dAlan Adamson, SD OSSD if ((strstr(argv[1], DEVNAME_START_PCI) != argv[1]) &&
500b1e787b108592a37e3d54dc9b5e676de5386dAlan Adamson, SD OSSD (strstr(argv[1], DEVNAME_START_NIU) != argv[1])) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /* Default is to probe all trees accounting for bus ranges. */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur parsed_args->flags = PROBEALL_FLAG | PROBERNG_FLAG;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /* Loop thru the options until complete or an error is found. */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur while (((c = getopt(argc, argv, no_dev_opt_string)) != -1) &&
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (error == B_FALSE)) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur switch (c) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /* Help requested. */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur case 'h':
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur usage(argv[0]);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur parsed_args->flags = 0;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur return (SUCCESS);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur case 'p':
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /* Take default probe mode */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur case 'a':
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /*
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * Enable display of ALL bus numbers.
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur *
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * This takes precidence over PROBERNG as -a
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * is explicitly specified.
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur parsed_args->flags &= ~PROBERNG_FLAG;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur case 'q':
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur parsed_args->flags |= QUIET_FLAG;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /* Verbose mode for full probe. */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur case 'v':
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur parsed_args->flags |= VERBOSE_FLAG;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur default:
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur error = B_TRUE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /* Check for values straggling at the end of the command. */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (optind != argc) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) fprintf(stderr, "%s: Unrecognized parameter "
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur "at the end of the command.\n", argv[0]);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur error = B_TRUE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (error) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur print_bad_option(argv, optopt, optarg);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur return (FAILURE);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur return (SUCCESS);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /* Device node specified on commandline. */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /* Skip argv[1] before continuing below. */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur optind++;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /* Loop through the options until complete or an error is found. */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur while (((c = getopt(argc, argv, opt_string)) != -1) &&
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (error == B_FALSE)) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur switch (c) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /* Nexus */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur case 'n':
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (parsed_args->flags & (LEAF_FLAG |
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur NEXUS_FLAG | INTR_FLAG | PROBE_FLAGS)) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) fprintf(stderr, "%s: -n set with "
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur "-d, -p or -i or is set twice\n", argv[0]);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur error = B_TRUE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur parsed_args->flags |= NEXUS_FLAG;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (parse_nexus_opts(optarg, &parsed_args->flags,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur &parsed_args->bank, &parsed_args->base_address) !=
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur SUCCESS) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) fprintf(stderr,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur "%s: Error parsing -n options\n", argv[0]);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur error = B_TRUE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /* Device (leaf node) */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur case 'd':
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (parsed_args->flags & (LEAF_FLAG |
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur NEXUS_FLAG | INTR_FLAG | PROBE_FLAGS)) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) fprintf(stderr, "%s: -d set with "
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur "-n, -p or -i or is set twice\n", argv[0]);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur error = B_TRUE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur parsed_args->flags |= LEAF_FLAG;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (parse_device_opts(optarg, &parsed_args->flags,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur &parsed_args->bus, &parsed_args->device,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur &parsed_args->function,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur &parsed_args->bank) != SUCCESS) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) fprintf(stderr,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur "%s: Error parsing -d options\n", argv[0]);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur error = B_TRUE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /* Interrupt */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur case 'i':
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (parsed_args->flags & (LEAF_FLAG |
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur NEXUS_FLAG | INTR_FLAG | PROBE_FLAGS)) {
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan (void) fprintf(stderr, "%s: -i set with -m, "
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur "-n, -d or -p or is set twice\n", argv[0]);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur error = B_TRUE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur parsed_args->flags |= INTR_FLAG;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /* parse input to get ino value. */
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan if (parse_ino_opts(optarg, &parsed_args->flags,
7ff178cd8db129d385d3177eb20744d3b6efc59bJimmy Vetayases &parsed_args->old_cpu,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur &parsed_args->intr_ino) != SUCCESS) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) fprintf(stderr,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur "%s: Error parsing interrupt options\n",
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur argv[0]);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur error = B_TRUE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan /* Interrupt */
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan case 'm':
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan if (parsed_args->flags & (LEAF_FLAG |
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan NEXUS_FLAG | INTR_FLAG | PROBE_FLAGS)) {
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan (void) fprintf(stderr, "%s: -m set with -i, "
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan "-n, -d or -p or is set twice\n", argv[0]);
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan error = B_TRUE;
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan break;
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan }
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan parsed_args->flags |= INTR_FLAG;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan /* parse input to get msi value. */
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan if (parse_msi_opts(optarg, &parsed_args->flags,
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan &parsed_args->intr_msi) != SUCCESS) {
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan (void) fprintf(stderr,
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan "%s: Error parsing interrupt options\n",
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan argv[0]);
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan error = B_TRUE;
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan }
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /* Probe */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur case 'p':
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (parsed_args->flags & (LEAF_FLAG |
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur NEXUS_FLAG | INTR_FLAG | PROBE_FLAGS)) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) fprintf(stderr, "%s: -p set with "
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur "-n, -d or -i or is set twice\n", argv[0]);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur error = B_TRUE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /* Process -p with no dedicated options to it. */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (optarg[0] == '-') {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur optind--;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /* Probe given tree observing ranges */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur parsed_args->flags |=
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (PROBETREE_FLAG | PROBERNG_FLAG);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur continue;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /* parse input to get ino value. */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (parse_probeone_opts(optarg, &parsed_args->flags,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur &parsed_args->bus, &parsed_args->device,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur &parsed_args->function) != SUCCESS) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) fprintf(stderr,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur "%s: Error parsing probe options\n",
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur argv[0]);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur error = B_TRUE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur } else {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /*
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * parse_probeone_opts found options to
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * set up bdf.
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur parsed_args->flags |= PROBEDEV_FLAG;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /* Probe all busses */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur case 'a':
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /* Must follow -p, and -p must have no bdf. */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (!(parsed_args->flags & PROBETREE_FLAG)) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur error = B_TRUE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur parsed_args->flags &= ~PROBERNG_FLAG;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /* Read */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur case 'r':
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (!(parsed_args->flags &
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (LEAF_FLAG | NEXUS_FLAG | INTR_FLAG))) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur error = B_TRUE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /*
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * Allow read and write to be set together for now,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * since this means write then read back for device and
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * nexus accesses. Check for this and disallow with
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * interrupt command later.
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur parsed_args->flags |= READ_FLAG;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /* Write */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur case 'w':
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (!(parsed_args->flags &
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (LEAF_FLAG | NEXUS_FLAG | INTR_FLAG))) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur error = B_TRUE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (parsed_args->flags & WRITE_FLAG) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) fprintf(stderr, "%s: -w set twice\n",
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur argv[0]);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur error = B_TRUE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /*
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * For device and nexus, get a single register value
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * to write.
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (parsed_args->flags & (NEXUS_FLAG | LEAF_FLAG)) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur parsed_args->flags |= WRITE_FLAG;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (get_value64(optarg,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur &parsed_args->write_value, HEX_ONLY) !=
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur SUCCESS) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) fprintf(stderr,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur "%s: Error reading value to "
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur "write.\n", argv[0]);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur error = B_TRUE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /* For interrupt, parse input to get cpu value. */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur } else if (parsed_args->flags & INTR_FLAG) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur parsed_args->flags |= WRITE_FLAG;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (parse_intr_set_opts(optarg,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur &parsed_args->flags,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur &parsed_args->intr_cpu) != SUCCESS) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) fprintf(stderr, "%s: Error "
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur "parsing interrupt options.\n",
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur argv[0]);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur error = B_TRUE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur } else {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur error = B_TRUE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /* Offset */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur case 'o':
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (!(parsed_args->flags & (LEAF_FLAG | NEXUS_FLAG))) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur error = B_TRUE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (parsed_args->flags & OFFSET_FLAG) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) fprintf(stderr, "%s: -o set twice\n",
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur argv[0]);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur error = B_TRUE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur parsed_args->flags |= OFFSET_FLAG;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (get_value64(optarg, &recv64, HEX_ONLY) != SUCCESS) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) fprintf(stderr,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur "%s: Error in offset argument\n", argv[0]);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur error = B_TRUE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur parsed_args->offset = (uint32_t)recv64;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (parsed_args->offset != recv64) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) fprintf(stderr, "%s: Offset argument "
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur "too large for 32 bits\n", argv[0]);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur error = B_TRUE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /* Size */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur case 's':
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (!(parsed_args->flags & (LEAF_FLAG | NEXUS_FLAG))) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur error = B_TRUE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (parsed_args->flags & SIZE_FLAG) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) fprintf(stderr, "%s: -s set twice\n",
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur argv[0]);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur error = B_TRUE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur parsed_args->flags |= SIZE_FLAG;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (get_value64(optarg, &recv64, HEX_ONLY) != SUCCESS) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) fprintf(stderr,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur "%s: Error in size argument\n", argv[0]);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur error = B_TRUE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur switch (recv64) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur case 1:
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur case 2:
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur case 4:
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur case 8:
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur default:
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur error = B_TRUE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) fprintf(stderr,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur "%s: Error in size argument\n", argv[0]);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur parsed_args->size |= (uint8_t)recv64;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /* Endian. */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur case 'e':
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (!(parsed_args->flags & (LEAF_FLAG | NEXUS_FLAG))) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur error = B_TRUE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (parsed_args->flags & ENDIAN_FLAG) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) fprintf(stderr, "%s: -e set twice\n",
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur argv[0]);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur error = B_TRUE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur parsed_args->flags |= ENDIAN_FLAG;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /* Only a single character allowed. */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (optarg[1] != '\0') {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) fprintf(stderr,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur "%s: Error in endian argument\n", argv[0]);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur error = B_TRUE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur switch (optarg[0]) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur case 'b':
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur parsed_args->big_endian = B_TRUE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur case 'l':
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur default:
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) fprintf(stderr,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur "%s: Error in endian argument\n", argv[0]);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur error = B_TRUE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /* (Byte)dump */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur case 'b':
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (!(parsed_args->flags & (LEAF_FLAG | NEXUS_FLAG))) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur error = B_TRUE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (parsed_args->flags & BYTEDUMP_FLAG) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) fprintf(stderr, "%s: -b set twice\n",
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur argv[0]);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur error = B_TRUE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur parsed_args->flags |= BYTEDUMP_FLAG;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (get_value64(optarg, &recv64, HEX_ONLY) != SUCCESS) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) fprintf(stderr, "%s: Error in "
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur "bytedump argument\n", argv[0]);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur error = B_TRUE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur parsed_args->bytedump_amt = (uint32_t)recv64;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (parsed_args->bytedump_amt != recv64) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) fprintf(stderr, "%s: Bytedump amount "
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur "too large for 32 bits\n", argv[0]);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur error = B_TRUE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /* Verbose. */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur case 'v':
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur parsed_args->flags |= VERBOSE_FLAG;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /*
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * Quiet - no errors reported as messages.
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * (Status still returned by program, however.)
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur case 'q':
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur parsed_args->flags |= QUIET_FLAG;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /* Loop. */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur case 'l':
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur parsed_args->flags |= LOOP_FLAG;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /*
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * Dump characters with bytedump (-b).
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * Show controller info with -i.
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur case 'c':
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (parsed_args->flags & BYTEDUMP_FLAG) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur parsed_args->flags |= CHARDUMP_FLAG;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur } else if (parsed_args->flags & INTR_FLAG) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur parsed_args->flags |= SHOWCTLR_FLAG;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur } else {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur error = B_TRUE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /* Continue on errors with bytedump (-b). */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur case 'x':
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (!(parsed_args->flags & BYTEDUMP_FLAG)) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur error = B_TRUE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur parsed_args->flags |= ERRCONT_FLAG;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur case 'g':
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (!(parsed_args->flags & INTR_FLAG)) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur error = B_TRUE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur parsed_args->flags |= SETGRP_FLAG;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /* Take -y as confirmation and don't ask (where applicable). */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur case 'y':
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur confirm = B_TRUE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /* Option without operand. */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur case ':':
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur switch (optopt) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur case 'p':
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /* Allow -p without bdf spec. */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur parsed_args->flags |=
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (PROBETREE_FLAG | PROBERNG_FLAG);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur default:
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur error = B_TRUE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /* Unrecognized option. */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur case '?':
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur error = B_TRUE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /*
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * Commandline has been parsed. Check for errors which can be checked
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * only after commandline parsing is complete.
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (!error) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /* Check for values straggling at the end of the command. */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (optind != argc) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) fprintf(stderr, "%s: Unrecognized parameter "
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur "at the end of the command.\n", argv[0]);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur print_bad_option(argv, optopt, optarg);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur return (FAILURE);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /* No args other than nexus. Default to probing that nexus */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (!(parsed_args->flags &
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (LEAF_FLAG | NEXUS_FLAG | INTR_FLAG | PROBE_FLAGS))) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur usage(argv[0]);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur parsed_args->flags = 0;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur return (SUCCESS);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /*
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * Don't allow any options other than all-bus, verbose or
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * quiet with probe command. Set default probe flags if nexus
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * or leaf options are not specified.
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (parsed_args->flags & (PROBETREE_FLAG | PROBEALL_FLAG)) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (parsed_args->flags &
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur ~(PROBE_FLAGS | QUIET_FLAG | VERBOSE_FLAG))
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur error = B_TRUE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /*
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * Allow only read, write, quiet and verbose flags for
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * interrupt command. Note that INO_SPEC_FLAG and CPU_SPEC_FLAG
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * get set for interrupt command.
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (parsed_args->flags & INTR_FLAG) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (parsed_args->flags &
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur ~(INTR_FLAG | VERBOSE_FLAG | QUIET_FLAG |
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur READ_FLAG | WRITE_FLAG | SHOWCTLR_FLAG |
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan SETGRP_FLAG | INO_ALL_FLAG | INO_SPEC_FLAG |
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan MSI_ALL_FLAG | MSI_SPEC_FLAG | CPU_SPEC_FLAG)) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) fprintf(stderr, "%s: -v, -q, -r, -w, -c "
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan "-g are only options allowed with "
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan "interrupt command.\n", argv[0]);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur error = B_TRUE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /* Need cpu and ino values for interrupt set command. */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if ((parsed_args->flags & WRITE_FLAG) &&
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan !(parsed_args->flags & CPU_SPEC_FLAG) &&
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan !((parsed_args->flags & INO_SPEC_FLAG) ||
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan (parsed_args->flags & MSI_SPEC_FLAG))) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) fprintf(stderr,
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan "%s: Both cpu and ino/msi must be "
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan "specified explicitly for interrupt "
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan "set command.\n", argv[0]);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur error = B_TRUE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /* Intr write and show ctlr flags are incompatible. */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if ((parsed_args->flags &
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (WRITE_FLAG + SHOWCTLR_FLAG)) ==
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (WRITE_FLAG + SHOWCTLR_FLAG)) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) fprintf(stderr,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur "%s: -w and -c are incompatible for "
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur "interrupt command.\n", argv[0]);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur error = B_TRUE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /* Intr setgrp flag valid only for intr writes. */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if ((parsed_args->flags & (WRITE_FLAG + SETGRP_FLAG)) ==
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur SETGRP_FLAG) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) fprintf(stderr,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur "%s: -g is incompatible with -r "
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur "for interrupt command.\n", argv[0]);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur error = B_TRUE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /*
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * Disallow read & write together in interrupt command.
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if ((parsed_args->flags & (WRITE_FLAG | READ_FLAG)) ==
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (WRITE_FLAG | READ_FLAG)) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) fprintf(stderr, "%s: Only one of -r and "
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur "-w can be specified in "
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur "interrupt command.\n", argv[0]);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur error = B_TRUE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /* Bytedump incompatible with some other options. */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if ((parsed_args->flags & BYTEDUMP_FLAG) &&
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (parsed_args->flags &
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (WRITE_FLAG | PROBE_FLAGS | INTR_FLAG))) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) fprintf(stderr,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur "%s: -b is incompatible with "
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur "another specified option.\n", argv[0]);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur error = B_TRUE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (parsed_args->flags & (LEAF_FLAG | NEXUS_FLAG)) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (!(parsed_args->flags & SIZE_FLAG)) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur parsed_args->size = DEFAULT_SIZE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if ((parsed_args->flags & WRITE_FLAG) &&
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur parsed_args->size < sizeof (uint64_t) &&
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (parsed_args->write_value >>
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (parsed_args->size * BITS_PER_BYTE))) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) fprintf(stderr,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur "%s: Data to write is larger than "
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur "specified size.\n", argv[0]);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur error = B_TRUE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur } else { /* Looping is compatible only with register cmds. */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (parsed_args->flags & LOOP_FLAG) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) fprintf(stderr, "%s: -l is incompatible "
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur "with given command.\n", argv[0]);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur error = B_TRUE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /* Call out an erroneous -y and then ignore it. */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if ((confirm) && (!(parsed_args->flags & BASE_SPEC_FLAG))) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) fprintf(stderr,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur "%s: -y is incompatible with given command."
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur " Ignoring.\n", argv[0]);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /* Now fill in the defaults and other holes. */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (!(error)) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (!(parsed_args->flags & (READ_FLAG | WRITE_FLAG))) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur parsed_args->flags |= READ_FLAG;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (parsed_args->flags & (LEAF_FLAG | NEXUS_FLAG)) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (!(parsed_args->flags & ENDIAN_FLAG)) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur parsed_args->big_endian = B_FALSE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (parsed_args->flags & BASE_SPEC_FLAG) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (!confirm) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur confirm = get_confirmation();
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (!confirm) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur parsed_args->flags &= ~ALL_COMMANDS;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /*
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * As far as other defaults are concerned:
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * Other fields: bus, device, function, offset, default to
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * zero.
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur } else { /* An error occurred. */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur print_bad_option(argv, optopt, optarg);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur return (error);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur}
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur/* Module-private functions. */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaurstatic void
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaurprint_bad_option(char *argv[], int optopt, char *optarg)
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur{
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /* Illegal option operand */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (optarg != NULL) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) fprintf(stderr,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur "%s: illegal operand %s specified for option %c\n",
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur argv[0], optarg, optopt);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /* Illegal option */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur } else if (optopt != 0) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) fprintf(stderr,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur "%s: option %c is illegal or is missing an operand\n",
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur argv[0], optopt);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /* getopt wasn't even called. Bad device spec. */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur } else {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) fprintf(stderr,
500b1e787b108592a37e3d54dc9b5e676de5386dAlan Adamson, SD OSSD "%s: device spec must start with %s or %s...\n", argv[0],
500b1e787b108592a37e3d54dc9b5e676de5386dAlan Adamson, SD OSSD DEVNAME_START_PCI, DEVNAME_START_NIU);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) fprintf(stderr,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur "%s: Type \"%s -h\" to get help on running this program.\n",
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur argv[0], argv[0]);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur}
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur/*
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * Warn the user and ask for confirmation.
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaurstatic boolean_t
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaurget_confirmation()
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur{
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur int i, b;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) printf("WARNING: This cmd with a bad addr can panic "
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur "the system. Continue [y/n] (n)? ");
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur for (i = 0; ; i++) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur b = getchar();
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur switch (b) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur case ' ':
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur case '\t':
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur case 'y':
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur case 'Y':
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur return (B_TRUE);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur default:
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur return (B_FALSE);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur}
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur/*
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * Given a digit string, return a 64 bit value.
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur *
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * If the hex_only arg is true, interpret all strings as hex.
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * Otherwise, interpret as strtoull(3C) does with base=0.
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaurstatic int
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaurget_value64(char *value_str, uint64_t *value, boolean_t hex_only)
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur{
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /* This is overkill for now, as everything is in hex. */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur static char dec_digits[] = "0123456789";
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur static char hex_digits[] = "01234567890abcdefABCDEF";
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur static char oct_digits[] = "01234567";
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur char *digit_string;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur char *string_to_check;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if ((value_str == NULL) || (strlen(value_str) == 0)) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) fprintf(stderr, "Missing value argument.\n");
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur return (FAILURE);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (!hex_only && (value_str[0] != '0')) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur digit_string = dec_digits;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur string_to_check = value_str;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur } else if ((value_str[1] == 'X') || (value_str[1] == 'x')) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur digit_string = hex_digits;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur string_to_check = &value_str[2]; /* Ignore 0x of hex */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur } else if (hex_only) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur digit_string = hex_digits;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur string_to_check = value_str; /* Hex number, no 0x prefix */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur } else {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur digit_string = oct_digits;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur string_to_check = value_str;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /*
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * Verify value is all proper digits.
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur *
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * For some reason, strtoull doesn't return an error when it cannot
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * interpret the value. This is why we do the checking ourselves.
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (strspn(string_to_check, digit_string) != strlen(string_to_check)) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) fprintf(stderr,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur "Value must contain only valid digits.\n");
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur return (FAILURE);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur *value = strtoull(value_str, NULL, (hex_only ? 16 : 0));
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur return (SUCCESS);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur}
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur/*
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * Parse nexus options. This includes:
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * bank=number
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur *
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * input is what the user specified for the options on the commandline,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * flags_arg is modified with the option set, and bank_arg returns the value
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * specified for bank.
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaurstatic int
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaurparse_nexus_opts(char *input, uint64_t *flags_arg, uint8_t *bank_arg,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur uint64_t *base_addr_arg)
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur{
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur typedef enum {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur bank = 0,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur base
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur } nexus_opts_index_t;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur static char *nexus_opts[] = {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur "bank",
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur "base",
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur NULL
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur };
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur char *value;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur uint64_t recv64;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur int rval = SUCCESS;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (input == NULL) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) fprintf(stderr, "Missing argument.\n");
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur return (FAILURE);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur while ((*input != '\0') && (rval == SUCCESS)) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur switch (getsubopt(&input, nexus_opts, &value)) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur case bank:
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (*flags_arg & BANK_SPEC_FLAG) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) fprintf(stderr, "The bank or bar arg is "
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur "specified more than once.\n");
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur rval = FAILURE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (*flags_arg & BASE_SPEC_FLAG) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) fprintf(stderr, "Bank and base address "
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur "cannot both be specified.\n");
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur rval = FAILURE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (value == NULL) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) fprintf(stderr, "Missing bank value.\n");
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur rval = FAILURE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if ((rval = get_value64(value, &recv64, HEX_ONLY)) !=
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur SUCCESS) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur *bank_arg = (uint8_t)recv64;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (*bank_arg != recv64) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) fprintf(stderr,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur "Bank argument must fit into 8 bits.\n");
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur rval = FAILURE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur *flags_arg |= BANK_SPEC_FLAG;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur case base:
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (*flags_arg & BASE_SPEC_FLAG) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) fprintf(stderr, "The base address "
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur "is specified more than once.\n");
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur rval = FAILURE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (*flags_arg & BANK_SPEC_FLAG) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) fprintf(stderr, "Bank and base address "
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur "cannot both be specified.\n");
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur rval = FAILURE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (value == NULL) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) fprintf(stderr,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur "Missing base addr value.\n");
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur rval = FAILURE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if ((rval = get_value64(value, base_addr_arg,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur HEX_ONLY)) != SUCCESS) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur *flags_arg |= BASE_SPEC_FLAG;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur default:
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) fprintf(stderr, "Unrecognized option for -n\n");
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur rval = FAILURE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur return (rval);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur}
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaurstatic int
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaurextract_bdf_arg(char *cvalue, char *fld, uint64_t fld_flag, uint64_t *all_flags,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur uint8_t *ivalue)
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur{
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur uint64_t recv64;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (*all_flags & fld_flag) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) fprintf(stderr,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur "The %s is specified more than once.\n", fld);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur return (FAILURE);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (get_value64(cvalue, &recv64, HEX_ONLY) != SUCCESS)
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur return (FAILURE);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur *ivalue = (uint8_t)recv64;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (recv64 != *ivalue) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) fprintf(stderr,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur "This program limits the %s argument to 8 bits.\n", fld);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) fprintf(stderr, "The actual maximum may be "
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur "smaller but cannot be enforced by this program.\n");
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur return (FAILURE);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur *all_flags |= fld_flag;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur return (SUCCESS);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur}
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaurstatic int extract_bdf(char *value, char **bvalue_p, char **dvalue_p,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur char **fvalue_p)
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur{
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur char *strtok_state;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur char *dummy;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur static char *separator = ".";
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur *bvalue_p = strtok_r(value, separator, &strtok_state);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur *dvalue_p = strtok_r(NULL, separator, &strtok_state);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur *fvalue_p = strtok_r(NULL, separator, &strtok_state);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur dummy = strtok_r(NULL, separator, &strtok_state);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /* Return failure only if too many values specified. */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur return ((dummy) ? FAILURE : SUCCESS);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur}
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur/*
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * Parse device options. This includes:
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * bus=number
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * dev=number
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * func=number
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * bank=number
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * config
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * bar0
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * bar1
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * bar2
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * bar3
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * bar4
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * bar5
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * rom
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur *
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * input is what the user specified for the options on the commandline,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * flags_arg is modified with the options set, and the rest of the args return
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * their respective values.
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaurstatic int
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaurparse_device_opts(
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur char *input, uint64_t *flags_arg, uint8_t *bus_arg, uint8_t *device_arg,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur uint8_t *func_arg, uint8_t *bank_arg)
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur{
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /* Needed by getsubopt(3C) */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur typedef enum {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur bus = 0,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur dev = 1,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur func = 2,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur bdf = 3,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur bank = 4,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur config = 5,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur bar0 = 6,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur bar1 = 7,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur bar2 = 8,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur bar3 = 9,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur bar4 = 10,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur bar5 = 11,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur rom = 12
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur } bdf_opts_index_t;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /* Needed by getsubopt(3C) */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur static char *bdf_opts[] = {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur "bus",
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur "dev",
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur "func",
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur "bdf",
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur "bank",
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur "config",
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur "bar0",
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur "bar1",
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur "bar2",
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur "bar3",
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur "bar4",
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur "bar5",
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur "rom",
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur NULL };
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur char *value; /* Current suboption being processed. */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur uint64_t recv64; /* Temporary value. */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /* This error message is used in many places. */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur static char bank_err[] =
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur {"The bank or bar arg is specified more than once.\n"};
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur int rval = SUCCESS;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur while ((*input != '\0') && (rval == SUCCESS)) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur switch (getsubopt(&input, bdf_opts, &value)) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /* bus=number */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur case bdf: {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur char *bvalue, *dvalue, *fvalue;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if ((rval = extract_bdf(value, &bvalue, &dvalue,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur &fvalue)) != SUCCESS) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (!bvalue | !dvalue | !fvalue) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if ((rval = extract_bdf_arg(bvalue, "bus",
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur BUS_SPEC_FLAG, flags_arg, bus_arg)) != SUCCESS) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if ((rval = extract_bdf_arg(dvalue, "dev",
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur DEV_SPEC_FLAG, flags_arg, device_arg)) != SUCCESS) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur rval = extract_bdf_arg(fvalue, "func",
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur FUNC_SPEC_FLAG, flags_arg, func_arg);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur case bus:
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur rval = extract_bdf_arg(value, "bus", BUS_SPEC_FLAG,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur flags_arg, bus_arg);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /* dev=number */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur case dev:
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur rval = extract_bdf_arg(value, "dev", DEV_SPEC_FLAG,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur flags_arg, device_arg);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /* func=number */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur case func:
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur rval = extract_bdf_arg(value, "func", FUNC_SPEC_FLAG,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur flags_arg, func_arg);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /* bank=number */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur case bank:
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (*flags_arg & BANK_SPEC_FLAG) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) fprintf(stderr, bank_err);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur rval = FAILURE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if ((rval = get_value64(value, &recv64, HEX_ONLY)) !=
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur SUCCESS) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur *bank_arg = (uint8_t)recv64;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (rval || (*bank_arg != recv64)) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) fprintf(stderr, "Bank argument must"
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur " fit into 8 bits.\n");
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur rval = FAILURE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur *flags_arg |= BANK_SPEC_FLAG;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /* config */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur case config:
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (*flags_arg & BANK_SPEC_FLAG) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) fprintf(stderr, bank_err);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur rval = FAILURE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur *bank_arg = PCITOOL_CONFIG;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur *flags_arg |= BANK_SPEC_FLAG;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /* bar0 */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur case bar0:
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (*flags_arg & BANK_SPEC_FLAG) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) fprintf(stderr, bank_err);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur rval = FAILURE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur *bank_arg = PCITOOL_BAR0;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur *flags_arg |= BANK_SPEC_FLAG;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /* bar1 */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur case bar1:
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (*flags_arg & BANK_SPEC_FLAG) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) fprintf(stderr, bank_err);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur rval = FAILURE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur *bank_arg = PCITOOL_BAR1;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur *flags_arg |= BANK_SPEC_FLAG;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /* bar2 */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur case bar2:
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (*flags_arg & BANK_SPEC_FLAG) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) fprintf(stderr, bank_err);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur rval = FAILURE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur *bank_arg = PCITOOL_BAR2;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur *flags_arg |= BANK_SPEC_FLAG;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /* bar3 */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur case bar3:
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (*flags_arg & BANK_SPEC_FLAG) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) fprintf(stderr, bank_err);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur rval = FAILURE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur *bank_arg = PCITOOL_BAR3;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur *flags_arg |= BANK_SPEC_FLAG;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /* bar4 */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur case bar4:
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (*flags_arg & BANK_SPEC_FLAG) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) fprintf(stderr, bank_err);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur rval = FAILURE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur *bank_arg = PCITOOL_BAR4;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur *flags_arg |= BANK_SPEC_FLAG;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /* bar5 */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur case bar5:
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (*flags_arg & BANK_SPEC_FLAG) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) fprintf(stderr, bank_err);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur rval = FAILURE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur *bank_arg = PCITOOL_BAR5;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur *flags_arg |= BANK_SPEC_FLAG;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /* rom */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur case rom:
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (*flags_arg & BANK_SPEC_FLAG) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) fprintf(stderr, bank_err);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur rval = FAILURE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur *bank_arg = PCITOOL_ROM;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur *flags_arg |= BANK_SPEC_FLAG;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur default:
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) fprintf(stderr, "Unrecognized option for -d\n");
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur rval = FAILURE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /* Bus, dev and func must all be specified. */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if ((*flags_arg & (BUS_SPEC_FLAG | DEV_SPEC_FLAG | FUNC_SPEC_FLAG)) !=
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (BUS_SPEC_FLAG | DEV_SPEC_FLAG | FUNC_SPEC_FLAG)) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur rval = FAILURE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /* No bank specified in any way. Default to config space */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur } else if ((*flags_arg & BANK_SPEC_FLAG) == 0) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur *flags_arg |= BANK_SPEC_FLAG;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur *bank_arg = PCITOOL_CONFIG;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur return (rval);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur}
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur/*
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan * Parse INO options. This includes:
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan * ino# | all
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur *
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * input is the string of options to parse. flags_arg returns modified with
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * specified options set. Other args return their respective values.
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaurstatic int
7ff178cd8db129d385d3177eb20744d3b6efc59bJimmy Vetayasesparse_ino_opts(char *input, uint64_t *flags_arg, uint32_t *cpu_arg,
7ff178cd8db129d385d3177eb20744d3b6efc59bJimmy Vetayases uint8_t *ino_arg)
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur{
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan uint64_t value;
7ff178cd8db129d385d3177eb20744d3b6efc59bJimmy Vetayases char *charvalue;
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan int rval = SUCCESS;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan if (strcmp(input, "all") == 0) {
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan *flags_arg |= INO_ALL_FLAG;
7ff178cd8db129d385d3177eb20744d3b6efc59bJimmy Vetayases#ifdef __x86
7ff178cd8db129d385d3177eb20744d3b6efc59bJimmy Vetayases } else if (strstr(input, ",") == NULL) {
7ff178cd8db129d385d3177eb20744d3b6efc59bJimmy Vetayases (void) fprintf(stderr,
7ff178cd8db129d385d3177eb20744d3b6efc59bJimmy Vetayases "Interrupt format should be <cpu#,ino#>.\n");
7ff178cd8db129d385d3177eb20744d3b6efc59bJimmy Vetayases rval = FAILURE;
7ff178cd8db129d385d3177eb20744d3b6efc59bJimmy Vetayases#else
7ff178cd8db129d385d3177eb20744d3b6efc59bJimmy Vetayases } else if (strstr(input, ",") == NULL) {
7ff178cd8db129d385d3177eb20744d3b6efc59bJimmy Vetayases if ((rval = get_value64(input, &value, HEX_ONLY)) == SUCCESS)
7ff178cd8db129d385d3177eb20744d3b6efc59bJimmy Vetayases *ino_arg = (uint8_t)value;
7ff178cd8db129d385d3177eb20744d3b6efc59bJimmy Vetayases
7ff178cd8db129d385d3177eb20744d3b6efc59bJimmy Vetayases if (*ino_arg != value) {
7ff178cd8db129d385d3177eb20744d3b6efc59bJimmy Vetayases (void) fprintf(stderr,
7ff178cd8db129d385d3177eb20744d3b6efc59bJimmy Vetayases "ino argument must fit into 8 bits.\n");
7ff178cd8db129d385d3177eb20744d3b6efc59bJimmy Vetayases rval = FAILURE;
7ff178cd8db129d385d3177eb20744d3b6efc59bJimmy Vetayases } else {
7ff178cd8db129d385d3177eb20744d3b6efc59bJimmy Vetayases *flags_arg |= INO_SPEC_FLAG;
7ff178cd8db129d385d3177eb20744d3b6efc59bJimmy Vetayases }
7ff178cd8db129d385d3177eb20744d3b6efc59bJimmy Vetayases#endif
7ff178cd8db129d385d3177eb20744d3b6efc59bJimmy Vetayases } else if (charvalue = strtok(input, ",")) {
7ff178cd8db129d385d3177eb20744d3b6efc59bJimmy Vetayases if ((rval =
7ff178cd8db129d385d3177eb20744d3b6efc59bJimmy Vetayases get_value64(charvalue, &value, HEX_ONLY)) == SUCCESS) {
7ff178cd8db129d385d3177eb20744d3b6efc59bJimmy Vetayases *cpu_arg = (int)value;
7ff178cd8db129d385d3177eb20744d3b6efc59bJimmy Vetayases }
7ff178cd8db129d385d3177eb20744d3b6efc59bJimmy Vetayases
7ff178cd8db129d385d3177eb20744d3b6efc59bJimmy Vetayases input = strtok(NULL, ",");
7ff178cd8db129d385d3177eb20744d3b6efc59bJimmy Vetayases if (input == NULL) {
7ff178cd8db129d385d3177eb20744d3b6efc59bJimmy Vetayases (void) fprintf(stderr, "ino argument is need.\n");
7ff178cd8db129d385d3177eb20744d3b6efc59bJimmy Vetayases return (FAILURE);
7ff178cd8db129d385d3177eb20744d3b6efc59bJimmy Vetayases }
7ff178cd8db129d385d3177eb20744d3b6efc59bJimmy Vetayases
7ff178cd8db129d385d3177eb20744d3b6efc59bJimmy Vetayases if ((rval = get_value64(input, &value, HEX_ONLY)) == SUCCESS)
7ff178cd8db129d385d3177eb20744d3b6efc59bJimmy Vetayases *ino_arg = (uint8_t)value;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan if (*ino_arg != value) {
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan (void) fprintf(stderr,
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan "ino argument must fit into 8 bits.\n");
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan rval = FAILURE;
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan } else {
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan *flags_arg |= INO_SPEC_FLAG;
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan }
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan } else {
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan (void) fprintf(stderr,
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan "Unrecognized option for -i\n");
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan rval = FAILURE;
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan return (rval);
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan}
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan/*
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan * Parse MSI options. This includes:
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan * msi# | all
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan *
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan * input is the string of options to parse. flags_arg returns modified with
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan * specified options set. Other args return their respective values.
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan */
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yanstatic int
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yanparse_msi_opts(char *input, uint64_t *flags_arg, uint16_t *msi_arg)
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan{
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan uint64_t value;
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan int rval = SUCCESS;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan if (strcmp(input, "all") == 0) {
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan *flags_arg |= MSI_ALL_FLAG;
7ff178cd8db129d385d3177eb20744d3b6efc59bJimmy Vetayases } else if (strstr(input, ",") == NULL) {
7ff178cd8db129d385d3177eb20744d3b6efc59bJimmy Vetayases if ((rval = get_value64(input, &value, HEX_ONLY)) == SUCCESS)
7ff178cd8db129d385d3177eb20744d3b6efc59bJimmy Vetayases *msi_arg = (uint16_t)value;
7ff178cd8db129d385d3177eb20744d3b6efc59bJimmy Vetayases
7ff178cd8db129d385d3177eb20744d3b6efc59bJimmy Vetayases if (*msi_arg != value) {
7ff178cd8db129d385d3177eb20744d3b6efc59bJimmy Vetayases (void) fprintf(stderr,
7ff178cd8db129d385d3177eb20744d3b6efc59bJimmy Vetayases "msi argument must fit into 16 bits.\n");
7ff178cd8db129d385d3177eb20744d3b6efc59bJimmy Vetayases rval = FAILURE;
7ff178cd8db129d385d3177eb20744d3b6efc59bJimmy Vetayases } else {
7ff178cd8db129d385d3177eb20744d3b6efc59bJimmy Vetayases *flags_arg |= MSI_SPEC_FLAG;
7ff178cd8db129d385d3177eb20744d3b6efc59bJimmy Vetayases }
7ff178cd8db129d385d3177eb20744d3b6efc59bJimmy Vetayases } else if (strtok(input, ",")) {
7ff178cd8db129d385d3177eb20744d3b6efc59bJimmy Vetayases input = strtok(NULL, ",");
7ff178cd8db129d385d3177eb20744d3b6efc59bJimmy Vetayases if (input == NULL) {
7ff178cd8db129d385d3177eb20744d3b6efc59bJimmy Vetayases (void) fprintf(stderr, "msi argument is need.\n");
7ff178cd8db129d385d3177eb20744d3b6efc59bJimmy Vetayases return (FAILURE);
7ff178cd8db129d385d3177eb20744d3b6efc59bJimmy Vetayases }
7ff178cd8db129d385d3177eb20744d3b6efc59bJimmy Vetayases
7ff178cd8db129d385d3177eb20744d3b6efc59bJimmy Vetayases if ((rval = get_value64(input, &value, HEX_ONLY)) == SUCCESS)
7ff178cd8db129d385d3177eb20744d3b6efc59bJimmy Vetayases *msi_arg = (uint16_t)value;
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan if (*msi_arg != value) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) fprintf(stderr,
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan "msi argument must fit into 16 bits.\n");
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur rval = FAILURE;
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan } else {
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan *flags_arg |= MSI_SPEC_FLAG;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan } else {
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan (void) fprintf(stderr,
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan "Unrecognized option for -m\n");
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan rval = FAILURE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur return (rval);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur}
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur/*
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * Parse interrupt set options. This includes:
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * cpu=number
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur *
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * input is the string of options to parse. flags_arg returns modified with
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur * specified options set. Other args return their respective values.
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaurstatic int
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaurparse_intr_set_opts(char *input, uint64_t *flags_arg, uint32_t *cpu_arg)
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur{
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan uint64_t value;
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan int rval = SUCCESS;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan if ((rval = get_value64(input, &value, HEX_ONLY)) == SUCCESS) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan if ((long)value > sysconf(_SC_CPUID_MAX)) {
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan (void) fprintf(stderr, "Cpu argument "
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan "exceeds maximum for this system type.\n");
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur rval = FAILURE;
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan } else {
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan *cpu_arg = (uint32_t)value;
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan *flags_arg |= CPU_SPEC_FLAG;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan } else {
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan (void) fprintf(stderr,
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan "Unrecognized option for -i -m -w\n");
09b1eac246a4e627fcbd1ce5bf8005746cbe45eaEvan Yan rval = FAILURE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur return (rval);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur}
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaurstatic int
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaurparse_probeone_opts(
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur char *input, uint64_t *flags_arg, uint8_t *bus_arg, uint8_t *device_arg,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur uint8_t *func_arg)
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur{
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur typedef enum {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur bus = 0,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur dev = 1,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur func = 2,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur bdf = 3
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur } p1_bdf_opts_index_t;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /* Needed by getsubopt(3C) */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur static char *p1_bdf_opts[] = {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur "bus",
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur "dev",
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur "func",
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur "bdf",
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur NULL };
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur char *value; /* Current suboption being processed. */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur int rval = SUCCESS;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur while ((*input != '\0') && (rval == SUCCESS)) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur switch (getsubopt(&input, p1_bdf_opts, &value)) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /* bus=number */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur case bdf: {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur char *bvalue, *dvalue, *fvalue;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if ((rval = extract_bdf(value, &bvalue, &dvalue,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur &fvalue)) != SUCCESS) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (bvalue)
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if ((rval = extract_bdf_arg(bvalue, "bus",
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur BUS_SPEC_FLAG, flags_arg, bus_arg)) !=
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur SUCCESS) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (dvalue)
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if ((rval = extract_bdf_arg(dvalue, "dev",
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur DEV_SPEC_FLAG, flags_arg, device_arg)) !=
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur SUCCESS) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (fvalue)
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur rval = extract_bdf_arg(fvalue, "func",
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur FUNC_SPEC_FLAG, flags_arg, func_arg);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur case bus:
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur rval = extract_bdf_arg(value, "bus", BUS_SPEC_FLAG,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur flags_arg, bus_arg);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /* dev=number */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur case dev:
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur rval = extract_bdf_arg(value, "dev", DEV_SPEC_FLAG,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur flags_arg, device_arg);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur /* func=number */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur case func:
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur rval = extract_bdf_arg(value, "func", FUNC_SPEC_FLAG,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur flags_arg, func_arg);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur default:
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) fprintf(stderr, "Unrecognized option for -p\n");
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur rval = FAILURE;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur break;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur return (rval);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur}
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur#ifdef DEBUG
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaurstatic void
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaurdump_struct(pcitool_uiargs_t *dumpthis) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) printf("flags:0x%x\n", dumpthis->flags);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) printf("bus:%d (0x%x)\n",
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur dumpthis->bus, dumpthis->bus);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) printf("device:%d (0x%x)\n", dumpthis->device,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur dumpthis->device);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) printf("function:%d (0x%x)\n", dumpthis->function,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur dumpthis->function);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) printf("write_value:%" PRIu64 " (0x%" PRIx64 ")\n",
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur dumpthis->write_value, dumpthis->write_value);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) printf("bank:%d (0x%x)\n",
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur dumpthis->bank, dumpthis->bank);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) printf("offset:%d (0x%x)\n", dumpthis->offset, dumpthis->offset);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) printf("size:%d, endian:%s\n", dumpthis->size,
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur dumpthis->big_endian ? "BIG" : "little");
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) printf("ino:%d, cpu:%d\n",
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur dumpthis->intr_ino, dumpthis->intr_cpu);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur}
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur#ifdef STANDALONE
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur/* Test program for this module. Useful when implementing new options. */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaurint
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaurmain(int argc, char *argv[])
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur{
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur int status;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur pcitool_uiargs_t parsed_args;
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur status = get_commandline_args(argc, argv, &parsed_args);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur if (status) {
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur (void) printf("Error getting command.\n");
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur }
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur dump_struct(&parsed_args);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur return (SUCCESS);
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur}
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur#endif /* STANDALONE */
d5ace9454616652a717c9831d949dffa319381f9Erwin T Tsaur#endif /* DEBUG */