Blame utils/fwparam_ibft/prom_parse.y

Packit Service 646995
/*
Packit Service 646995
 * Copyright (C) IBM Corporation. 2007
Packit Service 646995
 * Author: Doug Maxey <dwm@austin.ibm.com>
Packit Service 646995
 *
Packit Service 646995
 * This program is free software: you can redistribute it and/or modify
Packit Service 646995
 * it under the terms of the GNU General Public License as published by
Packit Service 646995
 * the Free Software Foundation, either version 2 of the License, or
Packit Service 646995
 * (at your option) any later version.
Packit Service 646995
 *
Packit Service 646995
 * This program is distributed in the hope that it will be useful,
Packit Service 646995
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 646995
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service 646995
 * GNU General Public License for more details.
Packit Service 646995
 *
Packit Service 646995
 * You should have received a copy of the GNU General Public License
Packit Service 646995
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
Packit Service 646995
 */
Packit Service 646995
Packit Service 646995
/* - DEFINITION section. */
Packit Service 646995
Packit Service 646995
%{
Packit Service 646995
	/* literal block. include lines, decls, defns. */
Packit Service 646995
//#define YYDEBUG 1
Packit Service 646995
#if YYDEBUG
Packit Service 646995
#define DPRINT(fmt,...) printf(fmt,__VA_ARGS__)
Packit Service 646995
#else
Packit Service 646995
#define DPRINT(fmt,...) do {} while(0)
Packit Service 646995
#endif
Packit Service 646995
#include "prom_parse.h"
Packit Service 646995
#include "iscsi_obp.h"
Packit Service 646995
Packit Service 646995
Packit Service 646995
%}
Packit Service 646995
%union {
Packit Service 646995
#define	STR_LEN		16384
Packit Service 646995
		char str[STR_LEN];
Packit Service 646995
}
Packit Service 646995
Packit Service 646995
/* definitions. */
Packit Service 646995
%token <str> BUSNAME BOOTDEV
Packit Service 646995
%token <str> IPV4 IQN
Packit Service 646995
%token <str> OBPPARM OBPQUAL
Packit Service 646995
%token <str> HEX4 HEX16
Packit Service 646995
%token <str> VDEVICE VDEVINST VDEVDEV VDEVRAW
Packit Service 646995
%token <str> CHOSEN
Packit Service 646995
%token <str> FILENAME
Packit Service 646995
Packit Service 646995
%type <str> devpath busses bus bootdev
Packit Service 646995
%type <str> disklabel diskpart
Packit Service 646995
%type <str> vdevice vdev_parms vdev_parm
Packit Service 646995
%type <str> obp_quals obp_qual obp_params obp_param
Packit Service 646995
%type <str> ipaddr ipv4 ipv6
Packit Service 646995
%type <str> hexpart hexseq
Packit Service 646995
Packit Service 646995
%locations
Packit Service 646995
%parse-param {struct ofw_dev *ofwdev}
Packit Service 646995
Packit Service 646995
%%
Packit Service 646995
Packit Service 646995
devpath: '/'   {
Packit Service 646995
			DPRINT("****rootonly: \"%s\"\n", "/");
Packit Service 646995
		}
Packit Service 646995
	| '/' busses  bootdev  {
Packit Service 646995
			DPRINT("****devpath busses:\n/%s/%s\n", $2, $3);
Packit Service 646995
		}
Packit Service 646995
	| '/' busses  bootdev disklabel {
Packit Service 646995
			ofwdev->dev_path = malloc(strlen($<str>2) +
Packit Service 646995
                                      strlen($<str>3) + 3);
Packit Service 646995
			sprintf(ofwdev->dev_path, "/%s%s", $<str>2, $<str>3);
Packit Service 646995
			DPRINT("****devpath busses bootdev "
Packit Service 646995
                   "disklabel:\n/%s/%s%s\n",
Packit Service 646995
				   $2, $3, $4);
Packit Service 646995
		}
Packit Service 646995
	| '/' busses  bootdev obp_quals obp_params {
Packit Service 646995
			ofwdev->dev_path = malloc(strlen($<str>2) +
Packit Service 646995
                                      strlen($<str>3) + 3);
Packit Service 646995
			sprintf(ofwdev->dev_path, "/%s%s", $<str>2, $<str>3);
Packit Service 646995
			DPRINT("****busses bootdev obp_quals obp_parms:\n"
Packit Service 646995
                   "/%s/%s:%s%s\n",
Packit Service 646995
				   $2, $3, $4, $5);
Packit Service 646995
		}
Packit Service 646995
	| '/' busses  bootdev obp_quals obp_params disklabel {
Packit Service 646995
			ofwdev->dev_path = malloc(strlen($<str>2) +
Packit Service 646995
                                      strlen($<str>3) + 3);
Packit Service 646995
			sprintf(ofwdev->dev_path, "/%s%s", $<str>2, $<str>3);
Packit Service 646995
			DPRINT("****busses bootdev obp_quals obp_parms "
Packit Service 646995
                   "disklabel:\n/%s:%s%s%s\n", $2, $4, $5, $6);
Packit Service 646995
		}
Packit Service 646995
	| '/' vdevice bootdev vdev_parms obp_quals obp_params disklabel {
Packit Service 646995
			DPRINT("****vdevice bootdev obp_parms "
Packit Service 646995
                   "disklabel:\n/%s:%s%s%s%s\n",
Packit Service 646995
				   $2, $4, $5, $6, $7);
Packit Service 646995
		}
Packit Service 646995
	;
Packit Service 646995
Packit Service 646995
busses:	   bus	{
Packit Service 646995
			strcpy($$, $1);
Packit Service 646995
		}
Packit Service 646995
	| busses '/' bus {
Packit Service 646995
			snprintf($$, STR_LEN, "%s/%s", $<str>1, $<str>3);
Packit Service 646995
		}
Packit Service 646995
	;
Packit Service 646995
Packit Service 646995
bus:	BUSNAME {
Packit Service 646995
			strcpy($$, $1);
Packit Service 646995
		}
Packit Service 646995
	| BUSNAME '@' HEX4 {
Packit Service 646995
			snprintf($$, STR_LEN, "%s@%s", $<str>1, $<str>3);
Packit Service 646995
		}
Packit Service 646995
	| BUSNAME '@' HEX4 ',' HEX4 {
Packit Service 646995
			snprintf($$, STR_LEN, "%s@%s,%s", $<str>1, $<str>3, $<str>5);
Packit Service 646995
		}
Packit Service 646995
	| BUSNAME '@' HEX16 {
Packit Service 646995
			snprintf($$, STR_LEN, "%s@%s", $<str>1, $<str>3);
Packit Service 646995
		}
Packit Service 646995
	| BUSNAME ',' HEX4 '@' HEX16  {
Packit Service 646995
			snprintf($$, STR_LEN, "%s,%s@%s", $<str>1, $<str>3, $<str>5);
Packit Service 646995
		}
Packit Service 646995
	;
Packit Service 646995
Packit Service 646995
Packit Service 646995
bootdev:  '/' BOOTDEV ':' {
Packit Service 646995
			snprintf($$, STR_LEN, "/%s", $<str>2);
Packit Service 646995
		}
Packit Service 646995
	| '/' BOOTDEV '@' HEX4 ':' {
Packit Service 646995
			snprintf($$, STR_LEN, "/%s@%s", $<str>2, $<str>4);
Packit Service 646995
		}
Packit Service 646995
	| '/' BOOTDEV '@' HEX4 ',' HEX4 ':' {
Packit Service 646995
			snprintf($$, STR_LEN, "/%s@%s,%s", $<str>2, $<str>4, $<str>6);
Packit Service 646995
		}
Packit Service 646995
	;
Packit Service 646995
Packit Service 646995
vdevice: VDEVICE '/' VDEVINST {
Packit Service 646995
			snprintf($$, STR_LEN, "%s/%s", $<str>1, $<str>3);
Packit Service 646995
		}
Packit Service 646995
	;
Packit Service 646995
Packit Service 646995
vdev_parms: ':' vdev_parm {
Packit Service 646995
			snprintf($$, STR_LEN, ":%s", $<str>2);
Packit Service 646995
		}
Packit Service 646995
	| vdev_parms ',' vdev_parm {
Packit Service 646995
			snprintf($$, STR_LEN, "%s,%s", $<str>1, $<str>3);
Packit Service 646995
		}
Packit Service 646995
	| vdev_parms ',' VDEVRAW {
Packit Service 646995
			snprintf($$, STR_LEN, "%s,%s", $<str>1, $<str>3);
Packit Service 646995
		}
Packit Service 646995
	;
Packit Service 646995
Packit Service 646995
vdev_parm: VDEVDEV '=' CHOSEN {
Packit Service 646995
			snprintf($$, STR_LEN, "%s=%s", $<str>1, $<str>3);
Packit Service 646995
		}
Packit Service 646995
	;
Packit Service 646995
Packit Service 646995
obp_params: ',' obp_param	{
Packit Service 646995
			snprintf($$, STR_LEN, ",%s", $2);
Packit Service 646995
		}
Packit Service 646995
	| obp_params ',' obp_param {
Packit Service 646995
			snprintf($$, STR_LEN, "%s,%s", $<str>1, $<str>3);
Packit Service 646995
		}
Packit Service 646995
	| obp_params ',' disklabel {
Packit Service 646995
			snprintf($$, STR_LEN, "%s,%s", $<str>1, $<str>3);
Packit Service 646995
		}
Packit Service 646995
	;
Packit Service 646995
Packit Service 646995
obp_param: HEX4 {
Packit Service 646995
			snprintf($$, STR_LEN, "%s", $1);
Packit Service 646995
		}
Packit Service 646995
	| OBPPARM '=' HEX16 {
Packit Service 646995
			/* luns > 0 are the SAM-3+ hex representation. */
Packit Service 646995
			obp_parm_hexnum(ofwdev, $<str>1, $<str>3);
Packit Service 646995
			snprintf($$, STR_LEN, "%s=%s", $<str>1, $<str>3);
Packit Service 646995
		}
Packit Service 646995
	| OBPPARM '=' ipaddr {
Packit Service 646995
			obp_parm_addr(ofwdev, $<str>1, $<str>3);
Packit Service 646995
			snprintf($$, STR_LEN, "%s=%s", $<str>1, $<str>3);
Packit Service 646995
		}
Packit Service 646995
	| OBPPARM '=' IQN {
Packit Service 646995
			obp_parm_iqn(ofwdev, $<str>1, $<str>3);
Packit Service 646995
			snprintf($$, STR_LEN, "%s=%s", $<str>1, $<str>3);
Packit Service 646995
		}
Packit Service 646995
	| OBPPARM '=' HEX4 {
Packit Service 646995
			obp_parm_hexnum(ofwdev, $<str>1, $<str>3);
Packit Service 646995
			snprintf($$, STR_LEN, "%s=%s", $<str>1, $<str>3);
Packit Service 646995
		}
Packit Service 646995
	| OBPPARM '=' FILENAME {
Packit Service 646995
			obp_parm_str(ofwdev, $<str>1, $<str>3);
Packit Service 646995
			snprintf($$, STR_LEN, "%s=%s", $<str>1, $<str>3);
Packit Service 646995
		}
Packit Service 646995
	;
Packit Service 646995
Packit Service 646995
obp_quals: obp_qual {
Packit Service 646995
			snprintf($$, STR_LEN, "%s", $1);
Packit Service 646995
		}
Packit Service 646995
	|  obp_quals ',' obp_qual {
Packit Service 646995
			snprintf($$, STR_LEN, "%s,%s", $<str>1, $<str>3);
Packit Service 646995
		}
Packit Service 646995
	;
Packit Service 646995
Packit Service 646995
obp_qual: OBPQUAL {
Packit Service 646995
			snprintf($$, STR_LEN, "%s", obp_qual_set(ofwdev, $<str>1));
Packit Service 646995
		}
Packit Service 646995
	| vdev_parm {
Packit Service 646995
			snprintf($$, STR_LEN, "%s", $<str>1);
Packit Service 646995
		}
Packit Service 646995
	;
Packit Service 646995
Packit Service 646995
ipaddr: ipv4 {
Packit Service 646995
			snprintf($$, STR_LEN, "%s", $<str>1);
Packit Service 646995
		}
Packit Service 646995
	| ipv6 {
Packit Service 646995
			snprintf($$, STR_LEN, "%s", $<str>1);
Packit Service 646995
		}
Packit Service 646995
	;
Packit Service 646995
Packit Service 646995
ipv4: IPV4 {
Packit Service 646995
			snprintf($$, STR_LEN, "%s", $1);
Packit Service 646995
		}
Packit Service 646995
	;
Packit Service 646995
Packit Service 646995
ipv6: hexpart {
Packit Service 646995
			snprintf($$, STR_LEN, "%s", $1);
Packit Service 646995
		}
Packit Service 646995
	| hexpart ':' ipv4 {
Packit Service 646995
			snprintf($$, STR_LEN, "%s:%s", $1, $3);
Packit Service 646995
		}
Packit Service 646995
	;
Packit Service 646995
Packit Service 646995
hexpart: hexseq {
Packit Service 646995
			snprintf($$, STR_LEN, "%s", $1);
Packit Service 646995
		}
Packit Service 646995
	| hexpart "::"	{
Packit Service 646995
			snprintf($$, STR_LEN, "%s::", $<str>1);
Packit Service 646995
		}
Packit Service 646995
	| hexpart "::" hexseq {
Packit Service 646995
			snprintf($$, STR_LEN, "%s::%s", $<str>1, $<str>3);
Packit Service 646995
		}
Packit Service 646995
	| "::" hexseq {
Packit Service 646995
			snprintf($$, STR_LEN, "::%s", $<str>2);
Packit Service 646995
		}
Packit Service 646995
	;
Packit Service 646995
Packit Service 646995
hexseq:	HEX4 {
Packit Service 646995
            snprintf($$, STR_LEN, "%s", $1);
Packit Service 646995
        }
Packit Service 646995
    | hexseq ":" HEX4 {
Packit Service 646995
            snprintf($$, STR_LEN, "%s:%s", $<str>1, $<str>3);
Packit Service 646995
        }
Packit Service 646995
    ;
Packit Service 646995
Packit Service 646995
disklabel:   diskpart {
Packit Service 646995
            snprintf($$, STR_LEN, "%s", $<str>1);
Packit Service 646995
        }
Packit Service 646995
    | HEX4 diskpart {
Packit Service 646995
            snprintf($$, STR_LEN, "%s%s", $<str>1, $<str>2);
Packit Service 646995
        }
Packit Service 646995
    | '@' HEX4 ',' HEX4 diskpart {
Packit Service 646995
            snprintf($$, STR_LEN, "@%s,%s%s", $<str>2, $<str>4, $<str>5);
Packit Service 646995
        }
Packit Service 646995
    ;
Packit Service 646995
Packit Service 646995
diskpart: ':' HEX4 {
Packit Service 646995
            snprintf($$, STR_LEN, ":%s", $<str>2);
Packit Service 646995
        }
Packit Service 646995
    | ':' HEX4 ',' FILENAME {
Packit Service 646995
            snprintf($$, STR_LEN, ":%s,%s", $<str>2, $<str>4);
Packit Service 646995
        }
Packit Service 646995
    ;
Packit Service 646995
Packit Service 646995
%%