Changes in 4.9.218 spi: qup: call spi_qup_pm_resume_runtime before suspending powerpc: Include .BTF section ARM: dts: dra7: Add "dma-ranges" property to PCIe RC DT nodes spi/zynqmp: remove entry that causes a cs glitch drm/exynos: dsi: propagate error value and silence meaningless warning drm/exynos: dsi: fix workaround for the legacy clock name altera-stapl: altera_get_note: prevent write beyond end of 'key' USB: Disable LPM on WD19's Realtek Hub usb: quirks: add NO_LPM quirk for RTL8153 based ethernet adapters USB: serial: option: add ME910G1 ECM composition 0x110b usb: host: xhci-plat: add a shutdown USB: serial: pl2303: add device-id for HP LD381 ALSA: line6: Fix endless MIDI read loop ALSA: seq: virmidi: Fix running status after receiving sysex ALSA: seq: oss: Fix running status after receiving sysex ALSA: pcm: oss: Avoid plugin buffer overflow ALSA: pcm: oss: Remove WARNING from snd_pcm_plug_alloc() checks iio: magnetometer: ak8974: Fix negative raw values in sysfs mmc: sdhci-of-at91: fix cd-gpios for SAMA5D2 staging: rtl8188eu: Add device id for MERCUSYS MW150US v2 staging/speakup: fix get_word non-space look-ahead intel_th: Fix user-visible error codes rtc: max8907: add missing select REGMAP_IRQ memcg: fix NULL pointer dereference in __mem_cgroup_usage_unregister_event mm: slub: be more careful about the double cmpxchg of freelist mm, slub: prevent kmalloc_node crashes and memory leaks x86/mm: split vmalloc_sync_all() USB: cdc-acm: fix close_delay and closing_wait units in TIOCSSERIAL USB: cdc-acm: fix rounding error in TIOCSSERIAL kbuild: Disable -Wpointer-to-enum-cast futex: Fix inode life-time issue futex: Unbreak futex hashing ALSA: hda/realtek: Fix pop noise on ALC225 arm64: smp: fix smp_send_stop() behaviour staging: greybus: loopback_test: fix potential path truncation staging: greybus: loopback_test: fix potential path truncations Revert "drm/dp_mst: Skip validating ports during destruction, just ref" hsr: fix general protection fault in hsr_addr_is_self() macsec: restrict to ethernet devices net: dsa: Fix duplicate frames flooded by learning net_sched: cls_route: remove the right filter from hashtable net_sched: keep alloc_hash updated after hash allocation NFC: fdp: Fix a signedness bug in fdp_nci_send_patch() slcan: not call free_netdev before rtnl_unlock in slcan_open vxlan: check return value of gro_cells_init() net: mvneta: Fix the case where the last poll did not process all rx hsr: use rcu_read_lock() in hsr_get_node_{list/status}() hsr: add restart routine into hsr_get_node_list() hsr: set .netnsok flag KVM: VMX: Do not allow reexecute_instruction() when skipping MMIO instr net: ipv4: don't let PMTU updates increase route MTU cpupower: avoid multiple definition with gcc -fno-common dt-bindings: net: FMan erratum A050385 scsi: ipr: Fix softlockup when rescanning devices in petitboot mac80211: Do not send mesh HWMP PREQ if HWMP is disabled sxgbe: Fix off by one in samsung driver strncpy size arg i2c: hix5hd2: add missed clk_disable_unprepare in remove ARM: dts: dra7: Add bus_dma_limit for L3 bus ARM: dts: omap5: Add bus_dma_limit for L3 bus perf probe: Do not depend on dwfl_module_addrsym() scripts/dtc: Remove redundant YYLOC global declaration scsi: sd: Fix optimal I/O size for devices that change reported values mac80211: mark station unauthorized before key removal genirq: Fix reference leaks on irq affinity notifiers vti[6]: fix packet tx through bpf_redirect() in XinY cases xfrm: fix uctx len check in verify_sec_ctx_len xfrm: add the missing verify_sec_ctx_len check in xfrm_add_acquire xfrm: policy: Fix doulbe free in xfrm_policy_timer netfilter: nft_fwd_netdev: validate family and chain type vti6: Fix memory leak of skb if input policy check fails Input: raydium_i2c_ts - use true and false for boolean values Input: raydium_i2c_ts - fix error codes in raydium_i2c_boot_trigger() tools: Let O= makes handle a relative path with -C option USB: serial: option: add support for ASKEY WWHC050 USB: serial: option: add BroadMobi BM806U USB: serial: option: add Wistron Neweb D19Q1 USB: cdc-acm: restore capability check order USB: serial: io_edgeport: fix slab-out-of-bounds read in edge_interrupt_callback usb: musb: fix crash with highmen PIO and usbmon media: flexcop-usb: fix endpoint sanity check media: usbtv: fix control-message timeouts staging: rtl8188eu: Add ASUS USB-N10 Nano B1 to device table staging: wlan-ng: fix ODEBUG bug in prism2sta_disconnect_usb staging: wlan-ng: fix use-after-free Read in hfa384x_usbin_callback libfs: fix infoleak in simple_attr_read() media: ov519: add missing endpoint sanity checks media: dib0700: fix rc endpoint lookup media: stv06xx: add missing descriptor sanity checks media: xirlink_cit: add missing descriptor sanity checks mac80211: Check port authorization in the ieee80211_tx_dequeue() case mac80211: fix authentication with iwlwifi/mvm vt: selection, introduce vc_is_sel vt: ioctl, switch VT_IS_IN_USE and VT_BUSY to inlines vt: switch vt_dont_switch to bool vt: vt_ioctl: remove unnecessary console allocation checks vt: vt_ioctl: fix VT_DISALLOCATE freeing in-use virtual console locking/atomic, kref: Add kref_read() vt: vt_ioctl: fix use-after-free in vt_in_use() bpf: Explicitly memset the bpf_attr structure net: ks8851-ml: Fix IO operations, again arm64: alternative: fix build with clang integrated assembler perf map: Fix off by one in strncpy() size argument Linux 4.9.218 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: I93ee241fe88658b93a22ab85752e8aa9883f6f98
300 lines
6.6 KiB
Plaintext
300 lines
6.6 KiB
Plaintext
/*
|
|
* (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation. 2005.
|
|
*
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License as
|
|
* published by the Free Software Foundation; either version 2 of the
|
|
* License, or (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
|
|
* USA
|
|
*/
|
|
|
|
%option noyywrap nounput noinput never-interactive
|
|
|
|
%x BYTESTRING
|
|
%x PROPNODENAME
|
|
%s V1
|
|
|
|
PROPNODECHAR [a-zA-Z0-9,._+*#?@-]
|
|
PATHCHAR ({PROPNODECHAR}|[/])
|
|
LABEL [a-zA-Z_][a-zA-Z0-9_]*
|
|
STRING \"([^\\"]|\\.)*\"
|
|
CHAR_LITERAL '([^']|\\')*'
|
|
WS [[:space:]]
|
|
COMMENT "/*"([^*]|\*+[^*/])*\*+"/"
|
|
LINECOMMENT "//".*\n
|
|
|
|
%{
|
|
#include "dtc.h"
|
|
#include "srcpos.h"
|
|
#include "dtc-parser.tab.h"
|
|
|
|
extern bool treesource_error;
|
|
|
|
/* CAUTION: this will stop working if we ever use yyless() or yyunput() */
|
|
#define YY_USER_ACTION \
|
|
{ \
|
|
srcpos_update(&yylloc, yytext, yyleng); \
|
|
}
|
|
|
|
/*#define LEXDEBUG 1*/
|
|
|
|
#ifdef LEXDEBUG
|
|
#define DPRINT(fmt, ...) fprintf(stderr, fmt, ##__VA_ARGS__)
|
|
#else
|
|
#define DPRINT(fmt, ...) do { } while (0)
|
|
#endif
|
|
|
|
static int dts_version = 1;
|
|
|
|
#define BEGIN_DEFAULT() DPRINT("<V1>\n"); \
|
|
BEGIN(V1); \
|
|
|
|
static void push_input_file(const char *filename);
|
|
static bool pop_input_file(void);
|
|
static void lexical_error(const char *fmt, ...);
|
|
%}
|
|
|
|
%%
|
|
<*>"/include/"{WS}*{STRING} {
|
|
char *name = strchr(yytext, '\"') + 1;
|
|
yytext[yyleng-1] = '\0';
|
|
push_input_file(name);
|
|
}
|
|
|
|
<*>^"#"(line)?[ \t]+[0-9]+[ \t]+{STRING}([ \t]+[0-9]+)? {
|
|
char *line, *fnstart, *fnend;
|
|
struct data fn;
|
|
/* skip text before line # */
|
|
line = yytext;
|
|
while (!isdigit((unsigned char)*line))
|
|
line++;
|
|
|
|
/* regexp ensures that first and list "
|
|
* in the whole yytext are those at
|
|
* beginning and end of the filename string */
|
|
fnstart = memchr(yytext, '"', yyleng);
|
|
for (fnend = yytext + yyleng - 1;
|
|
*fnend != '"'; fnend--)
|
|
;
|
|
assert(fnstart && fnend && (fnend > fnstart));
|
|
|
|
fn = data_copy_escape_string(fnstart + 1,
|
|
fnend - fnstart - 1);
|
|
|
|
/* Don't allow nuls in filenames */
|
|
if (memchr(fn.val, '\0', fn.len - 1))
|
|
lexical_error("nul in line number directive");
|
|
|
|
/* -1 since #line is the number of the next line */
|
|
srcpos_set_line(xstrdup(fn.val), atoi(line) - 1);
|
|
data_free(fn);
|
|
}
|
|
|
|
<*><<EOF>> {
|
|
if (!pop_input_file()) {
|
|
yyterminate();
|
|
}
|
|
}
|
|
|
|
<*>{STRING} {
|
|
DPRINT("String: %s\n", yytext);
|
|
yylval.data = data_copy_escape_string(yytext+1,
|
|
yyleng-2);
|
|
return DT_STRING;
|
|
}
|
|
|
|
<*>"/dts-v1/" {
|
|
DPRINT("Keyword: /dts-v1/\n");
|
|
dts_version = 1;
|
|
BEGIN_DEFAULT();
|
|
return DT_V1;
|
|
}
|
|
|
|
<*>"/memreserve/" {
|
|
DPRINT("Keyword: /memreserve/\n");
|
|
BEGIN_DEFAULT();
|
|
return DT_MEMRESERVE;
|
|
}
|
|
|
|
<*>"/bits/" {
|
|
DPRINT("Keyword: /bits/\n");
|
|
BEGIN_DEFAULT();
|
|
return DT_BITS;
|
|
}
|
|
|
|
<*>"/delete-property/" {
|
|
DPRINT("Keyword: /delete-property/\n");
|
|
DPRINT("<PROPNODENAME>\n");
|
|
BEGIN(PROPNODENAME);
|
|
return DT_DEL_PROP;
|
|
}
|
|
|
|
<*>"/delete-node/" {
|
|
DPRINT("Keyword: /delete-node/\n");
|
|
DPRINT("<PROPNODENAME>\n");
|
|
BEGIN(PROPNODENAME);
|
|
return DT_DEL_NODE;
|
|
}
|
|
|
|
<*>{LABEL}: {
|
|
DPRINT("Label: %s\n", yytext);
|
|
yylval.labelref = xstrdup(yytext);
|
|
yylval.labelref[yyleng-1] = '\0';
|
|
return DT_LABEL;
|
|
}
|
|
|
|
<V1>([0-9]+|0[xX][0-9a-fA-F]+)(U|L|UL|LL|ULL)? {
|
|
char *e;
|
|
DPRINT("Integer Literal: '%s'\n", yytext);
|
|
|
|
errno = 0;
|
|
yylval.integer = strtoull(yytext, &e, 0);
|
|
|
|
if (*e && e[strspn(e, "UL")]) {
|
|
lexical_error("Bad integer literal '%s'",
|
|
yytext);
|
|
}
|
|
|
|
if (errno == ERANGE)
|
|
lexical_error("Integer literal '%s' out of range",
|
|
yytext);
|
|
else
|
|
/* ERANGE is the only strtoull error triggerable
|
|
* by strings matching the pattern */
|
|
assert(errno == 0);
|
|
return DT_LITERAL;
|
|
}
|
|
|
|
<*>{CHAR_LITERAL} {
|
|
struct data d;
|
|
DPRINT("Character literal: %s\n", yytext);
|
|
|
|
d = data_copy_escape_string(yytext+1, yyleng-2);
|
|
if (d.len == 1) {
|
|
lexical_error("Empty character literal");
|
|
yylval.integer = 0;
|
|
return DT_CHAR_LITERAL;
|
|
}
|
|
|
|
yylval.integer = (unsigned char)d.val[0];
|
|
|
|
if (d.len > 2)
|
|
lexical_error("Character literal has %d"
|
|
" characters instead of 1",
|
|
d.len - 1);
|
|
|
|
return DT_CHAR_LITERAL;
|
|
}
|
|
|
|
<*>\&{LABEL} { /* label reference */
|
|
DPRINT("Ref: %s\n", yytext+1);
|
|
yylval.labelref = xstrdup(yytext+1);
|
|
return DT_REF;
|
|
}
|
|
|
|
<*>"&{/"{PATHCHAR}*\} { /* new-style path reference */
|
|
yytext[yyleng-1] = '\0';
|
|
DPRINT("Ref: %s\n", yytext+2);
|
|
yylval.labelref = xstrdup(yytext+2);
|
|
return DT_REF;
|
|
}
|
|
|
|
<BYTESTRING>[0-9a-fA-F]{2} {
|
|
yylval.byte = strtol(yytext, NULL, 16);
|
|
DPRINT("Byte: %02x\n", (int)yylval.byte);
|
|
return DT_BYTE;
|
|
}
|
|
|
|
<BYTESTRING>"]" {
|
|
DPRINT("/BYTESTRING\n");
|
|
BEGIN_DEFAULT();
|
|
return ']';
|
|
}
|
|
|
|
<PROPNODENAME>\\?{PROPNODECHAR}+ {
|
|
DPRINT("PropNodeName: %s\n", yytext);
|
|
yylval.propnodename = xstrdup((yytext[0] == '\\') ?
|
|
yytext + 1 : yytext);
|
|
BEGIN_DEFAULT();
|
|
return DT_PROPNODENAME;
|
|
}
|
|
|
|
"/incbin/" {
|
|
DPRINT("Binary Include\n");
|
|
return DT_INCBIN;
|
|
}
|
|
|
|
<*>{WS}+ /* eat whitespace */
|
|
<*>{COMMENT}+ /* eat C-style comments */
|
|
<*>{LINECOMMENT}+ /* eat C++-style comments */
|
|
|
|
<*>"<<" { return DT_LSHIFT; };
|
|
<*>">>" { return DT_RSHIFT; };
|
|
<*>"<=" { return DT_LE; };
|
|
<*>">=" { return DT_GE; };
|
|
<*>"==" { return DT_EQ; };
|
|
<*>"!=" { return DT_NE; };
|
|
<*>"&&" { return DT_AND; };
|
|
<*>"||" { return DT_OR; };
|
|
|
|
<*>. {
|
|
DPRINT("Char: %c (\\x%02x)\n", yytext[0],
|
|
(unsigned)yytext[0]);
|
|
if (yytext[0] == '[') {
|
|
DPRINT("<BYTESTRING>\n");
|
|
BEGIN(BYTESTRING);
|
|
}
|
|
if ((yytext[0] == '{')
|
|
|| (yytext[0] == ';')) {
|
|
DPRINT("<PROPNODENAME>\n");
|
|
BEGIN(PROPNODENAME);
|
|
}
|
|
return yytext[0];
|
|
}
|
|
|
|
%%
|
|
|
|
static void push_input_file(const char *filename)
|
|
{
|
|
assert(filename);
|
|
|
|
srcfile_push(filename);
|
|
|
|
yyin = current_srcfile->f;
|
|
|
|
yypush_buffer_state(yy_create_buffer(yyin, YY_BUF_SIZE));
|
|
}
|
|
|
|
|
|
static bool pop_input_file(void)
|
|
{
|
|
if (srcfile_pop() == 0)
|
|
return false;
|
|
|
|
yypop_buffer_state();
|
|
yyin = current_srcfile->f;
|
|
|
|
return true;
|
|
}
|
|
|
|
static void lexical_error(const char *fmt, ...)
|
|
{
|
|
va_list ap;
|
|
|
|
va_start(ap, fmt);
|
|
srcpos_verror(&yylloc, "Lexical error", fmt, ap);
|
|
va_end(ap);
|
|
|
|
treesource_error = true;
|
|
}
|