| From 3e888977f165594cf44dbe8f67e3a4960b22c11f Mon Sep 17 00:00:00 2001 | 
 | From: "Guillermo E. Martinez" <guillermo.e.martinez@oracle.com> | 
 | Date: Fri, 3 Feb 2023 11:17:49 -0600 | 
 | Subject: [PATCH 34/50] bpf: fix error conversion from long unsigned int to | 
 |  unsigned int [-Werror=overflow] | 
 | MIME-Version: 1.0 | 
 | Content-Type: text/plain; charset=UTF-8 | 
 | Content-Transfer-Encoding: 8bit | 
 |  | 
 | Regenerating BPF target using the maintainer mode emits: | 
 | .../opcodes/bpf-opc.c:57:11: error: conversion from ‘long unsigned int’ to ‘unsigned int’ changes value from ‘18446744073709486335’ to ‘4294902015’ [-Werror=overflow] | 
 |   57 |   64, 64, 0xffffffffffff00ff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_SRCLE) }, { F (F_OP_CODE) }, { F (F_DSTLE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } } | 
 |  | 
 | The use of a narrow size to handle the mask CGEN in instruction format | 
 | is causing this error.  Additionally eBPF `call' instructions | 
 | constructed by expressions using symbols (BPF_PSEUDO_CALL) emits | 
 | annotations in `src' field of the instruction, used to identify BPF | 
 | target endianness. | 
 |  | 
 | cpu/ | 
 | 	* bpf.cpu (define-call-insn): Remove `src' field from | 
 | 	instruction mask. | 
 |  | 
 | include/ | 
 | 	*opcode/cge.h (CGEN_IFMT): Adjust mask bit width. | 
 |  | 
 | opcodes/ | 
 | 	* bpf-opc.c: Regenerate. | 
 |  | 
 | (cherry picked from commit 7f6ebecd56e690012b05af0a492280765b17f186) | 
 | --- | 
 |  cpu/bpf.cpu           |  2 +- | 
 |  include/opcode/cgen.h |  2 +- | 
 |  opcodes/bpf-opc.c     | 54 +++++++++++++++++++++++-------------------- | 
 |  opcodes/cgen-dis.c    |  2 +- | 
 |  4 files changed, 32 insertions(+), 28 deletions(-) | 
 |  | 
 | --- a/cpu/bpf.cpu | 
 | +++ b/cpu/bpf.cpu | 
 | @@ -768,7 +768,7 @@ | 
 |         "call" | 
 |         (endian-isas x-endian) | 
 |         "call $disp32" | 
 | -       (+ disp32 (f-offset16 0) (f-regs 0) | 
 | +       (+ disp32 (f-offset16 0) (.sym src x-endian) ((.sym f-dst x-endian) 0) | 
 |            OP_CLASS_JMP OP_SRC_K OP_CODE_CALL) | 
 |         (c-call VOID | 
 |                 "bpfbf_call" disp32 (ifield (.sym f-src x-endian))) | 
 | --- a/include/opcode/cgen.h | 
 | +++ b/include/opcode/cgen.h | 
 | @@ -914,7 +914,7 @@ typedef struct | 
 |       Each insn's value is stored with the insn. | 
 |       The first step in recognizing an insn for disassembly is | 
 |       (opcode & mask) == value.  */ | 
 | -  CGEN_INSN_INT mask; | 
 | +  CGEN_INSN_LGUINT mask; | 
 |  #define CGEN_IFMT_MASK(ifmt) ((ifmt)->mask) | 
 |   | 
 |    /* Instruction fields. | 
 | --- a/opcodes/bpf-opc.c | 
 | +++ b/opcodes/bpf-opc.c | 
 | @@ -50,99 +50,103 @@ static const CGEN_IFMT ifmt_empty ATTRIB | 
 |  }; | 
 |   | 
 |  static const CGEN_IFMT ifmt_addile ATTRIBUTE_UNUSED = { | 
 | -  64, 64, 0xff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_SRCLE) }, { F (F_OP_CODE) }, { F (F_DSTLE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } } | 
 | +  64, 64, 0xfffff0ff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_SRCLE) }, { F (F_OP_CODE) }, { F (F_DSTLE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } } | 
 |  }; | 
 |   | 
 |  static const CGEN_IFMT ifmt_addrle ATTRIBUTE_UNUSED = { | 
 | -  64, 64, 0xff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_SRCLE) }, { F (F_OP_CODE) }, { F (F_DSTLE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } } | 
 | +  64, 64, 0xffffffffffff00ff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_SRCLE) }, { F (F_OP_CODE) }, { F (F_DSTLE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } } | 
 |  }; | 
 |   | 
 |  static const CGEN_IFMT ifmt_negle ATTRIBUTE_UNUSED = { | 
 | -  64, 64, 0xff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_SRCLE) }, { F (F_OP_CODE) }, { F (F_DSTLE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } } | 
 | +  64, 64, 0xfffffffffffff0ff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_SRCLE) }, { F (F_OP_CODE) }, { F (F_DSTLE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } } | 
 |  }; | 
 |   | 
 |  static const CGEN_IFMT ifmt_addibe ATTRIBUTE_UNUSED = { | 
 | -  64, 64, 0xff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_DSTBE) }, { F (F_OP_CODE) }, { F (F_SRCBE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } } | 
 | +  64, 64, 0xffff0fff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_DSTBE) }, { F (F_OP_CODE) }, { F (F_SRCBE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } } | 
 |  }; | 
 |   | 
 |  static const CGEN_IFMT ifmt_addrbe ATTRIBUTE_UNUSED = { | 
 | -  64, 64, 0xff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_DSTBE) }, { F (F_OP_CODE) }, { F (F_SRCBE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } } | 
 | +  64, 64, 0xffffffffffff00ff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_DSTBE) }, { F (F_OP_CODE) }, { F (F_SRCBE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } } | 
 |  }; | 
 |   | 
 |  static const CGEN_IFMT ifmt_negbe ATTRIBUTE_UNUSED = { | 
 | -  64, 64, 0xff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_DSTBE) }, { F (F_OP_CODE) }, { F (F_SRCBE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } } | 
 | +  64, 64, 0xffffffffffff0fff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_DSTBE) }, { F (F_OP_CODE) }, { F (F_SRCBE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } } | 
 |  }; | 
 |   | 
 |  static const CGEN_IFMT ifmt_endlele ATTRIBUTE_UNUSED = { | 
 | -  64, 64, 0xff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_SRCLE) }, { F (F_OP_CODE) }, { F (F_DSTLE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } } | 
 | +  64, 64, 0xfffff0ff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_SRCLE) }, { F (F_OP_CODE) }, { F (F_DSTLE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } } | 
 |  }; | 
 |   | 
 |  static const CGEN_IFMT ifmt_endlebe ATTRIBUTE_UNUSED = { | 
 | -  64, 64, 0xff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_DSTBE) }, { F (F_OP_CODE) }, { F (F_SRCBE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } } | 
 | +  64, 64, 0xffff0fff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_DSTBE) }, { F (F_OP_CODE) }, { F (F_SRCBE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } } | 
 |  }; | 
 |   | 
 |  static const CGEN_IFMT ifmt_lddwle ATTRIBUTE_UNUSED = { | 
 | -  64, 128, 0xff, { { F (F_IMM64) }, { F (F_OFFSET16) }, { F (F_SRCLE) }, { F (F_OP_MODE) }, { F (F_OP_SIZE) }, { F (F_DSTLE) }, { F (F_OP_CLASS) }, { 0 } } | 
 | +  64, 128, 0xfffff0ff, { { F (F_IMM64) }, { F (F_OFFSET16) }, { F (F_SRCLE) }, { F (F_OP_MODE) }, { F (F_OP_SIZE) }, { F (F_DSTLE) }, { F (F_OP_CLASS) }, { 0 } } | 
 |  }; | 
 |   | 
 |  static const CGEN_IFMT ifmt_lddwbe ATTRIBUTE_UNUSED = { | 
 | -  64, 128, 0xff, { { F (F_IMM64) }, { F (F_OFFSET16) }, { F (F_DSTBE) }, { F (F_OP_MODE) }, { F (F_OP_SIZE) }, { F (F_SRCBE) }, { F (F_OP_CLASS) }, { 0 } } | 
 | +  64, 128, 0xffff0fff, { { F (F_IMM64) }, { F (F_OFFSET16) }, { F (F_DSTBE) }, { F (F_OP_MODE) }, { F (F_OP_SIZE) }, { F (F_SRCBE) }, { F (F_OP_CLASS) }, { 0 } } | 
 |  }; | 
 |   | 
 |  static const CGEN_IFMT ifmt_ldabsw ATTRIBUTE_UNUSED = { | 
 | -  64, 64, 0xff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_REGS) }, { F (F_OP_MODE) }, { F (F_OP_SIZE) }, { F (F_OP_CLASS) }, { 0 } } | 
 | +  64, 64, 0xffffffff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_REGS) }, { F (F_OP_MODE) }, { F (F_OP_SIZE) }, { F (F_OP_CLASS) }, { 0 } } | 
 |  }; | 
 |   | 
 |  static const CGEN_IFMT ifmt_ldindwle ATTRIBUTE_UNUSED = { | 
 | -  64, 64, 0xff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_SRCLE) }, { F (F_OP_MODE) }, { F (F_OP_SIZE) }, { F (F_DSTLE) }, { F (F_OP_CLASS) }, { 0 } } | 
 | +  64, 64, 0xffff0fff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_SRCLE) }, { F (F_OP_MODE) }, { F (F_OP_SIZE) }, { F (F_DSTLE) }, { F (F_OP_CLASS) }, { 0 } } | 
 |  }; | 
 |   | 
 |  static const CGEN_IFMT ifmt_ldindwbe ATTRIBUTE_UNUSED = { | 
 | -  64, 64, 0xff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_DSTBE) }, { F (F_OP_MODE) }, { F (F_OP_SIZE) }, { F (F_SRCBE) }, { F (F_OP_CLASS) }, { 0 } } | 
 | +  64, 64, 0xfffff0ff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_DSTBE) }, { F (F_OP_MODE) }, { F (F_OP_SIZE) }, { F (F_SRCBE) }, { F (F_OP_CLASS) }, { 0 } } | 
 |  }; | 
 |   | 
 |  static const CGEN_IFMT ifmt_ldxwle ATTRIBUTE_UNUSED = { | 
 | -  64, 64, 0xff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_SRCLE) }, { F (F_OP_MODE) }, { F (F_OP_SIZE) }, { F (F_DSTLE) }, { F (F_OP_CLASS) }, { 0 } } | 
 | +  64, 64, 0xffffffff000000ff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_SRCLE) }, { F (F_OP_MODE) }, { F (F_OP_SIZE) }, { F (F_DSTLE) }, { F (F_OP_CLASS) }, { 0 } } | 
 |  }; | 
 |   | 
 |  static const CGEN_IFMT ifmt_ldxwbe ATTRIBUTE_UNUSED = { | 
 | -  64, 64, 0xff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_DSTBE) }, { F (F_OP_MODE) }, { F (F_OP_SIZE) }, { F (F_SRCBE) }, { F (F_OP_CLASS) }, { 0 } } | 
 | +  64, 64, 0xffffffff000000ff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_DSTBE) }, { F (F_OP_MODE) }, { F (F_OP_SIZE) }, { F (F_SRCBE) }, { F (F_OP_CLASS) }, { 0 } } | 
 |  }; | 
 |   | 
 |  static const CGEN_IFMT ifmt_stble ATTRIBUTE_UNUSED = { | 
 | -  64, 64, 0xff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_SRCLE) }, { F (F_OP_MODE) }, { F (F_OP_SIZE) }, { F (F_DSTLE) }, { F (F_OP_CLASS) }, { 0 } } | 
 | +  64, 64, 0xf0ff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_SRCLE) }, { F (F_OP_MODE) }, { F (F_OP_SIZE) }, { F (F_DSTLE) }, { F (F_OP_CLASS) }, { 0 } } | 
 |  }; | 
 |   | 
 |  static const CGEN_IFMT ifmt_stbbe ATTRIBUTE_UNUSED = { | 
 | -  64, 64, 0xff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_DSTBE) }, { F (F_OP_MODE) }, { F (F_OP_SIZE) }, { F (F_SRCBE) }, { F (F_OP_CLASS) }, { 0 } } | 
 | +  64, 64, 0xfff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_DSTBE) }, { F (F_OP_MODE) }, { F (F_OP_SIZE) }, { F (F_SRCBE) }, { F (F_OP_CLASS) }, { 0 } } | 
 |  }; | 
 |   | 
 |  static const CGEN_IFMT ifmt_jeqile ATTRIBUTE_UNUSED = { | 
 | -  64, 64, 0xff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_SRCLE) }, { F (F_OP_CODE) }, { F (F_DSTLE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } } | 
 | +  64, 64, 0xf0ff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_SRCLE) }, { F (F_OP_CODE) }, { F (F_DSTLE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } } | 
 |  }; | 
 |   | 
 |  static const CGEN_IFMT ifmt_jeqrle ATTRIBUTE_UNUSED = { | 
 | -  64, 64, 0xff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_SRCLE) }, { F (F_OP_CODE) }, { F (F_DSTLE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } } | 
 | +  64, 64, 0xffffffff000000ff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_SRCLE) }, { F (F_OP_CODE) }, { F (F_DSTLE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } } | 
 |  }; | 
 |   | 
 |  static const CGEN_IFMT ifmt_jeqibe ATTRIBUTE_UNUSED = { | 
 | -  64, 64, 0xff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_DSTBE) }, { F (F_OP_CODE) }, { F (F_SRCBE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } } | 
 | +  64, 64, 0xfff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_DSTBE) }, { F (F_OP_CODE) }, { F (F_SRCBE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } } | 
 |  }; | 
 |   | 
 |  static const CGEN_IFMT ifmt_jeqrbe ATTRIBUTE_UNUSED = { | 
 | -  64, 64, 0xff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_DSTBE) }, { F (F_OP_CODE) }, { F (F_SRCBE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } } | 
 | +  64, 64, 0xffffffff000000ff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_DSTBE) }, { F (F_OP_CODE) }, { F (F_SRCBE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } } | 
 |  }; | 
 |   | 
 |  static const CGEN_IFMT ifmt_callle ATTRIBUTE_UNUSED = { | 
 | -  64, 64, 0xff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_REGS) }, { F (F_OP_CODE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } } | 
 | +  64, 64, 0xffff0fff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_SRCLE) }, { F (F_OP_CODE) }, { F (F_DSTLE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } } | 
 | +}; | 
 | + | 
 | +static const CGEN_IFMT ifmt_callbe ATTRIBUTE_UNUSED = { | 
 | +  64, 64, 0xfffff0ff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_DSTBE) }, { F (F_OP_CODE) }, { F (F_SRCBE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } } | 
 |  }; | 
 |   | 
 |  static const CGEN_IFMT ifmt_ja ATTRIBUTE_UNUSED = { | 
 | -  64, 64, 0xff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_REGS) }, { F (F_OP_CODE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } } | 
 | +  64, 64, 0xffffffff0000ffff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_REGS) }, { F (F_OP_CODE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } } | 
 |  }; | 
 |   | 
 |  static const CGEN_IFMT ifmt_exit ATTRIBUTE_UNUSED = { | 
 | -  64, 64, 0xff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_REGS) }, { F (F_OP_CODE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } } | 
 | +  64, 64, 0xffffffffffffffff, { { F (F_IMM32) }, { F (F_OFFSET16) }, { F (F_REGS) }, { F (F_OP_CODE) }, { F (F_OP_SRC) }, { F (F_OP_CLASS) }, { 0 } } | 
 |  }; | 
 |   | 
 |  #undef F | 
 | @@ -1646,7 +1650,7 @@ static const CGEN_OPCODE bpf_cgen_insn_o | 
 |    { | 
 |      { 0, 0, 0, 0 }, | 
 |      { { MNEM, ' ', OP (DISP32), 0 } }, | 
 | -    & ifmt_callle, { 0x85 } | 
 | +    & ifmt_callbe, { 0x85 } | 
 |    }, | 
 |  /* call $dstle */ | 
 |    { | 
 | --- a/opcodes/cgen-dis.c | 
 | +++ b/opcodes/cgen-dis.c | 
 | @@ -39,7 +39,7 @@ static void		 add_insn_to_hash_chain (CG | 
 |  static int | 
 |  count_decodable_bits (const CGEN_INSN *insn) | 
 |  { | 
 | -  unsigned mask = CGEN_INSN_BASE_MASK (insn); | 
 | +  CGEN_INSN_LGUINT mask = CGEN_INSN_BASE_MASK (insn); | 
 |  #if GCC_VERSION >= 3004 | 
 |    return __builtin_popcount (mask); | 
 |  #else |