Blame utils/fwparam_ibft/prom_parse.y

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