diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 81876e685..46c49a3f6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,6 +16,7 @@ jobs: sudo apt-get install wget build-essential python3 pip3 install setuptools pip3 install requests + pip3 install meson # Install (n)Migen / LiteX / Cores - name: Install LiteX diff --git a/.gitignore b/.gitignore index ef6d2aca5..40932b883 100644 --- a/.gitignore +++ b/.gitignore @@ -91,3 +91,6 @@ ENV/ # Rope project settings .ropeproject + +# VS Code settings +.vscode diff --git a/CHANGES b/CHANGES index 2dcaada88..8bb601c08 100644 --- a/CHANGES +++ b/CHANGES @@ -1,14 +1,72 @@ -[> 2021.XX, planned for August 2021 ------------------------------------ +[> 2021.08, released on September 15th 2021 +------------------------------------------- [> Issues resolved ------------------ - wishbone/UpConverter: Fix SEL propagation. + - cores/i2s: Fix SYNC sampling. + - BIOS/lib*: Fix GCC warnings. + - cpu/software: Fix stack alignment issues. + - cpu/blackparrot: Fix integration. + - interconnect/axi: Fix valid signal in connect_to_pads for axi lite. + - software/hw/common: Fix _csr_rd_buf/_csr_wr_buf for sizeof(buf[0]) < CSR_DW_BYTES case. + - software/soc.h: Fix interoperability with assembly. + - interconnect/stream: Fix n=1 case on Multiplexer/Demultiplexer. + - interconnect/axi: Fix BURST_WRAP case on AXIBurst2Beat. + - cpu/VexRiscv-SMP: Fix build without a memory bus. + - cpu/software: Fix CLANG detection. + - build/software: Force a fresh software build when cpu-type/variant is changed. + - cores/uart: Fix TX reset level. + - BIOS: Fix PHDR link error. + - BIOS: Fix build-id link error. + - LiteDRAM: Fix Artix7/DDR3 calibraiton at low speed. [> Added Features ----------------- - - cpu/vexriscv: Add CFU support. - - soc/controller: Add separate SoC/CPU reset fields. + - cores/video: Add 7-Series HDMI PHY over GTPs. + - cores/jtagbone: Allow JTAG chain selection. + - programmer: Add iCESugar programmer. + - cpu/vexriscv: Add CFU support. + - soc/controller: Add separate SoC/CPU reset fields. + - BIOS/liblitedram: Add debug capabilities, minor improvements. + - cpu/femtoRV: Add initial FemtoRV support. + - cores/uart: Cleaned-up, Add optional TX-Flush. + - cores/usb_ohci: Add initial SpinalHDL's USB OHCI support (integrated in Linux-on-LiteX-Vexriscv). + - stream: Add Gate Module. + - soc/builder: Allow linking external software packages. + - soc/software: Allow registering init functions. + - cores/ram: Add init support to Nexus LRAM. + - cores/spi: Add Manual CS Mode for bulk transfers. + - cores/VexRiscv-SMP: Make [ID]TLB size configurable. + - dts: Add GPIO IRQ support. + - programmer/DFUProg: Allow to specify alt interace and to not reboot. + - cores/clock/ecp5: Add dynamic phase adjustment signals. + - tools/litex_sim: Mode SDRAM settings to LiteDRAM's DFI model. + - build/gowin: Add AsyncResetSynchronizer/DDRInput/DDROutput implementations. + - build/gowin: Add On-Chip-Oscillator support. + - build/gowin: Add initial timing constraints support. + - build/attr_translate: Simplify/Cleanup. + - programmer/OpenFPGALoader: Add cable and freq options. + - interconnect/packet: Improve PacketFIFO to handle payload/param separately. + - clock/ecp5: Add 4-output support. + - LiteSPI: Simplified/Cleaned-up, new MMAP architecture, applied to LiteX-Boards. + - soc: Add LiteSPI integration code. + - LitePCIe: DMA/Controller Simplified/Cleaned-up. + - soc/add_cpu: Add memory mapping overrides to build log and make an exception for the CPUNone case. + - programmer: Add ECPprogProgrammer. + - soc/software: Add Random access option to memtest. + - tools: Add Renode generator script. + - tools: Add Zephyr DTS generator script. + - build/io: Add DDRTristate. + - cpu/VexRiscv: Restructure config flags for dcache/icache presence. + - litex_sim: Improve RAM/SDRAM integration and make it closer to LiteX-Boards targets. + - build/sim: Add ODDR/IDDR/DDRSTristate simulation models. + - litex_sim: Add SPIFlash support. + - LiteSPI: Add DDR support and integration in LiteX (rate=1:1, 1:2). + - build/Vivado: Make pre_synthesis/placement/routing commands similar to platform_commands. + - LiteDRAM: Refactor C code generator. + - LiteDRAM: Improve LPDDR4 support. + - LiteDRAM: Reduce ECC granularity. [> API changes/Deprecation -------------------------- diff --git a/litex/build/gowin/common.py b/litex/build/gowin/common.py index 3687fc7b5..cb0461a7b 100644 --- a/litex/build/gowin/common.py +++ b/litex/build/gowin/common.py @@ -65,10 +65,42 @@ class GowinDDROutput: def lower(dr): return GowinDDROutputImpl(dr.i1, dr.i2, dr.o, dr.clk) +# Gowin Differential Input ------------------------------------------------------------------------- + +class GowinDifferentialInputImpl(Module): + def __init__(self, i_p, i_n, o): + self.specials += Instance("TLVDS_IBUF", + i_I = i_p, + i_IB = i_n, + o_O = o, + ) + +class GowinDifferentialInput: + @staticmethod + def lower(dr): + return GowinDifferentialInputImpl(dr.i_p, dr.i_n, dr.o) + +# Gowin Differential Output ------------------------------------------------------------------------- + +class GowinDifferentialOutputImpl(Module): + def __init__(self, i, o_p, o_n): + self.specials += Instance("TLVDS_OBUF", + i_I = i, + o_O = o_p, + o_OB = o_n, + ) + +class GowinDifferentialOutput: + @staticmethod + def lower(dr): + return GowinDifferentialOutputImpl(dr.i, dr.o_p, dr.o_n) + # Gowin Special Overrides -------------------------------------------------------------------------- gowin_special_overrides = { AsyncResetSynchronizer: GowinAsyncResetSynchronizer, DDRInput: GowinDDRInput, DDROutput: GowinDDROutput, -} \ No newline at end of file + DifferentialInput: GowinDifferentialInput, + DifferentialOutput: GowinDifferentialOutput, +} diff --git a/litex/build/gowin/gowin.py b/litex/build/gowin/gowin.py index d07ffad44..58f7ad2b9 100644 --- a/litex/build/gowin/gowin.py +++ b/litex/build/gowin/gowin.py @@ -89,6 +89,27 @@ class GowinToolchain: self.options = {} self.clocks = dict() + def apply_hyperram_integration_hack(self, v_file): + # FIXME: Gowin EDA expects a very specific HypeRAM integration pattern, modify generated verilog to match it. + + # Convert to vectors. + tools.replace_in_file(v_file, "O_hpram_reset_n", "O_hpram_reset_n[0]") + tools.replace_in_file(v_file, "O_hpram_cs_n", "O_hpram_cs_n[0]") + tools.replace_in_file(v_file, "O_hpram_rwds", "O_hpram_rwds[0]") + tools.replace_in_file(v_file, "O_hpram_ck ", "O_hpram_ck[0] ") + tools.replace_in_file(v_file, "O_hpram_ck_n ", "O_hpram_ck_n[0] ") + tools.replace_in_file(v_file, "O_hpram_ck,", "O_hpram_ck[0],") + tools.replace_in_file(v_file, "O_hpram_ck_n,", "O_hpram_ck_n[0],") + tools.replace_in_file(v_file, "wire O_hpram_reset_n[0]", "wire [0:0] O_hpram_reset_n") + tools.replace_in_file(v_file, "wire O_hpram_cs_n[0]", "wire [0:0] O_hpram_cs_n") + tools.replace_in_file(v_file, "wire IO_hpram_rwds[0]", "wire [0:0] IO_hpram_rwds") + tools.replace_in_file(v_file, "wire O_hpram_ck[0]", "wire [0:0] O_hpram_ck") + tools.replace_in_file(v_file, "wire O_hpram_ck_n[0]", "wire [0:0] O_hpram_ck_n") + + # Apply Synthesis directives. + tools.replace_in_file(v_file, "wire [0:0] IO_hpram_rwds,", "wire [0:0] IO_hpram_rwds, /* synthesis syn_tristate = 1 */") + tools.replace_in_file(v_file, "wire [7:0] IO_hpram_dq,", "wire [7:0] IO_hpram_dq, /* synthesis syn_tristate = 1 */") + def build(self, platform, fragment, build_dir = "build", build_name = "top", @@ -99,8 +120,8 @@ class GowinToolchain: cwd = os.getcwd() os.makedirs(build_dir, exist_ok=True) os.chdir(build_dir) - # Finalize design + if not isinstance(fragment, _Fragment): fragment = fragment.get_fragment() platform.finalize(fragment) @@ -111,6 +132,7 @@ class GowinToolchain: v_file = build_name + ".v" v_output.write(v_file) platform.add_source(v_file) + self.apply_hyperram_integration_hack(v_file) if platform.verilog_include_paths: self.options["include_path"] = "{" + ";".join(platform.verilog_include_paths) + "}" diff --git a/litex/build/io.py b/litex/build/io.py index dde6b6f2a..73ba48015 100644 --- a/litex/build/io.py +++ b/litex/build/io.py @@ -145,6 +145,44 @@ class DDROutput(Special): def lower(dr): raise NotImplementedError("Attempted to use a DDR output, but platform does not support them") +# DDR Tristate ------------------------------------------------------------------------------------- + +class InferedDDRTristate(Module): + def __init__(self, io, o1, o2, oe1, oe2, i1, i2, clk): + _o = Signal() + _oe = Signal() + _i = Signal() + self.specials += DDROutput(o1, o2, _o, clk) + self.specials += DDROutput(oe1, oe2, _oe, clk) + self.specials += DDRInput(_i, i1, i2, clk) + self.specials += Tristate(io, _o, _oe, _i) + +class DDRTristate(Special): + def __init__(self, io, o1, o2, oe1, oe2, i1, i2, clk=ClockSignal()): + Special.__init__(self) + self.io = io + self.o1 = o1 + self.o2 = o2 + self.oe1 = oe1 + self.oe2 = oe2 + self.i1 = i1 + self.i2 = i2 + self.clk = clk + + def iter_expressions(self): + yield self, "io", SPECIAL_INOUT + yield self, "o1", SPECIAL_INPUT + yield self, "o2", SPECIAL_INPUT + yield self, "oe1", SPECIAL_INPUT + yield self, "oe2", SPECIAL_INPUT + yield self, "i1", SPECIAL_OUTPUT + yield self, "i2", SPECIAL_OUTPUT + yield self, "clk", SPECIAL_INPUT + + @staticmethod + def lower(dr): + return InferedDDRTristate(dr.io, dr.o1, dr.o2, dr.oe1, dr.oe2, dr.i1, dr.i2, dr.clk) + # Clock Reset Generator ---------------------------------------------------------------------------- class CRG(Module): diff --git a/litex/build/lattice/common.py b/litex/build/lattice/common.py index b243a9796..d19152c0b 100644 --- a/litex/build/lattice/common.py +++ b/litex/build/lattice/common.py @@ -241,6 +241,31 @@ class LatticeNXSDROutput: def lower(dr): return LatticeNXSDROutputImpl(dr.i, dr.o, dr.clk) +# NX SDR Input and Output via regular flip-flops --------------------------------------------------- + +# This is a workaround for IO-specific primitives IFD1P3BX / OFD1P3BX being unsupported in nextpnr: +# https://github.com/YosysHQ/nextpnr/issues/698 + +class LatticeNXSDRFFImpl(Module): + def __init__(self, i, o, clk): + self.specials += Instance("FD1P3BX", + i_CK = clk, + i_PD = 0, + i_SP = 1, + i_D = i, + o_Q = o, + ) + +class LatticeNXSDRInputViaFlipFlop: + @staticmethod + def lower(dr): + return LatticeNXSDRFFImpl(dr.i, dr.o, dr.clk) + +class LatticeNXSDROutputViaFlipFlop: + @staticmethod + def lower(dr): + return LatticeNXSDRFFImpl(dr.i, dr.o, dr.clk) + # NX DDR Input ------------------------------------------------------------------------------------- class LatticeNXDDRInputImpl(Module): @@ -273,6 +298,24 @@ class LatticeNXDDROutput: def lower(dr): return LatticeNXDDROutputImpl(dr.i1, dr.i2, dr.o, dr.clk) +# NX DDR Tristate ------------------------------------------------------------------------------------ + +class LatticeNXDDRTristateImpl(Module): + def __init__(self, io, o1, o2, oe1, oe2, i1, i2, clk): + _o = Signal() + _oe = Signal() + _i = Signal() + self.specials += DDROutput(o1, o2, _o, clk) + self.specials += SDROutput(oe1 | oe2, _oe, clk) + self.specials += DDRInput(_i, i1, i2, clk) + self.specials += Tristate(io, _o, _oe, _i) + _oe.attr.add("syn_useioff") + +class LatticeNXDDRTristate: + @staticmethod + def lower(dr): + return LatticeNXDDRTristateImpl(dr.io, dr.o1, dr.o2, dr.oe1, dr.oe2, dr.i1, dr.i2, dr.clk) + # NX Special Overrides ----------------------------------------------------------------------------- lattice_NX_special_overrides = { @@ -281,8 +324,15 @@ lattice_NX_special_overrides = { SDROutput: LatticeNXSDROutput, DDRInput: LatticeNXDDRInput, DDROutput: LatticeNXDDROutput, + DDRTristate: LatticeNXDDRTristate, } +lattice_NX_special_overrides_for_oxide = dict(lattice_NX_special_overrides) +lattice_NX_special_overrides_for_oxide.update({ + SDRInput: LatticeNXSDRInputViaFlipFlop, + SDROutput: LatticeNXSDROutputViaFlipFlop, +}) + # iCE40 AsyncResetSynchronizer --------------------------------------------------------------------- class LatticeiCE40AsyncResetSynchronizerImpl(Module): diff --git a/litex/build/lattice/oxide.py b/litex/build/lattice/oxide.py index dfdc0d798..f59863937 100644 --- a/litex/build/lattice/oxide.py +++ b/litex/build/lattice/oxide.py @@ -108,9 +108,10 @@ def _run_script(script): class LatticeOxideToolchain: attr_translate = { "keep": ("keep", "true"), + "syn_useioff": ("syn_useioff", 1), } - special_overrides = common.lattice_NX_special_overrides + special_overrides = common.lattice_NX_special_overrides_for_oxide def __init__(self): self.yosys_template = _yosys_template diff --git a/litex/build/lattice/programmer.py b/litex/build/lattice/programmer.py index dd0202c25..d9967de52 100644 --- a/litex/build/lattice/programmer.py +++ b/litex/build/lattice/programmer.py @@ -185,3 +185,18 @@ class EcpDapProgrammer(GenericProgrammer): "--freq", str(self.frequency_khz), bitstream_file ]) + +# EcpprogProgrammer ------------------------------------------------------------------------------- + +class EcpprogProgrammer(GenericProgrammer): + """ecpprog allows you to program ECP5 FPGAs and attached SPI flash using FTDI based JTAG probes + + You can get `ecpprog` here: https://github.com/gregdavill/ecpprog + """ + needs_bitreverse = False + + def flash(self, address, bitstream_file): + self.call(["ecpprog", "-o", str(address), bitstream_file]) + + def load_bitstream(self, bitstream_file): + self.call(["ecpprog", "-S", bitstream_file]) diff --git a/litex/build/openfpgaloader.py b/litex/build/openfpgaloader.py index 1f5b0d032..cb639030f 100644 --- a/litex/build/openfpgaloader.py +++ b/litex/build/openfpgaloader.py @@ -25,8 +25,10 @@ class OpenFPGALoader(GenericProgrammer): self.cmd += ["--bitstream", bitstream_file] self.call(self.cmd) - def flash(self, address, data_file): + def flash(self, address, data_file, external=False): self.cmd += ["--write-flash", "--bitstream", data_file] + if external: + self.cmd += ["--external-flash"] if address: self.cmd.append("--offset") self.cmd.append(address) diff --git a/litex/build/sim/common.py b/litex/build/sim/common.py index 38741fd4b..649618c13 100644 --- a/litex/build/sim/common.py +++ b/litex/build/sim/common.py @@ -1 +1,43 @@ -sim_special_overrides = {} +from migen import * +from migen.fhdl.specials import Special + +from litex.build.io import * + +# DDROutput ---------------------------------------------------------------------------------------- + +class SimDDROutputImpl(Module): + def __init__(self, o, i1, i2, clk): + self.specials += Instance("DDR_OUTPUT", + i_i1 = i1, + i_i2 = i2, + o_o = o, + i_clk = clk + ) + +class SimDDROutput: + @staticmethod + def lower(dr): + return SimDDROutputImpl(dr.o, dr.i1, dr.i2, dr.clk) + +# DDRInput ----------------------------------------------------------------------------------------- + +class SimDDRInputImpl(Module): + def __init__(self, i, o1, o2, clk): + self.specials += Instance("DDR_INPUT", + o_o1 = o1, + o_o2 = o2, + i_i = i, + i_clk = clk + ) + +class SimDDRInput: + @staticmethod + def lower(dr): + return SimDDRInputImpl(dr.i, dr.o1, dr.o2, dr.clk) + +# Special Overrides -------------------------------------------------------------------------------- + +sim_special_overrides = { + DDROutput: SimDDROutput, + DDRInput: SimDDRInput, +} diff --git a/litex/build/sim/verilog/iddr_verilog.v b/litex/build/sim/verilog/iddr_verilog.v new file mode 100644 index 000000000..e58dabfe7 --- /dev/null +++ b/litex/build/sim/verilog/iddr_verilog.v @@ -0,0 +1,24 @@ +module DDR_INPUT( + output reg o1, + output reg o2, + input i, + input clk); + +reg _o1, _o2; + +always @ (posedge clk) + begin + o1 = _o1; + o2 = _o2; + end + +always @ (posedge clk) + begin + _o1 = i; + end + +always @ (negedge clk) + begin + _o2 = i; + end +endmodule diff --git a/litex/build/sim/verilog/oddr_verilog.v b/litex/build/sim/verilog/oddr_verilog.v new file mode 100644 index 000000000..0193cc60a --- /dev/null +++ b/litex/build/sim/verilog/oddr_verilog.v @@ -0,0 +1,19 @@ +module DDR_OUTPUT( + input i1, + input i2, + output o, + input clk); + +wire _o; +reg _i1, _i2; + +assign o = _o; +assign _o = (clk) ? _i1 : _i2; + +always @ (posedge clk) + begin + _i1 = i1; + _i2 = i2; + end + +endmodule diff --git a/litex/build/xilinx/common.py b/litex/build/xilinx/common.py index c4ee2e402..82f840366 100644 --- a/litex/build/xilinx/common.py +++ b/litex/build/xilinx/common.py @@ -152,6 +152,28 @@ class XilinxSDRTristate: def lower(dr): return XilinxSDRTristateImpl(dr.io, dr.o, dr.oe, dr.i, dr.clk) +# Common DDRTristate ------------------------------------------------------------------------------- + +class XilinxDDRTristateImpl(Module): + def __init__(self, io, o1, o2, oe1, oe2, i1, i2, clk): + _o = Signal() + _oe_n = Signal() + _i = Signal() + self.specials += DDROutput(o1, o2, _o, clk) + self.specials += DDROutput(~oe1, ~oe2, _oe_n, clk) + self.specials += DDRInput(_i, i1, i2, clk) + self.specials += Instance("IOBUF", + io_IO = io, + o_O = _i, + i_I = _o, + i_T = _oe_n, + ) + +class XilinxDDRTristate: + @staticmethod + def lower(dr): + return XilinxDDRTristateImpl(dr.io, dr.o1, dr.o2, dr.oe1, dr.oe2, dr.i1, dr.i2, dr.clk) + # Common Special Overrides ------------------------------------------------------------------------- xilinx_special_overrides = { @@ -160,6 +182,7 @@ xilinx_special_overrides = { DifferentialInput: XilinxDifferentialInput, DifferentialOutput: XilinxDifferentialOutput, SDRTristate: XilinxSDRTristate, + DDRTristate: XilinxDDRTristate, } # Spartan6 DDROutput ------------------------------------------------------------------------------- @@ -343,18 +366,36 @@ class XilinxDDRInputUS: # Ultrascale SDROutput ----------------------------------------------------------------------------- +class XilinxSDROutputImplUS(Module): + def __init__(self, i, o, clk): + self.specials += Instance("FDCE", + i_C = clk, + i_CE = 1, + i_CLR = 0, + i_D = i, + o_Q = o + ) + class XilinxSDROutputUS: @staticmethod def lower(dr): - return XilinxDDROutputImplUS(dr.i, dr.i, dr.o, dr.clk) - - + return XilinxSDROutputImplUS(dr.i, dr.o, dr.clk) + # Ultrascale SDRInput ------------------------------------------------------------------------------ +class XilinxSDRInputImplUS(Module): + def __init__(self, i, o, clk): + self.specials += Instance("FDCE", + i_C = clk, + i_CE = 1, + i_CLR = 0, + i_D = i, + o_Q = o + ) class XilinxSDRInputUS: @staticmethod def lower(dr): - return XilinxDDRInputImplUS(dr.i, dr.o, Signal(), dr.clk) + return XilinxSDRInputImplUS(dr.i, dr.o, dr.clk) # Ultrascale Specials Overrides -------------------------------------------------------------------- diff --git a/litex/build/xilinx/vivado.py b/litex/build/xilinx/vivado.py index ab2a54be7..874d37e18 100644 --- a/litex/build/xilinx/vivado.py +++ b/litex/build/xilinx/vivado.py @@ -102,6 +102,22 @@ def _run_script(script): # XilinxVivadoToolchain ---------------------------------------------------------------------------- +class XilinxVivadoCommands(list): + def add(self, command, **signals): + self.append((command, signals)) + + def resolve(self, vns): + named_commands = [] + for command in self: + if isinstance(command, str): + named_commands.append(command) + else: + template, args = command + name_dict = dict((k, vns.get_name(sig)) for k, sig in args.items()) + named_commands.append(template.format(**name_dict)) + return named_commands + + class XilinxVivadoToolchain: attr_translate = { "keep": ("dont_touch", "true"), @@ -116,9 +132,9 @@ class XilinxVivadoToolchain: def __init__(self): self.bitstream_commands = [] self.additional_commands = [] - self.pre_synthesis_commands = [] - self.pre_placement_commands = [] - self.pre_routing_commands = [] + self.pre_synthesis_commands = XilinxVivadoCommands() + self.pre_placement_commands = XilinxVivadoCommands() + self.pre_routing_commands = XilinxVivadoCommands() self.incremental_implementation = False self.vivado_synth_directive = "default" self.opt_directive = "default" @@ -129,7 +145,7 @@ class XilinxVivadoToolchain: self.clocks = dict() self.false_paths = set() - def _build_tcl(self, platform, build_name, synth_mode, enable_xpm): + def _build_tcl(self, platform, build_name, synth_mode, enable_xpm, vns): assert synth_mode in ["vivado", "yosys"] tcl = [] @@ -191,7 +207,7 @@ class XilinxVivadoToolchain: # Add pre-synthesis commands tcl.append("\n# Add pre-synthesis commands\n") - tcl.extend(c.format(build_name=build_name) for c in self.pre_synthesis_commands) + tcl.extend(c.format(build_name=build_name) for c in self.pre_synthesis_commands.resolve(vns)) # Synthesis if synth_mode == "vivado": @@ -223,7 +239,7 @@ class XilinxVivadoToolchain: # Add pre-placement commands tcl.append("\n# Add pre-placement commands\n") - tcl.extend(c.format(build_name=build_name) for c in self.pre_placement_commands) + tcl.extend(c.format(build_name=build_name) for c in self.pre_placement_commands.resolve(vns)) # Placement tcl.append("\n# Placement\n") @@ -239,7 +255,7 @@ class XilinxVivadoToolchain: # Add pre-routing commands tcl.append("\n# Add pre-routing commands\n") - tcl.extend(c.format(build_name=build_name) for c in self.pre_routing_commands) + tcl.extend(c.format(build_name=build_name) for c in self.pre_routing_commands.resolve(vns)) # Routing tcl.append("\n# Routing\n") @@ -341,7 +357,8 @@ class XilinxVivadoToolchain: platform = platform, build_name = build_name, synth_mode = synth_mode, - enable_xpm = enable_xpm + enable_xpm = enable_xpm, + vns = v_output.ns, ) # Generate design constraints (.xdc) diff --git a/litex/soc/cores/clock/gowin_gw1nsr.py b/litex/soc/cores/clock/gowin_gw1nsr.py new file mode 100644 index 000000000..948604d94 --- /dev/null +++ b/litex/soc/cores/clock/gowin_gw1nsr.py @@ -0,0 +1,131 @@ +# +# This file is part of LiteX. +# +# Copyright (c) 2021 Florent Kermarrec +# SPDX-License-Identifier: BSD-2-Clause + +from migen import * +from migen.genlib.resetsync import AsyncResetSynchronizer + +from litex.soc.cores.clock.common import * + +class Open(Signal): pass + +# GoWin / GW1NSRPLL -------------------------------------------------------------------------------- + +class GW1NSRPLL(Module): + nclkouts_max = 1 + pfd_freq_range = ( 3e6, 500e6) + vco_freq_range = (400e6, 1000e6) + def __init__(self, device, vco_margin=0): + self.logger = logging.getLogger("GW1NPLL") + self.logger.info("Creating GW1NPLL.".format()) + self.device = device + self.vco_margin = vco_margin + self.reset = Signal() + self.locked = Signal() + self.clkin_freq = None + self.vcxo_freq = None + self.nclkouts = 0 + self.clkouts = {} + self.config = {} + self.params = {} + + def register_clkin(self, clkin, freq): + self.clkin = Signal() + if isinstance(clkin, (Signal, ClockSignal)): + self.comb += self.clkin.eq(clkin) + else: + raise ValueError + self.clkin_freq = freq + register_clkin_log(self.logger, clkin, freq) + + def create_clkout(self, cd, freq, phase=0, margin=1e-2, with_reset=True): + assert self.nclkouts < self.nclkouts_max + clkout = Signal() + self.clkouts[self.nclkouts] = (clkout, freq, phase, margin) + if with_reset: + # FIXME: Should use PLL's lock but does not seem stable. + self.specials += AsyncResetSynchronizer(cd, self.reset) + self.comb += cd.clk.eq(clkout) + create_clkout_log(self.logger, cd.name, freq, margin, self.nclkouts) + self.nclkouts += 1 + + def compute_config(self): + config = {} + for idiv in range(1, 64): + config["idiv"] = idiv + pfd_freq = self.clkin_freq/idiv + pfd_freq_min, pfd_freq_max = self.pfd_freq_range + if (pfd_freq < pfd_freq_min) or (pfd_freq > pfd_freq_max): + continue + for fdiv in range(1, 64): + out_freq = self.clkin_freq*fdiv/idiv + for odiv in [2, 4, 8, 16, 32, 48, 64, 80, 96, 112, 128]: + config["odiv"] = odiv + vco_freq = out_freq*odiv + (vco_freq_min, vco_freq_max) = self.vco_freq_range + if (vco_freq >= vco_freq_min*(1 + self.vco_margin) and + vco_freq <= vco_freq_max*(1 - self.vco_margin)): + for _n, (clk, f, p, _m) in sorted(self.clkouts.items()): + if abs(out_freq - f) <= f*_m: + config["clk{}_freq".format(_n)] = out_freq + config["vco"] = vco_freq + config["fdiv"] = fdiv + compute_config_log(self.logger, config) + return config + raise ValueError("No PLL config found") + + def do_finalize(self): + assert hasattr(self, "clkin") + assert len(self.clkouts) == 1 + config = self.compute_config() + # Based on UG286-1.3E Note. + self.params.update( + # Parameters. + p_DEVICE = self.device, # FPGA Device. + p_FCLKIN = str(self.clkin_freq/1e6), # Clk Input frequency (MHz). + p_DYN_IDIV_SEL = "false", # Disable dynamic IDIV. + p_IDIV_SEL = config["idiv"]-1, # Static IDIV value (1-64). + p_DYN_FBDIV_SEL = "false", # Disable dynamic FBDIV. + p_FBDIV_SEL = config["fdiv"]-1, # Static FBDIV value (1-64). + p_DYN_ODIV_SEL = "false", # Disable dynamic ODIV. + p_ODIV_SEL = config["odiv"], # Static ODIV value. + p_PSDA_SEL = "0000", # - + p_DYN_DA_EN = "false", # - + p_DUTYDA_SEL = "1000", # - + p_CLKOUT_FT_DIR = 1, # - + p_CLKOUTP_FT_DIR = 1, # - + p_CLKOUT_DLY_STEP = 0, # - + p_CLKOUTP_DLY_STEP = 0, # - + p_CLKFB_SEL = "internal", # Clk Feedback type (internal, external). + p_CLKOUT_BYPASS = "false", # Clk Input to CLKOUT bypass. + p_CLKOUTP_BYPASS = "false", # Clk Input to CLKOUTP bypass. + p_CLKOUTD_BYPASS = "false", # Clk Input to CLKOUTD bypass. + p_DYN_SDIV_SEL = 2, # Disable dynamic SDIV. + p_CLKOUTD_SRC = "CLKOUT", # Recopy CLKOUT to CLKOUTD. + p_CLKOUTD3_SRC = "CLKOUT", # Recopy CLKOUT to CLKOUTD3. + + # Inputs. + i_CLKIN = self.clkin, # Clk Input. + i_CLKFB = 0, # Clk Feedback. + i_RESET = self.reset, # PLL Reset. + i_RESET_P = 0, # PLL Power Down. + i_ODSEL = 0, # Dynamic ODIV control. + i_FBDSEL = 0, # Dynamic IDIV control. + i_IDSEL = 0, # Dynamic FDIV control. + i_PSDA = 0, # Dynamic phase control. + i_DUTYDA = 0, # Dynamic duty cycle control. + i_FDLY = 0, # Dynamic CLKOUTP delay control. + i_VREN = 1, + ) + clk0, f0, p0, m0 = self.clkouts[0] + self.params.update( + # Outputs. + o_LOCK = self.locked, # PLL lock status. + o_CLKOUT = clk0, # Clock output. + o_CLKOUTP = Open(), # Clock output (With phase and duty cycle adjustement). + o_CLKOUTD = Open(), # Clock divided from CLKOUT and CLKOUTP (controlled by SDIV). + o_CLKOUTD3 = Open(), # Clock divided from CLKOUT and CLKOUTP (constant division of 3). + ) + self.specials += Instance("PLLVR", **self.params) diff --git a/litex/soc/cores/clock/lattice_ecp5.py b/litex/soc/cores/clock/lattice_ecp5.py index fd6cdbd4f..4b0f5c75e 100644 --- a/litex/soc/cores/clock/lattice_ecp5.py +++ b/litex/soc/cores/clock/lattice_ecp5.py @@ -97,6 +97,9 @@ class ECP5PLL(Module): break if not valid: all_valid = False + if self.nclkouts == self.nclkouts_max and not config["clkfb"]: + # If there is no output suitable for feedback and no spare, not valid + all_valid = False else: all_valid = False if all_valid: @@ -159,4 +162,6 @@ class ECP5PLL(Module): self.params[f"p_CLKO{n_to_l[n]}_FPHASE"] = 0 self.params[f"p_CLKO{n_to_l[n]}_CPHASE"] = cphase self.params[f"o_CLKO{n_to_l[n]}"] = clk + if f > 0: # i.e. not a feedback-only clock + self.params["attr"].append((f"FREQUENCY_PIN_CLKO{n_to_l[n]}", str(f/1e6))) self.specials += Instance("EHXPLLL", **self.params) diff --git a/litex/soc/cores/clock/xilinx_s6.py b/litex/soc/cores/clock/xilinx_s6.py index b44ff14ee..e64a48fa8 100644 --- a/litex/soc/cores/clock/xilinx_s6.py +++ b/litex/soc/cores/clock/xilinx_s6.py @@ -37,7 +37,6 @@ class S6PLL(XilinxClocking): p_BANDWIDTH = "OPTIMIZED", p_COMPENSATION = "INTERNAL", i_RST = self.reset, - i_PWRDWN = self.power_down, o_LOCKED = self.locked, # VCO. diff --git a/litex/soc/cores/cpu/blackparrot/crt0.S b/litex/soc/cores/cpu/blackparrot/crt0.S index 5f5cb0962..b6d57d133 100644 --- a/litex/soc/cores/cpu/blackparrot/crt0.S +++ b/litex/soc/cores/cpu/blackparrot/crt0.S @@ -53,7 +53,7 @@ trap_entry: crt_init: - la sp, _fstack + 8 + la sp, _fstack la a0, trap_entry csrw mtvec, a0 diff --git a/litex/soc/cores/cpu/cv32e40p/crt0.S b/litex/soc/cores/cpu/cv32e40p/crt0.S index d654998b2..904cecde8 100644 --- a/litex/soc/cores/cpu/cv32e40p/crt0.S +++ b/litex/soc/cores/cpu/cv32e40p/crt0.S @@ -90,7 +90,7 @@ trap_entry: crt_init: - la sp, _fstack + 4 + la sp, _fstack la a0, vector_table csrw mtvec, a0 diff --git a/litex/soc/cores/cpu/microwatt/core.py b/litex/soc/cores/cpu/microwatt/core.py index 4c3c20a31..4dde10a78 100644 --- a/litex/soc/cores/cpu/microwatt/core.py +++ b/litex/soc/cores/cpu/microwatt/core.py @@ -30,7 +30,7 @@ class Microwatt(CPU): variants = CPU_VARIANTS data_width = 64 endianness = "little" - gcc_triple = ("powerpc64le-linux", "powerpc64le-linux-gnu") + gcc_triple = ("powerpc64le-linux", "powerpc64le-linux-gnu", "ppc64le-linux", "ppc64le-linux-musl") linker_output_format = "elf64-powerpcle" nop = "nop" io_regions = {0xc0000000: 0x10000000} # Origin, Length. @@ -58,7 +58,6 @@ class Microwatt(CPU): flags += "-mlittle-endian " flags += "-mstrict-align " flags += "-fno-stack-protector " - flags += "-mcmodel=small " flags += "-D__microwatt__ " return flags diff --git a/litex/soc/cores/cpu/rocket/boot-helper.S b/litex/soc/cores/cpu/rocket/boot-helper.S index 6dd74aaeb..657806060 100644 --- a/litex/soc/cores/cpu/rocket/boot-helper.S +++ b/litex/soc/cores/cpu/rocket/boot-helper.S @@ -1,4 +1,18 @@ .section .text, "ax", @progbits -.global boot_helper +.global boot_helper +.global smp_ap_args +.global smp_ap_target +.global smp_ap_ready + boot_helper: - jr x13 + // boot core saves args and jump target for ap cores: + sd a0, smp_ap_args, t1 + sd a1, smp_ap_args+8, t1 + sd a2, smp_ap_args+16, t1 + sd a3, smp_ap_target, t1 + fence w, w + // notify application cores to proceed with boot: + li t0, 1 + sd t0, smp_ap_ready, t1 + // boot core now also ready to boot: + jr a3 diff --git a/litex/soc/cores/cpu/rocket/core.py b/litex/soc/cores/cpu/rocket/core.py index 940414446..308eeb845 100644 --- a/litex/soc/cores/cpu/rocket/core.py +++ b/litex/soc/cores/cpu/rocket/core.py @@ -45,9 +45,12 @@ class Open(Signal): pass CPU_VARIANTS = { "standard": "freechips.rocketchip.system.LitexConfig", "linux": "freechips.rocketchip.system.LitexLinuxConfig", + "linux4": "freechips.rocketchip.system.LitexLinux4Config", "linuxd": "freechips.rocketchip.system.LitexLinuxDConfig", "linuxq": "freechips.rocketchip.system.LitexLinuxQConfig", "full": "freechips.rocketchip.system.LitexFullConfig", + "full4d": "freechips.rocketchip.system.LitexFull4DConfig", + "full4q": "freechips.rocketchip.system.LitexFull4QConfig", } # GCC Flags----------------------------------------------------------------------------------------- @@ -55,20 +58,26 @@ CPU_VARIANTS = { GCC_FLAGS = { "standard": "-march=rv64imac -mabi=lp64 ", "linux": "-march=rv64imac -mabi=lp64 ", + "linux4": "-march=rv64imac -mabi=lp64 ", "linuxd": "-march=rv64imac -mabi=lp64 ", "linuxq": "-march=rv64imac -mabi=lp64 ", "full": "-march=rv64imafdc -mabi=lp64 ", + "full4d": "-march=rv64imafdc -mabi=lp64 ", + "full4q": "-march=rv64imafdc -mabi=lp64 ", } -# AXI Data-Widths ---------------------------------------------------------------------------------- +# CPU Size Params ---------------------------------------------------------------------------------- -AXI_DATA_WIDTHS = { - # Variant : (mem, mmio) - "standard": ( 64, 64), - "linux": ( 64, 64), - "linuxd": (128, 64), - "linuxq": (256, 64), - "full": ( 64, 64), +CPU_SIZE_PARAMS = { + # Variant : (mem_dw, mmio_dw, num_cores) + "standard": ( 64, 64, 1), + "linux": ( 64, 64, 1), + "linux4": ( 64, 64, 4), + "linuxd": ( 128, 64, 1), + "linuxq": ( 256, 64, 1), + "full": ( 64, 64, 1), + "full4d": ( 128, 64, 4), + "full4q": ( 256, 64, 4), } # Rocket RV64 -------------------------------------------------------------------------------------- @@ -111,7 +120,7 @@ class RocketRV64(CPU): self.reset = Signal() self.interrupt = Signal(4) - mem_dw, mmio_dw = AXI_DATA_WIDTHS[self.variant] + mem_dw, mmio_dw, num_cores = CPU_SIZE_PARAMS[self.variant] self.mem_axi = mem_axi = axi.AXIInterface(data_width=mem_dw, address_width=32, id_width=4) self.mmio_axi = mmio_axi = axi.AXIInterface(data_width=mmio_dw, address_width=32, id_width=4) @@ -132,7 +141,6 @@ class RocketRV64(CPU): i_reset = ResetSignal("sys") | self.reset, # Debug (ignored). - i_resetctrl_hartIsInReset_0 = Open(), i_debug_clock = 0, i_debug_reset = ResetSignal() | self.reset, o_debug_clockeddmi_dmi_req_ready = Open(), @@ -282,14 +290,14 @@ class RocketRV64(CPU): o_l2_frontend_bus_axi4_0_r_bits_resp = l2fb_axi.r.resp, o_l2_frontend_bus_axi4_0_r_bits_last = l2fb_axi.r.last, ) + # additional per-core debug signals: + self.cpu_params.update({'i_resetctrl_hartIsInReset_%s'%i : Open() for i in range(num_cores)}) # Adapt AXI interfaces to Wishbone. - mmio_a2w = ResetInserter()(axi.AXI2Wishbone(mmio_axi, mmio_wb, base_address=0)) - self.comb += mmio_a2w.reset.eq(ResetSignal() | self.reset) # Note: Must be reset with the CPU. + mmio_a2w = axi.AXI2Wishbone(mmio_axi, mmio_wb, base_address=0) self.submodules += mmio_a2w - l2fb_a2w = ResetInserter()(axi.Wishbone2AXI(l2fb_wb, l2fb_axi, base_address=0)) - self.comb += l2fb_a2w.reset.eq(ResetSignal() | self.reset) # Note: Must be reset with the CPU. + l2fb_a2w = axi.Wishbone2AXI(l2fb_wb, l2fb_axi, base_address=0) self.submodules += l2fb_a2w # Add Verilog sources. diff --git a/litex/soc/cores/cpu/rocket/crt0.S b/litex/soc/cores/cpu/rocket/crt0.S index 8a9514d55..d28a5c04f 100644 --- a/litex/soc/cores/cpu/rocket/crt0.S +++ b/litex/soc/cores/cpu/rocket/crt0.S @@ -2,6 +2,10 @@ .global isr .global _start +.global smp_ap_args +.global smp_ap_target +.global smp_ap_ready + _start: j crt_init nop @@ -53,38 +57,66 @@ trap_entry: crt_init: - la sp, _fstack + 8 - la a0, trap_entry - csrw mtvec, a0 + la sp, _fstack + sd zero, smp_ap_ready, t0 + la t0, trap_entry + csrw mtvec, t0 + +smp_select_bp: + csrr a0, mhartid + beqz a0, data_init // hart 0 is bp, everyone else is ap + +smp_ap_loop: + ld t0, smp_ap_ready + beqz t0, smp_ap_loop +smp_ap_boot: + fence r, r + fence.i // i$ flush + ld a0, smp_ap_args // hart ID (but next-stage loads its own) + ld a1, smp_ap_args+8 // DTB pointer (if provded by litex bios) + ld a2, smp_ap_args+16 + ld a3, smp_ap_target + jr a3 +smp_ap_done: data_init: - la a0, _fdata - la a1, _edata - la a2, _fdata_rom + la t0, _fdata + la t1, _edata + la t2, _fdata_rom data_loop: - beq a0,a1,data_done - ld a3,0(a2) - sd a3,0(a0) - add a0,a0,8 - add a2,a2,8 + beq t0,t1,data_done + ld t3,0(t2) + sd t3,0(t0) + add t0,t0,8 + add t2,t2,8 j data_loop data_done: bss_init: - la a0, _fbss - la a1, _ebss + la t0, _fbss + la t1, _ebss bss_loop: - beq a0,a1,bss_done - sd zero,0(a0) - add a0,a0,8 + beq t0,t1,bss_done + sd zero,0(t0) + add t0,t0,8 j bss_loop bss_done: call plic_init // initialize external interrupt controller - li a0, 0x800 // external interrupt sources only (using LiteX timer); + li t0, 0x800 // external interrupt sources only (using LiteX timer); // NOTE: must still enable mstatus.MIE! - csrw mie,a0 + csrw mie,t0 call main inf_loop: j inf_loop + +.bss +smp_ap_args: + .dword 0 + .dword 0 + .dword 0 +smp_ap_target: + .dword 0 +smp_ap_ready: + .dword 0 diff --git a/litex/soc/cores/cpu/vexriscv/core.py b/litex/soc/cores/cpu/vexriscv/core.py index 0aef8bc96..c3d433951 100644 --- a/litex/soc/cores/cpu/vexriscv/core.py +++ b/litex/soc/cores/cpu/vexriscv/core.py @@ -135,6 +135,7 @@ class VexRiscv(CPU, AutoCSR): # # # + # CPU Instance. self.cpu_params = dict( i_clk = ClockSignal("sys"), i_reset = ResetSignal("sys") | self.reset, @@ -168,9 +169,11 @@ class VexRiscv(CPU, AutoCSR): i_dBusWishbone_ERR = dbus.err ) + # Add Timer (Optional). if with_timer: self.add_timer() + # Add Debug (Optional). if "debug" in variant: self.add_debug() @@ -287,7 +290,6 @@ class VexRiscv(CPU, AutoCSR): ("valid", 1), ("ready", 1), ("payload", [ - ("response_ok", 1), ("outputs_0", 32), ]), ]), @@ -305,7 +307,6 @@ class VexRiscv(CPU, AutoCSR): i_cmd_payload_inputs_1 = cfu_bus.cmd.payload.inputs_1, o_rsp_valid = cfu_bus.rsp.valid, i_rsp_ready = cfu_bus.rsp.ready, - o_rsp_payload_response_ok = cfu_bus.rsp.payload.response_ok, o_rsp_payload_outputs_0 = cfu_bus.rsp.payload.outputs_0, i_clk = ClockSignal("sys"), i_reset = ResetSignal("sys"), @@ -321,7 +322,6 @@ class VexRiscv(CPU, AutoCSR): o_CfuPlugin_bus_cmd_payload_inputs_1 = cfu_bus.cmd.payload.inputs_1, i_CfuPlugin_bus_rsp_valid = cfu_bus.rsp.valid, o_CfuPlugin_bus_rsp_ready = cfu_bus.rsp.ready, - i_CfuPlugin_bus_rsp_payload_response_ok = cfu_bus.rsp.payload.response_ok, i_CfuPlugin_bus_rsp_payload_outputs_0 = cfu_bus.rsp.payload.outputs_0, ) @@ -332,9 +332,24 @@ class VexRiscv(CPU, AutoCSR): platform.add_source(os.path.join(vdir, cpu_filename)) def add_soc_components(self, soc, soc_region_cls): + # Connect Debug interface to SoC. if "debug" in self.variant: - soc.bus.add_slave("vexriscv_debug", self.debug_bus, region=soc_region_cls( - origin=soc.mem_map.get("vexriscv_debug"), size=0x100, cached=False)) + soc.bus.add_slave("vexriscv_debug", self.debug_bus, region= + soc_region_cls( + origin = soc.mem_map.get("vexriscv_debug"), + size = 0x100, + cached = False + ) + ) + + # Pass I/D Caches info to software. + base_variant = str(self.variant.split('+')[0]) + # DCACHE is present on all variants except minimal and lite. + if not base_variant in ["minimal", "lite"]: + soc.add_config("CPU_HAS_DCACHE") + # ICACHE is present on all variants except minimal. + if not base_variant in ["minimal"]: + soc.add_config("CPU_HAS_ICACHE") def use_external_variant(self, variant_filename): self.external_variant = True diff --git a/litex/soc/cores/cpu/vexriscv/crt0.S b/litex/soc/cores/cpu/vexriscv/crt0.S index 90beab953..0496c84be 100644 --- a/litex/soc/cores/cpu/vexriscv/crt0.S +++ b/litex/soc/cores/cpu/vexriscv/crt0.S @@ -54,7 +54,7 @@ trap_entry: crt_init: - la sp, _fstack + 4 + la sp, _fstack la a0, trap_entry csrw mtvec, a0 diff --git a/litex/soc/cores/cpu/vexriscv/system.h b/litex/soc/cores/cpu/vexriscv/system.h index 1fcfb4fba..419180245 100644 --- a/litex/soc/cores/cpu/vexriscv/system.h +++ b/litex/soc/cores/cpu/vexriscv/system.h @@ -11,9 +11,7 @@ extern "C" { __attribute__((unused)) static void flush_cpu_icache(void) { -#if defined(CONFIG_CPU_VARIANT_MINIMAL) - /* No instruction cache */ -#else +#if defined(CONFIG_CPU_HAS_ICACHE) asm volatile( ".word(0x100F)\n" "nop\n" @@ -27,9 +25,7 @@ __attribute__((unused)) static void flush_cpu_icache(void) __attribute__((unused)) static void flush_cpu_dcache(void) { -#if defined(CONFIG_CPU_VARIANT_MINIMAL) || defined(CONFIG_CPU_VARIANT_LITE) - /* No data cache */ -#else +#if defined(CONFIG_CPU_HAS_DCACHE) asm volatile(".word(0x500F)\n"); #endif } diff --git a/litex/soc/cores/cpu/vexriscv_smp/core.py b/litex/soc/cores/cpu/vexriscv_smp/core.py old mode 100644 new mode 100755 index f7c837121..44deb4ee4 --- a/litex/soc/cores/cpu/vexriscv_smp/core.py +++ b/litex/soc/cores/cpu/vexriscv_smp/core.py @@ -419,8 +419,6 @@ class VexRiscvSMP(CPU): def add_memory_buses(self, address_width, data_width): VexRiscvSMP.litedram_width = data_width - VexRiscvSMP.generate_cluster_name() - from litedram.common import LiteDRAMNativePort if(not VexRiscvSMP.wishbone_memory): ibus = LiteDRAMNativePort(mode="both", address_width=32, data_width=VexRiscvSMP.litedram_width) @@ -457,6 +455,7 @@ class VexRiscvSMP(CPU): def do_finalize(self): assert hasattr(self, "reset_address") + VexRiscvSMP.generate_cluster_name() self.specials += Instance(self.cluster_name, **self.cpu_params) # Add Verilog sources diff --git a/litex/soc/cores/cpu/vexriscv_smp/crt0.S b/litex/soc/cores/cpu/vexriscv_smp/crt0.S index 3e466fdd0..ec18b8ecd 100644 --- a/litex/soc/cores/cpu/vexriscv_smp/crt0.S +++ b/litex/soc/cores/cpu/vexriscv_smp/crt0.S @@ -58,11 +58,27 @@ trap_entry: .text crt_init: - la sp, _fstack + 4 + la sp, _fstack la a0, trap_entry csrw mtvec, a0 sw x0, smp_lottery_lock, a1 +smp_tyranny: + csrr a0, mhartid + beqz a0, data_init + +smp_slave: + lw a0, smp_lottery_lock + beqz a0, smp_slave + fence r, r + + .word(0x100F) //i$ flush + lw x10, smp_lottery_args + lw x11, smp_lottery_args+4 + lw x12, smp_lottery_args+8 + lw x13, smp_lottery_target + jr x13 + data_init: la a0, _fdata la a1, _edata @@ -76,23 +92,6 @@ data_loop: j data_loop data_done: -smp_tyranny: - csrr a0, mhartid - beqz a0, bss_init - call smp_slave - -smp_slave: - lw a0, smp_lottery_lock - beqz a0, smp_slave - fence r, r - - .word(0x100F) //i$ flush - lw x10, smp_lottery_args - lw x11, smp_lottery_args+4 - lw x12, smp_lottery_args+8 - lw x13, smp_lottery_target - jr x13 - bss_init: la a0, _fbss la a1, _ebss diff --git a/litex/soc/cores/gpio.py b/litex/soc/cores/gpio.py index daaf9c453..b92057666 100644 --- a/litex/soc/cores/gpio.py +++ b/litex/soc/cores/gpio.py @@ -73,20 +73,29 @@ class GPIOInOut(Module): class GPIOTristate(_GPIOIRQ, Module, AutoCSR): def __init__(self, pads, with_irq=False): - assert isinstance(pads, Signal) - nbits = len(pads) + assert isinstance(pads, Signal) or isinstance(pads, Record) + nbits = len(pads) if isinstance(pads, Signal) else len(pads.o) + self._oe = CSRStorage(nbits, description="GPIO Tristate(s) Control.") self._in = CSRStatus(nbits, description="GPIO Input(s) Status.") self._out = CSRStorage(nbits, description="GPIO Ouptut(s) Control.") # # # - for i in range(nbits): - t = TSTriple() - self.specials += t.get_tristate(pads[i]) - self.comb += t.oe.eq(self._oe.storage[i]) - self.comb += t.o.eq(self._out.storage[i]) - self.specials += MultiReg(t.i, self._in.status[i]) + if isinstance(pads, Signal): + # Proper inout IOs. + for i in range(nbits): + t = TSTriple() + self.specials += t.get_tristate(pads[i]) + self.comb += t.oe.eq(self._oe.storage[i]) + self.comb += t.o.eq(self._out.storage[i]) + self.specials += MultiReg(t.i, self._in.status[i]) + else: + # Tristate inout IOs (For external tristate IO chips or simulation). + for i in range(nbits): + self.comb += pads.oe[i].eq(self._oe.storage[i]) + self.comb += pads.o[i].eq(self._out.storage[i]) + self.specials += MultiReg(pads.i[i], self._in.status[i]) if with_irq: self.add_irq(self._in.status) diff --git a/litex/soc/cores/uart.py b/litex/soc/cores/uart.py index eff637cad..650674271 100644 --- a/litex/soc/cores/uart.py +++ b/litex/soc/cores/uart.py @@ -57,6 +57,8 @@ class RS232PHYTX(Module): # # # + pads.tx.reset = 1 + data = Signal(8, reset_less=True) count = Signal(4, reset_less=True) diff --git a/litex/soc/cores/video.py b/litex/soc/cores/video.py index 131a0a89b..33b819c47 100644 --- a/litex/soc/cores/video.py +++ b/litex/soc/cores/video.py @@ -733,6 +733,38 @@ class VideoHDMI10to1Serializer(Module): o = data_o, ) +class VideoHDMIPHY(Module): + def __init__(self, pads, clock_domain="sys", pn_swap=[]): + self.sink = sink = stream.Endpoint(video_data_layout) + + # # # + + # Always ack Sink, no backpressure. + self.comb += sink.ready.eq(1) + + # Clocking + Pseudo Differential Signaling. + self.specials += DDROutput(i1=1, i2=0, o=pads.clk_p, clk=ClockSignal(clock_domain)) + + # Encode/Serialize Datas. + for color in ["r", "g", "b"]: + + # TMDS Encoding. + encoder = ClockDomainsRenamer(clock_domain)(TMDSEncoder()) + setattr(self.submodules, f"{color}_encoder", encoder) + self.comb += encoder.d.eq(getattr(sink, color)) + self.comb += encoder.c.eq(Cat(sink.hsync, sink.vsync) if color == "r" else 0) + self.comb += encoder.de.eq(sink.de) + + # 10:1 Serialization + Pseudo Differential Signaling. + c2d = {"r": 0, "g": 1, "b": 2} + data = encoder.out if color not in pn_swap else ~encoder.out + serializer = VideoHDMI10to1Serializer( + data_i = data, + data_o = getattr(pads, f"data{c2d[color]}_p"), + clock_domain = clock_domain, + ) + setattr(self.submodules, f"{color}_serializer", serializer) + # HDMI (Xilinx Spartan6). class VideoS6HDMIPHY(Module): @@ -926,36 +958,3 @@ class VideoS7GTPHDMIPHY(Module): setattr(self.submodules, f"gtp{color}", gtp) self.comb += gtp.tx_produce_pattern.eq(1) self.comb += gtp.tx_pattern.eq(cdc.source.data) - -# HDMI (Lattice ECP5). - -class VideoECP5HDMIPHY(Module): - def __init__(self, pads, clock_domain="sys"): - self.sink = sink = stream.Endpoint(video_data_layout) - - # # # - - # Always ack Sink, no backpressure. - self.comb += sink.ready.eq(1) - - # Clocking + Pseudo Differential Signaling. - self.specials += DDROutput(i1=1, i2=0, o=pads.clk_p, clk=ClockSignal(clock_domain)) - - # Encode/Serialize Datas. - for color in ["r", "g", "b"]: - - # TMDS Encoding. - encoder = ClockDomainsRenamer(clock_domain)(TMDSEncoder()) - setattr(self.submodules, f"{color}_encoder", encoder) - self.comb += encoder.d.eq(getattr(sink, color)) - self.comb += encoder.c.eq(Cat(sink.hsync, sink.vsync) if color == "r" else 0) - self.comb += encoder.de.eq(sink.de) - - # 10:1 Serialization + Pseudo Differential Signaling. - c2d = {"r": 0, "g": 1, "b": 2} - serializer = VideoHDMI10to1Serializer( - data_i = encoder.out, - data_o = getattr(pads, f"data{c2d[color]}_p"), - clock_domain = clock_domain, - ) - setattr(self.submodules, f"{color}_serializer", serializer) diff --git a/litex/soc/integration/builder.py b/litex/soc/integration/builder.py index afa4b2801..e1c099e81 100644 --- a/litex/soc/integration/builder.py +++ b/litex/soc/integration/builder.py @@ -2,7 +2,7 @@ # This file is part of LiteX. # # This file is Copyright (c) 2015 Sebastien Bourdeauducq -# This file is Copyright (c) 2015-2019 Florent Kermarrec +# This file is Copyright (c) 2015-2021 Florent Kermarrec # This file is Copyright (c) 2018-2019 Antmicro # This file is Copyright (c) 2018 Sergiusz Bazanski # This file is Copyright (c) 2016-2017 Tim 'mithro' Ansell @@ -27,12 +27,18 @@ from litex.soc.cores import cpu def _makefile_escape(s): return s.replace("\\", "\\\\") -def _create_dir(d): - os.makedirs(os.path.realpath(d), exist_ok=True) +def _create_dir(d, remove_if_exists=False): + dir_path = os.path.realpath(d) + if remove_if_exists and os.path.exists(dir_path): + shutil.rmtree(dir_path) + os.makedirs(dir_path, exist_ok=True) # Software Packages -------------------------------------------------------------------------------- soc_software_packages = [ + # picolibc + "libc", + # Compiler-RT. "libcompiler_rt", @@ -50,7 +56,7 @@ soc_software_packages = [ # Builder ------------------------------------------------------------------------------------------ -soc_directory = os.path.abspath(os.path.join(os.path.dirname(__file__), "..")) +soc_directory = os.path.abspath(os.path.join(os.path.dirname(__file__), "..")) class Builder: def __init__(self, soc, @@ -103,14 +109,11 @@ class Builder: self.generate_doc = generate_doc # List software packages and libraries. - self.software_packages = [] + self.software_packages = [] self.software_libraries = [] for name in soc_software_packages: self.add_software_package(name) - - if name == "libbase": - name += "-nofloat" self.add_software_library(name) def add_software_package(self, name, src_dir=None): @@ -121,46 +124,48 @@ class Builder: def add_software_library(self, name): self.software_libraries.append(name) - def _generate_includes(self): + def _get_variables_contents(self): + variables_contents = [] + def define(k, v): + variables_contents.append("{}={}".format(k, _makefile_escape(v))) + + # Define packages and libraries. + define("PACKAGES", " ".join(name for name, src_dir in self.software_packages)) + define("PACKAGE_DIRS", " ".join(src_dir for name, src_dir in self.software_packages)) + define("LIBS", " ".join(self.software_libraries)) + + # Define the CPU variables. + for k, v in export.get_cpu_mak(self.soc.cpu, self.compile_software): + define(k, v) + + # Define the SoC/Picolibc/Compiler-RT/Software/Include directories. + define("SOC_DIRECTORY", soc_directory) + picolibc_directory = get_data_mod("software", "picolibc").data_location + define("PICOLIBC_DIRECTORY", picolibc_directory) + compiler_rt_directory = get_data_mod("software", "compiler_rt").data_location + define("COMPILER_RT_DIRECTORY", compiler_rt_directory) + variables_contents.append("export BUILDINC_DIRECTORY") + define("BUILDINC_DIRECTORY", self.include_dir) + for name, src_dir in self.software_packages: + define(name.upper() + "_DIRECTORY", src_dir) + + # Define the BIOS Options. + for bios_option in self.bios_options: + assert bios_option in ["TERM_NO_HIST", "TERM_MINI", "TERM_NO_COMPLETE"] + define(bios_option, "1") + + return "\n".join(variables_contents) + + def _generate_includes(self, with_bios=True): # Generate Include/Generated directories. _create_dir(self.include_dir) _create_dir(self.generated_dir) # Generate BIOS files when the SoC uses it. - with_bios = self.soc.cpu_type not in [None, "zynq7000"] if with_bios: - self.add_software_package("bios") - # Generate Variables to variables.mak. - variables_contents = [] - def define(k, v): - variables_contents.append("{}={}".format(k, _makefile_escape(v))) - - # Define packages and libraries. - define("PACKAGES", " ".join(name for name, src_dir in self.software_packages)) - define("PACKAGE_DIRS", " ".join(src_dir for name, src_dir in self.software_packages)) - define("LIBS", " ".join(self.software_libraries)) - - # Define the CPU variables. - for k, v in export.get_cpu_mak(self.soc.cpu, self.compile_software): - define(k, v) - - # Define the SoC/Compiler-RT/Software/Include directories. - define("SOC_DIRECTORY", soc_directory) - compiler_rt_directory = get_data_mod("software", "compiler_rt").data_location - define("COMPILER_RT_DIRECTORY", compiler_rt_directory) - variables_contents.append("export BUILDINC_DIRECTORY") - define("BUILDINC_DIRECTORY", self.include_dir) - for name, src_dir in self.software_packages: - define(name.upper() + "_DIRECTORY", src_dir) - - # Define the BIOS Options. - for bios_option in self.bios_options: - assert bios_option in ["TERM_NO_HIST", "TERM_MINI", "TERM_NO_COMPLETE"] - define(bios_option, "1") - - # Write to variables.mak. - write_to_file(os.path.join(self.generated_dir, "variables.mak"), "\n".join(variables_contents)) + variables_contents = self._get_variables_contents() + write_to_file(os.path.join(self.generated_dir, "variables.mak"), variables_contents) # Generate Output Format to output_format.ld. output_format_contents = export.get_linker_output_format(self.soc.cpu) @@ -194,7 +199,7 @@ class Builder: git_contents = export.get_git_header() write_to_file(os.path.join(self.generated_dir, "git.h"), git_contents) - # Generate LiteDRAM C header to sdram_phy.h when the SoC use it. + # Generate LiteDRAM C header to sdram_phy.h when the SoC use it if hasattr(self.soc, "sdram"): from litedram.init import get_sdram_phy_c_header sdram_contents = get_sdram_phy_c_header( @@ -253,15 +258,30 @@ class Builder: # Pass Output Directory to Platform. self.soc.platform.output_dir = self.output_dir - # Create Gateware/Software directories. + # Check if BIOS is used and add software package if so. + with_bios = self.soc.cpu_type not in [None, "zynq7000"] + if with_bios: + self.add_software_package("bios") + + # Create Gateware directory. _create_dir(self.gateware_dir) - _create_dir(self.software_dir) + + # Create Software directory. + # First check if software needs a full re-build and remove software dir if so. + if self.soc.cpu_type is not None: + software_full_rebuild = False + software_variables_mak = os.path.join(self.generated_dir, "variables.mak") + if os.path.exists(software_variables_mak): + old_variables_contents = open(software_variables_mak).read() + new_variables_contents = self._get_variables_contents() + software_full_rebuild = (old_variables_contents != new_variables_contents) + _create_dir(self.software_dir, remove_if_exists=software_full_rebuild) # Finalize the SoC. self.soc.finalize() # Generate Software Includes/Files. - self._generate_includes() + self._generate_includes(with_bios=with_bios) # Export SoC Mapping. self._generate_csr_map() diff --git a/litex/soc/integration/export.py b/litex/soc/integration/export.py index 866c629e9..f74fe57d4 100644 --- a/litex/soc/integration/export.py +++ b/litex/soc/integration/export.py @@ -18,6 +18,8 @@ import os import json +import time +import datetime import inspect from shutil import which from sysconfig import get_platform @@ -33,26 +35,22 @@ from litex.soc.doc.module import gather_submodules, ModuleNotDocumented, Documen from litex.soc.doc.csr import DocumentedCSRRegion from litex.soc.interconnect.csr import _CompoundCSR -# for generating a timestamp in the description field, if none is otherwise given -import datetime -import time - # CPU files ---------------------------------------------------------------------------------------- def get_cpu_mak(cpu, compile_software): - # select between clang and gcc + # Select between CLANG and GCC. clang = os.getenv("CLANG", "") if clang != "": clang = bool(int(clang)) else: clang = None - if not hasattr(cpu, "clang_triple"): + if cpu.clang_triple is None: if clang: - raise ValueError(cpu.name + "not supported with clang.") + raise ValueError(cpu.name + " is not supported with CLANG.") else: clang = False else: - # Default to gcc unless told otherwise + # Default to gcc unless told otherwise. if clang is None: clang = False assert isinstance(clang, bool) @@ -63,7 +61,7 @@ def get_cpu_mak(cpu, compile_software): triple = cpu.gcc_triple flags = cpu.gcc_flags - # select triple when more than one + # Select triple when more than one. def select_triple(triple): r = None if not isinstance(triple, tuple): @@ -74,7 +72,7 @@ def get_cpu_mak(cpu, compile_software): p = get_platform() for i in range(len(triple)): t = triple[i] - # use native toolchain if host and target platforms are the same + # Use native toolchain if host and target platforms are the same. if t == 'riscv64-unknown-elf' and p == 'linux-riscv64': r = '--native--' break @@ -90,25 +88,25 @@ def get_cpu_mak(cpu, compile_software): raise OSError(msg) return r - # return informations + # Return informations. return [ - ("TRIPLE", select_triple(triple)), - ("CPU", cpu.name), - ("CPUFLAGS", flags), + ("TRIPLE", select_triple(triple)), + ("CPU", cpu.name), + ("CPUFLAGS", flags), ("CPUENDIANNESS", cpu.endianness), - ("CLANG", str(int(clang))), + ("CLANG", str(int(clang))), ("CPU_DIRECTORY", os.path.dirname(inspect.getfile(cpu.__class__))), ] def get_linker_output_format(cpu): - return "OUTPUT_FORMAT(\"" + cpu.linker_output_format + "\")\n" + return f"OUTPUT_FORMAT(\"{cpu.linker_output_format}\")\n" def get_linker_regions(regions): r = "MEMORY {\n" for name, region in regions.items(): - r += "\t{} : ORIGIN = 0x{:08x}, LENGTH = 0x{:08x}\n".format(name, region.origin, region.length) + r += f"\t{name} : ORIGIN = 0x{region.origin:08x}, LENGTH = 0x{region.length:08x}\n" r += "}\n" return r @@ -119,8 +117,8 @@ def get_git_header(): from litex.build.tools import get_migen_git_revision, get_litex_git_revision r = generated_banner("//") r += "#ifndef __GENERATED_GIT_H\n#define __GENERATED_GIT_H\n\n" - r += "#define MIGEN_GIT_SHA1 \"{}\"\n".format(get_migen_git_revision()) - r += "#define LITEX_GIT_SHA1 \"{}\"\n".format(get_litex_git_revision()) + r += f"#define MIGEN_GIT_SHA1 \"{get_migen_git_revision()}\"\n" + r += f"#define LITEX_GIT_SHA1 \"{get_litex_git_revision()}\"\n" r += "#endif\n" return r @@ -128,9 +126,9 @@ def get_mem_header(regions): r = generated_banner("//") r += "#ifndef __GENERATED_MEM_H\n#define __GENERATED_MEM_H\n\n" for name, region in regions.items(): - r += "#ifndef {name}_BASE\n".format(name=name.upper()) - r += "#define {name}_BASE 0x{base:08x}L\n#define {name}_SIZE 0x{size:08x}\n".format( - name=name.upper(), base=region.origin, size=region.length) + r += f"#ifndef {name.upper()}_BASE\n" + r += f"#define {name.upper()}_BASE 0x{region.origin:08x}L\n" + r += f"#define {name.upper()}_SIZE 0x{region.length:08x}\n" r += "#endif\n\n" r += "#ifndef MEM_REGIONS\n" @@ -175,14 +173,14 @@ def get_soc_header(constants, with_access_functions=True): def _get_rw_functions_c(reg_name, reg_base, nwords, busword, alignment, read_only, with_access_functions): r = "" - addr_str = "CSR_{}_ADDR".format(reg_name.upper()) - size_str = "CSR_{}_SIZE".format(reg_name.upper()) - r += "#define {} (CSR_BASE + {}L)\n".format(addr_str, hex(reg_base)) - r += "#define {} {}\n".format(size_str, nwords) + addr_str = f"CSR_{reg_name.upper()}_ADDR" + size_str = f"CSR_{reg_name.upper()}_SIZE" + r += f"#define {addr_str} (CSR_BASE + {hex(reg_base)}L)\n" + r += f"#define {size_str} {nwords}\n" size = nwords*busword//8 if size > 8: - # downstream should select appropriate `csr_[rd|wr]_buf_uintX()` pair! + # Downstream should select appropriate `csr_[rd|wr]_buf_uintX()` pair! return r elif size > 4: ctype = "uint64_t" @@ -195,25 +193,25 @@ def _get_rw_functions_c(reg_name, reg_base, nwords, busword, alignment, read_onl stride = alignment//8; if with_access_functions: - r += "static inline {} {}_read(void) {{\n".format(ctype, reg_name) + r += f"static inline {ctype} {reg_name}_read(void) {{\n" if nwords > 1: - r += "\t{} r = csr_read_simple(CSR_BASE + {}L);\n".format(ctype, hex(reg_base)) + r += f"\t{ctype} r = csr_read_simple(CSR_BASE + {reg_base}L);\n" for sub in range(1, nwords): - r += "\tr <<= {};\n".format(busword) - r += "\tr |= csr_read_simple(CSR_BASE + {}L);\n".format(hex(reg_base+sub*stride)) + r += f"\tr <<= {busword};\n" + r += f"\tr |= csr_read_simple(CSR_BASE + {hex(reg_base+sub*stride)}L);\n" r += "\treturn r;\n}\n" else: - r += "\treturn csr_read_simple(CSR_BASE + {}L);\n}}\n".format(hex(reg_base)) + r += f"\treturn csr_read_simple(CSR_BASE + {hex(reg_base)}L);\n}}\n" if not read_only: - r += "static inline void {}_write({} v) {{\n".format(reg_name, ctype) + r += f"static inline void {reg_name}_write({ctype} v) {{\n" for sub in range(nwords): shift = (nwords-sub-1)*busword if shift: v_shift = "v >> {}".format(shift) else: v_shift = "v" - r += "\tcsr_write_simple({}, CSR_BASE + {}L);\n".format(v_shift, hex(reg_base+sub*stride)) + r += f"\tcsr_write_simple({v_shift}, CSR_BASE + {hex(reg_base+sub*stride)}L);\n" r += "}\n" return r @@ -232,12 +230,12 @@ def get_csr_header(regions, constants, csr_base=None, with_access_functions=True r += "#endif /* ! CSR_ACCESSORS_DEFINED */\n" csr_base = csr_base if csr_base is not None else regions[next(iter(regions))].origin r += "#ifndef CSR_BASE\n" - r += "#define CSR_BASE {}L\n".format(hex(csr_base)) + r += f"#define CSR_BASE {hex(csr_base)}L\n" r += "#endif\n" for name, region in regions.items(): origin = region.origin - csr_base r += "\n/* "+name+" */\n" - r += "#define CSR_"+name.upper()+"_BASE (CSR_BASE + "+hex(origin)+"L)\n" + r += f"#define CSR_{name.upper()}_BASE (CSR_BASE + {hex(origin)}L)\n" if not isinstance(region.obj, Memory): for csr in region.obj: nr = (csr.size + region.busword - 1)//region.busword @@ -248,10 +246,10 @@ def get_csr_header(regions, constants, csr_base=None, with_access_functions=True for field in csr.fields.fields: offset = str(field.offset) size = str(field.size) - r += "#define CSR_"+name.upper()+"_"+csr.name.upper()+"_"+field.name.upper()+"_OFFSET "+offset+"\n" - r += "#define CSR_"+name.upper()+"_"+csr.name.upper()+"_"+field.name.upper()+"_SIZE "+size+"\n" + r += f"#define CSR_{name.upper()}_{csr.name.upper()}_{field.name.upper()}_OFFSET {offset}\n" + r += f"#define CSR_{name.upper()}_{csr.name.upper()}_{field.name.upper()}_SIZE {size}\n" if with_access_functions and csr.size <= 32: # FIXME: Implement extract/read functions for csr.size > 32-bit. - reg_name = name + "_" + csr.name.lower() + reg_name = name + "_" + csr.name.lower() field_name = reg_name + "_" + field.name.lower() r += "static inline uint32_t " + field_name + "_extract(uint32_t oldword) {\n" r += "\tuint32_t mask = ((1 << " + size + ")-1);\n" @@ -290,13 +288,16 @@ def get_csr_json(csr_regions={}, constants={}, mem_regions={}): region_origin = region.origin if not isinstance(region.obj, Memory): for csr in region.obj: - size = (csr.size + region.busword - 1)//region.busword + _size = (csr.size + region.busword - 1)//region.busword + _type = "rw" + if isinstance(csr, CSRStatus) and not hasattr(csr, "r"): + _type = "ro" d["csr_registers"][name + "_" + csr.name] = { "addr": region_origin, - "size": size, - "type": "ro" if isinstance(csr, CSRStatus) else "rw" + "size": _size, + "type": _type } - region_origin += alignment//8*size + region_origin += alignment//8*_size for name, value in constants.items(): d["constants"][name.lower()] = value.lower() if isinstance(value, str) else value diff --git a/litex/soc/integration/soc.py b/litex/soc/integration/soc.py index e66cdf825..8798fb071 100644 --- a/litex/soc/integration/soc.py +++ b/litex/soc/integration/soc.py @@ -233,13 +233,17 @@ class SoCBusHandler(Module): for _, search_region in search_regions.items(): origin = search_region.origin while (origin + size) < (search_region.origin + search_region.size_pow2): + # Align Origin on Size. + if (origin%size): + origin += (origin - origin%size) + continue # Create a Candidate. candidate = SoCRegion(origin=origin, size=size, cached=cached) overlap = False # Check Candidate does not overlap with allocated existing regions. for _, allocated in self.regions.items(): if self.check_regions_overlap({"0": allocated, "1": candidate}) is not None: - origin = allocated.origin + allocated.size_pow2 + origin += size overlap = True break if not overlap: @@ -1329,12 +1333,10 @@ class LiteXSoC(SoC): mem_wb = wishbone.Interface( data_width = self.cpu.mem_axi.data_width, adr_width = 32-log2_int(self.cpu.mem_axi.data_width//8)) - # FIXME: AXI2Wishbone FSMs must be reset with the CPU. - mem_a2w = ResetInserter()(axi.AXI2Wishbone( + mem_a2w = axi.AXI2Wishbone( axi = self.cpu.mem_axi, wishbone = mem_wb, - base_address = 0)) - self.comb += mem_a2w.reset.eq(ResetSignal() | self.cpu.reset) + base_address = 0) self.submodules += mem_a2w litedram_wb = wishbone.Interface(port.data_width) self.submodules += LiteDRAMWishbone2Native( @@ -1397,9 +1399,10 @@ class LiteXSoC(SoC): # Add Ethernet --------------------------------------------------------------------------------- def add_ethernet(self, name="ethmac", phy=None, phy_cd="eth", dynamic_ip=False, software_debug=False, - nrxslots = 2, - ntxslots = 2, - with_timestamp = False): + nrxslots = 2, + ntxslots = 2, + with_timestamp = False, + with_timing_constraints = True): # Imports from liteeth.mac import LiteEthMAC from liteeth.phy.model import LiteEthPHYModel @@ -1450,10 +1453,11 @@ class LiteXSoC(SoC): # Add Etherbone -------------------------------------------------------------------------------- def add_etherbone(self, name="etherbone", phy=None, phy_cd="eth", - mac_address = 0x10e2d5000000, - ip_address = "192.168.1.50", - udp_port = 1234, - buffer_depth = 4): + mac_address = 0x10e2d5000000, + ip_address = "192.168.1.50", + udp_port = 1234, + buffer_depth = 4, + with_timing_constraints = True): # Imports from liteeth.core import LiteEthUDPIPCore from liteeth.frontend.etherbone import LiteEthEtherbone @@ -1493,7 +1497,7 @@ class LiteXSoC(SoC): self.platform.add_false_path_constraints(self.crg.cd_sys.clk, eth_rx_clk, eth_tx_clk) # Add SPI Flash -------------------------------------------------------------------------------- - def add_spi_flash(self, name="spiflash", mode="4x", dummy_cycles=None, clk_freq=None, module=None, **kwargs): + def add_spi_flash(self, name="spiflash", mode="4x", dummy_cycles=None, clk_freq=None, module=None, phy=None, rate="1:1", **kwargs): if module is None: # Use previous LiteX SPI Flash core with compat, will be deprecated at some point. from litex.compat.soc_add_spi_flash import add_spi_flash @@ -1501,29 +1505,34 @@ class LiteXSoC(SoC): # LiteSPI. else: # Imports. - from litespi.phy.generic import LiteSPIPHY from litespi import LiteSPI + from litespi.phy.generic import LiteSPIPHY from litespi.opcodes import SpiNorFlashOpCodes # Checks/Parameters. assert mode in ["1x", "4x"] if clk_freq is None: clk_freq = self.sys_clk_freq + # PHY. + spiflash_phy = phy + if spiflash_phy is None: + self.check_if_exists(name + "_phy") + spiflash_pads = self.platform.request(name if mode == "1x" else name + mode) + spiflash_phy = LiteSPIPHY(spiflash_pads, module, device=self.platform.device, default_divisor=int(self.sys_clk_freq/clk_freq), rate=rate) + setattr(self.submodules, name + "_phy", spiflash_phy) + # Core. - self.check_if_exists(name + "_phy") self.check_if_exists(name + "_mmap") - spiflash_pads = self.platform.request(name if mode == "1x" else name + mode) - spiflash_phy = LiteSPIPHY(spiflash_pads, module, default_divisor=int(self.sys_clk_freq/clk_freq)) - spiflash_core = LiteSPI(spiflash_phy, clk_freq=clk_freq, mmap_endianness=self.cpu.endianness, **kwargs) - setattr(self.submodules, name + "_phy", spiflash_phy) + spiflash_core = LiteSPI(spiflash_phy, mmap_endianness=self.cpu.endianness, **kwargs) setattr(self.submodules, name + "_core", spiflash_core) spiflash_region = SoCRegion(origin=self.mem_map.get(name, None), size=module.total_size) self.bus.add_slave(name=name, slave=spiflash_core.bus, region=spiflash_region) # Constants. - self.add_constant("SPIFLASH_MODULE_NAME", module.name.upper()) + self.add_constant("SPIFLASH_PHY_FREQUENCY", clk_freq) + self.add_constant("SPIFLASH_MODULE_NAME", module.name.upper()) self.add_constant("SPIFLASH_MODULE_TOTAL_SIZE", module.total_size) - self.add_constant("SPIFLASH_MODULE_PAGE_SIZE", module.page_size) + self.add_constant("SPIFLASH_MODULE_PAGE_SIZE", module.page_size) if SpiNorFlashOpCodes.READ_1_1_4 in module.supported_opcodes: self.add_constant("SPIFLASH_MODULE_QUAD_CAPABLE") if SpiNorFlashOpCodes.READ_4_4_4 in module.supported_opcodes: diff --git a/litex/soc/interconnect/axi.py b/litex/soc/interconnect/axi.py index 3be196715..b40532f0d 100644 --- a/litex/soc/interconnect/axi.py +++ b/litex/soc/interconnect/axi.py @@ -317,7 +317,7 @@ class AXIBurst2Beat(Module): beat_count = Signal(8) beat_size = Signal(8 + 4) - beat_offset = Signal(8 + 4) + beat_offset = Signal((8 + 4, True)) beat_wrap = Signal(8 + 4) # Compute parameters @@ -352,8 +352,8 @@ class AXIBurst2Beat(Module): ) ), If((ax_burst.burst == BURST_WRAP) & (BURST_WRAP in capabilities), - If(beat_offset == beat_wrap, - beat_offset.eq(0) + If((ax_beat.addr & beat_wrap) == beat_wrap, + beat_offset.eq(beat_offset - beat_wrap) ) ) ) diff --git a/litex/soc/interconnect/packet.py b/litex/soc/interconnect/packet.py index b07434017..6db406316 100644 --- a/litex/soc/interconnect/packet.py +++ b/litex/soc/interconnect/packet.py @@ -411,7 +411,7 @@ class PacketFIFO(Module): # Connect FIFOs to Source. self.comb += [ - param_fifo.source.connect(source, omit={"last", "ready"}), + param_fifo.source.connect(source, omit={"last", "ready", "dummy"}), payload_fifo.source.connect(source, omit={"valid", "ready"}), param_fifo.source.ready.eq( source.valid & source.last & source.ready), payload_fifo.source.ready.eq(source.valid & source.ready), diff --git a/litex/soc/interconnect/wishbone.py b/litex/soc/interconnect/wishbone.py index a57ebd711..85d9c6b5f 100644 --- a/litex/soc/interconnect/wishbone.py +++ b/litex/soc/interconnect/wishbone.py @@ -6,6 +6,8 @@ # Copyright (c) 2018 Tim 'mithro' Ansell # SPDX-License-Identifier: BSD-2-Clause +"""Wishbone Classic support for LiteX (Standard HandShaking/Synchronous Feedback)""" + from math import log2 from functools import reduce diff --git a/litex/soc/software/bios/Makefile b/litex/soc/software/bios/Makefile index 6c0a6aac8..dafd44c35 100755 --- a/litex/soc/software/bios/Makefile +++ b/litex/soc/software/bios/Makefile @@ -19,6 +19,7 @@ OBJECTS = isr.o \ cmd_liteeth.o \ cmd_litesdcard.o \ cmd_litesata.o \ + sim_debug.o \ main.o ifneq "$(or $(TERM_NO_COMPLETE),$(TERM_MINI))" "" @@ -56,9 +57,9 @@ bios.elf: $(BIOS_DIRECTORY)/linker.ld $(OBJECTS) vpath %.a $(PACKAGES:%=../%) -%.elf: ../libbase/crt0.o $(LIBS:%=%.a) +%.elf: crt0.o $(LIBS:%=%.a) $(CC) $(LDFLAGS) -T $(BIOS_DIRECTORY)/linker.ld -N -o $@ \ - ../libbase/crt0.o \ + crt0.o \ $(OBJECTS) \ $(PACKAGES:%=-L../%) \ -Wl,--whole-archive \ @@ -85,6 +86,9 @@ endif boot-helper.o: $(CPU_DIRECTORY)/boot-helper.S $(assemble) +crt0.o: $(CPU_DIRECTORY)/crt0.S + $(assemble) + clean: $(RM) $(OBJECTS) bios.elf bios.bin .*~ *~ diff --git a/litex/soc/software/bios/boot.c b/litex/soc/software/bios/boot.c index 3760eaba5..d802a1abc 100644 --- a/litex/soc/software/bios/boot.c +++ b/litex/soc/software/bios/boot.c @@ -10,10 +10,7 @@ #include #include #include -#include -#include #include -#include #include #include @@ -23,9 +20,13 @@ #include "sfl.h" #include "boot.h" -#include "jsmn.h" -#include +#include + +#include +#include +#include +#include #include #include diff --git a/litex/soc/software/bios/cmds/cmd_bios.c b/litex/soc/software/bios/cmds/cmd_bios.c index 873468db2..1cd290f7b 100644 --- a/litex/soc/software/bios/cmds/cmd_bios.c +++ b/litex/soc/software/bios/cmds/cmd_bios.c @@ -2,15 +2,15 @@ #include #include -#include -#include #include -#include + +#include #include #include "../command.h" #include "../helpers.h" +#include "../sim_debug.h" /** * Command "help" @@ -48,9 +48,17 @@ define_command(help, help_handler, "Print this help", SYSTEM_CMDS); */ static void ident_handler(int nb_params, char **params) { + const int IDENT_SIZE = 256; char buffer[IDENT_SIZE]; - get_ident(buffer); +#ifdef CSR_IDENTIFIER_MEM_BASE + int i; + for(i=0;i #include -#include +#include #include "../command.h" #include "../helpers.h" diff --git a/litex/soc/software/bios/cmds/cmd_litedram.c b/litex/soc/software/bios/cmds/cmd_litedram.c index e8c713f7f..b955a0d98 100644 --- a/litex/soc/software/bios/cmds/cmd_litedram.c +++ b/litex/soc/software/bios/cmds/cmd_litedram.c @@ -4,11 +4,11 @@ #include #include #include -#include +#include #include #include -#include +#include #include #include diff --git a/litex/soc/software/bios/cmds/cmd_mem.c b/litex/soc/software/bios/cmds/cmd_mem.c index cb01a3926..d2bb04fff 100644 --- a/litex/soc/software/bios/cmds/cmd_mem.c +++ b/litex/soc/software/bios/cmds/cmd_mem.c @@ -2,7 +2,7 @@ #include #include -#include +#include #include #include @@ -202,9 +202,10 @@ static void mem_speed_handler(int nb_params, char **params) unsigned int *addr; unsigned long size; bool read_only = false; + bool random = false; if (nb_params < 1) { - printf("mem_speed []"); + printf("mem_speed [] []"); return; } @@ -228,6 +229,14 @@ static void mem_speed_handler(int nb_params, char **params) } } - memspeed(addr, size, read_only); + if (nb_params >= 4) { + random = (bool) strtoul(params[3], &c, 0); + if (*c != 0) { + printf("Incorrect random value"); + return; + } + } + + memspeed(addr, size, read_only, random); } define_command(mem_speed, mem_speed_handler, "Test memory speed", MEM_CMDS); diff --git a/litex/soc/software/bios/helpers.c b/litex/soc/software/bios/helpers.c index 5c1686759..0f8e9bfab 100644 --- a/litex/soc/software/bios/helpers.c +++ b/litex/soc/software/bios/helpers.c @@ -3,10 +3,11 @@ // SPDX-License-Identifier: BSD-Source-Code #include -#include -#include #include +#include +#include + #include "readline.h" #include "helpers.h" #include "command.h" @@ -20,7 +21,7 @@ void dump_bytes(unsigned int *ptr, int count, unsigned long addr) char *data = (char *)ptr; int line_bytes = 0, i = 0; - putsnonl("Memory dump:"); + fputs("Memory dump:", stdout); while (count > 0) { line_bytes = (count > NUMBER_OF_BYTES_ON_A_LINE)? diff --git a/litex/soc/software/bios/isr.c b/litex/soc/software/bios/isr.c index a7fe63aee..a38c29422 100644 --- a/litex/soc/software/bios/isr.c +++ b/litex/soc/software/bios/isr.c @@ -7,7 +7,7 @@ #include #include #include -#include +#include #include #if defined(__microwatt__) diff --git a/litex/soc/software/bios/linker.ld b/litex/soc/software/bios/linker.ld index af6c43be2..a29795b1e 100644 --- a/litex/soc/software/bios/linker.ld +++ b/litex/soc/software/bios/linker.ld @@ -85,7 +85,7 @@ SECTIONS } } -PROVIDE(_fstack = ORIGIN(sram) + LENGTH(sram) - 8); +PROVIDE(_fstack = ORIGIN(sram) + LENGTH(sram)); PROVIDE(_fdata_rom = LOADADDR(.data)); PROVIDE(_edata_rom = LOADADDR(.data) + SIZEOF(.data)); diff --git a/litex/soc/software/bios/main.c b/litex/soc/software/bios/main.c index 42b0c6025..542b42d85 100644 --- a/litex/soc/software/bios/main.c +++ b/litex/soc/software/bios/main.c @@ -17,13 +17,9 @@ #include #include -#include #include -#include #include -#include #include -#include #include "boot.h" #include "readline.h" @@ -35,7 +31,11 @@ #include #include -#include +#include +#include + +#include +#include #include diff --git a/litex/soc/software/bios/readline.c b/litex/soc/software/bios/readline.c index a255ebfaa..d386a84a5 100644 --- a/litex/soc/software/bios/readline.c +++ b/litex/soc/software/bios/readline.c @@ -13,9 +13,6 @@ #include #include -#include -#include - #include "readline.h" #include "complete.h" @@ -54,15 +51,15 @@ static int read_key(void) { char c; char esc[5]; - c = readchar(); + c = getchar(); if (c == 27) { int i = 0; - esc[i++] = readchar(); - esc[i++] = readchar(); + esc[i++] = getchar(); + esc[i++] = getchar(); if (isdigit(esc[1])) { while(1) { - esc[i] = readchar(); + esc[i] = getchar(); if (esc[i++] == '~') break; if (i == ARRAY_SIZE(esc)) diff --git a/litex/soc/software/bios/readline_simple.c b/litex/soc/software/bios/readline_simple.c index bcf062138..e3e1ab706 100644 --- a/litex/soc/software/bios/readline_simple.c +++ b/litex/soc/software/bios/readline_simple.c @@ -8,9 +8,6 @@ #include #include -#include -#include - #include "readline.h" int readline(char *s, int size) @@ -22,7 +19,7 @@ int readline(char *s, int size) c[1] = 0; ptr = 0; while(1) { - c[0] = readchar(); + c[0] = getchar(); if (c[0] == skip) continue; skip = 0; @@ -31,7 +28,7 @@ int readline(char *s, int size) case 0x08: if(ptr > 0) { ptr--; - putsnonl("\x08 \x08"); + fputs("\x08 \x08", stdout); } break; case 0x07: @@ -39,15 +36,15 @@ int readline(char *s, int size) case '\r': skip = '\n'; s[ptr] = 0x00; - putsnonl("\n"); + fputs("\n", stdout); return 0; case '\n': skip = '\r'; s[ptr] = 0x00; - putsnonl("\n"); + fputs("\n", stdout); return 0; default: - putsnonl(c); + fputs(c, stdout); s[ptr] = c[0]; ptr++; break; diff --git a/litex/soc/software/libbase/sim_debug.c b/litex/soc/software/bios/sim_debug.c similarity index 100% rename from litex/soc/software/libbase/sim_debug.c rename to litex/soc/software/bios/sim_debug.c diff --git a/litex/soc/software/include/base/sim_debug.h b/litex/soc/software/bios/sim_debug.h similarity index 100% rename from litex/soc/software/include/base/sim_debug.h rename to litex/soc/software/bios/sim_debug.h diff --git a/litex/soc/software/common.mak b/litex/soc/software/common.mak index ec14f40d2..fb9735434 100644 --- a/litex/soc/software/common.mak +++ b/litex/soc/software/common.mak @@ -14,7 +14,7 @@ else CC_normal := $(TARGET_PREFIX)gcc -std=gnu99 CX_normal := $(TARGET_PREFIX)g++ endif -AR_normal := $(TARGET_PREFIX)ar +AR_normal := $(TARGET_PREFIX)gcc-ar LD_normal := $(TARGET_PREFIX)ld OBJCOPY_normal := $(TARGET_PREFIX)objcopy @@ -45,15 +45,18 @@ DEPFLAGS += -MD -MP # Toolchain options # -INCLUDES = -I$(SOC_DIRECTORY)/software/include/base \ +INCLUDES = -I$(PICOLIBC_DIRECTORY)/newlib/libc/tinystdio \ + -I$(PICOLIBC_DIRECTORY)/newlib/libc/include \ + -I$(LIBBASE_DIRECTORY) \ -I$(SOC_DIRECTORY)/software/include \ -I$(SOC_DIRECTORY)/software \ -I$(BUILDINC_DIRECTORY) \ + -I$(BUILDINC_DIRECTORY)/../libc \ -I$(CPU_DIRECTORY) -COMMONFLAGS = $(DEPFLAGS) -Os $(CPUFLAGS) -g3 -fomit-frame-pointer -Wall -fno-builtin -nostdinc -fno-stack-protector $(INCLUDES) +COMMONFLAGS = $(DEPFLAGS) -Os $(CPUFLAGS) -g3 -fomit-frame-pointer -Wall -fno-builtin -fno-stack-protector -flto $(INCLUDES) CFLAGS = $(COMMONFLAGS) -fexceptions -Wstrict-prototypes -Wold-style-definition -Wmissing-prototypes CXXFLAGS = $(COMMONFLAGS) -std=c++11 -I$(SOC_DIRECTORY)/software/include/basec++ -fexceptions -fno-rtti -ffreestanding -LDFLAGS = -nostdlib -nodefaultlibs -L$(BUILDINC_DIRECTORY) +LDFLAGS = -nostdlib -nodefaultlibs -Wl,--no-dynamic-linker -Wl,--build-id=none $(CFLAGS) -L$(BUILDINC_DIRECTORY) define compilexx $(CX) -c $(CXXFLAGS) $(1) $< -o $@ diff --git a/litex/soc/software/demo/Makefile b/litex/soc/software/demo/Makefile index a71fcc295..1ea2d6815 100644 --- a/litex/soc/software/demo/Makefile +++ b/litex/soc/software/demo/Makefile @@ -3,7 +3,7 @@ BUILD_DIR?=../build/ include $(BUILD_DIR)/software/include/generated/variables.mak include $(SOC_DIRECTORY)/software/common.mak -OBJECTS = isr.o donut.o helloc.o main.o +OBJECTS = isr.o donut.o helloc.o main.o crt0.o ifdef WITH_CXX OBJECTS += hellocpp.o endif @@ -21,16 +21,17 @@ demo.elf: $(OBJECTS) $(CC) $(LDFLAGS) \ -T linker.ld \ -N -o $@ \ - $(BUILD_DIR)/software/libbase/crt0.o \ $(OBJECTS) \ - -L$(BUILD_DIR)/software/libbase \ - -L$(BUILD_DIR)/software/libcompiler_rt \ - -lbase-nofloat -lcompiler_rt + $(PACKAGES:%=-L$(BUILD_DIR)/software/%) \ + $(LIBS:lib%=-l%) chmod -x $@ main.o: main.c $(compile) +crt0.o: $(CPU_DIRECTORY)/crt0.S + $(assemble) + donut.o: CFLAGS += -w helloc.o: CFLAGS += -w diff --git a/litex/soc/software/demo/demo.py b/litex/soc/software/demo/demo.py old mode 100644 new mode 100755 index 6f94d4c32..5ad4ee8c3 --- a/litex/soc/software/demo/demo.py +++ b/litex/soc/software/demo/demo.py @@ -8,7 +8,6 @@ import os import argparse -from distutils.dir_util import copy_tree def main(): parser = argparse.ArgumentParser(description="LiteX Bare Metal Demo App.") @@ -20,8 +19,7 @@ def main(): os.makedirs("demo", exist_ok=True) # Copy contents to demo directory - src = os.path.abspath(os.path.dirname(__file__)) - copy_tree(src, "demo") + os.system(f"cp {os.path.abspath(os.path.dirname(__file__))}/* demo") # Compile demo build_path = args.build_path if os.path.isabs(args.build_path) else os.path.join("..", args.build_path) diff --git a/litex/soc/software/demo/donut.c b/litex/soc/software/demo/donut.c index 956c38040..0aab4177e 100644 --- a/litex/soc/software/demo/donut.c +++ b/litex/soc/software/demo/donut.c @@ -9,7 +9,7 @@ #include #include -#include +#include #define R(mul,shift,x,y) \ _=x; \ @@ -59,9 +59,9 @@ void donut(void) { R(5, 7, cA, sA); R(5, 8, cB, sB); if (readchar_nonblock()) { - readchar(); + getchar(); break; } - putsnonl("\x1b[23A"); + fputs("\x1b[23A", stdout); } -} \ No newline at end of file +} diff --git a/litex/soc/software/demo/isr.c b/litex/soc/software/demo/isr.c index 8bdbd84c2..797663181 100644 --- a/litex/soc/software/demo/isr.c +++ b/litex/soc/software/demo/isr.c @@ -4,7 +4,7 @@ #include #include #include -#include +#include void isr(void); diff --git a/litex/soc/software/demo/linker.ld b/litex/soc/software/demo/linker.ld index 36af68283..d327ecf77 100644 --- a/litex/soc/software/demo/linker.ld +++ b/litex/soc/software/demo/linker.ld @@ -10,33 +10,41 @@ SECTIONS .text : { _ftext = .; + /* Make sure crt0 files come first, and they, and the isr */ + /* don't get disposed of by greedy optimisation */ + *crt0*(.text) + KEEP(*crt0*(.text)) + KEEP(*(.text.isr)) + *(.text .stub .text.* .gnu.linkonce.t.*) _etext = .; } > main_ram .rodata : { - . = ALIGN(4); + . = ALIGN(8); _frodata = .; *(.rodata .rodata.* .gnu.linkonce.r.*) *(.rodata1) + . = ALIGN(8); _erodata = .; } > main_ram .data : { - . = ALIGN(4); + . = ALIGN(8); _fdata = .; *(.data .data.* .gnu.linkonce.d.*) *(.data1) _gp = ALIGN(16); *(.sdata .sdata.* .gnu.linkonce.s.*) + . = ALIGN(8); _edata = .; - } > main_ram + } > sram AT > main_ram .bss : { - . = ALIGN(4); + . = ALIGN(8); _fbss = .; *(.dynsbss) *(.sbss .sbss.* .gnu.linkonce.sb.*) @@ -44,13 +52,13 @@ SECTIONS *(.dynbss) *(.bss .bss.* .gnu.linkonce.b.*) *(COMMON) - . = ALIGN(4); + . = ALIGN(8); _ebss = .; _end = .; } > sram } -PROVIDE(_fstack = ORIGIN(sram) + LENGTH(sram) - 4); +PROVIDE(_fstack = ORIGIN(sram) + LENGTH(sram)); PROVIDE(_fdata_rom = LOADADDR(.data)); PROVIDE(_edata_rom = LOADADDR(.data) + SIZEOF(.data)); diff --git a/litex/soc/software/demo/main.c b/litex/soc/software/demo/main.c index f628b5b88..38c451fa6 100644 --- a/litex/soc/software/demo/main.c +++ b/litex/soc/software/demo/main.c @@ -6,8 +6,8 @@ #include #include -#include -#include +#include +#include #include /*-----------------------------------------------------------------------*/ @@ -21,14 +21,14 @@ static char *readstr(void) static int ptr = 0; if(readchar_nonblock()) { - c[0] = readchar(); + c[0] = getchar(); c[1] = 0; switch(c[0]) { case 0x7f: case 0x08: if(ptr > 0) { ptr--; - putsnonl("\x08 \x08"); + fputs("\x08 \x08", stdout); } break; case 0x07: @@ -36,13 +36,13 @@ static char *readstr(void) case '\r': case '\n': s[ptr] = 0x00; - putsnonl("\n"); + fputs("\n", stdout); ptr = 0; return s; default: if(ptr >= (sizeof(s) - 1)) break; - putsnonl(c); + fputs(c, stdout); s[ptr] = c[0]; ptr++; break; diff --git a/litex/soc/software/include/base/assert.h b/litex/soc/software/include/base/assert.h deleted file mode 100644 index 7b80a2876..000000000 --- a/litex/soc/software/include/base/assert.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef __ASSERT_H -#define __ASSERT_H - -#define assert(x) - -#endif /* __ASSERT_H */ diff --git a/litex/soc/software/include/base/ctype.h b/litex/soc/software/include/base/ctype.h deleted file mode 100644 index 693685933..000000000 --- a/litex/soc/software/include/base/ctype.h +++ /dev/null @@ -1,63 +0,0 @@ -#ifndef __CTYPE_H -#define __CTYPE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * NOTE! This ctype does not handle EOF like the standard C - * library is required to. - */ - -#define _U 0x01 /* upper */ -#define _L 0x02 /* lower */ -#define _D 0x04 /* digit */ -#define _C 0x08 /* cntrl */ -#define _P 0x10 /* punct */ -#define _S 0x20 /* white space (space/lf/tab) */ -#define _X 0x40 /* hex digit */ -#define _SP 0x80 /* hard space (0x20) */ - -extern const unsigned char _ctype[]; - -#define __ismask(x) (_ctype[(int)(unsigned char)(x)]) - -#define isalnum(c) ((__ismask(c)&(_U|_L|_D)) != 0) -#define isalpha(c) ((__ismask(c)&(_U|_L)) != 0) -#define iscntrl(c) ((__ismask(c)&(_C)) != 0) -#define isdigit(c) ((__ismask(c)&(_D)) != 0) -#define isgraph(c) ((__ismask(c)&(_P|_U|_L|_D)) != 0) -#define islower(c) ((__ismask(c)&(_L)) != 0) -#define isprint(c) ((__ismask(c)&(_P|_U|_L|_D|_SP)) != 0) -#define ispunct(c) ((__ismask(c)&(_P)) != 0) -/* Note: isspace() must return false for %NUL-terminator */ -#define isspace(c) ((__ismask(c)&(_S)) != 0) -#define isupper(c) ((__ismask(c)&(_U)) != 0) -#define isxdigit(c) ((__ismask(c)&(_D|_X)) != 0) - -#define isascii(c) (((unsigned char)(c))<=0x7f) -#define toascii(c) (((unsigned char)(c))&0x7f) - -static inline unsigned char __tolower(unsigned char c) -{ - if (isupper(c)) - c -= 'A'-'a'; - return c; -} - -static inline unsigned char __toupper(unsigned char c) -{ - if (islower(c)) - c -= 'a'-'A'; - return c; -} - -#define tolower(c) __tolower(c) -#define toupper(c) __toupper(c) - -#ifdef __cplusplus -} -#endif - -#endif /* __CTYPE_H */ diff --git a/litex/soc/software/include/base/div64.h b/litex/soc/software/include/base/div64.h deleted file mode 100644 index 2f0754746..000000000 --- a/litex/soc/software/include/base/div64.h +++ /dev/null @@ -1,39 +0,0 @@ -#ifndef _ASM_GENERIC_DIV64_H -#define _ASM_GENERIC_DIV64_H -/* - * Copyright (C) 2003 Bernardo Innocenti - * Based on former asm-ppc/div64.h and asm-m68knommu/div64.h - * - * The semantics of do_div() are: - * - * uint32_t do_div(uint64_t *n, uint32_t base) - * { - * uint32_t remainder = *n % base; - * *n = *n / base; - * return remainder; - * } - * - * NOTE: macro parameter n is evaluated multiple times, - * beware of side effects! - */ - -#include - -extern uint32_t __div64_32(uint64_t *dividend, uint32_t divisor); - -/* The unnecessary pointer compare is there - * to check for type safety (n must be 64bit) - */ -# define do_div(n,base) ({ \ - uint32_t __base = (base); \ - uint32_t __rem; \ - (void)(((typeof((n)) *)0) == ((uint64_t *)0)); \ - if (((n) >> 32) == 0) { \ - __rem = (uint32_t)(n) % __base; \ - (n) = (uint32_t)(n) / __base; \ - } else \ - __rem = __div64_32(&(n), __base); \ - __rem; \ - }) - -#endif /* _ASM_GENERIC_DIV64_H */ diff --git a/litex/soc/software/include/base/endian.h b/litex/soc/software/include/base/endian.h deleted file mode 100644 index 81cf2153f..000000000 --- a/litex/soc/software/include/base/endian.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef __ENDIAN_H -#define __ENDIAN_H - -#ifdef __cplusplus -extern "C" { -#endif - -#define __LITTLE_ENDIAN 0 -#define __BIG_ENDIAN 1 -#define __BYTE_ORDER __BIG_ENDIAN - -static inline unsigned int le32toh(unsigned int val) -{ - return (val & 0xff) << 24 | - (val & 0xff00) << 8 | - (val & 0xff0000) >> 8 | - (val & 0xff000000) >> 24; -} - -static inline unsigned short le16toh(unsigned short val) -{ - return (val & 0xff) << 8 | - (val & 0xff00) >> 8; -} - -#ifdef __cplusplus -} -#endif - -#endif /* __ENDIAN_H */ diff --git a/litex/soc/software/include/base/errno.h b/litex/soc/software/include/base/errno.h deleted file mode 100644 index be05873aa..000000000 --- a/litex/soc/software/include/base/errno.h +++ /dev/null @@ -1,261 +0,0 @@ -#ifndef __ERRNO_H -#define __ERRNO_H - -#ifdef __cplusplus -extern "C" { -#endif - -extern int errno; - -#define EPERM 1 -#define EPERM_STR "Operation not permitted" -#define ENOENT 2 -#define ENOENT_STR "No such file or directory" -#define ESRCH 3 -#define ESRCH_STR "No such process" -#define EINTR 4 -#define EINTR_STR "Interrupted system call" -#define EIO 5 -#define EIO_STR "I/O error" -#define ENXIO 6 -#define ENXIO_STR "No such device or address" -#define E2BIG 7 -#define E2BIG_STR "Arg list too long" -#define ENOEXEC 8 -#define ENOEXEC_STR "Exec format error" -#define EBADF 9 -#define EBADF_STR "Bad file number" -#define ECHILD 10 -#define ECHILD_STR "No child processes" -#define EAGAIN 11 -#define EWOULDBLOCK EAGAIN -#define EAGAIN_STR "Try again" -#define ENOMEM 12 -#define ENOMEM_STR "Out of memory" -#define EACCES 13 -#define EACCES_STR "Permission denied" -#define EFAULT 14 -#define EFAULT_STR "Bad address" -#define ENOTBLK 15 -#define ENOTBLK_STR "Block device required" -#define EBUSY 16 -#define EBUSY_STR "Device or resource busy" -#define EEXIST 17 -#define EEXIST_STR "File exists" -#define EXDEV 18 -#define EXDEV_STR "Cross-device link" -#define ENODEV 19 -#define ENODEV_STR "No such device" -#define ENOTDIR 20 -#define ENOTDIR_STR "Not a directory" -#define EISDIR 21 -#define EISDIR_STR "Is a directory" -#define EINVAL 22 -#define EINVAL_STR "Invalid argument" -#define ENFILE 23 -#define ENFILE_STR "File table overflow" -#define EMFILE 24 -#define EMFILE_STR "Too many open files" -#define ENOTTY 25 -#define ENOTTY_STR "Not a typewriter" -#define ETXTBSY 26 -#define ETXTBSY_STR "Text file busy" -#define EFBIG 27 -#define EFBIG_STR "File too large" -#define ENOSPC 28 -#define ENOSPC_STR "No space left on device" -#define ESPIPE 29 -#define ESPIPE_STR "Illegal seek" -#define EROFS 30 -#define EROFS_STR "Read-only file system" -#define EMLINK 31 -#define EMLINK_STR "Too many links" -#define EPIPE 32 -#define EPIPE_STR "Broken pipe" -#define EDOM 33 -#define EDOM_STR "Math argument out of domain of func" -#define ERANGE 34 -#define ERANGE_STR "Math result not representable" -#define EDEADLK 35 -#define EDEADLOCK EDEADLK -#define EDEADLK_STR "Resource deadlock would occur" -#define ENAMETOOLONG 36 -#define ENAMETOOLONG_STR "File name too long" -#define ENOLCK 37 -#define ENOLCK_STR "No record locks available" -#define ENOSYS 38 -#define ENOSYS_STR "Function not implemented" -#define ENOTEMPTY 39 -#define ENOTEMPTY_STR "Directory not empty" -#define ELOOP 40 -#define ELOOP_STR "Too many symbolic links encountered" -#define ENOMSG 42 -#define ENOMSG_STR "No message of desired type" -#define EIDRM 43 -#define EIDRM_STR "Identifier removed" -#define ECHRNG 44 -#define ECHRNG_STR "Channel number out of range" -#define EL2NSYNC 45 -#define EL2NSYNC_STR "Level 2 not synchronized" -#define EL3HLT 46 -#define EL3HLT_STR "Level 3 halted" -#define EL3RST 47 -#define EL3RST_STR "Level 3 reset" -#define ELNRNG 48 -#define ELNRNG_STR "Link number out of range" -#define EUNATCH 49 -#define EUNATCH_STR "Protocol driver not attached" -#define ENOCSI 50 -#define ENOCSI_STR "No CSI structure available" -#define EL2HLT 51 -#define EL2HLT_STR "Level 2 halted" -#define EBADE 52 -#define EBADE_STR "Invalid exchange" -#define EBADR 53 -#define EBADR_STR "Invalid request descriptor" -#define EXFULL 54 -#define EXFULL_STR "Exchange full" -#define ENOANO 55 -#define ENOANO_STR "No anode" -#define EBADRQC 56 -#define EBADRQC_STR "Invalid request code" -#define EBADSLT 57 -#define EBADSLT_STR "Invalid slot" -#define EBFONT 59 -#define EBFONT_STR "Bad font file format" -#define ENOSTR 60 -#define ENOSTR_STR "Device not a stream" -#define ENODATA 61 -#define ENODATA_STR "No data available" -#define ETIME 62 -#define ETIME_STR "Timer expired" -#define ENOSR 63 -#define ENOSR_STR "Out of streams resources" -#define ENONET 64 -#define ENONET_STR "Machine is not on the network" -#define ENOPKG 65 -#define ENOPKG_STR "Package not installed" -#define EREMOTE 66 -#define EREMOTE_STR "Object is remote" -#define ENOLINK 67 -#define ENOLINK_STR "Link has been severed" -#define EADV 68 -#define EADV_STR "Advertise error" -#define ESRMNT 69 -#define ESRMNT_STR "Srmount error" -#define ECOMM 70 -#define ECOMM_STR "Communication error on send" -#define EPROTO 71 -#define EPROTO_STR "Protocol error" -#define EMULTIHOP 72 -#define EMULTIHOP_STR "Multihop attempted" -#define EDOTDOT 73 -#define EDOTDOT_STR "RFS specific error" -#define EBADMSG 74 -#define EBADMSG_STR "Not a data message" -#define EOVERFLOW 75 -#define EOVERFLOW_STR "Value too large for defined data type" -#define ENOTUNIQ 76 -#define ENOTUNIQ_STR "Name not unique on network" -#define EBADFD 77 -#define EBADFD_STR "File descriptor in bad state" -#define EREMCHG 78 -#define EREMCHG_STR "Remote address changed" -#define ELIBACC 79 -#define ELIBACC_STR "Can not access a needed shared library" -#define ELIBBAD 80 -#define ELIBBAD_STR "Accessing a corrupted shared library" -#define ELIBSCN 81 -#define ELIBSCN_STR ".lib section in a.out corrupted" -#define ELIBMAX 82 -#define ELIBMAX_STR "Attempting to link in too many shared libraries" -#define ELIBEXEC 83 -#define ELIBEXEC_STR "Cannot exec a shared library directly" -#define EILSEQ 84 -#define EILSEQ_STR "Illegal byte sequence" -#define ERESTART 85 -#define ERESTART_STR "Interrupted system call should be restarted" -#define ESTRPIPE 86 -#define ESTRPIPE_STR "Streams pipe error" -#define EUSERS 87 -#define EUSERS_STR "Too many users" -#define ENOTSOCK 88 -#define ENOTSOCK_STR "Socket operation on non-socket" -#define EDESTADDRREQ 89 -#define EDESTADDRREQ_STR "Destination address required" -#define EMSGSIZE 90 -#define EMSGSIZE_STR "Message too long" -#define EPROTOTYPE 91 -#define EPROTOTYPE_STR "Protocol wrong type for socket" -#define ENOPROTOOPT 92 -#define ENOPROTOOPT_STR "Protocol not available" -#define EPROTONOSUPPORT 93 -#define EPROTONOSUPPORT_STR "Protocol not supported" -#define ESOCKTNOSUPPORT 94 -#define ESOCKTNOSUPPORT_STR "Socket type not supported" -#define EOPNOTSUPP 95 -#define EOPNOTSUPP_STR "Operation not supported on transport endpoint" -#define EPFNOSUPPORT 96 -#define EPFNOSUPPORT_STR "Protocol family not supported" -#define EAFNOSUPPORT 97 -#define EAFNOSUPPORT_STR "Address family not supported by protocol" -#define EADDRINUSE 98 -#define EADDRINUSE_STR "Address already in use" -#define EADDRNOTAVAIL 99 -#define EADDRNOTAVAIL_STR "Cannot assign requested address" -#define ENETDOWN 100 -#define ENETDOWN_STR "Network is down" -#define ENETUNREACH 101 -#define ENETUNREACH_STR "Network is unreachable" -#define ENETRESET 102 -#define ENETRESET_STR "Network dropped connection because of reset" -#define ECONNABORTED 103 -#define ECONNABORTED_STR "Software caused connection abort" -#define ECONNRESET 104 -#define ECONNRESET_STR "Connection reset by peer" -#define ENOBUFS 105 -#define ENOBUFS_STR "No buffer space available" -#define EISCONN 106 -#define EISCONN_STR "Transport endpoint is already connected" -#define ENOTCONN 107 -#define ENOTCONN_STR "Transport endpoint is not connected" -#define ESHUTDOWN 108 -#define ESHUTDOWN_STR "Cannot send after transport endpoint shutdown" -#define ETOOMANYREFS 109 -#define ETOOMANYREFS_STR "Too many references: cannot splice" -#define ETIMEDOUT 110 -#define ETIMEDOUT_STR "Connection timed out" -#define ECONNREFUSED 111 -#define ECONNREFUSED_STR "Connection refused" -#define EHOSTDOWN 112 -#define EHOSTDOWN_STR "Host is down" -#define EHOSTUNREACH 113 -#define EHOSTUNREACH_STR "No route to host" -#define EALREADY 114 -#define EALREADY_STR "Operation already in progress" -#define EINPROGRESS 115 -#define EINPROGRESS_STR "Operation now in progress" -#define ESTALE 116 -#define ESTALE_STR "Stale NFS file handle" -#define EUCLEAN 117 -#define EUCLEAN_STR "Structure needs cleaning" -#define ENOTNAM 118 -#define ENOTNAM_STR "Not a XENIX named type file" -#define ENAVAIL 119 -#define ENAVAIL_STR "No XENIX semaphores available" -#define EISNAM 120 -#define EISNAM_STR "Is a named type file" -#define EREMOTEIO 121 -#define EREMOTEIO_STR "Remote I/O error" -#define EDQUOT 122 -#define EDQUOT_STR "Quota exceeded" -#define ENOMEDIUM 123 -#define ENOMEDIUM_STR "No medium found" -#define EMEDIUMTYPE 124 -#define EMEDIUMTYPE_STR "Wrong medium type" - -#ifdef __cplusplus -} -#endif - -#endif /* __ERRNO_H */ diff --git a/litex/soc/software/include/base/float.h b/litex/soc/software/include/base/float.h deleted file mode 100644 index 2d0bf676a..000000000 --- a/litex/soc/software/include/base/float.h +++ /dev/null @@ -1,58 +0,0 @@ -#ifndef __FLOAT_H -#define __FLOAT_H - -#ifdef __cplusplus -extern "C" { -#endif - -#define FLT_EVAL_METHOD __FLT_EVAL_METHOD__ -#define FLT_ROUNDS (__builtin_flt_rounds()) -#define FLT_RADIX __FLT_RADIX__ - -#define FLT_MANT_DIG __FLT_MANT_DIG__ -#define DBL_MANT_DIG __DBL_MANT_DIG__ -#define LDBL_MANT_DIG __LDBL_MANT_DIG__ - -#define DECIMAL_DIG __DECIMAL_DIG__ - -#define FLT_DIG __FLT_DIG__ -#define DBL_DIG __DBL_DIG__ -#define LDBL_DIG __LDBL_DIG__ - -#define FLT_MIN_EXP __FLT_MIN_EXP__ -#define DBL_MIN_EXP __DBL_MIN_EXP__ -#define LDBL_MIN_EXP __LDBL_MIN_EXP__ - -#define FLT_MIN_10_EXP __FLT_MIN_10_EXP__ -#define DBL_MIN_10_EXP __DBL_MIN_10_EXP__ -#define LDBL_MIN_10_EXP __LDBL_MIN_10_EXP__ - -#define FLT_MAX_EXP __FLT_MAX_EXP__ -#define DBL_MAX_EXP __DBL_MAX_EXP__ -#define LDBL_MAX_EXP __LDBL_MAX_EXP__ - -#define FLT_MAX_10_EXP __FLT_MAX_10_EXP__ -#define DBL_MAX_10_EXP __DBL_MAX_10_EXP__ -#define LDBL_MAX_10_EXP __LDBL_MAX_10_EXP__ - -#define FLT_MAX __FLT_MAX__ -#define DBL_MAX __DBL_MAX__ -#define LDBL_MAX __LDBL_MAX__ - -#define FLT_EPSILON __FLT_EPSILON__ -#define DBL_EPSILON __DBL_EPSILON__ -#define LDBL_EPSILON __LDBL_EPSILON__ - -#define FLT_MIN __FLT_MIN__ -#define DBL_MIN __DBL_MIN__ -#define LDBL_MIN __LDBL_MIN__ - -#define FLT_TRUE_MIN __FLT_DENORM_MIN__ -#define DBL_TRUE_MIN __DBL_DENORM_MIN__ -#define LDBL_TRUE_MIN __LDBL_DENORM_MIN__ - -#ifdef __cplusplus -} -#endif - -#endif /* __FLOAT_H */ diff --git a/litex/soc/software/include/base/id.h b/litex/soc/software/include/base/id.h deleted file mode 100644 index bccbd5587..000000000 --- a/litex/soc/software/include/base/id.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef __ID_H -#define __ID_H - -#ifdef __cplusplus -extern "C" { -#endif - -#define IDENT_SIZE 256 -void get_ident(char *ident); - -#ifdef __cplusplus -} -#endif - -#endif /* __ID_H */ diff --git a/litex/soc/software/include/base/inet.h b/litex/soc/software/include/base/inet.h deleted file mode 100644 index 373074719..000000000 --- a/litex/soc/software/include/base/inet.h +++ /dev/null @@ -1,52 +0,0 @@ -/* Copyright © 2005-2014 Rich Felker, et al. - * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files (the - * "Software"), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sublicense, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY - * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, - * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#ifndef __INET_H -#define __INET_H - -#include - -static __inline uint16_t __bswap_16(uint16_t __x) -{ - return (__x<<8) | (__x>>8); -} - -static __inline uint32_t __bswap_32(uint32_t __x) -{ - return (__x>>24) | ((__x>>8)&0xff00) | ((__x<<8)&0xff0000) | (__x<<24); -} - -static __inline uint64_t __bswap_64(uint64_t __x) -{ - return (__bswap_32(__x)+(0ULL<<32)) | __bswap_32(__x>>32); -} - -#define bswap_16(x) __bswap_16(x) -#define bswap_32(x) __bswap_32(x) -#define bswap_64(x) __bswap_64(x) - -uint16_t htons(uint16_t n); -uint32_t htonl(uint32_t n); -uint16_t ntohs(uint16_t n); -uint32_t ntohl(uint32_t n); - -#endif /* __INET_H */ diff --git a/litex/soc/software/include/base/inttypes.h b/litex/soc/software/include/base/inttypes.h deleted file mode 100644 index bc22376a6..000000000 --- a/litex/soc/software/include/base/inttypes.h +++ /dev/null @@ -1,231 +0,0 @@ -/* Copyright (C) 1997-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - . */ - -/* - * ISO C99: 7.8 Format conversion of integer types - */ - -#ifndef __INTTYPES_H -#define __INTTYPES_H - -#include - -# ifdef __LP64__ -# define __PRI64_PREFIX "l" -# define __PRIPTR_PREFIX "l" -# else -# define __PRI64_PREFIX "ll" -# define __PRIPTR_PREFIX -# endif - -/* Macros for printing format specifiers. */ - -/* Decimal notation. */ -# define PRId8 "d" -# define PRId16 "d" -# define PRId32 "d" -# define PRId64 __PRI64_PREFIX "d" - -# define PRIdLEAST8 "d" -# define PRIdLEAST16 "d" -# define PRIdLEAST32 "d" -# define PRIdLEAST64 __PRI64_PREFIX "d" - -# define PRIdFAST8 "d" -# define PRIdFAST16 __PRIPTR_PREFIX "d" -# define PRIdFAST32 __PRIPTR_PREFIX "d" -# define PRIdFAST64 __PRI64_PREFIX "d" - - -# define PRIi8 "i" -# define PRIi16 "i" -# define PRIi32 "i" -# define PRIi64 __PRI64_PREFIX "i" - -# define PRIiLEAST8 "i" -# define PRIiLEAST16 "i" -# define PRIiLEAST32 "i" -# define PRIiLEAST64 __PRI64_PREFIX "i" - -# define PRIiFAST8 "i" -# define PRIiFAST16 __PRIPTR_PREFIX "i" -# define PRIiFAST32 __PRIPTR_PREFIX "i" -# define PRIiFAST64 __PRI64_PREFIX "i" - -/* Octal notation. */ -# define PRIo8 "o" -# define PRIo16 "o" -# define PRIo32 "o" -# define PRIo64 __PRI64_PREFIX "o" - -# define PRIoLEAST8 "o" -# define PRIoLEAST16 "o" -# define PRIoLEAST32 "o" -# define PRIoLEAST64 __PRI64_PREFIX "o" - -# define PRIoFAST8 "o" -# define PRIoFAST16 __PRIPTR_PREFIX "o" -# define PRIoFAST32 __PRIPTR_PREFIX "o" -# define PRIoFAST64 __PRI64_PREFIX "o" - -/* Unsigned integers. */ -# define PRIu8 "u" -# define PRIu16 "u" -# define PRIu32 "u" -# define PRIu64 __PRI64_PREFIX "u" - -# define PRIuLEAST8 "u" -# define PRIuLEAST16 "u" -# define PRIuLEAST32 "u" -# define PRIuLEAST64 __PRI64_PREFIX "u" - -# define PRIuFAST8 "u" -# define PRIuFAST16 __PRIPTR_PREFIX "u" -# define PRIuFAST32 __PRIPTR_PREFIX "u" -# define PRIuFAST64 __PRI64_PREFIX "u" - -/* lowercase hexadecimal notation. */ -# define PRIx8 "x" -# define PRIx16 "x" -# define PRIx32 "x" -# define PRIx64 __PRI64_PREFIX "x" - -# define PRIxLEAST8 "x" -# define PRIxLEAST16 "x" -# define PRIxLEAST32 "x" -# define PRIxLEAST64 __PRI64_PREFIX "x" - -# define PRIxFAST8 "x" -# define PRIxFAST16 __PRIPTR_PREFIX "x" -# define PRIxFAST32 __PRIPTR_PREFIX "x" -# define PRIxFAST64 __PRI64_PREFIX "x" - -/* UPPERCASE hexadecimal notation. */ -# define PRIX8 "X" -# define PRIX16 "X" -# define PRIX32 "X" -# define PRIX64 __PRI64_PREFIX "X" - -# define PRIXLEAST8 "X" -# define PRIXLEAST16 "X" -# define PRIXLEAST32 "X" -# define PRIXLEAST64 __PRI64_PREFIX "X" - -# define PRIXFAST8 "X" -# define PRIXFAST16 __PRIPTR_PREFIX "X" -# define PRIXFAST32 __PRIPTR_PREFIX "X" -# define PRIXFAST64 __PRI64_PREFIX "X" - -/* Macros for printing `intmax_t' and `uintmax_t'. */ -# define PRIdMAX __PRI64_PREFIX "d" -# define PRIiMAX __PRI64_PREFIX "i" -# define PRIoMAX __PRI64_PREFIX "o" -# define PRIuMAX __PRI64_PREFIX "u" -# define PRIxMAX __PRI64_PREFIX "x" -# define PRIXMAX __PRI64_PREFIX "X" - - -/* Macros for printing `intptr_t' and `uintptr_t'. */ -# define PRIdPTR __PRIPTR_PREFIX "d" -# define PRIiPTR __PRIPTR_PREFIX "i" -# define PRIoPTR __PRIPTR_PREFIX "o" -# define PRIuPTR __PRIPTR_PREFIX "u" -# define PRIxPTR __PRIPTR_PREFIX "x" -# define PRIXPTR __PRIPTR_PREFIX "X" - -/* Macros for scanning format specifiers. */ - -/* Signed decimal notation. */ -# define SCNd8 "hhd" -# define SCNd16 "hd" -# define SCNd32 "d" -# define SCNd64 __PRI64_PREFIX "d" - -# define SCNdLEAST8 "hhd" -# define SCNdLEAST16 "hd" -# define SCNdLEAST32 "d" -# define SCNdLEAST64 __PRI64_PREFIX "d" - -# define SCNdFAST8 "hhd" -# define SCNdFAST16 __PRIPTR_PREFIX "d" -# define SCNdFAST32 __PRIPTR_PREFIX "d" -# define SCNdFAST64 __PRI64_PREFIX "d" - -/* Unsigned decimal notation. */ -# define SCNu8 "hhu" -# define SCNu16 "hu" -# define SCNu32 "u" -# define SCNu64 __PRI64_PREFIX "u" - -# define SCNuLEAST8 "hhu" -# define SCNuLEAST16 "hu" -# define SCNuLEAST32 "u" -# define SCNuLEAST64 __PRI64_PREFIX "u" - -# define SCNuFAST8 "hhu" -# define SCNuFAST16 __PRIPTR_PREFIX "u" -# define SCNuFAST32 __PRIPTR_PREFIX "u" -# define SCNuFAST64 __PRI64_PREFIX "u" - -/* Octal notation. */ -# define SCNo8 "hho" -# define SCNo16 "ho" -# define SCNo32 "o" -# define SCNo64 __PRI64_PREFIX "o" - -# define SCNoLEAST8 "hho" -# define SCNoLEAST16 "ho" -# define SCNoLEAST32 "o" -# define SCNoLEAST64 __PRI64_PREFIX "o" - -# define SCNoFAST8 "hho" -# define SCNoFAST16 __PRIPTR_PREFIX "o" -# define SCNoFAST32 __PRIPTR_PREFIX "o" -# define SCNoFAST64 __PRI64_PREFIX "o" - -/* Hexadecimal notation. */ -# define SCNx8 "hhx" -# define SCNx16 "hx" -# define SCNx32 "x" -# define SCNx64 __PRI64_PREFIX "x" - -# define SCNxLEAST8 "hhx" -# define SCNxLEAST16 "hx" -# define SCNxLEAST32 "x" -# define SCNxLEAST64 __PRI64_PREFIX "x" - -# define SCNxFAST8 "hhx" -# define SCNxFAST16 __PRIPTR_PREFIX "x" -# define SCNxFAST32 __PRIPTR_PREFIX "x" -# define SCNxFAST64 __PRI64_PREFIX "x" - - -/* Macros for scanning `intmax_t' and `uintmax_t'. */ -# define SCNdMAX __PRI64_PREFIX "d" -# define SCNiMAX __PRI64_PREFIX "i" -# define SCNoMAX __PRI64_PREFIX "o" -# define SCNuMAX __PRI64_PREFIX "u" -# define SCNxMAX __PRI64_PREFIX "x" - -/* Macros for scaning `intptr_t' and `uintptr_t'. */ -# define SCNdPTR __PRIPTR_PREFIX "d" -# define SCNiPTR __PRIPTR_PREFIX "i" -# define SCNoPTR __PRIPTR_PREFIX "o" -# define SCNuPTR __PRIPTR_PREFIX "u" -# define SCNxPTR __PRIPTR_PREFIX "x" - -#endif /* __INTTYPES_H */ diff --git a/litex/soc/software/include/base/limits.h b/litex/soc/software/include/base/limits.h deleted file mode 100644 index fd5888c3b..000000000 --- a/litex/soc/software/include/base/limits.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef __LIMITS_H -#define __LIMITS_H - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef __LP64__ -#define ULONG_MAX 18446744073709551615UL -#else -#define ULONG_MAX 4294967295UL -#endif - -#define UINT_MAX 4294967295U -#define INT_MIN (-INT_MAX - 1) -#define INT_MAX 2147483647 - -#define USHRT_MAX 65535 -#define SHRT_MIN (-32768) -#define SHRT_MAX 32767 - -#define UCHAR_MAX 255 - -#define CHAR_BIT 8 - -#ifdef __cplusplus -} -#endif - -#endif /* __LIMITS_H */ diff --git a/litex/soc/software/include/base/math.h b/litex/soc/software/include/base/math.h deleted file mode 100644 index f13bf6c67..000000000 --- a/litex/soc/software/include/base/math.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef __MATH_H -#define __MATH_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include "../fdlibm/fdlibm.h" - -#ifdef __cplusplus -} -#endif - -#endif /* __MATH_H */ diff --git a/litex/soc/software/include/base/pthread.h b/litex/soc/software/include/base/pthread.h deleted file mode 100644 index b78aa1e56..000000000 --- a/litex/soc/software/include/base/pthread.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef __PTHREAD_H -#define __PTHREAD_H - -typedef int pthread_rwlock_t; - -#define PTHREAD_RWLOCK_INITIALIZER 0 - -#ifdef __cplusplus -extern "C" { -#endif - -inline int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock) - { return 0; } -inline int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock) - { return 0; } -inline int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock) - { return 0; } -inline int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock) - { return 0; } -int pthread_rwlock_unlock(pthread_rwlock_t *rwlock) - { return 0; } - -#ifdef __cplusplus -} -#endif - -#endif /* __PTHREAD_H */ diff --git a/litex/soc/software/include/base/stdarg.h b/litex/soc/software/include/base/stdarg.h deleted file mode 100644 index 08729e47c..000000000 --- a/litex/soc/software/include/base/stdarg.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef __STDARG_H -#define __STDARG_H - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -#define va_start(v, l) __builtin_va_start((v), l) -#define va_arg(ap, type) __builtin_va_arg((ap), type) -#define va_copy(aq, ap) __builtin_va_copy((aq), (ap)) -#define va_end(ap) __builtin_va_end(ap) -#define va_list __builtin_va_list - -int vsnprintf(char *buf, size_t size, const char *fmt, va_list args); -int vscnprintf(char *buf, size_t size, const char *fmt, va_list args); -int vsprintf(char *buf, const char *fmt, va_list args); -int vprintf(const char *format, va_list ap); - -#ifdef __cplusplus -} -#endif - -#endif /* __STDARG_H */ diff --git a/litex/soc/software/include/base/stdbool.h b/litex/soc/software/include/base/stdbool.h deleted file mode 100644 index d58bb58fd..000000000 --- a/litex/soc/software/include/base/stdbool.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef __STDBOOL_H -#define __STDBOOL_H - -#define bool _Bool -#define true 1 -#define false 0 - -#endif /* __STDBOOL_H */ diff --git a/litex/soc/software/include/base/stddef.h b/litex/soc/software/include/base/stddef.h deleted file mode 100644 index 858d70b3e..000000000 --- a/litex/soc/software/include/base/stddef.h +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef __STDDEF_H -#define __STDDEF_H - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef __cplusplus -#define NULL 0 -#else -#define NULL ((void *)0) -#endif - -#ifdef __LP64__ -typedef unsigned long size_t; -typedef long ptrdiff_t; -#else -typedef unsigned int size_t; -typedef int ptrdiff_t; -#endif - -#define offsetof(type, member) __builtin_offsetof(type, member) - -#ifdef __cplusplus -} -#endif - -#endif /* __STDDEF_H */ diff --git a/litex/soc/software/include/base/stdint.h b/litex/soc/software/include/base/stdint.h deleted file mode 100644 index a17e1739a..000000000 --- a/litex/soc/software/include/base/stdint.h +++ /dev/null @@ -1,63 +0,0 @@ -#ifndef __STDINT_H -#define __STDINT_H - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef __LP64__ -typedef long intptr_t; -typedef unsigned long uintptr_t; -#else -typedef int intptr_t; -typedef unsigned int uintptr_t; -#endif - -typedef unsigned long long uint64_t; -typedef unsigned int uint32_t; -typedef unsigned short uint16_t; -typedef unsigned char uint8_t; - -typedef long long int64_t; -typedef int int32_t; -typedef short int16_t; -typedef signed char int8_t; - -typedef signed char int_least8_t; -typedef unsigned char uint_least8_t; -typedef signed short int_least16_t; -typedef unsigned short uint_least16_t; -typedef signed int int_least32_t; -typedef unsigned int uint_least32_t; -typedef signed long long int_least64_t; -typedef unsigned long long uint_least64_t; - -#define INT8_MAX 127 -#define INT16_MAX 32767 -#define INT32_MAX 2147483647 -#define INT64_MAX 9223372036854775807LL - -#define INT8_MIN -128 -#define INT16_MIN -32768 -#define INT32_MIN (-INT32_MAX - 1) -#define INT64_MIN (-INT64_MAX - 1LL) - -#define UINT8_MAX 255 -#define UINT16_MAX 65535 -#define UINT32_MAX 4294967295U -#define UINT64_MAX 18446744073709551615ULL - -#define __int_c_join(a, b) a ## b -#define __int_c(v, suffix) __int_c_join(v, suffix) -#define __uint_c(v, suffix) __int_c_join(v##U, suffix) - -#define INT64_C(v) __int_c(v, LL) -#define UINT64_C(v) __uint_c(v, LL) -#define INT32_C(v) v -#define UINT32_C(v) v##U - -#ifdef __cplusplus -} -#endif - -#endif /* __STDINT_H */ diff --git a/litex/soc/software/include/base/stdio.h b/litex/soc/software/include/base/stdio.h deleted file mode 100644 index f070cf123..000000000 --- a/litex/soc/software/include/base/stdio.h +++ /dev/null @@ -1,77 +0,0 @@ -#ifndef __STDIO_H -#define __STDIO_H - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -int putchar(int c); -int puts(const char *s); - -int snprintf(char *buf, size_t size, const char *fmt, ...) __attribute__((format(printf, 3, 4))); -int scnprintf(char *buf, size_t size, const char *fmt, ...) __attribute__((format(printf, 3, 4))); -int sprintf(char *buf, const char *fmt, ...) __attribute__((format(printf, 2, 3))); - -int printf(const char *fmt, ...) __attribute__((format(printf, 1, 2))); - -/* Not sure this belongs here... */ -typedef long long loff_t; -typedef long off_t; -typedef int mode_t; -typedef int dev_t; - -/* - * Note: this library does not provide FILE operations. - * User code must implement them. - */ - -#ifndef BUFSIZ -#define BUFSIZ 1024 -#endif - -#ifndef EOF -#define EOF -1 -#endif - -#ifndef SEEK_SET -#define SEEK_SET 0 -#endif - -#ifndef SEEK_CUR -#define SEEK_CUR 1 -#endif - -#ifndef SEEK_END -#define SEEK_END 2 -#endif - -typedef int FILE; - -extern FILE *stdin; -extern FILE *stdout; -extern FILE *stderr; - -int fprintf(FILE *stream, const char *format, ...) __attribute__((format(printf, 2, 3))); -int fflush(FILE *stream); - -FILE *fopen(const char *path, const char *mode); -FILE *freopen(const char *path, const char *mode, FILE *stream); -char *fgets(char *s, int size, FILE *stream); -size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream); -size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream); -int getc(FILE *stream); -int fputc(int c, FILE *stream); -int ferror(FILE *stream); -int feof(FILE *stream); -int fclose(FILE *fp); - -int fseek(FILE *stream, long offset, int whence); -long ftell(FILE *stream); - -#ifdef __cplusplus -} -#endif - -#endif /* __STDIO_H */ diff --git a/litex/soc/software/include/base/stdlib.h b/litex/soc/software/include/base/stdlib.h deleted file mode 100644 index a8af6cdf2..000000000 --- a/litex/soc/software/include/base/stdlib.h +++ /dev/null @@ -1,85 +0,0 @@ -/* - * MiSoC - * Copyright (C) 2007, 2008, 2009, 2011 Sebastien Bourdeauducq - * Copyright (C) Linux kernel developers - * - * 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, version 3 of the License. - * - * 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, see . - */ - -#ifndef __STDLIB_H -#define __STDLIB_H - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -#define PRINTF_ZEROPAD 1 /* pad with zero */ -#define PRINTF_SIGN 2 /* unsigned/signed long */ -#define PRINTF_PLUS 4 /* show plus */ -#define PRINTF_SPACE 8 /* space if plus */ -#define PRINTF_LEFT 16 /* left justified */ -#define PRINTF_SPECIAL 32 /* 0x */ -#define PRINTF_LARGE 64 /* use 'ABCDEF' instead of 'abcdef' */ - -#define likely(x) x -#define unlikely(x) x - -static inline int abs(int x) -{ - return x > 0 ? x : -x; -} - -static inline long int labs(long int x) -{ - return x > 0 ? x : -x; -} - -unsigned long strtoul(const char *nptr, char **endptr, unsigned int base); -long strtol(const char *nptr, char **endptr, int base); -double strtod(const char *str, char **endptr); - -int skip_atoi(const char **s); -static inline int atoi(const char *nptr) { - return strtol(nptr, NULL, 10); -} -static inline long atol(const char *nptr) { - return (long)atoi(nptr); -} -char *number(char *buf, char *end, unsigned long num, int base, int size, int precision, int type); - -#define RAND_MAX 2147483647 - -unsigned int rand(void); -void srand(unsigned int seed); -void abort(void) __attribute__((noreturn)); - -void qsort(void *base, size_t nmemb, size_t size, int(*compar)(const void *, const void *)); - -/* - * The following functions are not provided by this library. - */ - -char *getenv(const char *name); - -void *malloc(size_t size); -void *calloc(size_t nmemb, size_t size); -void free(void *ptr); -void *realloc(void *ptr, size_t size); - -#ifdef __cplusplus -} -#endif - -#endif /* __STDLIB_H */ diff --git a/litex/soc/software/include/base/string.h b/litex/soc/software/include/base/string.h deleted file mode 100644 index 2c45c87fe..000000000 --- a/litex/soc/software/include/base/string.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * MiSoC - * Copyright (C) 2007, 2008, 2009, 2010 Sebastien Bourdeauducq - * Copyright (C) Linus Torvalds and Linux kernel developers - * - * 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, version 3 of the License. - * - * 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, see . - */ - -#ifndef __STRING_H -#define __STRING_H - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -char *strchr(const char *s, int c); -char *strpbrk(const char *,const char *); -char *strrchr(const char *s, int c); -char *strnchr(const char *s, size_t count, int c); -char *strcpy(char *dest, const char *src); -char *strncpy(char *dest, const char *src, size_t count); -int strcmp(const char *cs, const char *ct); -int strncmp(const char *cs, const char *ct, size_t count); -int strcasecmp(const char *cs, const char *ct); -char *strcat(char *dest, const char *src); -char *strncat(char *dest, const char *src, size_t n); -size_t strlen(const char *s); -size_t strnlen(const char *s, size_t count); -size_t strspn(const char *s, const char *accept); -int memcmp(const void *cs, const void *ct, size_t count); -void *memset(void *s, int c, size_t count); -void *memcpy(void *to, const void *from, size_t n); -void *memmove(void *dest, const void *src, size_t count); -char *strstr(const char *s1, const char *s2); -void *memchr(const void *s, int c, size_t n); - -char *strerror(int errnum); - -#ifdef __cplusplus -} -#endif - -#endif /* __STRING_H */ diff --git a/litex/soc/software/include/base/time.h b/litex/soc/software/include/base/time.h deleted file mode 100644 index 34083902c..000000000 --- a/litex/soc/software/include/base/time.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef __TIME_H -#define __TIME_H - -#ifdef __cplusplus -extern "C" { -#endif - -void time_init(void); -int elapsed(int *last_event, int period); - -#ifdef __cplusplus -} -#endif - -#endif /* __TIME_H */ diff --git a/litex/soc/software/include/basec++/algorithm b/litex/soc/software/include/basec++/algorithm deleted file mode 100644 index cb9b61423..000000000 --- a/litex/soc/software/include/basec++/algorithm +++ /dev/null @@ -1,4 +0,0 @@ -#ifndef __CXX_ALGORITHM -#define __CXX_ALGORITHM - -#endif /* __CXX_ALGORITHM */ diff --git a/litex/soc/software/include/basec++/cstddef b/litex/soc/software/include/basec++/cstddef deleted file mode 100644 index 5291f1b6a..000000000 --- a/litex/soc/software/include/basec++/cstddef +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef __CXX_CSTDDEF -#define __CXX_CSTDDEF - -#include - -namespace std { - using ::size_t; - using ::ptrdiff_t; -} - -#endif /* __CXX_CSTDDEF */ diff --git a/litex/soc/software/include/basec++/cstdlib b/litex/soc/software/include/basec++/cstdlib deleted file mode 100644 index 6501ea9fe..000000000 --- a/litex/soc/software/include/basec++/cstdlib +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef __CXX_CSTDLIB -#define __CXX_CSTDLIB - -#include - -#endif /* __CXX_CSTDLIB */ diff --git a/litex/soc/software/include/basec++/new b/litex/soc/software/include/basec++/new deleted file mode 100644 index aa2f1a8d7..000000000 --- a/litex/soc/software/include/basec++/new +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef __CXX_NEW -#define __CXX_NEW - -#include - -inline void* operator new (std::size_t size, void* ptr) noexcept - { return ptr; } - -#endif /* __CXX_NEW */ diff --git a/litex/soc/software/include/dyld/dlfcn.h b/litex/soc/software/include/dyld/dlfcn.h deleted file mode 100644 index cf679f79d..000000000 --- a/litex/soc/software/include/dyld/dlfcn.h +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef __DLFCN_H -#define __DLFCN_H - -typedef struct -{ - const char *dli_fname; /* File name of defining object. */ - void *dli_fbase; /* Load address of that object. */ - const char *dli_sname; /* Name of nearest symbol. */ - void *dli_saddr; /* Exact value of nearest symbol. */ -} Dl_info; - -#ifdef __cplusplus -extern "C" { -#endif - -extern int dl_iterate_phdr (int (*__callback) (struct dl_phdr_info *, - size_t, void *), - void *__data); - -/* Fill in *INFO with the following information about ADDRESS. - Returns 0 iff no shared object's segments contain that address. */ -extern int dladdr (const void *__address, Dl_info *__info); - -#ifdef __cplusplus -} -#endif - -#endif /* __DLFCN_H */ diff --git a/litex/soc/software/include/dyld/dyld.h b/litex/soc/software/include/dyld/dyld.h deleted file mode 100644 index 5d3e6f340..000000000 --- a/litex/soc/software/include/dyld/dyld.h +++ /dev/null @@ -1,31 +0,0 @@ -#ifndef __DYLD_H -#define __DYLD_H - -#include - -struct dyld_info { - Elf32_Addr base; - const char *strtab; - const Elf32_Sym *symtab; - struct { - Elf32_Word nbucket; - Elf32_Word nchain; - const Elf32_Word *bucket; - const Elf32_Word *chain; - } hash; -}; - -#ifdef __cplusplus -extern "C" { -#endif - -int dyld_load(const void *shlib, Elf32_Addr base, - Elf32_Addr (*resolve)(void *, const char *), void *resolve_data, - struct dyld_info *info, const char **error_out); -void *dyld_lookup(const char *symbol, struct dyld_info *info); - -#ifdef __cplusplus -} -#endif - -#endif /* __DYLD_H */ diff --git a/litex/soc/software/include/dyld/elf.h b/litex/soc/software/include/dyld/elf.h deleted file mode 100644 index c84c28a1e..000000000 --- a/litex/soc/software/include/dyld/elf.h +++ /dev/null @@ -1,3343 +0,0 @@ -/* This file defines standard ELF types, structures, and macros. - Copyright (C) 1995-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - . */ - -#ifndef _ELF_H -#define _ELF_H 1 - -#ifdef __cplusplus -extern "C" { -#endif - -/* Standard ELF types. */ - -#include - -/* Type for a 16-bit quantity. */ -typedef uint16_t Elf32_Half; -typedef uint16_t Elf64_Half; - -/* Types for signed and unsigned 32-bit quantities. */ -typedef uint32_t Elf32_Word; -typedef int32_t Elf32_Sword; -typedef uint32_t Elf64_Word; -typedef int32_t Elf64_Sword; - -/* Types for signed and unsigned 64-bit quantities. */ -typedef uint64_t Elf32_Xword; -typedef int64_t Elf32_Sxword; -typedef uint64_t Elf64_Xword; -typedef int64_t Elf64_Sxword; - -/* Type of addresses. */ -typedef uint32_t Elf32_Addr; -typedef uint64_t Elf64_Addr; - -/* Type of file offsets. */ -typedef uint32_t Elf32_Off; -typedef uint64_t Elf64_Off; - -/* Type for section indices, which are 16-bit quantities. */ -typedef uint16_t Elf32_Section; -typedef uint16_t Elf64_Section; - -/* Type for version symbol information. */ -typedef Elf32_Half Elf32_Versym; -typedef Elf64_Half Elf64_Versym; - - -/* The ELF file header. This appears at the start of every ELF file. */ - -#define EI_NIDENT (16) - -typedef struct -{ - unsigned char e_ident[EI_NIDENT]; /* Magic number and other info */ - Elf32_Half e_type; /* Object file type */ - Elf32_Half e_machine; /* Architecture */ - Elf32_Word e_version; /* Object file version */ - Elf32_Addr e_entry; /* Entry point virtual address */ - Elf32_Off e_phoff; /* Program header table file offset */ - Elf32_Off e_shoff; /* Section header table file offset */ - Elf32_Word e_flags; /* Processor-specific flags */ - Elf32_Half e_ehsize; /* ELF header size in bytes */ - Elf32_Half e_phentsize; /* Program header table entry size */ - Elf32_Half e_phnum; /* Program header table entry count */ - Elf32_Half e_shentsize; /* Section header table entry size */ - Elf32_Half e_shnum; /* Section header table entry count */ - Elf32_Half e_shstrndx; /* Section header string table index */ -} Elf32_Ehdr; - -typedef struct -{ - unsigned char e_ident[EI_NIDENT]; /* Magic number and other info */ - Elf64_Half e_type; /* Object file type */ - Elf64_Half e_machine; /* Architecture */ - Elf64_Word e_version; /* Object file version */ - Elf64_Addr e_entry; /* Entry point virtual address */ - Elf64_Off e_phoff; /* Program header table file offset */ - Elf64_Off e_shoff; /* Section header table file offset */ - Elf64_Word e_flags; /* Processor-specific flags */ - Elf64_Half e_ehsize; /* ELF header size in bytes */ - Elf64_Half e_phentsize; /* Program header table entry size */ - Elf64_Half e_phnum; /* Program header table entry count */ - Elf64_Half e_shentsize; /* Section header table entry size */ - Elf64_Half e_shnum; /* Section header table entry count */ - Elf64_Half e_shstrndx; /* Section header string table index */ -} Elf64_Ehdr; - -/* Fields in the e_ident array. The EI_* macros are indices into the - array. The macros under each EI_* macro are the values the byte - may have. */ - -#define EI_MAG0 0 /* File identification byte 0 index */ -#define ELFMAG0 0x7f /* Magic number byte 0 */ - -#define EI_MAG1 1 /* File identification byte 1 index */ -#define ELFMAG1 'E' /* Magic number byte 1 */ - -#define EI_MAG2 2 /* File identification byte 2 index */ -#define ELFMAG2 'L' /* Magic number byte 2 */ - -#define EI_MAG3 3 /* File identification byte 3 index */ -#define ELFMAG3 'F' /* Magic number byte 3 */ - -/* Conglomeration of the identification bytes, for easy testing as a word. */ -#define ELFMAG "\177ELF" -#define SELFMAG 4 - -#define EI_CLASS 4 /* File class byte index */ -#define ELFCLASSNONE 0 /* Invalid class */ -#define ELFCLASS32 1 /* 32-bit objects */ -#define ELFCLASS64 2 /* 64-bit objects */ -#define ELFCLASSNUM 3 - -#define EI_DATA 5 /* Data encoding byte index */ -#define ELFDATANONE 0 /* Invalid data encoding */ -#define ELFDATA2LSB 1 /* 2's complement, little endian */ -#define ELFDATA2MSB 2 /* 2's complement, big endian */ -#define ELFDATANUM 3 - -#define EI_VERSION 6 /* File version byte index */ - /* Value must be EV_CURRENT */ - -#define EI_OSABI 7 /* OS ABI identification */ -#define ELFOSABI_NONE 0 /* UNIX System V ABI */ -#define ELFOSABI_SYSV 0 /* Alias. */ -#define ELFOSABI_HPUX 1 /* HP-UX */ -#define ELFOSABI_NETBSD 2 /* NetBSD. */ -#define ELFOSABI_GNU 3 /* Object uses GNU ELF extensions. */ -#define ELFOSABI_LINUX ELFOSABI_GNU /* Compatibility alias. */ -#define ELFOSABI_SOLARIS 6 /* Sun Solaris. */ -#define ELFOSABI_AIX 7 /* IBM AIX. */ -#define ELFOSABI_IRIX 8 /* SGI Irix. */ -#define ELFOSABI_FREEBSD 9 /* FreeBSD. */ -#define ELFOSABI_TRU64 10 /* Compaq TRU64 UNIX. */ -#define ELFOSABI_MODESTO 11 /* Novell Modesto. */ -#define ELFOSABI_OPENBSD 12 /* OpenBSD. */ -#define ELFOSABI_ARM_AEABI 64 /* ARM EABI */ -#define ELFOSABI_ARM 97 /* ARM */ -#define ELFOSABI_STANDALONE 255 /* Standalone (embedded) application */ - -#define EI_ABIVERSION 8 /* ABI version */ - -#define EI_PAD 9 /* Byte index of padding bytes */ - -/* Legal values for e_type (object file type). */ - -#define ET_NONE 0 /* No file type */ -#define ET_REL 1 /* Relocatable file */ -#define ET_EXEC 2 /* Executable file */ -#define ET_DYN 3 /* Shared object file */ -#define ET_CORE 4 /* Core file */ -#define ET_NUM 5 /* Number of defined types */ -#define ET_LOOS 0xfe00 /* OS-specific range start */ -#define ET_HIOS 0xfeff /* OS-specific range end */ -#define ET_LOPROC 0xff00 /* Processor-specific range start */ -#define ET_HIPROC 0xffff /* Processor-specific range end */ - -/* Legal values for e_machine (architecture). */ - -#define EM_NONE 0 /* No machine */ -#define EM_M32 1 /* AT&T WE 32100 */ -#define EM_SPARC 2 /* SUN SPARC */ -#define EM_386 3 /* Intel 80386 */ -#define EM_68K 4 /* Motorola m68k family */ -#define EM_88K 5 /* Motorola m88k family */ -#define EM_860 7 /* Intel 80860 */ -#define EM_MIPS 8 /* MIPS R3000 big-endian */ -#define EM_S370 9 /* IBM System/370 */ -#define EM_MIPS_RS3_LE 10 /* MIPS R3000 little-endian */ - -#define EM_PARISC 15 /* HPPA */ -#define EM_VPP500 17 /* Fujitsu VPP500 */ -#define EM_SPARC32PLUS 18 /* Sun's "v8plus" */ -#define EM_960 19 /* Intel 80960 */ -#define EM_PPC 20 /* PowerPC */ -#define EM_PPC64 21 /* PowerPC 64-bit */ -#define EM_S390 22 /* IBM S390 */ - -#define EM_V800 36 /* NEC V800 series */ -#define EM_FR20 37 /* Fujitsu FR20 */ -#define EM_RH32 38 /* TRW RH-32 */ -#define EM_RCE 39 /* Motorola RCE */ -#define EM_ARM 40 /* ARM */ -#define EM_FAKE_ALPHA 41 /* Digital Alpha */ -#define EM_SH 42 /* Hitachi SH */ -#define EM_SPARCV9 43 /* SPARC v9 64-bit */ -#define EM_TRICORE 44 /* Siemens Tricore */ -#define EM_ARC 45 /* Argonaut RISC Core */ -#define EM_H8_300 46 /* Hitachi H8/300 */ -#define EM_H8_300H 47 /* Hitachi H8/300H */ -#define EM_H8S 48 /* Hitachi H8S */ -#define EM_H8_500 49 /* Hitachi H8/500 */ -#define EM_IA_64 50 /* Intel Merced */ -#define EM_MIPS_X 51 /* Stanford MIPS-X */ -#define EM_COLDFIRE 52 /* Motorola Coldfire */ -#define EM_68HC12 53 /* Motorola M68HC12 */ -#define EM_MMA 54 /* Fujitsu MMA Multimedia Accelerator*/ -#define EM_PCP 55 /* Siemens PCP */ -#define EM_NCPU 56 /* Sony nCPU embeeded RISC */ -#define EM_NDR1 57 /* Denso NDR1 microprocessor */ -#define EM_STARCORE 58 /* Motorola Start*Core processor */ -#define EM_ME16 59 /* Toyota ME16 processor */ -#define EM_ST100 60 /* STMicroelectronic ST100 processor */ -#define EM_TINYJ 61 /* Advanced Logic Corp. Tinyj emb.fam*/ -#define EM_X86_64 62 /* AMD x86-64 architecture */ -#define EM_PDSP 63 /* Sony DSP Processor */ - -#define EM_FX66 66 /* Siemens FX66 microcontroller */ -#define EM_ST9PLUS 67 /* STMicroelectronics ST9+ 8/16 mc */ -#define EM_ST7 68 /* STmicroelectronics ST7 8 bit mc */ -#define EM_68HC16 69 /* Motorola MC68HC16 microcontroller */ -#define EM_68HC11 70 /* Motorola MC68HC11 microcontroller */ -#define EM_68HC08 71 /* Motorola MC68HC08 microcontroller */ -#define EM_68HC05 72 /* Motorola MC68HC05 microcontroller */ -#define EM_SVX 73 /* Silicon Graphics SVx */ -#define EM_ST19 74 /* STMicroelectronics ST19 8 bit mc */ -#define EM_VAX 75 /* Digital VAX */ -#define EM_CRIS 76 /* Axis Communications 32-bit embedded processor */ -#define EM_JAVELIN 77 /* Infineon Technologies 32-bit embedded processor */ -#define EM_FIREPATH 78 /* Element 14 64-bit DSP Processor */ -#define EM_ZSP 79 /* LSI Logic 16-bit DSP Processor */ -#define EM_MMIX 80 /* Donald Knuth's educational 64-bit processor */ -#define EM_HUANY 81 /* Harvard University machine-independent object files */ -#define EM_PRISM 82 /* SiTera Prism */ -#define EM_AVR 83 /* Atmel AVR 8-bit microcontroller */ -#define EM_FR30 84 /* Fujitsu FR30 */ -#define EM_D10V 85 /* Mitsubishi D10V */ -#define EM_D30V 86 /* Mitsubishi D30V */ -#define EM_V850 87 /* NEC v850 */ -#define EM_M32R 88 /* Mitsubishi M32R */ -#define EM_MN10300 89 /* Matsushita MN10300 */ -#define EM_MN10200 90 /* Matsushita MN10200 */ -#define EM_PJ 91 /* picoJava */ -#define EM_OPENRISC 92 /* OpenRISC 32-bit embedded processor */ -#define EM_ARC_A5 93 /* ARC Cores Tangent-A5 */ -#define EM_XTENSA 94 /* Tensilica Xtensa Architecture */ -#define EM_AARCH64 183 /* ARM AARCH64 */ -#define EM_TILEPRO 188 /* Tilera TILEPro */ -#define EM_MICROBLAZE 189 /* Xilinx MicroBlaze */ -#define EM_TILEGX 191 /* Tilera TILE-Gx */ -#define EM_NUM 192 - -/* If it is necessary to assign new unofficial EM_* values, please - pick large random numbers (0x8523, 0xa7f2, etc.) to minimize the - chances of collision with official or non-GNU unofficial values. */ - -#define EM_ALPHA 0x9026 - -/* Legal values for e_version (version). */ - -#define EV_NONE 0 /* Invalid ELF version */ -#define EV_CURRENT 1 /* Current version */ -#define EV_NUM 2 - -/* Section header. */ - -typedef struct -{ - Elf32_Word sh_name; /* Section name (string tbl index) */ - Elf32_Word sh_type; /* Section type */ - Elf32_Word sh_flags; /* Section flags */ - Elf32_Addr sh_addr; /* Section virtual addr at execution */ - Elf32_Off sh_offset; /* Section file offset */ - Elf32_Word sh_size; /* Section size in bytes */ - Elf32_Word sh_link; /* Link to another section */ - Elf32_Word sh_info; /* Additional section information */ - Elf32_Word sh_addralign; /* Section alignment */ - Elf32_Word sh_entsize; /* Entry size if section holds table */ -} Elf32_Shdr; - -typedef struct -{ - Elf64_Word sh_name; /* Section name (string tbl index) */ - Elf64_Word sh_type; /* Section type */ - Elf64_Xword sh_flags; /* Section flags */ - Elf64_Addr sh_addr; /* Section virtual addr at execution */ - Elf64_Off sh_offset; /* Section file offset */ - Elf64_Xword sh_size; /* Section size in bytes */ - Elf64_Word sh_link; /* Link to another section */ - Elf64_Word sh_info; /* Additional section information */ - Elf64_Xword sh_addralign; /* Section alignment */ - Elf64_Xword sh_entsize; /* Entry size if section holds table */ -} Elf64_Shdr; - -/* Special section indices. */ - -#define SHN_UNDEF 0 /* Undefined section */ -#define SHN_LORESERVE 0xff00 /* Start of reserved indices */ -#define SHN_LOPROC 0xff00 /* Start of processor-specific */ -#define SHN_BEFORE 0xff00 /* Order section before all others - (Solaris). */ -#define SHN_AFTER 0xff01 /* Order section after all others - (Solaris). */ -#define SHN_HIPROC 0xff1f /* End of processor-specific */ -#define SHN_LOOS 0xff20 /* Start of OS-specific */ -#define SHN_HIOS 0xff3f /* End of OS-specific */ -#define SHN_ABS 0xfff1 /* Associated symbol is absolute */ -#define SHN_COMMON 0xfff2 /* Associated symbol is common */ -#define SHN_XINDEX 0xffff /* Index is in extra table. */ -#define SHN_HIRESERVE 0xffff /* End of reserved indices */ - -/* Legal values for sh_type (section type). */ - -#define SHT_NULL 0 /* Section header table entry unused */ -#define SHT_PROGBITS 1 /* Program data */ -#define SHT_SYMTAB 2 /* Symbol table */ -#define SHT_STRTAB 3 /* String table */ -#define SHT_RELA 4 /* Relocation entries with addends */ -#define SHT_HASH 5 /* Symbol hash table */ -#define SHT_DYNAMIC 6 /* Dynamic linking information */ -#define SHT_NOTE 7 /* Notes */ -#define SHT_NOBITS 8 /* Program space with no data (bss) */ -#define SHT_REL 9 /* Relocation entries, no addends */ -#define SHT_SHLIB 10 /* Reserved */ -#define SHT_DYNSYM 11 /* Dynamic linker symbol table */ -#define SHT_INIT_ARRAY 14 /* Array of constructors */ -#define SHT_FINI_ARRAY 15 /* Array of destructors */ -#define SHT_PREINIT_ARRAY 16 /* Array of pre-constructors */ -#define SHT_GROUP 17 /* Section group */ -#define SHT_SYMTAB_SHNDX 18 /* Extended section indeces */ -#define SHT_NUM 19 /* Number of defined types. */ -#define SHT_LOOS 0x60000000 /* Start OS-specific. */ -#define SHT_GNU_ATTRIBUTES 0x6ffffff5 /* Object attributes. */ -#define SHT_GNU_HASH 0x6ffffff6 /* GNU-style hash table. */ -#define SHT_GNU_LIBLIST 0x6ffffff7 /* Prelink library list */ -#define SHT_CHECKSUM 0x6ffffff8 /* Checksum for DSO content. */ -#define SHT_LOSUNW 0x6ffffffa /* Sun-specific low bound. */ -#define SHT_SUNW_move 0x6ffffffa -#define SHT_SUNW_COMDAT 0x6ffffffb -#define SHT_SUNW_syminfo 0x6ffffffc -#define SHT_GNU_verdef 0x6ffffffd /* Version definition section. */ -#define SHT_GNU_verneed 0x6ffffffe /* Version needs section. */ -#define SHT_GNU_versym 0x6fffffff /* Version symbol table. */ -#define SHT_HISUNW 0x6fffffff /* Sun-specific high bound. */ -#define SHT_HIOS 0x6fffffff /* End OS-specific type */ -#define SHT_LOPROC 0x70000000 /* Start of processor-specific */ -#define SHT_HIPROC 0x7fffffff /* End of processor-specific */ -#define SHT_LOUSER 0x80000000 /* Start of application-specific */ -#define SHT_HIUSER 0x8fffffff /* End of application-specific */ - -/* Legal values for sh_flags (section flags). */ - -#define SHF_WRITE (1 << 0) /* Writable */ -#define SHF_ALLOC (1 << 1) /* Occupies memory during execution */ -#define SHF_EXECINSTR (1 << 2) /* Executable */ -#define SHF_MERGE (1 << 4) /* Might be merged */ -#define SHF_STRINGS (1 << 5) /* Contains nul-terminated strings */ -#define SHF_INFO_LINK (1 << 6) /* `sh_info' contains SHT index */ -#define SHF_LINK_ORDER (1 << 7) /* Preserve order after combining */ -#define SHF_OS_NONCONFORMING (1 << 8) /* Non-standard OS specific handling - required */ -#define SHF_GROUP (1 << 9) /* Section is member of a group. */ -#define SHF_TLS (1 << 10) /* Section hold thread-local data. */ -#define SHF_MASKOS 0x0ff00000 /* OS-specific. */ -#define SHF_MASKPROC 0xf0000000 /* Processor-specific */ -#define SHF_ORDERED (1 << 30) /* Special ordering requirement - (Solaris). */ -#define SHF_EXCLUDE (1 << 31) /* Section is excluded unless - referenced or allocated (Solaris).*/ - -/* Section group handling. */ -#define GRP_COMDAT 0x1 /* Mark group as COMDAT. */ - -/* Symbol table entry. */ - -typedef struct -{ - Elf32_Word st_name; /* Symbol name (string tbl index) */ - Elf32_Addr st_value; /* Symbol value */ - Elf32_Word st_size; /* Symbol size */ - unsigned char st_info; /* Symbol type and binding */ - unsigned char st_other; /* Symbol visibility */ - Elf32_Section st_shndx; /* Section index */ -} Elf32_Sym; - -typedef struct -{ - Elf64_Word st_name; /* Symbol name (string tbl index) */ - unsigned char st_info; /* Symbol type and binding */ - unsigned char st_other; /* Symbol visibility */ - Elf64_Section st_shndx; /* Section index */ - Elf64_Addr st_value; /* Symbol value */ - Elf64_Xword st_size; /* Symbol size */ -} Elf64_Sym; - -/* The syminfo section if available contains additional information about - every dynamic symbol. */ - -typedef struct -{ - Elf32_Half si_boundto; /* Direct bindings, symbol bound to */ - Elf32_Half si_flags; /* Per symbol flags */ -} Elf32_Syminfo; - -typedef struct -{ - Elf64_Half si_boundto; /* Direct bindings, symbol bound to */ - Elf64_Half si_flags; /* Per symbol flags */ -} Elf64_Syminfo; - -/* Possible values for si_boundto. */ -#define SYMINFO_BT_SELF 0xffff /* Symbol bound to self */ -#define SYMINFO_BT_PARENT 0xfffe /* Symbol bound to parent */ -#define SYMINFO_BT_LOWRESERVE 0xff00 /* Beginning of reserved entries */ - -/* Possible bitmasks for si_flags. */ -#define SYMINFO_FLG_DIRECT 0x0001 /* Direct bound symbol */ -#define SYMINFO_FLG_PASSTHRU 0x0002 /* Pass-thru symbol for translator */ -#define SYMINFO_FLG_COPY 0x0004 /* Symbol is a copy-reloc */ -#define SYMINFO_FLG_LAZYLOAD 0x0008 /* Symbol bound to object to be lazy - loaded */ -/* Syminfo version values. */ -#define SYMINFO_NONE 0 -#define SYMINFO_CURRENT 1 -#define SYMINFO_NUM 2 - - -/* How to extract and insert information held in the st_info field. */ - -#define ELF32_ST_BIND(val) (((unsigned char) (val)) >> 4) -#define ELF32_ST_TYPE(val) ((val) & 0xf) -#define ELF32_ST_INFO(bind, type) (((bind) << 4) + ((type) & 0xf)) - -/* Both Elf32_Sym and Elf64_Sym use the same one-byte st_info field. */ -#define ELF64_ST_BIND(val) ELF32_ST_BIND (val) -#define ELF64_ST_TYPE(val) ELF32_ST_TYPE (val) -#define ELF64_ST_INFO(bind, type) ELF32_ST_INFO ((bind), (type)) - -/* Legal values for ST_BIND subfield of st_info (symbol binding). */ - -#define STB_LOCAL 0 /* Local symbol */ -#define STB_GLOBAL 1 /* Global symbol */ -#define STB_WEAK 2 /* Weak symbol */ -#define STB_NUM 3 /* Number of defined types. */ -#define STB_LOOS 10 /* Start of OS-specific */ -#define STB_GNU_UNIQUE 10 /* Unique symbol. */ -#define STB_HIOS 12 /* End of OS-specific */ -#define STB_LOPROC 13 /* Start of processor-specific */ -#define STB_HIPROC 15 /* End of processor-specific */ - -/* Legal values for ST_TYPE subfield of st_info (symbol type). */ - -#define STT_NOTYPE 0 /* Symbol type is unspecified */ -#define STT_OBJECT 1 /* Symbol is a data object */ -#define STT_FUNC 2 /* Symbol is a code object */ -#define STT_SECTION 3 /* Symbol associated with a section */ -#define STT_FILE 4 /* Symbol's name is file name */ -#define STT_COMMON 5 /* Symbol is a common data object */ -#define STT_TLS 6 /* Symbol is thread-local data object*/ -#define STT_NUM 7 /* Number of defined types. */ -#define STT_LOOS 10 /* Start of OS-specific */ -#define STT_GNU_IFUNC 10 /* Symbol is indirect code object */ -#define STT_HIOS 12 /* End of OS-specific */ -#define STT_LOPROC 13 /* Start of processor-specific */ -#define STT_HIPROC 15 /* End of processor-specific */ - - -/* Symbol table indices are found in the hash buckets and chain table - of a symbol hash table section. This special index value indicates - the end of a chain, meaning no further symbols are found in that bucket. */ - -#define STN_UNDEF 0 /* End of a chain. */ - - -/* How to extract and insert information held in the st_other field. */ - -#define ELF32_ST_VISIBILITY(o) ((o) & 0x03) - -/* For ELF64 the definitions are the same. */ -#define ELF64_ST_VISIBILITY(o) ELF32_ST_VISIBILITY (o) - -/* Symbol visibility specification encoded in the st_other field. */ -#define STV_DEFAULT 0 /* Default symbol visibility rules */ -#define STV_INTERNAL 1 /* Processor specific hidden class */ -#define STV_HIDDEN 2 /* Sym unavailable in other modules */ -#define STV_PROTECTED 3 /* Not preemptible, not exported */ - - -/* Relocation table entry without addend (in section of type SHT_REL). */ - -typedef struct -{ - Elf32_Addr r_offset; /* Address */ - Elf32_Word r_info; /* Relocation type and symbol index */ -} Elf32_Rel; - -/* I have seen two different definitions of the Elf64_Rel and - Elf64_Rela structures, so we'll leave them out until Novell (or - whoever) gets their act together. */ -/* The following, at least, is used on Sparc v9, MIPS, and Alpha. */ - -typedef struct -{ - Elf64_Addr r_offset; /* Address */ - Elf64_Xword r_info; /* Relocation type and symbol index */ -} Elf64_Rel; - -/* Relocation table entry with addend (in section of type SHT_RELA). */ - -typedef struct -{ - Elf32_Addr r_offset; /* Address */ - Elf32_Word r_info; /* Relocation type and symbol index */ - Elf32_Sword r_addend; /* Addend */ -} Elf32_Rela; - -typedef struct -{ - Elf64_Addr r_offset; /* Address */ - Elf64_Xword r_info; /* Relocation type and symbol index */ - Elf64_Sxword r_addend; /* Addend */ -} Elf64_Rela; - -/* How to extract and insert information held in the r_info field. */ - -#define ELF32_R_SYM(val) ((val) >> 8) -#define ELF32_R_TYPE(val) ((val) & 0xff) -#define ELF32_R_INFO(sym, type) (((sym) << 8) + ((type) & 0xff)) - -#define ELF64_R_SYM(i) ((i) >> 32) -#define ELF64_R_TYPE(i) ((i) & 0xffffffff) -#define ELF64_R_INFO(sym,type) ((((Elf64_Xword) (sym)) << 32) + (type)) - -/* Program segment header. */ - -typedef struct -{ - Elf32_Word p_type; /* Segment type */ - Elf32_Off p_offset; /* Segment file offset */ - Elf32_Addr p_vaddr; /* Segment virtual address */ - Elf32_Addr p_paddr; /* Segment physical address */ - Elf32_Word p_filesz; /* Segment size in file */ - Elf32_Word p_memsz; /* Segment size in memory */ - Elf32_Word p_flags; /* Segment flags */ - Elf32_Word p_align; /* Segment alignment */ -} Elf32_Phdr; - -typedef struct -{ - Elf64_Word p_type; /* Segment type */ - Elf64_Word p_flags; /* Segment flags */ - Elf64_Off p_offset; /* Segment file offset */ - Elf64_Addr p_vaddr; /* Segment virtual address */ - Elf64_Addr p_paddr; /* Segment physical address */ - Elf64_Xword p_filesz; /* Segment size in file */ - Elf64_Xword p_memsz; /* Segment size in memory */ - Elf64_Xword p_align; /* Segment alignment */ -} Elf64_Phdr; - -/* Special value for e_phnum. This indicates that the real number of - program headers is too large to fit into e_phnum. Instead the real - value is in the field sh_info of section 0. */ - -#define PN_XNUM 0xffff - -/* Legal values for p_type (segment type). */ - -#define PT_NULL 0 /* Program header table entry unused */ -#define PT_LOAD 1 /* Loadable program segment */ -#define PT_DYNAMIC 2 /* Dynamic linking information */ -#define PT_INTERP 3 /* Program interpreter */ -#define PT_NOTE 4 /* Auxiliary information */ -#define PT_SHLIB 5 /* Reserved */ -#define PT_PHDR 6 /* Entry for header table itself */ -#define PT_TLS 7 /* Thread-local storage segment */ -#define PT_NUM 8 /* Number of defined types */ -#define PT_LOOS 0x60000000 /* Start of OS-specific */ -#define PT_GNU_EH_FRAME 0x6474e550 /* GCC .eh_frame_hdr segment */ -#define PT_GNU_STACK 0x6474e551 /* Indicates stack executability */ -#define PT_GNU_RELRO 0x6474e552 /* Read-only after relocation */ -#define PT_LOSUNW 0x6ffffffa -#define PT_SUNWBSS 0x6ffffffa /* Sun Specific segment */ -#define PT_SUNWSTACK 0x6ffffffb /* Stack segment */ -#define PT_HISUNW 0x6fffffff -#define PT_HIOS 0x6fffffff /* End of OS-specific */ -#define PT_LOPROC 0x70000000 /* Start of processor-specific */ -#define PT_HIPROC 0x7fffffff /* End of processor-specific */ - -/* Legal values for p_flags (segment flags). */ - -#define PF_X (1 << 0) /* Segment is executable */ -#define PF_W (1 << 1) /* Segment is writable */ -#define PF_R (1 << 2) /* Segment is readable */ -#define PF_MASKOS 0x0ff00000 /* OS-specific */ -#define PF_MASKPROC 0xf0000000 /* Processor-specific */ - -/* Legal values for note segment descriptor types for core files. */ - -#define NT_PRSTATUS 1 /* Contains copy of prstatus struct */ -#define NT_FPREGSET 2 /* Contains copy of fpregset struct */ -#define NT_PRPSINFO 3 /* Contains copy of prpsinfo struct */ -#define NT_PRXREG 4 /* Contains copy of prxregset struct */ -#define NT_TASKSTRUCT 4 /* Contains copy of task structure */ -#define NT_PLATFORM 5 /* String from sysinfo(SI_PLATFORM) */ -#define NT_AUXV 6 /* Contains copy of auxv array */ -#define NT_GWINDOWS 7 /* Contains copy of gwindows struct */ -#define NT_ASRS 8 /* Contains copy of asrset struct */ -#define NT_PSTATUS 10 /* Contains copy of pstatus struct */ -#define NT_PSINFO 13 /* Contains copy of psinfo struct */ -#define NT_PRCRED 14 /* Contains copy of prcred struct */ -#define NT_UTSNAME 15 /* Contains copy of utsname struct */ -#define NT_LWPSTATUS 16 /* Contains copy of lwpstatus struct */ -#define NT_LWPSINFO 17 /* Contains copy of lwpinfo struct */ -#define NT_PRFPXREG 20 /* Contains copy of fprxregset struct */ -#define NT_SIGINFO 0x53494749 /* Contains copy of siginfo_t, - size might increase */ -#define NT_FILE 0x46494c45 /* Contains information about mapped - files */ -#define NT_PRXFPREG 0x46e62b7f /* Contains copy of user_fxsr_struct */ -#define NT_PPC_VMX 0x100 /* PowerPC Altivec/VMX registers */ -#define NT_PPC_SPE 0x101 /* PowerPC SPE/EVR registers */ -#define NT_PPC_VSX 0x102 /* PowerPC VSX registers */ -#define NT_386_TLS 0x200 /* i386 TLS slots (struct user_desc) */ -#define NT_386_IOPERM 0x201 /* x86 io permission bitmap (1=deny) */ -#define NT_X86_XSTATE 0x202 /* x86 extended state using xsave */ -#define NT_S390_HIGH_GPRS 0x300 /* s390 upper register halves */ -#define NT_S390_TIMER 0x301 /* s390 timer register */ -#define NT_S390_TODCMP 0x302 /* s390 TOD clock comparator register */ -#define NT_S390_TODPREG 0x303 /* s390 TOD programmable register */ -#define NT_S390_CTRS 0x304 /* s390 control registers */ -#define NT_S390_PREFIX 0x305 /* s390 prefix register */ -#define NT_S390_LAST_BREAK 0x306 /* s390 breaking event address */ -#define NT_S390_SYSTEM_CALL 0x307 /* s390 system call restart data */ -#define NT_S390_TDB 0x308 /* s390 transaction diagnostic block */ -#define NT_ARM_VFP 0x400 /* ARM VFP/NEON registers */ -#define NT_ARM_TLS 0x401 /* ARM TLS register */ -#define NT_ARM_HW_BREAK 0x402 /* ARM hardware breakpoint registers */ -#define NT_ARM_HW_WATCH 0x403 /* ARM hardware watchpoint registers */ - -/* Legal values for the note segment descriptor types for object files. */ - -#define NT_VERSION 1 /* Contains a version string. */ - - -/* Dynamic section entry. */ - -typedef struct -{ - Elf32_Sword d_tag; /* Dynamic entry type */ - union - { - Elf32_Word d_val; /* Integer value */ - Elf32_Addr d_ptr; /* Address value */ - } d_un; -} Elf32_Dyn; - -typedef struct -{ - Elf64_Sxword d_tag; /* Dynamic entry type */ - union - { - Elf64_Xword d_val; /* Integer value */ - Elf64_Addr d_ptr; /* Address value */ - } d_un; -} Elf64_Dyn; - -/* Legal values for d_tag (dynamic entry type). */ - -#define DT_NULL 0 /* Marks end of dynamic section */ -#define DT_NEEDED 1 /* Name of needed library */ -#define DT_PLTRELSZ 2 /* Size in bytes of PLT relocs */ -#define DT_PLTGOT 3 /* Processor defined value */ -#define DT_HASH 4 /* Address of symbol hash table */ -#define DT_STRTAB 5 /* Address of string table */ -#define DT_SYMTAB 6 /* Address of symbol table */ -#define DT_RELA 7 /* Address of Rela relocs */ -#define DT_RELASZ 8 /* Total size of Rela relocs */ -#define DT_RELAENT 9 /* Size of one Rela reloc */ -#define DT_STRSZ 10 /* Size of string table */ -#define DT_SYMENT 11 /* Size of one symbol table entry */ -#define DT_INIT 12 /* Address of init function */ -#define DT_FINI 13 /* Address of termination function */ -#define DT_SONAME 14 /* Name of shared object */ -#define DT_RPATH 15 /* Library search path (deprecated) */ -#define DT_SYMBOLIC 16 /* Start symbol search here */ -#define DT_REL 17 /* Address of Rel relocs */ -#define DT_RELSZ 18 /* Total size of Rel relocs */ -#define DT_RELENT 19 /* Size of one Rel reloc */ -#define DT_PLTREL 20 /* Type of reloc in PLT */ -#define DT_DEBUG 21 /* For debugging; unspecified */ -#define DT_TEXTREL 22 /* Reloc might modify .text */ -#define DT_JMPREL 23 /* Address of PLT relocs */ -#define DT_BIND_NOW 24 /* Process relocations of object */ -#define DT_INIT_ARRAY 25 /* Array with addresses of init fct */ -#define DT_FINI_ARRAY 26 /* Array with addresses of fini fct */ -#define DT_INIT_ARRAYSZ 27 /* Size in bytes of DT_INIT_ARRAY */ -#define DT_FINI_ARRAYSZ 28 /* Size in bytes of DT_FINI_ARRAY */ -#define DT_RUNPATH 29 /* Library search path */ -#define DT_FLAGS 30 /* Flags for the object being loaded */ -#define DT_ENCODING 32 /* Start of encoded range */ -#define DT_PREINIT_ARRAY 32 /* Array with addresses of preinit fct*/ -#define DT_PREINIT_ARRAYSZ 33 /* size in bytes of DT_PREINIT_ARRAY */ -#define DT_NUM 34 /* Number used */ -#define DT_LOOS 0x6000000d /* Start of OS-specific */ -#define DT_HIOS 0x6ffff000 /* End of OS-specific */ -#define DT_LOPROC 0x70000000 /* Start of processor-specific */ -#define DT_HIPROC 0x7fffffff /* End of processor-specific */ -#define DT_PROCNUM DT_MIPS_NUM /* Most used by any processor */ - -/* DT_* entries which fall between DT_VALRNGHI & DT_VALRNGLO use the - Dyn.d_un.d_val field of the Elf*_Dyn structure. This follows Sun's - approach. */ -#define DT_VALRNGLO 0x6ffffd00 -#define DT_GNU_PRELINKED 0x6ffffdf5 /* Prelinking timestamp */ -#define DT_GNU_CONFLICTSZ 0x6ffffdf6 /* Size of conflict section */ -#define DT_GNU_LIBLISTSZ 0x6ffffdf7 /* Size of library list */ -#define DT_CHECKSUM 0x6ffffdf8 -#define DT_PLTPADSZ 0x6ffffdf9 -#define DT_MOVEENT 0x6ffffdfa -#define DT_MOVESZ 0x6ffffdfb -#define DT_FEATURE_1 0x6ffffdfc /* Feature selection (DTF_*). */ -#define DT_POSFLAG_1 0x6ffffdfd /* Flags for DT_* entries, effecting - the following DT_* entry. */ -#define DT_SYMINSZ 0x6ffffdfe /* Size of syminfo table (in bytes) */ -#define DT_SYMINENT 0x6ffffdff /* Entry size of syminfo */ -#define DT_VALRNGHI 0x6ffffdff -#define DT_VALTAGIDX(tag) (DT_VALRNGHI - (tag)) /* Reverse order! */ -#define DT_VALNUM 12 - -/* DT_* entries which fall between DT_ADDRRNGHI & DT_ADDRRNGLO use the - Dyn.d_un.d_ptr field of the Elf*_Dyn structure. - - If any adjustment is made to the ELF object after it has been - built these entries will need to be adjusted. */ -#define DT_ADDRRNGLO 0x6ffffe00 -#define DT_GNU_HASH 0x6ffffef5 /* GNU-style hash table. */ -#define DT_TLSDESC_PLT 0x6ffffef6 -#define DT_TLSDESC_GOT 0x6ffffef7 -#define DT_GNU_CONFLICT 0x6ffffef8 /* Start of conflict section */ -#define DT_GNU_LIBLIST 0x6ffffef9 /* Library list */ -#define DT_CONFIG 0x6ffffefa /* Configuration information. */ -#define DT_DEPAUDIT 0x6ffffefb /* Dependency auditing. */ -#define DT_AUDIT 0x6ffffefc /* Object auditing. */ -#define DT_PLTPAD 0x6ffffefd /* PLT padding. */ -#define DT_MOVETAB 0x6ffffefe /* Move table. */ -#define DT_SYMINFO 0x6ffffeff /* Syminfo table. */ -#define DT_ADDRRNGHI 0x6ffffeff -#define DT_ADDRTAGIDX(tag) (DT_ADDRRNGHI - (tag)) /* Reverse order! */ -#define DT_ADDRNUM 11 - -/* The versioning entry types. The next are defined as part of the - GNU extension. */ -#define DT_VERSYM 0x6ffffff0 - -#define DT_RELACOUNT 0x6ffffff9 -#define DT_RELCOUNT 0x6ffffffa - -/* These were chosen by Sun. */ -#define DT_FLAGS_1 0x6ffffffb /* State flags, see DF_1_* below. */ -#define DT_VERDEF 0x6ffffffc /* Address of version definition - table */ -#define DT_VERDEFNUM 0x6ffffffd /* Number of version definitions */ -#define DT_VERNEED 0x6ffffffe /* Address of table with needed - versions */ -#define DT_VERNEEDNUM 0x6fffffff /* Number of needed versions */ -#define DT_VERSIONTAGIDX(tag) (DT_VERNEEDNUM - (tag)) /* Reverse order! */ -#define DT_VERSIONTAGNUM 16 - -/* Sun added these machine-independent extensions in the "processor-specific" - range. Be compatible. */ -#define DT_AUXILIARY 0x7ffffffd /* Shared object to load before self */ -#define DT_FILTER 0x7fffffff /* Shared object to get values from */ -#define DT_EXTRATAGIDX(tag) ((Elf32_Word)-((Elf32_Sword) (tag) <<1>>1)-1) -#define DT_EXTRANUM 3 - -/* Values of `d_un.d_val' in the DT_FLAGS entry. */ -#define DF_ORIGIN 0x00000001 /* Object may use DF_ORIGIN */ -#define DF_SYMBOLIC 0x00000002 /* Symbol resolutions starts here */ -#define DF_TEXTREL 0x00000004 /* Object contains text relocations */ -#define DF_BIND_NOW 0x00000008 /* No lazy binding for this object */ -#define DF_STATIC_TLS 0x00000010 /* Module uses the static TLS model */ - -/* State flags selectable in the `d_un.d_val' element of the DT_FLAGS_1 - entry in the dynamic section. */ -#define DF_1_NOW 0x00000001 /* Set RTLD_NOW for this object. */ -#define DF_1_GLOBAL 0x00000002 /* Set RTLD_GLOBAL for this object. */ -#define DF_1_GROUP 0x00000004 /* Set RTLD_GROUP for this object. */ -#define DF_1_NODELETE 0x00000008 /* Set RTLD_NODELETE for this object.*/ -#define DF_1_LOADFLTR 0x00000010 /* Trigger filtee loading at runtime.*/ -#define DF_1_INITFIRST 0x00000020 /* Set RTLD_INITFIRST for this object*/ -#define DF_1_NOOPEN 0x00000040 /* Set RTLD_NOOPEN for this object. */ -#define DF_1_ORIGIN 0x00000080 /* $ORIGIN must be handled. */ -#define DF_1_DIRECT 0x00000100 /* Direct binding enabled. */ -#define DF_1_TRANS 0x00000200 -#define DF_1_INTERPOSE 0x00000400 /* Object is used to interpose. */ -#define DF_1_NODEFLIB 0x00000800 /* Ignore default lib search path. */ -#define DF_1_NODUMP 0x00001000 /* Object can't be dldump'ed. */ -#define DF_1_CONFALT 0x00002000 /* Configuration alternative created.*/ -#define DF_1_ENDFILTEE 0x00004000 /* Filtee terminates filters search. */ -#define DF_1_DISPRELDNE 0x00008000 /* Disp reloc applied at build time. */ -#define DF_1_DISPRELPND 0x00010000 /* Disp reloc applied at run-time. */ -#define DF_1_NODIRECT 0x00020000 /* Object has no-direct binding. */ -#define DF_1_IGNMULDEF 0x00040000 -#define DF_1_NOKSYMS 0x00080000 -#define DF_1_NOHDR 0x00100000 -#define DF_1_EDITED 0x00200000 /* Object is modified after built. */ -#define DF_1_NORELOC 0x00400000 -#define DF_1_SYMINTPOSE 0x00800000 /* Object has individual interposers. */ -#define DF_1_GLOBAUDIT 0x01000000 /* Global auditing required. */ -#define DF_1_SINGLETON 0x02000000 /* Singleton symbols are used. */ - -/* Flags for the feature selection in DT_FEATURE_1. */ -#define DTF_1_PARINIT 0x00000001 -#define DTF_1_CONFEXP 0x00000002 - -/* Flags in the DT_POSFLAG_1 entry effecting only the next DT_* entry. */ -#define DF_P1_LAZYLOAD 0x00000001 /* Lazyload following object. */ -#define DF_P1_GROUPPERM 0x00000002 /* Symbols from next object are not - generally available. */ - -/* Version definition sections. */ - -typedef struct -{ - Elf32_Half vd_version; /* Version revision */ - Elf32_Half vd_flags; /* Version information */ - Elf32_Half vd_ndx; /* Version Index */ - Elf32_Half vd_cnt; /* Number of associated aux entries */ - Elf32_Word vd_hash; /* Version name hash value */ - Elf32_Word vd_aux; /* Offset in bytes to verdaux array */ - Elf32_Word vd_next; /* Offset in bytes to next verdef - entry */ -} Elf32_Verdef; - -typedef struct -{ - Elf64_Half vd_version; /* Version revision */ - Elf64_Half vd_flags; /* Version information */ - Elf64_Half vd_ndx; /* Version Index */ - Elf64_Half vd_cnt; /* Number of associated aux entries */ - Elf64_Word vd_hash; /* Version name hash value */ - Elf64_Word vd_aux; /* Offset in bytes to verdaux array */ - Elf64_Word vd_next; /* Offset in bytes to next verdef - entry */ -} Elf64_Verdef; - - -/* Legal values for vd_version (version revision). */ -#define VER_DEF_NONE 0 /* No version */ -#define VER_DEF_CURRENT 1 /* Current version */ -#define VER_DEF_NUM 2 /* Given version number */ - -/* Legal values for vd_flags (version information flags). */ -#define VER_FLG_BASE 0x1 /* Version definition of file itself */ -#define VER_FLG_WEAK 0x2 /* Weak version identifier */ - -/* Versym symbol index values. */ -#define VER_NDX_LOCAL 0 /* Symbol is local. */ -#define VER_NDX_GLOBAL 1 /* Symbol is global. */ -#define VER_NDX_LORESERVE 0xff00 /* Beginning of reserved entries. */ -#define VER_NDX_ELIMINATE 0xff01 /* Symbol is to be eliminated. */ - -/* Auxialiary version information. */ - -typedef struct -{ - Elf32_Word vda_name; /* Version or dependency names */ - Elf32_Word vda_next; /* Offset in bytes to next verdaux - entry */ -} Elf32_Verdaux; - -typedef struct -{ - Elf64_Word vda_name; /* Version or dependency names */ - Elf64_Word vda_next; /* Offset in bytes to next verdaux - entry */ -} Elf64_Verdaux; - - -/* Version dependency section. */ - -typedef struct -{ - Elf32_Half vn_version; /* Version of structure */ - Elf32_Half vn_cnt; /* Number of associated aux entries */ - Elf32_Word vn_file; /* Offset of filename for this - dependency */ - Elf32_Word vn_aux; /* Offset in bytes to vernaux array */ - Elf32_Word vn_next; /* Offset in bytes to next verneed - entry */ -} Elf32_Verneed; - -typedef struct -{ - Elf64_Half vn_version; /* Version of structure */ - Elf64_Half vn_cnt; /* Number of associated aux entries */ - Elf64_Word vn_file; /* Offset of filename for this - dependency */ - Elf64_Word vn_aux; /* Offset in bytes to vernaux array */ - Elf64_Word vn_next; /* Offset in bytes to next verneed - entry */ -} Elf64_Verneed; - - -/* Legal values for vn_version (version revision). */ -#define VER_NEED_NONE 0 /* No version */ -#define VER_NEED_CURRENT 1 /* Current version */ -#define VER_NEED_NUM 2 /* Given version number */ - -/* Auxiliary needed version information. */ - -typedef struct -{ - Elf32_Word vna_hash; /* Hash value of dependency name */ - Elf32_Half vna_flags; /* Dependency specific information */ - Elf32_Half vna_other; /* Unused */ - Elf32_Word vna_name; /* Dependency name string offset */ - Elf32_Word vna_next; /* Offset in bytes to next vernaux - entry */ -} Elf32_Vernaux; - -typedef struct -{ - Elf64_Word vna_hash; /* Hash value of dependency name */ - Elf64_Half vna_flags; /* Dependency specific information */ - Elf64_Half vna_other; /* Unused */ - Elf64_Word vna_name; /* Dependency name string offset */ - Elf64_Word vna_next; /* Offset in bytes to next vernaux - entry */ -} Elf64_Vernaux; - - -/* Legal values for vna_flags. */ -#define VER_FLG_WEAK 0x2 /* Weak version identifier */ - - -/* Auxiliary vector. */ - -/* This vector is normally only used by the program interpreter. The - usual definition in an ABI supplement uses the name auxv_t. The - vector is not usually defined in a standard file, but it - can't hurt. We rename it to avoid conflicts. The sizes of these - types are an arrangement between the exec server and the program - interpreter, so we don't fully specify them here. */ - -typedef struct -{ - uint32_t a_type; /* Entry type */ - union - { - uint32_t a_val; /* Integer value */ - /* We use to have pointer elements added here. We cannot do that, - though, since it does not work when using 32-bit definitions - on 64-bit platforms and vice versa. */ - } a_un; -} Elf32_auxv_t; - -typedef struct -{ - uint64_t a_type; /* Entry type */ - union - { - uint64_t a_val; /* Integer value */ - /* We use to have pointer elements added here. We cannot do that, - though, since it does not work when using 32-bit definitions - on 64-bit platforms and vice versa. */ - } a_un; -} Elf64_auxv_t; - -/* Note section contents. Each entry in the note section begins with - a header of a fixed form. */ - -typedef struct -{ - Elf32_Word n_namesz; /* Length of the note's name. */ - Elf32_Word n_descsz; /* Length of the note's descriptor. */ - Elf32_Word n_type; /* Type of the note. */ -} Elf32_Nhdr; - -typedef struct -{ - Elf64_Word n_namesz; /* Length of the note's name. */ - Elf64_Word n_descsz; /* Length of the note's descriptor. */ - Elf64_Word n_type; /* Type of the note. */ -} Elf64_Nhdr; - -/* Known names of notes. */ - -/* Solaris entries in the note section have this name. */ -#define ELF_NOTE_SOLARIS "SUNW Solaris" - -/* Note entries for GNU systems have this name. */ -#define ELF_NOTE_GNU "GNU" - - -/* Defined types of notes for Solaris. */ - -/* Value of descriptor (one word) is desired pagesize for the binary. */ -#define ELF_NOTE_PAGESIZE_HINT 1 - - -/* Defined note types for GNU systems. */ - -/* ABI information. The descriptor consists of words: - word 0: OS descriptor - word 1: major version of the ABI - word 2: minor version of the ABI - word 3: subminor version of the ABI -*/ -#define NT_GNU_ABI_TAG 1 -#define ELF_NOTE_ABI NT_GNU_ABI_TAG /* Old name. */ - -/* Known OSes. These values can appear in word 0 of an - NT_GNU_ABI_TAG note section entry. */ -#define ELF_NOTE_OS_LINUX 0 -#define ELF_NOTE_OS_GNU 1 -#define ELF_NOTE_OS_SOLARIS2 2 -#define ELF_NOTE_OS_FREEBSD 3 - -/* Synthetic hwcap information. The descriptor begins with two words: - word 0: number of entries - word 1: bitmask of enabled entries - Then follow variable-length entries, one byte followed by a - '\0'-terminated hwcap name string. The byte gives the bit - number to test if enabled, (1U << bit) & bitmask. */ -#define NT_GNU_HWCAP 2 - -/* Build ID bits as generated by ld --build-id. - The descriptor consists of any nonzero number of bytes. */ -#define NT_GNU_BUILD_ID 3 - -/* Version note generated by GNU gold containing a version string. */ -#define NT_GNU_GOLD_VERSION 4 - - -/* Move records. */ -typedef struct -{ - Elf32_Xword m_value; /* Symbol value. */ - Elf32_Word m_info; /* Size and index. */ - Elf32_Word m_poffset; /* Symbol offset. */ - Elf32_Half m_repeat; /* Repeat count. */ - Elf32_Half m_stride; /* Stride info. */ -} Elf32_Move; - -typedef struct -{ - Elf64_Xword m_value; /* Symbol value. */ - Elf64_Xword m_info; /* Size and index. */ - Elf64_Xword m_poffset; /* Symbol offset. */ - Elf64_Half m_repeat; /* Repeat count. */ - Elf64_Half m_stride; /* Stride info. */ -} Elf64_Move; - -/* Macro to construct move records. */ -#define ELF32_M_SYM(info) ((info) >> 8) -#define ELF32_M_SIZE(info) ((unsigned char) (info)) -#define ELF32_M_INFO(sym, size) (((sym) << 8) + (unsigned char) (size)) - -#define ELF64_M_SYM(info) ELF32_M_SYM (info) -#define ELF64_M_SIZE(info) ELF32_M_SIZE (info) -#define ELF64_M_INFO(sym, size) ELF32_M_INFO (sym, size) - - -/* Motorola 68k specific definitions. */ - -/* Values for Elf32_Ehdr.e_flags. */ -#define EF_CPU32 0x00810000 - -/* m68k relocs. */ - -#define R_68K_NONE 0 /* No reloc */ -#define R_68K_32 1 /* Direct 32 bit */ -#define R_68K_16 2 /* Direct 16 bit */ -#define R_68K_8 3 /* Direct 8 bit */ -#define R_68K_PC32 4 /* PC relative 32 bit */ -#define R_68K_PC16 5 /* PC relative 16 bit */ -#define R_68K_PC8 6 /* PC relative 8 bit */ -#define R_68K_GOT32 7 /* 32 bit PC relative GOT entry */ -#define R_68K_GOT16 8 /* 16 bit PC relative GOT entry */ -#define R_68K_GOT8 9 /* 8 bit PC relative GOT entry */ -#define R_68K_GOT32O 10 /* 32 bit GOT offset */ -#define R_68K_GOT16O 11 /* 16 bit GOT offset */ -#define R_68K_GOT8O 12 /* 8 bit GOT offset */ -#define R_68K_PLT32 13 /* 32 bit PC relative PLT address */ -#define R_68K_PLT16 14 /* 16 bit PC relative PLT address */ -#define R_68K_PLT8 15 /* 8 bit PC relative PLT address */ -#define R_68K_PLT32O 16 /* 32 bit PLT offset */ -#define R_68K_PLT16O 17 /* 16 bit PLT offset */ -#define R_68K_PLT8O 18 /* 8 bit PLT offset */ -#define R_68K_COPY 19 /* Copy symbol at runtime */ -#define R_68K_GLOB_DAT 20 /* Create GOT entry */ -#define R_68K_JMP_SLOT 21 /* Create PLT entry */ -#define R_68K_RELATIVE 22 /* Adjust by program base */ -#define R_68K_TLS_GD32 25 /* 32 bit GOT offset for GD */ -#define R_68K_TLS_GD16 26 /* 16 bit GOT offset for GD */ -#define R_68K_TLS_GD8 27 /* 8 bit GOT offset for GD */ -#define R_68K_TLS_LDM32 28 /* 32 bit GOT offset for LDM */ -#define R_68K_TLS_LDM16 29 /* 16 bit GOT offset for LDM */ -#define R_68K_TLS_LDM8 30 /* 8 bit GOT offset for LDM */ -#define R_68K_TLS_LDO32 31 /* 32 bit module-relative offset */ -#define R_68K_TLS_LDO16 32 /* 16 bit module-relative offset */ -#define R_68K_TLS_LDO8 33 /* 8 bit module-relative offset */ -#define R_68K_TLS_IE32 34 /* 32 bit GOT offset for IE */ -#define R_68K_TLS_IE16 35 /* 16 bit GOT offset for IE */ -#define R_68K_TLS_IE8 36 /* 8 bit GOT offset for IE */ -#define R_68K_TLS_LE32 37 /* 32 bit offset relative to - static TLS block */ -#define R_68K_TLS_LE16 38 /* 16 bit offset relative to - static TLS block */ -#define R_68K_TLS_LE8 39 /* 8 bit offset relative to - static TLS block */ -#define R_68K_TLS_DTPMOD32 40 /* 32 bit module number */ -#define R_68K_TLS_DTPREL32 41 /* 32 bit module-relative offset */ -#define R_68K_TLS_TPREL32 42 /* 32 bit TP-relative offset */ -/* Keep this the last entry. */ -#define R_68K_NUM 43 - -/* Intel 80386 specific definitions. */ - -/* i386 relocs. */ - -#define R_386_NONE 0 /* No reloc */ -#define R_386_32 1 /* Direct 32 bit */ -#define R_386_PC32 2 /* PC relative 32 bit */ -#define R_386_GOT32 3 /* 32 bit GOT entry */ -#define R_386_PLT32 4 /* 32 bit PLT address */ -#define R_386_COPY 5 /* Copy symbol at runtime */ -#define R_386_GLOB_DAT 6 /* Create GOT entry */ -#define R_386_JMP_SLOT 7 /* Create PLT entry */ -#define R_386_RELATIVE 8 /* Adjust by program base */ -#define R_386_GOTOFF 9 /* 32 bit offset to GOT */ -#define R_386_GOTPC 10 /* 32 bit PC relative offset to GOT */ -#define R_386_32PLT 11 -#define R_386_TLS_TPOFF 14 /* Offset in static TLS block */ -#define R_386_TLS_IE 15 /* Address of GOT entry for static TLS - block offset */ -#define R_386_TLS_GOTIE 16 /* GOT entry for static TLS block - offset */ -#define R_386_TLS_LE 17 /* Offset relative to static TLS - block */ -#define R_386_TLS_GD 18 /* Direct 32 bit for GNU version of - general dynamic thread local data */ -#define R_386_TLS_LDM 19 /* Direct 32 bit for GNU version of - local dynamic thread local data - in LE code */ -#define R_386_16 20 -#define R_386_PC16 21 -#define R_386_8 22 -#define R_386_PC8 23 -#define R_386_TLS_GD_32 24 /* Direct 32 bit for general dynamic - thread local data */ -#define R_386_TLS_GD_PUSH 25 /* Tag for pushl in GD TLS code */ -#define R_386_TLS_GD_CALL 26 /* Relocation for call to - __tls_get_addr() */ -#define R_386_TLS_GD_POP 27 /* Tag for popl in GD TLS code */ -#define R_386_TLS_LDM_32 28 /* Direct 32 bit for local dynamic - thread local data in LE code */ -#define R_386_TLS_LDM_PUSH 29 /* Tag for pushl in LDM TLS code */ -#define R_386_TLS_LDM_CALL 30 /* Relocation for call to - __tls_get_addr() in LDM code */ -#define R_386_TLS_LDM_POP 31 /* Tag for popl in LDM TLS code */ -#define R_386_TLS_LDO_32 32 /* Offset relative to TLS block */ -#define R_386_TLS_IE_32 33 /* GOT entry for negated static TLS - block offset */ -#define R_386_TLS_LE_32 34 /* Negated offset relative to static - TLS block */ -#define R_386_TLS_DTPMOD32 35 /* ID of module containing symbol */ -#define R_386_TLS_DTPOFF32 36 /* Offset in TLS block */ -#define R_386_TLS_TPOFF32 37 /* Negated offset in static TLS block */ -#define R_386_SIZE32 38 /* 32-bit symbol size */ -#define R_386_TLS_GOTDESC 39 /* GOT offset for TLS descriptor. */ -#define R_386_TLS_DESC_CALL 40 /* Marker of call through TLS - descriptor for - relaxation. */ -#define R_386_TLS_DESC 41 /* TLS descriptor containing - pointer to code and to - argument, returning the TLS - offset for the symbol. */ -#define R_386_IRELATIVE 42 /* Adjust indirectly by program base */ -/* Keep this the last entry. */ -#define R_386_NUM 43 - -/* SUN SPARC specific definitions. */ - -/* Legal values for ST_TYPE subfield of st_info (symbol type). */ - -#define STT_SPARC_REGISTER 13 /* Global register reserved to app. */ - -/* Values for Elf64_Ehdr.e_flags. */ - -#define EF_SPARCV9_MM 3 -#define EF_SPARCV9_TSO 0 -#define EF_SPARCV9_PSO 1 -#define EF_SPARCV9_RMO 2 -#define EF_SPARC_LEDATA 0x800000 /* little endian data */ -#define EF_SPARC_EXT_MASK 0xFFFF00 -#define EF_SPARC_32PLUS 0x000100 /* generic V8+ features */ -#define EF_SPARC_SUN_US1 0x000200 /* Sun UltraSPARC1 extensions */ -#define EF_SPARC_HAL_R1 0x000400 /* HAL R1 extensions */ -#define EF_SPARC_SUN_US3 0x000800 /* Sun UltraSPARCIII extensions */ - -/* SPARC relocs. */ - -#define R_SPARC_NONE 0 /* No reloc */ -#define R_SPARC_8 1 /* Direct 8 bit */ -#define R_SPARC_16 2 /* Direct 16 bit */ -#define R_SPARC_32 3 /* Direct 32 bit */ -#define R_SPARC_DISP8 4 /* PC relative 8 bit */ -#define R_SPARC_DISP16 5 /* PC relative 16 bit */ -#define R_SPARC_DISP32 6 /* PC relative 32 bit */ -#define R_SPARC_WDISP30 7 /* PC relative 30 bit shifted */ -#define R_SPARC_WDISP22 8 /* PC relative 22 bit shifted */ -#define R_SPARC_HI22 9 /* High 22 bit */ -#define R_SPARC_22 10 /* Direct 22 bit */ -#define R_SPARC_13 11 /* Direct 13 bit */ -#define R_SPARC_LO10 12 /* Truncated 10 bit */ -#define R_SPARC_GOT10 13 /* Truncated 10 bit GOT entry */ -#define R_SPARC_GOT13 14 /* 13 bit GOT entry */ -#define R_SPARC_GOT22 15 /* 22 bit GOT entry shifted */ -#define R_SPARC_PC10 16 /* PC relative 10 bit truncated */ -#define R_SPARC_PC22 17 /* PC relative 22 bit shifted */ -#define R_SPARC_WPLT30 18 /* 30 bit PC relative PLT address */ -#define R_SPARC_COPY 19 /* Copy symbol at runtime */ -#define R_SPARC_GLOB_DAT 20 /* Create GOT entry */ -#define R_SPARC_JMP_SLOT 21 /* Create PLT entry */ -#define R_SPARC_RELATIVE 22 /* Adjust by program base */ -#define R_SPARC_UA32 23 /* Direct 32 bit unaligned */ - -/* Additional Sparc64 relocs. */ - -#define R_SPARC_PLT32 24 /* Direct 32 bit ref to PLT entry */ -#define R_SPARC_HIPLT22 25 /* High 22 bit PLT entry */ -#define R_SPARC_LOPLT10 26 /* Truncated 10 bit PLT entry */ -#define R_SPARC_PCPLT32 27 /* PC rel 32 bit ref to PLT entry */ -#define R_SPARC_PCPLT22 28 /* PC rel high 22 bit PLT entry */ -#define R_SPARC_PCPLT10 29 /* PC rel trunc 10 bit PLT entry */ -#define R_SPARC_10 30 /* Direct 10 bit */ -#define R_SPARC_11 31 /* Direct 11 bit */ -#define R_SPARC_64 32 /* Direct 64 bit */ -#define R_SPARC_OLO10 33 /* 10bit with secondary 13bit addend */ -#define R_SPARC_HH22 34 /* Top 22 bits of direct 64 bit */ -#define R_SPARC_HM10 35 /* High middle 10 bits of ... */ -#define R_SPARC_LM22 36 /* Low middle 22 bits of ... */ -#define R_SPARC_PC_HH22 37 /* Top 22 bits of pc rel 64 bit */ -#define R_SPARC_PC_HM10 38 /* High middle 10 bit of ... */ -#define R_SPARC_PC_LM22 39 /* Low miggle 22 bits of ... */ -#define R_SPARC_WDISP16 40 /* PC relative 16 bit shifted */ -#define R_SPARC_WDISP19 41 /* PC relative 19 bit shifted */ -#define R_SPARC_GLOB_JMP 42 /* was part of v9 ABI but was removed */ -#define R_SPARC_7 43 /* Direct 7 bit */ -#define R_SPARC_5 44 /* Direct 5 bit */ -#define R_SPARC_6 45 /* Direct 6 bit */ -#define R_SPARC_DISP64 46 /* PC relative 64 bit */ -#define R_SPARC_PLT64 47 /* Direct 64 bit ref to PLT entry */ -#define R_SPARC_HIX22 48 /* High 22 bit complemented */ -#define R_SPARC_LOX10 49 /* Truncated 11 bit complemented */ -#define R_SPARC_H44 50 /* Direct high 12 of 44 bit */ -#define R_SPARC_M44 51 /* Direct mid 22 of 44 bit */ -#define R_SPARC_L44 52 /* Direct low 10 of 44 bit */ -#define R_SPARC_REGISTER 53 /* Global register usage */ -#define R_SPARC_UA64 54 /* Direct 64 bit unaligned */ -#define R_SPARC_UA16 55 /* Direct 16 bit unaligned */ -#define R_SPARC_TLS_GD_HI22 56 -#define R_SPARC_TLS_GD_LO10 57 -#define R_SPARC_TLS_GD_ADD 58 -#define R_SPARC_TLS_GD_CALL 59 -#define R_SPARC_TLS_LDM_HI22 60 -#define R_SPARC_TLS_LDM_LO10 61 -#define R_SPARC_TLS_LDM_ADD 62 -#define R_SPARC_TLS_LDM_CALL 63 -#define R_SPARC_TLS_LDO_HIX22 64 -#define R_SPARC_TLS_LDO_LOX10 65 -#define R_SPARC_TLS_LDO_ADD 66 -#define R_SPARC_TLS_IE_HI22 67 -#define R_SPARC_TLS_IE_LO10 68 -#define R_SPARC_TLS_IE_LD 69 -#define R_SPARC_TLS_IE_LDX 70 -#define R_SPARC_TLS_IE_ADD 71 -#define R_SPARC_TLS_LE_HIX22 72 -#define R_SPARC_TLS_LE_LOX10 73 -#define R_SPARC_TLS_DTPMOD32 74 -#define R_SPARC_TLS_DTPMOD64 75 -#define R_SPARC_TLS_DTPOFF32 76 -#define R_SPARC_TLS_DTPOFF64 77 -#define R_SPARC_TLS_TPOFF32 78 -#define R_SPARC_TLS_TPOFF64 79 -#define R_SPARC_GOTDATA_HIX22 80 -#define R_SPARC_GOTDATA_LOX10 81 -#define R_SPARC_GOTDATA_OP_HIX22 82 -#define R_SPARC_GOTDATA_OP_LOX10 83 -#define R_SPARC_GOTDATA_OP 84 -#define R_SPARC_H34 85 -#define R_SPARC_SIZE32 86 -#define R_SPARC_SIZE64 87 -#define R_SPARC_WDISP10 88 -#define R_SPARC_JMP_IREL 248 -#define R_SPARC_IRELATIVE 249 -#define R_SPARC_GNU_VTINHERIT 250 -#define R_SPARC_GNU_VTENTRY 251 -#define R_SPARC_REV32 252 -/* Keep this the last entry. */ -#define R_SPARC_NUM 253 - -/* For Sparc64, legal values for d_tag of Elf64_Dyn. */ - -#define DT_SPARC_REGISTER 0x70000001 -#define DT_SPARC_NUM 2 - -/* MIPS R3000 specific definitions. */ - -/* Legal values for e_flags field of Elf32_Ehdr. */ - -#define EF_MIPS_NOREORDER 1 /* A .noreorder directive was used. */ -#define EF_MIPS_PIC 2 /* Contains PIC code. */ -#define EF_MIPS_CPIC 4 /* Uses PIC calling sequence. */ -#define EF_MIPS_XGOT 8 -#define EF_MIPS_64BIT_WHIRL 16 -#define EF_MIPS_ABI2 32 -#define EF_MIPS_ABI_ON32 64 -#define EF_MIPS_NAN2008 1024 /* Uses IEEE 754-2008 NaN encoding. */ -#define EF_MIPS_ARCH 0xf0000000 /* MIPS architecture level. */ - -/* Legal values for MIPS architecture level. */ - -#define EF_MIPS_ARCH_1 0x00000000 /* -mips1 code. */ -#define EF_MIPS_ARCH_2 0x10000000 /* -mips2 code. */ -#define EF_MIPS_ARCH_3 0x20000000 /* -mips3 code. */ -#define EF_MIPS_ARCH_4 0x30000000 /* -mips4 code. */ -#define EF_MIPS_ARCH_5 0x40000000 /* -mips5 code. */ -#define EF_MIPS_ARCH_32 0x50000000 /* MIPS32 code. */ -#define EF_MIPS_ARCH_64 0x60000000 /* MIPS64 code. */ -#define EF_MIPS_ARCH_32R2 0x70000000 /* MIPS32r2 code. */ -#define EF_MIPS_ARCH_64R2 0x80000000 /* MIPS64r2 code. */ - -/* The following are unofficial names and should not be used. */ - -#define E_MIPS_ARCH_1 EF_MIPS_ARCH_1 -#define E_MIPS_ARCH_2 EF_MIPS_ARCH_2 -#define E_MIPS_ARCH_3 EF_MIPS_ARCH_3 -#define E_MIPS_ARCH_4 EF_MIPS_ARCH_4 -#define E_MIPS_ARCH_5 EF_MIPS_ARCH_5 -#define E_MIPS_ARCH_32 EF_MIPS_ARCH_32 -#define E_MIPS_ARCH_64 EF_MIPS_ARCH_64 - -/* Special section indices. */ - -#define SHN_MIPS_ACOMMON 0xff00 /* Allocated common symbols. */ -#define SHN_MIPS_TEXT 0xff01 /* Allocated test symbols. */ -#define SHN_MIPS_DATA 0xff02 /* Allocated data symbols. */ -#define SHN_MIPS_SCOMMON 0xff03 /* Small common symbols. */ -#define SHN_MIPS_SUNDEFINED 0xff04 /* Small undefined symbols. */ - -/* Legal values for sh_type field of Elf32_Shdr. */ - -#define SHT_MIPS_LIBLIST 0x70000000 /* Shared objects used in link. */ -#define SHT_MIPS_MSYM 0x70000001 -#define SHT_MIPS_CONFLICT 0x70000002 /* Conflicting symbols. */ -#define SHT_MIPS_GPTAB 0x70000003 /* Global data area sizes. */ -#define SHT_MIPS_UCODE 0x70000004 /* Reserved for SGI/MIPS compilers */ -#define SHT_MIPS_DEBUG 0x70000005 /* MIPS ECOFF debugging info. */ -#define SHT_MIPS_REGINFO 0x70000006 /* Register usage information. */ -#define SHT_MIPS_PACKAGE 0x70000007 -#define SHT_MIPS_PACKSYM 0x70000008 -#define SHT_MIPS_RELD 0x70000009 -#define SHT_MIPS_IFACE 0x7000000b -#define SHT_MIPS_CONTENT 0x7000000c -#define SHT_MIPS_OPTIONS 0x7000000d /* Miscellaneous options. */ -#define SHT_MIPS_SHDR 0x70000010 -#define SHT_MIPS_FDESC 0x70000011 -#define SHT_MIPS_EXTSYM 0x70000012 -#define SHT_MIPS_DENSE 0x70000013 -#define SHT_MIPS_PDESC 0x70000014 -#define SHT_MIPS_LOCSYM 0x70000015 -#define SHT_MIPS_AUXSYM 0x70000016 -#define SHT_MIPS_OPTSYM 0x70000017 -#define SHT_MIPS_LOCSTR 0x70000018 -#define SHT_MIPS_LINE 0x70000019 -#define SHT_MIPS_RFDESC 0x7000001a -#define SHT_MIPS_DELTASYM 0x7000001b -#define SHT_MIPS_DELTAINST 0x7000001c -#define SHT_MIPS_DELTACLASS 0x7000001d -#define SHT_MIPS_DWARF 0x7000001e /* DWARF debugging information. */ -#define SHT_MIPS_DELTADECL 0x7000001f -#define SHT_MIPS_SYMBOL_LIB 0x70000020 -#define SHT_MIPS_EVENTS 0x70000021 /* Event section. */ -#define SHT_MIPS_TRANSLATE 0x70000022 -#define SHT_MIPS_PIXIE 0x70000023 -#define SHT_MIPS_XLATE 0x70000024 -#define SHT_MIPS_XLATE_DEBUG 0x70000025 -#define SHT_MIPS_WHIRL 0x70000026 -#define SHT_MIPS_EH_REGION 0x70000027 -#define SHT_MIPS_XLATE_OLD 0x70000028 -#define SHT_MIPS_PDR_EXCEPTION 0x70000029 - -/* Legal values for sh_flags field of Elf32_Shdr. */ - -#define SHF_MIPS_GPREL 0x10000000 /* Must be in global data area. */ -#define SHF_MIPS_MERGE 0x20000000 -#define SHF_MIPS_ADDR 0x40000000 -#define SHF_MIPS_STRINGS 0x80000000 -#define SHF_MIPS_NOSTRIP 0x08000000 -#define SHF_MIPS_LOCAL 0x04000000 -#define SHF_MIPS_NAMES 0x02000000 -#define SHF_MIPS_NODUPE 0x01000000 - - -/* Symbol tables. */ - -/* MIPS specific values for `st_other'. */ -#define STO_MIPS_DEFAULT 0x0 -#define STO_MIPS_INTERNAL 0x1 -#define STO_MIPS_HIDDEN 0x2 -#define STO_MIPS_PROTECTED 0x3 -#define STO_MIPS_PLT 0x8 -#define STO_MIPS_SC_ALIGN_UNUSED 0xff - -/* MIPS specific values for `st_info'. */ -#define STB_MIPS_SPLIT_COMMON 13 - -/* Entries found in sections of type SHT_MIPS_GPTAB. */ - -typedef union -{ - struct - { - Elf32_Word gt_current_g_value; /* -G value used for compilation. */ - Elf32_Word gt_unused; /* Not used. */ - } gt_header; /* First entry in section. */ - struct - { - Elf32_Word gt_g_value; /* If this value were used for -G. */ - Elf32_Word gt_bytes; /* This many bytes would be used. */ - } gt_entry; /* Subsequent entries in section. */ -} Elf32_gptab; - -/* Entry found in sections of type SHT_MIPS_REGINFO. */ - -typedef struct -{ - Elf32_Word ri_gprmask; /* General registers used. */ - Elf32_Word ri_cprmask[4]; /* Coprocessor registers used. */ - Elf32_Sword ri_gp_value; /* $gp register value. */ -} Elf32_RegInfo; - -/* Entries found in sections of type SHT_MIPS_OPTIONS. */ - -typedef struct -{ - unsigned char kind; /* Determines interpretation of the - variable part of descriptor. */ - unsigned char size; /* Size of descriptor, including header. */ - Elf32_Section section; /* Section header index of section affected, - 0 for global options. */ - Elf32_Word info; /* Kind-specific information. */ -} Elf_Options; - -/* Values for `kind' field in Elf_Options. */ - -#define ODK_NULL 0 /* Undefined. */ -#define ODK_REGINFO 1 /* Register usage information. */ -#define ODK_EXCEPTIONS 2 /* Exception processing options. */ -#define ODK_PAD 3 /* Section padding options. */ -#define ODK_HWPATCH 4 /* Hardware workarounds performed */ -#define ODK_FILL 5 /* record the fill value used by the linker. */ -#define ODK_TAGS 6 /* reserve space for desktop tools to write. */ -#define ODK_HWAND 7 /* HW workarounds. 'AND' bits when merging. */ -#define ODK_HWOR 8 /* HW workarounds. 'OR' bits when merging. */ - -/* Values for `info' in Elf_Options for ODK_EXCEPTIONS entries. */ - -#define OEX_FPU_MIN 0x1f /* FPE's which MUST be enabled. */ -#define OEX_FPU_MAX 0x1f00 /* FPE's which MAY be enabled. */ -#define OEX_PAGE0 0x10000 /* page zero must be mapped. */ -#define OEX_SMM 0x20000 /* Force sequential memory mode? */ -#define OEX_FPDBUG 0x40000 /* Force floating point debug mode? */ -#define OEX_PRECISEFP OEX_FPDBUG -#define OEX_DISMISS 0x80000 /* Dismiss invalid address faults? */ - -#define OEX_FPU_INVAL 0x10 -#define OEX_FPU_DIV0 0x08 -#define OEX_FPU_OFLO 0x04 -#define OEX_FPU_UFLO 0x02 -#define OEX_FPU_INEX 0x01 - -/* Masks for `info' in Elf_Options for an ODK_HWPATCH entry. */ - -#define OHW_R4KEOP 0x1 /* R4000 end-of-page patch. */ -#define OHW_R8KPFETCH 0x2 /* may need R8000 prefetch patch. */ -#define OHW_R5KEOP 0x4 /* R5000 end-of-page patch. */ -#define OHW_R5KCVTL 0x8 /* R5000 cvt.[ds].l bug. clean=1. */ - -#define OPAD_PREFIX 0x1 -#define OPAD_POSTFIX 0x2 -#define OPAD_SYMBOL 0x4 - -/* Entry found in `.options' section. */ - -typedef struct -{ - Elf32_Word hwp_flags1; /* Extra flags. */ - Elf32_Word hwp_flags2; /* Extra flags. */ -} Elf_Options_Hw; - -/* Masks for `info' in ElfOptions for ODK_HWAND and ODK_HWOR entries. */ - -#define OHWA0_R4KEOP_CHECKED 0x00000001 -#define OHWA1_R4KEOP_CLEAN 0x00000002 - -/* MIPS relocs. */ - -#define R_MIPS_NONE 0 /* No reloc */ -#define R_MIPS_16 1 /* Direct 16 bit */ -#define R_MIPS_32 2 /* Direct 32 bit */ -#define R_MIPS_REL32 3 /* PC relative 32 bit */ -#define R_MIPS_26 4 /* Direct 26 bit shifted */ -#define R_MIPS_HI16 5 /* High 16 bit */ -#define R_MIPS_LO16 6 /* Low 16 bit */ -#define R_MIPS_GPREL16 7 /* GP relative 16 bit */ -#define R_MIPS_LITERAL 8 /* 16 bit literal entry */ -#define R_MIPS_GOT16 9 /* 16 bit GOT entry */ -#define R_MIPS_PC16 10 /* PC relative 16 bit */ -#define R_MIPS_CALL16 11 /* 16 bit GOT entry for function */ -#define R_MIPS_GPREL32 12 /* GP relative 32 bit */ - -#define R_MIPS_SHIFT5 16 -#define R_MIPS_SHIFT6 17 -#define R_MIPS_64 18 -#define R_MIPS_GOT_DISP 19 -#define R_MIPS_GOT_PAGE 20 -#define R_MIPS_GOT_OFST 21 -#define R_MIPS_GOT_HI16 22 -#define R_MIPS_GOT_LO16 23 -#define R_MIPS_SUB 24 -#define R_MIPS_INSERT_A 25 -#define R_MIPS_INSERT_B 26 -#define R_MIPS_DELETE 27 -#define R_MIPS_HIGHER 28 -#define R_MIPS_HIGHEST 29 -#define R_MIPS_CALL_HI16 30 -#define R_MIPS_CALL_LO16 31 -#define R_MIPS_SCN_DISP 32 -#define R_MIPS_REL16 33 -#define R_MIPS_ADD_IMMEDIATE 34 -#define R_MIPS_PJUMP 35 -#define R_MIPS_RELGOT 36 -#define R_MIPS_JALR 37 -#define R_MIPS_TLS_DTPMOD32 38 /* Module number 32 bit */ -#define R_MIPS_TLS_DTPREL32 39 /* Module-relative offset 32 bit */ -#define R_MIPS_TLS_DTPMOD64 40 /* Module number 64 bit */ -#define R_MIPS_TLS_DTPREL64 41 /* Module-relative offset 64 bit */ -#define R_MIPS_TLS_GD 42 /* 16 bit GOT offset for GD */ -#define R_MIPS_TLS_LDM 43 /* 16 bit GOT offset for LDM */ -#define R_MIPS_TLS_DTPREL_HI16 44 /* Module-relative offset, high 16 bits */ -#define R_MIPS_TLS_DTPREL_LO16 45 /* Module-relative offset, low 16 bits */ -#define R_MIPS_TLS_GOTTPREL 46 /* 16 bit GOT offset for IE */ -#define R_MIPS_TLS_TPREL32 47 /* TP-relative offset, 32 bit */ -#define R_MIPS_TLS_TPREL64 48 /* TP-relative offset, 64 bit */ -#define R_MIPS_TLS_TPREL_HI16 49 /* TP-relative offset, high 16 bits */ -#define R_MIPS_TLS_TPREL_LO16 50 /* TP-relative offset, low 16 bits */ -#define R_MIPS_GLOB_DAT 51 -#define R_MIPS_COPY 126 -#define R_MIPS_JUMP_SLOT 127 -/* Keep this the last entry. */ -#define R_MIPS_NUM 128 - -/* Legal values for p_type field of Elf32_Phdr. */ - -#define PT_MIPS_REGINFO 0x70000000 /* Register usage information */ -#define PT_MIPS_RTPROC 0x70000001 /* Runtime procedure table. */ -#define PT_MIPS_OPTIONS 0x70000002 - -/* Special program header types. */ - -#define PF_MIPS_LOCAL 0x10000000 - -/* Legal values for d_tag field of Elf32_Dyn. */ - -#define DT_MIPS_RLD_VERSION 0x70000001 /* Runtime linker interface version */ -#define DT_MIPS_TIME_STAMP 0x70000002 /* Timestamp */ -#define DT_MIPS_ICHECKSUM 0x70000003 /* Checksum */ -#define DT_MIPS_IVERSION 0x70000004 /* Version string (string tbl index) */ -#define DT_MIPS_FLAGS 0x70000005 /* Flags */ -#define DT_MIPS_BASE_ADDRESS 0x70000006 /* Base address */ -#define DT_MIPS_MSYM 0x70000007 -#define DT_MIPS_CONFLICT 0x70000008 /* Address of CONFLICT section */ -#define DT_MIPS_LIBLIST 0x70000009 /* Address of LIBLIST section */ -#define DT_MIPS_LOCAL_GOTNO 0x7000000a /* Number of local GOT entries */ -#define DT_MIPS_CONFLICTNO 0x7000000b /* Number of CONFLICT entries */ -#define DT_MIPS_LIBLISTNO 0x70000010 /* Number of LIBLIST entries */ -#define DT_MIPS_SYMTABNO 0x70000011 /* Number of DYNSYM entries */ -#define DT_MIPS_UNREFEXTNO 0x70000012 /* First external DYNSYM */ -#define DT_MIPS_GOTSYM 0x70000013 /* First GOT entry in DYNSYM */ -#define DT_MIPS_HIPAGENO 0x70000014 /* Number of GOT page table entries */ -#define DT_MIPS_RLD_MAP 0x70000016 /* Address of run time loader map. */ -#define DT_MIPS_DELTA_CLASS 0x70000017 /* Delta C++ class definition. */ -#define DT_MIPS_DELTA_CLASS_NO 0x70000018 /* Number of entries in - DT_MIPS_DELTA_CLASS. */ -#define DT_MIPS_DELTA_INSTANCE 0x70000019 /* Delta C++ class instances. */ -#define DT_MIPS_DELTA_INSTANCE_NO 0x7000001a /* Number of entries in - DT_MIPS_DELTA_INSTANCE. */ -#define DT_MIPS_DELTA_RELOC 0x7000001b /* Delta relocations. */ -#define DT_MIPS_DELTA_RELOC_NO 0x7000001c /* Number of entries in - DT_MIPS_DELTA_RELOC. */ -#define DT_MIPS_DELTA_SYM 0x7000001d /* Delta symbols that Delta - relocations refer to. */ -#define DT_MIPS_DELTA_SYM_NO 0x7000001e /* Number of entries in - DT_MIPS_DELTA_SYM. */ -#define DT_MIPS_DELTA_CLASSSYM 0x70000020 /* Delta symbols that hold the - class declaration. */ -#define DT_MIPS_DELTA_CLASSSYM_NO 0x70000021 /* Number of entries in - DT_MIPS_DELTA_CLASSSYM. */ -#define DT_MIPS_CXX_FLAGS 0x70000022 /* Flags indicating for C++ flavor. */ -#define DT_MIPS_PIXIE_INIT 0x70000023 -#define DT_MIPS_SYMBOL_LIB 0x70000024 -#define DT_MIPS_LOCALPAGE_GOTIDX 0x70000025 -#define DT_MIPS_LOCAL_GOTIDX 0x70000026 -#define DT_MIPS_HIDDEN_GOTIDX 0x70000027 -#define DT_MIPS_PROTECTED_GOTIDX 0x70000028 -#define DT_MIPS_OPTIONS 0x70000029 /* Address of .options. */ -#define DT_MIPS_INTERFACE 0x7000002a /* Address of .interface. */ -#define DT_MIPS_DYNSTR_ALIGN 0x7000002b -#define DT_MIPS_INTERFACE_SIZE 0x7000002c /* Size of the .interface section. */ -#define DT_MIPS_RLD_TEXT_RESOLVE_ADDR 0x7000002d /* Address of rld_text_rsolve - function stored in GOT. */ -#define DT_MIPS_PERF_SUFFIX 0x7000002e /* Default suffix of dso to be added - by rld on dlopen() calls. */ -#define DT_MIPS_COMPACT_SIZE 0x7000002f /* (O32)Size of compact rel section. */ -#define DT_MIPS_GP_VALUE 0x70000030 /* GP value for aux GOTs. */ -#define DT_MIPS_AUX_DYNAMIC 0x70000031 /* Address of aux .dynamic. */ -/* The address of .got.plt in an executable using the new non-PIC ABI. */ -#define DT_MIPS_PLTGOT 0x70000032 -/* The base of the PLT in an executable using the new non-PIC ABI if that - PLT is writable. For a non-writable PLT, this is omitted or has a zero - value. */ -#define DT_MIPS_RWPLT 0x70000034 -#define DT_MIPS_NUM 0x35 - -/* Legal values for DT_MIPS_FLAGS Elf32_Dyn entry. */ - -#define RHF_NONE 0 /* No flags */ -#define RHF_QUICKSTART (1 << 0) /* Use quickstart */ -#define RHF_NOTPOT (1 << 1) /* Hash size not power of 2 */ -#define RHF_NO_LIBRARY_REPLACEMENT (1 << 2) /* Ignore LD_LIBRARY_PATH */ -#define RHF_NO_MOVE (1 << 3) -#define RHF_SGI_ONLY (1 << 4) -#define RHF_GUARANTEE_INIT (1 << 5) -#define RHF_DELTA_C_PLUS_PLUS (1 << 6) -#define RHF_GUARANTEE_START_INIT (1 << 7) -#define RHF_PIXIE (1 << 8) -#define RHF_DEFAULT_DELAY_LOAD (1 << 9) -#define RHF_REQUICKSTART (1 << 10) -#define RHF_REQUICKSTARTED (1 << 11) -#define RHF_CORD (1 << 12) -#define RHF_NO_UNRES_UNDEF (1 << 13) -#define RHF_RLD_ORDER_SAFE (1 << 14) - -/* Entries found in sections of type SHT_MIPS_LIBLIST. */ - -typedef struct -{ - Elf32_Word l_name; /* Name (string table index) */ - Elf32_Word l_time_stamp; /* Timestamp */ - Elf32_Word l_checksum; /* Checksum */ - Elf32_Word l_version; /* Interface version */ - Elf32_Word l_flags; /* Flags */ -} Elf32_Lib; - -typedef struct -{ - Elf64_Word l_name; /* Name (string table index) */ - Elf64_Word l_time_stamp; /* Timestamp */ - Elf64_Word l_checksum; /* Checksum */ - Elf64_Word l_version; /* Interface version */ - Elf64_Word l_flags; /* Flags */ -} Elf64_Lib; - - -/* Legal values for l_flags. */ - -#define LL_NONE 0 -#define LL_EXACT_MATCH (1 << 0) /* Require exact match */ -#define LL_IGNORE_INT_VER (1 << 1) /* Ignore interface version */ -#define LL_REQUIRE_MINOR (1 << 2) -#define LL_EXPORTS (1 << 3) -#define LL_DELAY_LOAD (1 << 4) -#define LL_DELTA (1 << 5) - -/* Entries found in sections of type SHT_MIPS_CONFLICT. */ - -typedef Elf32_Addr Elf32_Conflict; - - -/* HPPA specific definitions. */ - -/* Legal values for e_flags field of Elf32_Ehdr. */ - -#define EF_PARISC_TRAPNIL 0x00010000 /* Trap nil pointer dereference. */ -#define EF_PARISC_EXT 0x00020000 /* Program uses arch. extensions. */ -#define EF_PARISC_LSB 0x00040000 /* Program expects little endian. */ -#define EF_PARISC_WIDE 0x00080000 /* Program expects wide mode. */ -#define EF_PARISC_NO_KABP 0x00100000 /* No kernel assisted branch - prediction. */ -#define EF_PARISC_LAZYSWAP 0x00400000 /* Allow lazy swapping. */ -#define EF_PARISC_ARCH 0x0000ffff /* Architecture version. */ - -/* Defined values for `e_flags & EF_PARISC_ARCH' are: */ - -#define EFA_PARISC_1_0 0x020b /* PA-RISC 1.0 big-endian. */ -#define EFA_PARISC_1_1 0x0210 /* PA-RISC 1.1 big-endian. */ -#define EFA_PARISC_2_0 0x0214 /* PA-RISC 2.0 big-endian. */ - -/* Additional section indeces. */ - -#define SHN_PARISC_ANSI_COMMON 0xff00 /* Section for tenatively declared - symbols in ANSI C. */ -#define SHN_PARISC_HUGE_COMMON 0xff01 /* Common blocks in huge model. */ - -/* Legal values for sh_type field of Elf32_Shdr. */ - -#define SHT_PARISC_EXT 0x70000000 /* Contains product specific ext. */ -#define SHT_PARISC_UNWIND 0x70000001 /* Unwind information. */ -#define SHT_PARISC_DOC 0x70000002 /* Debug info for optimized code. */ - -/* Legal values for sh_flags field of Elf32_Shdr. */ - -#define SHF_PARISC_SHORT 0x20000000 /* Section with short addressing. */ -#define SHF_PARISC_HUGE 0x40000000 /* Section far from gp. */ -#define SHF_PARISC_SBP 0x80000000 /* Static branch prediction code. */ - -/* Legal values for ST_TYPE subfield of st_info (symbol type). */ - -#define STT_PARISC_MILLICODE 13 /* Millicode function entry point. */ - -#define STT_HP_OPAQUE (STT_LOOS + 0x1) -#define STT_HP_STUB (STT_LOOS + 0x2) - -/* HPPA relocs. */ - -#define R_PARISC_NONE 0 /* No reloc. */ -#define R_PARISC_DIR32 1 /* Direct 32-bit reference. */ -#define R_PARISC_DIR21L 2 /* Left 21 bits of eff. address. */ -#define R_PARISC_DIR17R 3 /* Right 17 bits of eff. address. */ -#define R_PARISC_DIR17F 4 /* 17 bits of eff. address. */ -#define R_PARISC_DIR14R 6 /* Right 14 bits of eff. address. */ -#define R_PARISC_PCREL32 9 /* 32-bit rel. address. */ -#define R_PARISC_PCREL21L 10 /* Left 21 bits of rel. address. */ -#define R_PARISC_PCREL17R 11 /* Right 17 bits of rel. address. */ -#define R_PARISC_PCREL17F 12 /* 17 bits of rel. address. */ -#define R_PARISC_PCREL14R 14 /* Right 14 bits of rel. address. */ -#define R_PARISC_DPREL21L 18 /* Left 21 bits of rel. address. */ -#define R_PARISC_DPREL14R 22 /* Right 14 bits of rel. address. */ -#define R_PARISC_GPREL21L 26 /* GP-relative, left 21 bits. */ -#define R_PARISC_GPREL14R 30 /* GP-relative, right 14 bits. */ -#define R_PARISC_LTOFF21L 34 /* LT-relative, left 21 bits. */ -#define R_PARISC_LTOFF14R 38 /* LT-relative, right 14 bits. */ -#define R_PARISC_SECREL32 41 /* 32 bits section rel. address. */ -#define R_PARISC_SEGBASE 48 /* No relocation, set segment base. */ -#define R_PARISC_SEGREL32 49 /* 32 bits segment rel. address. */ -#define R_PARISC_PLTOFF21L 50 /* PLT rel. address, left 21 bits. */ -#define R_PARISC_PLTOFF14R 54 /* PLT rel. address, right 14 bits. */ -#define R_PARISC_LTOFF_FPTR32 57 /* 32 bits LT-rel. function pointer. */ -#define R_PARISC_LTOFF_FPTR21L 58 /* LT-rel. fct ptr, left 21 bits. */ -#define R_PARISC_LTOFF_FPTR14R 62 /* LT-rel. fct ptr, right 14 bits. */ -#define R_PARISC_FPTR64 64 /* 64 bits function address. */ -#define R_PARISC_PLABEL32 65 /* 32 bits function address. */ -#define R_PARISC_PLABEL21L 66 /* Left 21 bits of fdesc address. */ -#define R_PARISC_PLABEL14R 70 /* Right 14 bits of fdesc address. */ -#define R_PARISC_PCREL64 72 /* 64 bits PC-rel. address. */ -#define R_PARISC_PCREL22F 74 /* 22 bits PC-rel. address. */ -#define R_PARISC_PCREL14WR 75 /* PC-rel. address, right 14 bits. */ -#define R_PARISC_PCREL14DR 76 /* PC rel. address, right 14 bits. */ -#define R_PARISC_PCREL16F 77 /* 16 bits PC-rel. address. */ -#define R_PARISC_PCREL16WF 78 /* 16 bits PC-rel. address. */ -#define R_PARISC_PCREL16DF 79 /* 16 bits PC-rel. address. */ -#define R_PARISC_DIR64 80 /* 64 bits of eff. address. */ -#define R_PARISC_DIR14WR 83 /* 14 bits of eff. address. */ -#define R_PARISC_DIR14DR 84 /* 14 bits of eff. address. */ -#define R_PARISC_DIR16F 85 /* 16 bits of eff. address. */ -#define R_PARISC_DIR16WF 86 /* 16 bits of eff. address. */ -#define R_PARISC_DIR16DF 87 /* 16 bits of eff. address. */ -#define R_PARISC_GPREL64 88 /* 64 bits of GP-rel. address. */ -#define R_PARISC_GPREL14WR 91 /* GP-rel. address, right 14 bits. */ -#define R_PARISC_GPREL14DR 92 /* GP-rel. address, right 14 bits. */ -#define R_PARISC_GPREL16F 93 /* 16 bits GP-rel. address. */ -#define R_PARISC_GPREL16WF 94 /* 16 bits GP-rel. address. */ -#define R_PARISC_GPREL16DF 95 /* 16 bits GP-rel. address. */ -#define R_PARISC_LTOFF64 96 /* 64 bits LT-rel. address. */ -#define R_PARISC_LTOFF14WR 99 /* LT-rel. address, right 14 bits. */ -#define R_PARISC_LTOFF14DR 100 /* LT-rel. address, right 14 bits. */ -#define R_PARISC_LTOFF16F 101 /* 16 bits LT-rel. address. */ -#define R_PARISC_LTOFF16WF 102 /* 16 bits LT-rel. address. */ -#define R_PARISC_LTOFF16DF 103 /* 16 bits LT-rel. address. */ -#define R_PARISC_SECREL64 104 /* 64 bits section rel. address. */ -#define R_PARISC_SEGREL64 112 /* 64 bits segment rel. address. */ -#define R_PARISC_PLTOFF14WR 115 /* PLT-rel. address, right 14 bits. */ -#define R_PARISC_PLTOFF14DR 116 /* PLT-rel. address, right 14 bits. */ -#define R_PARISC_PLTOFF16F 117 /* 16 bits LT-rel. address. */ -#define R_PARISC_PLTOFF16WF 118 /* 16 bits PLT-rel. address. */ -#define R_PARISC_PLTOFF16DF 119 /* 16 bits PLT-rel. address. */ -#define R_PARISC_LTOFF_FPTR64 120 /* 64 bits LT-rel. function ptr. */ -#define R_PARISC_LTOFF_FPTR14WR 123 /* LT-rel. fct. ptr., right 14 bits. */ -#define R_PARISC_LTOFF_FPTR14DR 124 /* LT-rel. fct. ptr., right 14 bits. */ -#define R_PARISC_LTOFF_FPTR16F 125 /* 16 bits LT-rel. function ptr. */ -#define R_PARISC_LTOFF_FPTR16WF 126 /* 16 bits LT-rel. function ptr. */ -#define R_PARISC_LTOFF_FPTR16DF 127 /* 16 bits LT-rel. function ptr. */ -#define R_PARISC_LORESERVE 128 -#define R_PARISC_COPY 128 /* Copy relocation. */ -#define R_PARISC_IPLT 129 /* Dynamic reloc, imported PLT */ -#define R_PARISC_EPLT 130 /* Dynamic reloc, exported PLT */ -#define R_PARISC_TPREL32 153 /* 32 bits TP-rel. address. */ -#define R_PARISC_TPREL21L 154 /* TP-rel. address, left 21 bits. */ -#define R_PARISC_TPREL14R 158 /* TP-rel. address, right 14 bits. */ -#define R_PARISC_LTOFF_TP21L 162 /* LT-TP-rel. address, left 21 bits. */ -#define R_PARISC_LTOFF_TP14R 166 /* LT-TP-rel. address, right 14 bits.*/ -#define R_PARISC_LTOFF_TP14F 167 /* 14 bits LT-TP-rel. address. */ -#define R_PARISC_TPREL64 216 /* 64 bits TP-rel. address. */ -#define R_PARISC_TPREL14WR 219 /* TP-rel. address, right 14 bits. */ -#define R_PARISC_TPREL14DR 220 /* TP-rel. address, right 14 bits. */ -#define R_PARISC_TPREL16F 221 /* 16 bits TP-rel. address. */ -#define R_PARISC_TPREL16WF 222 /* 16 bits TP-rel. address. */ -#define R_PARISC_TPREL16DF 223 /* 16 bits TP-rel. address. */ -#define R_PARISC_LTOFF_TP64 224 /* 64 bits LT-TP-rel. address. */ -#define R_PARISC_LTOFF_TP14WR 227 /* LT-TP-rel. address, right 14 bits.*/ -#define R_PARISC_LTOFF_TP14DR 228 /* LT-TP-rel. address, right 14 bits.*/ -#define R_PARISC_LTOFF_TP16F 229 /* 16 bits LT-TP-rel. address. */ -#define R_PARISC_LTOFF_TP16WF 230 /* 16 bits LT-TP-rel. address. */ -#define R_PARISC_LTOFF_TP16DF 231 /* 16 bits LT-TP-rel. address. */ -#define R_PARISC_GNU_VTENTRY 232 -#define R_PARISC_GNU_VTINHERIT 233 -#define R_PARISC_TLS_GD21L 234 /* GD 21-bit left. */ -#define R_PARISC_TLS_GD14R 235 /* GD 14-bit right. */ -#define R_PARISC_TLS_GDCALL 236 /* GD call to __t_g_a. */ -#define R_PARISC_TLS_LDM21L 237 /* LD module 21-bit left. */ -#define R_PARISC_TLS_LDM14R 238 /* LD module 14-bit right. */ -#define R_PARISC_TLS_LDMCALL 239 /* LD module call to __t_g_a. */ -#define R_PARISC_TLS_LDO21L 240 /* LD offset 21-bit left. */ -#define R_PARISC_TLS_LDO14R 241 /* LD offset 14-bit right. */ -#define R_PARISC_TLS_DTPMOD32 242 /* DTP module 32-bit. */ -#define R_PARISC_TLS_DTPMOD64 243 /* DTP module 64-bit. */ -#define R_PARISC_TLS_DTPOFF32 244 /* DTP offset 32-bit. */ -#define R_PARISC_TLS_DTPOFF64 245 /* DTP offset 32-bit. */ -#define R_PARISC_TLS_LE21L R_PARISC_TPREL21L -#define R_PARISC_TLS_LE14R R_PARISC_TPREL14R -#define R_PARISC_TLS_IE21L R_PARISC_LTOFF_TP21L -#define R_PARISC_TLS_IE14R R_PARISC_LTOFF_TP14R -#define R_PARISC_TLS_TPREL32 R_PARISC_TPREL32 -#define R_PARISC_TLS_TPREL64 R_PARISC_TPREL64 -#define R_PARISC_HIRESERVE 255 - -/* Legal values for p_type field of Elf32_Phdr/Elf64_Phdr. */ - -#define PT_HP_TLS (PT_LOOS + 0x0) -#define PT_HP_CORE_NONE (PT_LOOS + 0x1) -#define PT_HP_CORE_VERSION (PT_LOOS + 0x2) -#define PT_HP_CORE_KERNEL (PT_LOOS + 0x3) -#define PT_HP_CORE_COMM (PT_LOOS + 0x4) -#define PT_HP_CORE_PROC (PT_LOOS + 0x5) -#define PT_HP_CORE_LOADABLE (PT_LOOS + 0x6) -#define PT_HP_CORE_STACK (PT_LOOS + 0x7) -#define PT_HP_CORE_SHM (PT_LOOS + 0x8) -#define PT_HP_CORE_MMF (PT_LOOS + 0x9) -#define PT_HP_PARALLEL (PT_LOOS + 0x10) -#define PT_HP_FASTBIND (PT_LOOS + 0x11) -#define PT_HP_OPT_ANNOT (PT_LOOS + 0x12) -#define PT_HP_HSL_ANNOT (PT_LOOS + 0x13) -#define PT_HP_STACK (PT_LOOS + 0x14) - -#define PT_PARISC_ARCHEXT 0x70000000 -#define PT_PARISC_UNWIND 0x70000001 - -/* Legal values for p_flags field of Elf32_Phdr/Elf64_Phdr. */ - -#define PF_PARISC_SBP 0x08000000 - -#define PF_HP_PAGE_SIZE 0x00100000 -#define PF_HP_FAR_SHARED 0x00200000 -#define PF_HP_NEAR_SHARED 0x00400000 -#define PF_HP_CODE 0x01000000 -#define PF_HP_MODIFY 0x02000000 -#define PF_HP_LAZYSWAP 0x04000000 -#define PF_HP_SBP 0x08000000 - - -/* Alpha specific definitions. */ - -/* Legal values for e_flags field of Elf64_Ehdr. */ - -#define EF_ALPHA_32BIT 1 /* All addresses must be < 2GB. */ -#define EF_ALPHA_CANRELAX 2 /* Relocations for relaxing exist. */ - -/* Legal values for sh_type field of Elf64_Shdr. */ - -/* These two are primerily concerned with ECOFF debugging info. */ -#define SHT_ALPHA_DEBUG 0x70000001 -#define SHT_ALPHA_REGINFO 0x70000002 - -/* Legal values for sh_flags field of Elf64_Shdr. */ - -#define SHF_ALPHA_GPREL 0x10000000 - -/* Legal values for st_other field of Elf64_Sym. */ -#define STO_ALPHA_NOPV 0x80 /* No PV required. */ -#define STO_ALPHA_STD_GPLOAD 0x88 /* PV only used for initial ldgp. */ - -/* Alpha relocs. */ - -#define R_ALPHA_NONE 0 /* No reloc */ -#define R_ALPHA_REFLONG 1 /* Direct 32 bit */ -#define R_ALPHA_REFQUAD 2 /* Direct 64 bit */ -#define R_ALPHA_GPREL32 3 /* GP relative 32 bit */ -#define R_ALPHA_LITERAL 4 /* GP relative 16 bit w/optimization */ -#define R_ALPHA_LITUSE 5 /* Optimization hint for LITERAL */ -#define R_ALPHA_GPDISP 6 /* Add displacement to GP */ -#define R_ALPHA_BRADDR 7 /* PC+4 relative 23 bit shifted */ -#define R_ALPHA_HINT 8 /* PC+4 relative 16 bit shifted */ -#define R_ALPHA_SREL16 9 /* PC relative 16 bit */ -#define R_ALPHA_SREL32 10 /* PC relative 32 bit */ -#define R_ALPHA_SREL64 11 /* PC relative 64 bit */ -#define R_ALPHA_GPRELHIGH 17 /* GP relative 32 bit, high 16 bits */ -#define R_ALPHA_GPRELLOW 18 /* GP relative 32 bit, low 16 bits */ -#define R_ALPHA_GPREL16 19 /* GP relative 16 bit */ -#define R_ALPHA_COPY 24 /* Copy symbol at runtime */ -#define R_ALPHA_GLOB_DAT 25 /* Create GOT entry */ -#define R_ALPHA_JMP_SLOT 26 /* Create PLT entry */ -#define R_ALPHA_RELATIVE 27 /* Adjust by program base */ -#define R_ALPHA_TLS_GD_HI 28 -#define R_ALPHA_TLSGD 29 -#define R_ALPHA_TLS_LDM 30 -#define R_ALPHA_DTPMOD64 31 -#define R_ALPHA_GOTDTPREL 32 -#define R_ALPHA_DTPREL64 33 -#define R_ALPHA_DTPRELHI 34 -#define R_ALPHA_DTPRELLO 35 -#define R_ALPHA_DTPREL16 36 -#define R_ALPHA_GOTTPREL 37 -#define R_ALPHA_TPREL64 38 -#define R_ALPHA_TPRELHI 39 -#define R_ALPHA_TPRELLO 40 -#define R_ALPHA_TPREL16 41 -/* Keep this the last entry. */ -#define R_ALPHA_NUM 46 - -/* Magic values of the LITUSE relocation addend. */ -#define LITUSE_ALPHA_ADDR 0 -#define LITUSE_ALPHA_BASE 1 -#define LITUSE_ALPHA_BYTOFF 2 -#define LITUSE_ALPHA_JSR 3 -#define LITUSE_ALPHA_TLS_GD 4 -#define LITUSE_ALPHA_TLS_LDM 5 - -/* Legal values for d_tag of Elf64_Dyn. */ -#define DT_ALPHA_PLTRO (DT_LOPROC + 0) -#define DT_ALPHA_NUM 1 - -/* PowerPC specific declarations */ - -/* Values for Elf32/64_Ehdr.e_flags. */ -#define EF_PPC_EMB 0x80000000 /* PowerPC embedded flag */ - -/* Cygnus local bits below */ -#define EF_PPC_RELOCATABLE 0x00010000 /* PowerPC -mrelocatable flag*/ -#define EF_PPC_RELOCATABLE_LIB 0x00008000 /* PowerPC -mrelocatable-lib - flag */ - -/* PowerPC relocations defined by the ABIs */ -#define R_PPC_NONE 0 -#define R_PPC_ADDR32 1 /* 32bit absolute address */ -#define R_PPC_ADDR24 2 /* 26bit address, 2 bits ignored. */ -#define R_PPC_ADDR16 3 /* 16bit absolute address */ -#define R_PPC_ADDR16_LO 4 /* lower 16bit of absolute address */ -#define R_PPC_ADDR16_HI 5 /* high 16bit of absolute address */ -#define R_PPC_ADDR16_HA 6 /* adjusted high 16bit */ -#define R_PPC_ADDR14 7 /* 16bit address, 2 bits ignored */ -#define R_PPC_ADDR14_BRTAKEN 8 -#define R_PPC_ADDR14_BRNTAKEN 9 -#define R_PPC_REL24 10 /* PC relative 26 bit */ -#define R_PPC_REL14 11 /* PC relative 16 bit */ -#define R_PPC_REL14_BRTAKEN 12 -#define R_PPC_REL14_BRNTAKEN 13 -#define R_PPC_GOT16 14 -#define R_PPC_GOT16_LO 15 -#define R_PPC_GOT16_HI 16 -#define R_PPC_GOT16_HA 17 -#define R_PPC_PLTREL24 18 -#define R_PPC_COPY 19 -#define R_PPC_GLOB_DAT 20 -#define R_PPC_JMP_SLOT 21 -#define R_PPC_RELATIVE 22 -#define R_PPC_LOCAL24PC 23 -#define R_PPC_UADDR32 24 -#define R_PPC_UADDR16 25 -#define R_PPC_REL32 26 -#define R_PPC_PLT32 27 -#define R_PPC_PLTREL32 28 -#define R_PPC_PLT16_LO 29 -#define R_PPC_PLT16_HI 30 -#define R_PPC_PLT16_HA 31 -#define R_PPC_SDAREL16 32 -#define R_PPC_SECTOFF 33 -#define R_PPC_SECTOFF_LO 34 -#define R_PPC_SECTOFF_HI 35 -#define R_PPC_SECTOFF_HA 36 - -/* PowerPC relocations defined for the TLS access ABI. */ -#define R_PPC_TLS 67 /* none (sym+add)@tls */ -#define R_PPC_DTPMOD32 68 /* word32 (sym+add)@dtpmod */ -#define R_PPC_TPREL16 69 /* half16* (sym+add)@tprel */ -#define R_PPC_TPREL16_LO 70 /* half16 (sym+add)@tprel@l */ -#define R_PPC_TPREL16_HI 71 /* half16 (sym+add)@tprel@h */ -#define R_PPC_TPREL16_HA 72 /* half16 (sym+add)@tprel@ha */ -#define R_PPC_TPREL32 73 /* word32 (sym+add)@tprel */ -#define R_PPC_DTPREL16 74 /* half16* (sym+add)@dtprel */ -#define R_PPC_DTPREL16_LO 75 /* half16 (sym+add)@dtprel@l */ -#define R_PPC_DTPREL16_HI 76 /* half16 (sym+add)@dtprel@h */ -#define R_PPC_DTPREL16_HA 77 /* half16 (sym+add)@dtprel@ha */ -#define R_PPC_DTPREL32 78 /* word32 (sym+add)@dtprel */ -#define R_PPC_GOT_TLSGD16 79 /* half16* (sym+add)@got@tlsgd */ -#define R_PPC_GOT_TLSGD16_LO 80 /* half16 (sym+add)@got@tlsgd@l */ -#define R_PPC_GOT_TLSGD16_HI 81 /* half16 (sym+add)@got@tlsgd@h */ -#define R_PPC_GOT_TLSGD16_HA 82 /* half16 (sym+add)@got@tlsgd@ha */ -#define R_PPC_GOT_TLSLD16 83 /* half16* (sym+add)@got@tlsld */ -#define R_PPC_GOT_TLSLD16_LO 84 /* half16 (sym+add)@got@tlsld@l */ -#define R_PPC_GOT_TLSLD16_HI 85 /* half16 (sym+add)@got@tlsld@h */ -#define R_PPC_GOT_TLSLD16_HA 86 /* half16 (sym+add)@got@tlsld@ha */ -#define R_PPC_GOT_TPREL16 87 /* half16* (sym+add)@got@tprel */ -#define R_PPC_GOT_TPREL16_LO 88 /* half16 (sym+add)@got@tprel@l */ -#define R_PPC_GOT_TPREL16_HI 89 /* half16 (sym+add)@got@tprel@h */ -#define R_PPC_GOT_TPREL16_HA 90 /* half16 (sym+add)@got@tprel@ha */ -#define R_PPC_GOT_DTPREL16 91 /* half16* (sym+add)@got@dtprel */ -#define R_PPC_GOT_DTPREL16_LO 92 /* half16* (sym+add)@got@dtprel@l */ -#define R_PPC_GOT_DTPREL16_HI 93 /* half16* (sym+add)@got@dtprel@h */ -#define R_PPC_GOT_DTPREL16_HA 94 /* half16* (sym+add)@got@dtprel@ha */ - -/* The remaining relocs are from the Embedded ELF ABI, and are not - in the SVR4 ELF ABI. */ -#define R_PPC_EMB_NADDR32 101 -#define R_PPC_EMB_NADDR16 102 -#define R_PPC_EMB_NADDR16_LO 103 -#define R_PPC_EMB_NADDR16_HI 104 -#define R_PPC_EMB_NADDR16_HA 105 -#define R_PPC_EMB_SDAI16 106 -#define R_PPC_EMB_SDA2I16 107 -#define R_PPC_EMB_SDA2REL 108 -#define R_PPC_EMB_SDA21 109 /* 16 bit offset in SDA */ -#define R_PPC_EMB_MRKREF 110 -#define R_PPC_EMB_RELSEC16 111 -#define R_PPC_EMB_RELST_LO 112 -#define R_PPC_EMB_RELST_HI 113 -#define R_PPC_EMB_RELST_HA 114 -#define R_PPC_EMB_BIT_FLD 115 -#define R_PPC_EMB_RELSDA 116 /* 16 bit relative offset in SDA */ - -/* Diab tool relocations. */ -#define R_PPC_DIAB_SDA21_LO 180 /* like EMB_SDA21, but lower 16 bit */ -#define R_PPC_DIAB_SDA21_HI 181 /* like EMB_SDA21, but high 16 bit */ -#define R_PPC_DIAB_SDA21_HA 182 /* like EMB_SDA21, adjusted high 16 */ -#define R_PPC_DIAB_RELSDA_LO 183 /* like EMB_RELSDA, but lower 16 bit */ -#define R_PPC_DIAB_RELSDA_HI 184 /* like EMB_RELSDA, but high 16 bit */ -#define R_PPC_DIAB_RELSDA_HA 185 /* like EMB_RELSDA, adjusted high 16 */ - -/* GNU extension to support local ifunc. */ -#define R_PPC_IRELATIVE 248 - -/* GNU relocs used in PIC code sequences. */ -#define R_PPC_REL16 249 /* half16 (sym+add-.) */ -#define R_PPC_REL16_LO 250 /* half16 (sym+add-.)@l */ -#define R_PPC_REL16_HI 251 /* half16 (sym+add-.)@h */ -#define R_PPC_REL16_HA 252 /* half16 (sym+add-.)@ha */ - -/* This is a phony reloc to handle any old fashioned TOC16 references - that may still be in object files. */ -#define R_PPC_TOC16 255 - -/* PowerPC specific values for the Dyn d_tag field. */ -#define DT_PPC_GOT (DT_LOPROC + 0) -#define DT_PPC_NUM 1 - -/* PowerPC64 relocations defined by the ABIs */ -#define R_PPC64_NONE R_PPC_NONE -#define R_PPC64_ADDR32 R_PPC_ADDR32 /* 32bit absolute address */ -#define R_PPC64_ADDR24 R_PPC_ADDR24 /* 26bit address, word aligned */ -#define R_PPC64_ADDR16 R_PPC_ADDR16 /* 16bit absolute address */ -#define R_PPC64_ADDR16_LO R_PPC_ADDR16_LO /* lower 16bits of address */ -#define R_PPC64_ADDR16_HI R_PPC_ADDR16_HI /* high 16bits of address. */ -#define R_PPC64_ADDR16_HA R_PPC_ADDR16_HA /* adjusted high 16bits. */ -#define R_PPC64_ADDR14 R_PPC_ADDR14 /* 16bit address, word aligned */ -#define R_PPC64_ADDR14_BRTAKEN R_PPC_ADDR14_BRTAKEN -#define R_PPC64_ADDR14_BRNTAKEN R_PPC_ADDR14_BRNTAKEN -#define R_PPC64_REL24 R_PPC_REL24 /* PC-rel. 26 bit, word aligned */ -#define R_PPC64_REL14 R_PPC_REL14 /* PC relative 16 bit */ -#define R_PPC64_REL14_BRTAKEN R_PPC_REL14_BRTAKEN -#define R_PPC64_REL14_BRNTAKEN R_PPC_REL14_BRNTAKEN -#define R_PPC64_GOT16 R_PPC_GOT16 -#define R_PPC64_GOT16_LO R_PPC_GOT16_LO -#define R_PPC64_GOT16_HI R_PPC_GOT16_HI -#define R_PPC64_GOT16_HA R_PPC_GOT16_HA - -#define R_PPC64_COPY R_PPC_COPY -#define R_PPC64_GLOB_DAT R_PPC_GLOB_DAT -#define R_PPC64_JMP_SLOT R_PPC_JMP_SLOT -#define R_PPC64_RELATIVE R_PPC_RELATIVE - -#define R_PPC64_UADDR32 R_PPC_UADDR32 -#define R_PPC64_UADDR16 R_PPC_UADDR16 -#define R_PPC64_REL32 R_PPC_REL32 -#define R_PPC64_PLT32 R_PPC_PLT32 -#define R_PPC64_PLTREL32 R_PPC_PLTREL32 -#define R_PPC64_PLT16_LO R_PPC_PLT16_LO -#define R_PPC64_PLT16_HI R_PPC_PLT16_HI -#define R_PPC64_PLT16_HA R_PPC_PLT16_HA - -#define R_PPC64_SECTOFF R_PPC_SECTOFF -#define R_PPC64_SECTOFF_LO R_PPC_SECTOFF_LO -#define R_PPC64_SECTOFF_HI R_PPC_SECTOFF_HI -#define R_PPC64_SECTOFF_HA R_PPC_SECTOFF_HA -#define R_PPC64_ADDR30 37 /* word30 (S + A - P) >> 2 */ -#define R_PPC64_ADDR64 38 /* doubleword64 S + A */ -#define R_PPC64_ADDR16_HIGHER 39 /* half16 #higher(S + A) */ -#define R_PPC64_ADDR16_HIGHERA 40 /* half16 #highera(S + A) */ -#define R_PPC64_ADDR16_HIGHEST 41 /* half16 #highest(S + A) */ -#define R_PPC64_ADDR16_HIGHESTA 42 /* half16 #highesta(S + A) */ -#define R_PPC64_UADDR64 43 /* doubleword64 S + A */ -#define R_PPC64_REL64 44 /* doubleword64 S + A - P */ -#define R_PPC64_PLT64 45 /* doubleword64 L + A */ -#define R_PPC64_PLTREL64 46 /* doubleword64 L + A - P */ -#define R_PPC64_TOC16 47 /* half16* S + A - .TOC */ -#define R_PPC64_TOC16_LO 48 /* half16 #lo(S + A - .TOC.) */ -#define R_PPC64_TOC16_HI 49 /* half16 #hi(S + A - .TOC.) */ -#define R_PPC64_TOC16_HA 50 /* half16 #ha(S + A - .TOC.) */ -#define R_PPC64_TOC 51 /* doubleword64 .TOC */ -#define R_PPC64_PLTGOT16 52 /* half16* M + A */ -#define R_PPC64_PLTGOT16_LO 53 /* half16 #lo(M + A) */ -#define R_PPC64_PLTGOT16_HI 54 /* half16 #hi(M + A) */ -#define R_PPC64_PLTGOT16_HA 55 /* half16 #ha(M + A) */ - -#define R_PPC64_ADDR16_DS 56 /* half16ds* (S + A) >> 2 */ -#define R_PPC64_ADDR16_LO_DS 57 /* half16ds #lo(S + A) >> 2 */ -#define R_PPC64_GOT16_DS 58 /* half16ds* (G + A) >> 2 */ -#define R_PPC64_GOT16_LO_DS 59 /* half16ds #lo(G + A) >> 2 */ -#define R_PPC64_PLT16_LO_DS 60 /* half16ds #lo(L + A) >> 2 */ -#define R_PPC64_SECTOFF_DS 61 /* half16ds* (R + A) >> 2 */ -#define R_PPC64_SECTOFF_LO_DS 62 /* half16ds #lo(R + A) >> 2 */ -#define R_PPC64_TOC16_DS 63 /* half16ds* (S + A - .TOC.) >> 2 */ -#define R_PPC64_TOC16_LO_DS 64 /* half16ds #lo(S + A - .TOC.) >> 2 */ -#define R_PPC64_PLTGOT16_DS 65 /* half16ds* (M + A) >> 2 */ -#define R_PPC64_PLTGOT16_LO_DS 66 /* half16ds #lo(M + A) >> 2 */ - -/* PowerPC64 relocations defined for the TLS access ABI. */ -#define R_PPC64_TLS 67 /* none (sym+add)@tls */ -#define R_PPC64_DTPMOD64 68 /* doubleword64 (sym+add)@dtpmod */ -#define R_PPC64_TPREL16 69 /* half16* (sym+add)@tprel */ -#define R_PPC64_TPREL16_LO 70 /* half16 (sym+add)@tprel@l */ -#define R_PPC64_TPREL16_HI 71 /* half16 (sym+add)@tprel@h */ -#define R_PPC64_TPREL16_HA 72 /* half16 (sym+add)@tprel@ha */ -#define R_PPC64_TPREL64 73 /* doubleword64 (sym+add)@tprel */ -#define R_PPC64_DTPREL16 74 /* half16* (sym+add)@dtprel */ -#define R_PPC64_DTPREL16_LO 75 /* half16 (sym+add)@dtprel@l */ -#define R_PPC64_DTPREL16_HI 76 /* half16 (sym+add)@dtprel@h */ -#define R_PPC64_DTPREL16_HA 77 /* half16 (sym+add)@dtprel@ha */ -#define R_PPC64_DTPREL64 78 /* doubleword64 (sym+add)@dtprel */ -#define R_PPC64_GOT_TLSGD16 79 /* half16* (sym+add)@got@tlsgd */ -#define R_PPC64_GOT_TLSGD16_LO 80 /* half16 (sym+add)@got@tlsgd@l */ -#define R_PPC64_GOT_TLSGD16_HI 81 /* half16 (sym+add)@got@tlsgd@h */ -#define R_PPC64_GOT_TLSGD16_HA 82 /* half16 (sym+add)@got@tlsgd@ha */ -#define R_PPC64_GOT_TLSLD16 83 /* half16* (sym+add)@got@tlsld */ -#define R_PPC64_GOT_TLSLD16_LO 84 /* half16 (sym+add)@got@tlsld@l */ -#define R_PPC64_GOT_TLSLD16_HI 85 /* half16 (sym+add)@got@tlsld@h */ -#define R_PPC64_GOT_TLSLD16_HA 86 /* half16 (sym+add)@got@tlsld@ha */ -#define R_PPC64_GOT_TPREL16_DS 87 /* half16ds* (sym+add)@got@tprel */ -#define R_PPC64_GOT_TPREL16_LO_DS 88 /* half16ds (sym+add)@got@tprel@l */ -#define R_PPC64_GOT_TPREL16_HI 89 /* half16 (sym+add)@got@tprel@h */ -#define R_PPC64_GOT_TPREL16_HA 90 /* half16 (sym+add)@got@tprel@ha */ -#define R_PPC64_GOT_DTPREL16_DS 91 /* half16ds* (sym+add)@got@dtprel */ -#define R_PPC64_GOT_DTPREL16_LO_DS 92 /* half16ds (sym+add)@got@dtprel@l */ -#define R_PPC64_GOT_DTPREL16_HI 93 /* half16 (sym+add)@got@dtprel@h */ -#define R_PPC64_GOT_DTPREL16_HA 94 /* half16 (sym+add)@got@dtprel@ha */ -#define R_PPC64_TPREL16_DS 95 /* half16ds* (sym+add)@tprel */ -#define R_PPC64_TPREL16_LO_DS 96 /* half16ds (sym+add)@tprel@l */ -#define R_PPC64_TPREL16_HIGHER 97 /* half16 (sym+add)@tprel@higher */ -#define R_PPC64_TPREL16_HIGHERA 98 /* half16 (sym+add)@tprel@highera */ -#define R_PPC64_TPREL16_HIGHEST 99 /* half16 (sym+add)@tprel@highest */ -#define R_PPC64_TPREL16_HIGHESTA 100 /* half16 (sym+add)@tprel@highesta */ -#define R_PPC64_DTPREL16_DS 101 /* half16ds* (sym+add)@dtprel */ -#define R_PPC64_DTPREL16_LO_DS 102 /* half16ds (sym+add)@dtprel@l */ -#define R_PPC64_DTPREL16_HIGHER 103 /* half16 (sym+add)@dtprel@higher */ -#define R_PPC64_DTPREL16_HIGHERA 104 /* half16 (sym+add)@dtprel@highera */ -#define R_PPC64_DTPREL16_HIGHEST 105 /* half16 (sym+add)@dtprel@highest */ -#define R_PPC64_DTPREL16_HIGHESTA 106 /* half16 (sym+add)@dtprel@highesta */ -#define R_PPC64_TLSGD 107 /* none (sym+add)@tlsgd */ -#define R_PPC64_TLSLD 108 /* none (sym+add)@tlsld */ -#define R_PPC64_TOCSAVE 109 /* none */ - -/* Added when HA and HI relocs were changed to report overflows. */ -#define R_PPC64_ADDR16_HIGH 110 -#define R_PPC64_ADDR16_HIGHA 111 -#define R_PPC64_TPREL16_HIGH 112 -#define R_PPC64_TPREL16_HIGHA 113 -#define R_PPC64_DTPREL16_HIGH 114 -#define R_PPC64_DTPREL16_HIGHA 115 - -/* GNU extension to support local ifunc. */ -#define R_PPC64_JMP_IREL 247 -#define R_PPC64_IRELATIVE 248 -#define R_PPC64_REL16 249 /* half16 (sym+add-.) */ -#define R_PPC64_REL16_LO 250 /* half16 (sym+add-.)@l */ -#define R_PPC64_REL16_HI 251 /* half16 (sym+add-.)@h */ -#define R_PPC64_REL16_HA 252 /* half16 (sym+add-.)@ha */ - -/* e_flags bits specifying ABI. - 1 for original function descriptor using ABI, - 2 for revised ABI without function descriptors, - 0 for unspecified or not using any features affected by the differences. */ -#define EF_PPC64_ABI 3 - -/* PowerPC64 specific values for the Dyn d_tag field. */ -#define DT_PPC64_GLINK (DT_LOPROC + 0) -#define DT_PPC64_OPD (DT_LOPROC + 1) -#define DT_PPC64_OPDSZ (DT_LOPROC + 2) -#define DT_PPC64_OPT (DT_LOPROC + 3) -#define DT_PPC64_NUM 3 - -/* PowerPC64 specific values for the DT_PPC64_OPT Dyn entry. */ -#define PPC64_OPT_TLS 1 -#define PPC64_OPT_MULTI_TOC 2 - -/* PowerPC64 specific values for the Elf64_Sym st_other field. */ -#define STO_PPC64_LOCAL_BIT 5 -#define STO_PPC64_LOCAL_MASK (7 << STO_PPC64_LOCAL_BIT) -#define PPC64_LOCAL_ENTRY_OFFSET(other) \ - (((1 << (((other) & STO_PPC64_LOCAL_MASK) >> STO_PPC64_LOCAL_BIT)) >> 2) << 2) - - -/* ARM specific declarations */ - -/* Processor specific flags for the ELF header e_flags field. */ -#define EF_ARM_RELEXEC 0x01 -#define EF_ARM_HASENTRY 0x02 -#define EF_ARM_INTERWORK 0x04 -#define EF_ARM_APCS_26 0x08 -#define EF_ARM_APCS_FLOAT 0x10 -#define EF_ARM_PIC 0x20 -#define EF_ARM_ALIGN8 0x40 /* 8-bit structure alignment is in use */ -#define EF_ARM_NEW_ABI 0x80 -#define EF_ARM_OLD_ABI 0x100 -#define EF_ARM_SOFT_FLOAT 0x200 -#define EF_ARM_VFP_FLOAT 0x400 -#define EF_ARM_MAVERICK_FLOAT 0x800 - -#define EF_ARM_ABI_FLOAT_SOFT 0x200 /* NB conflicts with EF_ARM_SOFT_FLOAT */ -#define EF_ARM_ABI_FLOAT_HARD 0x400 /* NB conflicts with EF_ARM_VFP_FLOAT */ - - -/* Other constants defined in the ARM ELF spec. version B-01. */ -/* NB. These conflict with values defined above. */ -#define EF_ARM_SYMSARESORTED 0x04 -#define EF_ARM_DYNSYMSUSESEGIDX 0x08 -#define EF_ARM_MAPSYMSFIRST 0x10 -#define EF_ARM_EABIMASK 0XFF000000 - -/* Constants defined in AAELF. */ -#define EF_ARM_BE8 0x00800000 -#define EF_ARM_LE8 0x00400000 - -#define EF_ARM_EABI_VERSION(flags) ((flags) & EF_ARM_EABIMASK) -#define EF_ARM_EABI_UNKNOWN 0x00000000 -#define EF_ARM_EABI_VER1 0x01000000 -#define EF_ARM_EABI_VER2 0x02000000 -#define EF_ARM_EABI_VER3 0x03000000 -#define EF_ARM_EABI_VER4 0x04000000 -#define EF_ARM_EABI_VER5 0x05000000 - -/* Additional symbol types for Thumb. */ -#define STT_ARM_TFUNC STT_LOPROC /* A Thumb function. */ -#define STT_ARM_16BIT STT_HIPROC /* A Thumb label. */ - -/* ARM-specific values for sh_flags */ -#define SHF_ARM_ENTRYSECT 0x10000000 /* Section contains an entry point */ -#define SHF_ARM_COMDEF 0x80000000 /* Section may be multiply defined - in the input to a link step. */ - -/* ARM-specific program header flags */ -#define PF_ARM_SB 0x10000000 /* Segment contains the location - addressed by the static base. */ -#define PF_ARM_PI 0x20000000 /* Position-independent segment. */ -#define PF_ARM_ABS 0x40000000 /* Absolute segment. */ - -/* Processor specific values for the Phdr p_type field. */ -#define PT_ARM_EXIDX (PT_LOPROC + 1) /* ARM unwind segment. */ - -/* Processor specific values for the Shdr sh_type field. */ -#define SHT_ARM_EXIDX (SHT_LOPROC + 1) /* ARM unwind section. */ -#define SHT_ARM_PREEMPTMAP (SHT_LOPROC + 2) /* Preemption details. */ -#define SHT_ARM_ATTRIBUTES (SHT_LOPROC + 3) /* ARM attributes section. */ - - -/* AArch64 relocs. */ - -#define R_AARCH64_NONE 0 /* No relocation. */ -#define R_AARCH64_ABS64 257 /* Direct 64 bit. */ -#define R_AARCH64_ABS32 258 /* Direct 32 bit. */ -#define R_AARCH64_ABS16 259 /* Direct 16-bit. */ -#define R_AARCH64_PREL64 260 /* PC-relative 64-bit. */ -#define R_AARCH64_PREL32 261 /* PC-relative 32-bit. */ -#define R_AARCH64_PREL16 262 /* PC-relative 16-bit. */ -#define R_AARCH64_MOVW_UABS_G0 263 /* Dir. MOVZ imm. from bits 15:0. */ -#define R_AARCH64_MOVW_UABS_G0_NC 264 /* Likewise for MOVK; no check. */ -#define R_AARCH64_MOVW_UABS_G1 265 /* Dir. MOVZ imm. from bits 31:16. */ -#define R_AARCH64_MOVW_UABS_G1_NC 266 /* Likewise for MOVK; no check. */ -#define R_AARCH64_MOVW_UABS_G2 267 /* Dir. MOVZ imm. from bits 47:32. */ -#define R_AARCH64_MOVW_UABS_G2_NC 268 /* Likewise for MOVK; no check. */ -#define R_AARCH64_MOVW_UABS_G3 269 /* Dir. MOV{K,Z} imm. from 63:48. */ -#define R_AARCH64_MOVW_SABS_G0 270 /* Dir. MOV{N,Z} imm. from 15:0. */ -#define R_AARCH64_MOVW_SABS_G1 271 /* Dir. MOV{N,Z} imm. from 31:16. */ -#define R_AARCH64_MOVW_SABS_G2 272 /* Dir. MOV{N,Z} imm. from 47:32. */ -#define R_AARCH64_LD_PREL_LO19 273 /* PC-rel. LD imm. from bits 20:2. */ -#define R_AARCH64_ADR_PREL_LO21 274 /* PC-rel. ADR imm. from bits 20:0. */ -#define R_AARCH64_ADR_PREL_PG_HI21 275 /* Page-rel. ADRP imm. from 32:12. */ -#define R_AARCH64_ADR_PREL_PG_HI21_NC 276 /* Likewise; no overflow check. */ -#define R_AARCH64_ADD_ABS_LO12_NC 277 /* Dir. ADD imm. from bits 11:0. */ -#define R_AARCH64_LDST8_ABS_LO12_NC 278 /* Likewise for LD/ST; no check. */ -#define R_AARCH64_TSTBR14 279 /* PC-rel. TBZ/TBNZ imm. from 15:2. */ -#define R_AARCH64_CONDBR19 280 /* PC-rel. cond. br. imm. from 20:2. */ -#define R_AARCH64_JUMP26 282 /* PC-rel. B imm. from bits 27:2. */ -#define R_AARCH64_CALL26 283 /* Likewise for CALL. */ -#define R_AARCH64_LDST16_ABS_LO12_NC 284 /* Dir. ADD imm. from bits 11:1. */ -#define R_AARCH64_LDST32_ABS_LO12_NC 285 /* Likewise for bits 11:2. */ -#define R_AARCH64_LDST64_ABS_LO12_NC 286 /* Likewise for bits 11:3. */ -#define R_AARCH64_MOVW_PREL_G0 287 /* PC-rel. MOV{N,Z} imm. from 15:0. */ -#define R_AARCH64_MOVW_PREL_G0_NC 288 /* Likewise for MOVK; no check. */ -#define R_AARCH64_MOVW_PREL_G1 289 /* PC-rel. MOV{N,Z} imm. from 31:16. */ -#define R_AARCH64_MOVW_PREL_G1_NC 290 /* Likewise for MOVK; no check. */ -#define R_AARCH64_MOVW_PREL_G2 291 /* PC-rel. MOV{N,Z} imm. from 47:32. */ -#define R_AARCH64_MOVW_PREL_G2_NC 292 /* Likewise for MOVK; no check. */ -#define R_AARCH64_MOVW_PREL_G3 293 /* PC-rel. MOV{N,Z} imm. from 63:48. */ -#define R_AARCH64_LDST128_ABS_LO12_NC 299 /* Dir. ADD imm. from bits 11:4. */ -#define R_AARCH64_MOVW_GOTOFF_G0 300 /* GOT-rel. off. MOV{N,Z} imm. 15:0. */ -#define R_AARCH64_MOVW_GOTOFF_G0_NC 301 /* Likewise for MOVK; no check. */ -#define R_AARCH64_MOVW_GOTOFF_G1 302 /* GOT-rel. o. MOV{N,Z} imm. 31:16. */ -#define R_AARCH64_MOVW_GOTOFF_G1_NC 303 /* Likewise for MOVK; no check. */ -#define R_AARCH64_MOVW_GOTOFF_G2 304 /* GOT-rel. o. MOV{N,Z} imm. 47:32. */ -#define R_AARCH64_MOVW_GOTOFF_G2_NC 305 /* Likewise for MOVK; no check. */ -#define R_AARCH64_MOVW_GOTOFF_G3 306 /* GOT-rel. o. MOV{N,Z} imm. 63:48. */ -#define R_AARCH64_GOTREL64 307 /* GOT-relative 64-bit. */ -#define R_AARCH64_GOTREL32 308 /* GOT-relative 32-bit. */ -#define R_AARCH64_GOT_LD_PREL19 309 /* PC-rel. GOT off. load imm. 20:2. */ -#define R_AARCH64_LD64_GOTOFF_LO15 310 /* GOT-rel. off. LD/ST imm. 14:3. */ -#define R_AARCH64_ADR_GOT_PAGE 311 /* P-page-rel. GOT off. ADRP 32:12. */ -#define R_AARCH64_LD64_GOT_LO12_NC 312 /* Dir. GOT off. LD/ST imm. 11:3. */ -#define R_AARCH64_LD64_GOTPAGE_LO15 313 /* GOT-page-rel. GOT off. LD/ST 14:3 */ -#define R_AARCH64_TLSGD_ADR_PREL21 512 /* PC-relative ADR imm. 20:0. */ -#define R_AARCH64_TLSGD_ADR_PAGE21 513 /* page-rel. ADRP imm. 32:12. */ -#define R_AARCH64_TLSGD_ADD_LO12_NC 514 /* direct ADD imm. from 11:0. */ -#define R_AARCH64_TLSGD_MOVW_G1 515 /* GOT-rel. MOV{N,Z} 31:16. */ -#define R_AARCH64_TLSGD_MOVW_G0_NC 516 /* GOT-rel. MOVK imm. 15:0. */ -#define R_AARCH64_TLSLD_ADR_PREL21 517 /* Like 512; local dynamic model. */ -#define R_AARCH64_TLSLD_ADR_PAGE21 518 /* Like 513; local dynamic model. */ -#define R_AARCH64_TLSLD_ADD_LO12_NC 519 /* Like 514; local dynamic model. */ -#define R_AARCH64_TLSLD_MOVW_G1 520 /* Like 515; local dynamic model. */ -#define R_AARCH64_TLSLD_MOVW_G0_NC 521 /* Like 516; local dynamic model. */ -#define R_AARCH64_TLSLD_LD_PREL19 522 /* TLS PC-rel. load imm. 20:2. */ -#define R_AARCH64_TLSLD_MOVW_DTPREL_G2 523 /* TLS DTP-rel. MOV{N,Z} 47:32. */ -#define R_AARCH64_TLSLD_MOVW_DTPREL_G1 524 /* TLS DTP-rel. MOV{N,Z} 31:16. */ -#define R_AARCH64_TLSLD_MOVW_DTPREL_G1_NC 525 /* Likewise; MOVK; no check. */ -#define R_AARCH64_TLSLD_MOVW_DTPREL_G0 526 /* TLS DTP-rel. MOV{N,Z} 15:0. */ -#define R_AARCH64_TLSLD_MOVW_DTPREL_G0_NC 527 /* Likewise; MOVK; no check. */ -#define R_AARCH64_TLSLD_ADD_DTPREL_HI12 528 /* DTP-rel. ADD imm. from 23:12. */ -#define R_AARCH64_TLSLD_ADD_DTPREL_LO12 529 /* DTP-rel. ADD imm. from 11:0. */ -#define R_AARCH64_TLSLD_ADD_DTPREL_LO12_NC 530 /* Likewise; no ovfl. check. */ -#define R_AARCH64_TLSLD_LDST8_DTPREL_LO12 531 /* DTP-rel. LD/ST imm. 11:0. */ -#define R_AARCH64_TLSLD_LDST8_DTPREL_LO12_NC 532 /* Likewise; no check. */ -#define R_AARCH64_TLSLD_LDST16_DTPREL_LO12 533 /* DTP-rel. LD/ST imm. 11:1. */ -#define R_AARCH64_TLSLD_LDST16_DTPREL_LO12_NC 534 /* Likewise; no check. */ -#define R_AARCH64_TLSLD_LDST32_DTPREL_LO12 535 /* DTP-rel. LD/ST imm. 11:2. */ -#define R_AARCH64_TLSLD_LDST32_DTPREL_LO12_NC 536 /* Likewise; no check. */ -#define R_AARCH64_TLSLD_LDST64_DTPREL_LO12 537 /* DTP-rel. LD/ST imm. 11:3. */ -#define R_AARCH64_TLSLD_LDST64_DTPREL_LO12_NC 538 /* Likewise; no check. */ -#define R_AARCH64_TLSIE_MOVW_GOTTPREL_G1 539 /* GOT-rel. MOV{N,Z} 31:16. */ -#define R_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC 540 /* GOT-rel. MOVK 15:0. */ -#define R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21 541 /* Page-rel. ADRP 32:12. */ -#define R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC 542 /* Direct LD off. 11:3. */ -#define R_AARCH64_TLSIE_LD_GOTTPREL_PREL19 543 /* PC-rel. load imm. 20:2. */ -#define R_AARCH64_TLSLE_MOVW_TPREL_G2 544 /* TLS TP-rel. MOV{N,Z} 47:32. */ -#define R_AARCH64_TLSLE_MOVW_TPREL_G1 545 /* TLS TP-rel. MOV{N,Z} 31:16. */ -#define R_AARCH64_TLSLE_MOVW_TPREL_G1_NC 546 /* Likewise; MOVK; no check. */ -#define R_AARCH64_TLSLE_MOVW_TPREL_G0 547 /* TLS TP-rel. MOV{N,Z} 15:0. */ -#define R_AARCH64_TLSLE_MOVW_TPREL_G0_NC 548 /* Likewise; MOVK; no check. */ -#define R_AARCH64_TLSLE_ADD_TPREL_HI12 549 /* TP-rel. ADD imm. 23:12. */ -#define R_AARCH64_TLSLE_ADD_TPREL_LO12 550 /* TP-rel. ADD imm. 11:0. */ -#define R_AARCH64_TLSLE_ADD_TPREL_LO12_NC 551 /* Likewise; no ovfl. check. */ -#define R_AARCH64_TLSLE_LDST8_TPREL_LO12 552 /* TP-rel. LD/ST off. 11:0. */ -#define R_AARCH64_TLSLE_LDST8_TPREL_LO12_NC 553 /* Likewise; no ovfl. check. */ -#define R_AARCH64_TLSLE_LDST16_TPREL_LO12 554 /* TP-rel. LD/ST off. 11:1. */ -#define R_AARCH64_TLSLE_LDST16_TPREL_LO12_NC 555 /* Likewise; no check. */ -#define R_AARCH64_TLSLE_LDST32_TPREL_LO12 556 /* TP-rel. LD/ST off. 11:2. */ -#define R_AARCH64_TLSLE_LDST32_TPREL_LO12_NC 557 /* Likewise; no check. */ -#define R_AARCH64_TLSLE_LDST64_TPREL_LO12 558 /* TP-rel. LD/ST off. 11:3. */ -#define R_AARCH64_TLSLE_LDST64_TPREL_LO12_NC 559 /* Likewise; no check. */ -#define R_AARCH64_TLSDESC_LD_PREL19 560 /* PC-rel. load immediate 20:2. */ -#define R_AARCH64_TLSDESC_ADR_PREL21 561 /* PC-rel. ADR immediate 20:0. */ -#define R_AARCH64_TLSDESC_ADR_PAGE21 562 /* Page-rel. ADRP imm. 32:12. */ -#define R_AARCH64_TLSDESC_LD64_LO12 563 /* Direct LD off. from 11:3. */ -#define R_AARCH64_TLSDESC_ADD_LO12 564 /* Direct ADD imm. from 11:0. */ -#define R_AARCH64_TLSDESC_OFF_G1 565 /* GOT-rel. MOV{N,Z} imm. 31:16. */ -#define R_AARCH64_TLSDESC_OFF_G0_NC 566 /* GOT-rel. MOVK imm. 15:0; no ck. */ -#define R_AARCH64_TLSDESC_LDR 567 /* Relax LDR. */ -#define R_AARCH64_TLSDESC_ADD 568 /* Relax ADD. */ -#define R_AARCH64_TLSDESC_CALL 569 /* Relax BLR. */ -#define R_AARCH64_TLSLE_LDST128_TPREL_LO12 570 /* TP-rel. LD/ST off. 11:4. */ -#define R_AARCH64_TLSLE_LDST128_TPREL_LO12_NC 571 /* Likewise; no check. */ -#define R_AARCH64_TLSLD_LDST128_DTPREL_LO12 572 /* DTP-rel. LD/ST imm. 11:4. */ -#define R_AARCH64_TLSLD_LDST128_DTPREL_LO12_NC 573 /* Likewise; no check. */ -#define R_AARCH64_COPY 1024 /* Copy symbol at runtime. */ -#define R_AARCH64_GLOB_DAT 1025 /* Create GOT entry. */ -#define R_AARCH64_JUMP_SLOT 1026 /* Create PLT entry. */ -#define R_AARCH64_RELATIVE 1027 /* Adjust by program base. */ -#define R_AARCH64_TLS_DTPMOD64 1028 /* Module number, 64 bit. */ -#define R_AARCH64_TLS_DTPREL64 1029 /* Module-relative offset, 64 bit. */ -#define R_AARCH64_TLS_TPREL64 1030 /* TP-relative offset, 64 bit. */ -#define R_AARCH64_TLSDESC 1031 /* TLS Descriptor. */ -#define R_AARCH64_IRELATIVE 1032 /* STT_GNU_IFUNC relocation. */ - -/* ARM relocs. */ - -#define R_ARM_NONE 0 /* No reloc */ -#define R_ARM_PC24 1 /* Deprecated PC relative 26 - bit branch. */ -#define R_ARM_ABS32 2 /* Direct 32 bit */ -#define R_ARM_REL32 3 /* PC relative 32 bit */ -#define R_ARM_PC13 4 -#define R_ARM_ABS16 5 /* Direct 16 bit */ -#define R_ARM_ABS12 6 /* Direct 12 bit */ -#define R_ARM_THM_ABS5 7 /* Direct & 0x7C (LDR, STR). */ -#define R_ARM_ABS8 8 /* Direct 8 bit */ -#define R_ARM_SBREL32 9 -#define R_ARM_THM_PC22 10 /* PC relative 24 bit (Thumb32 BL). */ -#define R_ARM_THM_PC8 11 /* PC relative & 0x3FC - (Thumb16 LDR, ADD, ADR). */ -#define R_ARM_AMP_VCALL9 12 -#define R_ARM_SWI24 13 /* Obsolete static relocation. */ -#define R_ARM_TLS_DESC 13 /* Dynamic relocation. */ -#define R_ARM_THM_SWI8 14 /* Reserved. */ -#define R_ARM_XPC25 15 /* Reserved. */ -#define R_ARM_THM_XPC22 16 /* Reserved. */ -#define R_ARM_TLS_DTPMOD32 17 /* ID of module containing symbol */ -#define R_ARM_TLS_DTPOFF32 18 /* Offset in TLS block */ -#define R_ARM_TLS_TPOFF32 19 /* Offset in static TLS block */ -#define R_ARM_COPY 20 /* Copy symbol at runtime */ -#define R_ARM_GLOB_DAT 21 /* Create GOT entry */ -#define R_ARM_JUMP_SLOT 22 /* Create PLT entry */ -#define R_ARM_RELATIVE 23 /* Adjust by program base */ -#define R_ARM_GOTOFF 24 /* 32 bit offset to GOT */ -#define R_ARM_GOTPC 25 /* 32 bit PC relative offset to GOT */ -#define R_ARM_GOT32 26 /* 32 bit GOT entry */ -#define R_ARM_PLT32 27 /* Deprecated, 32 bit PLT address. */ -#define R_ARM_CALL 28 /* PC relative 24 bit (BL, BLX). */ -#define R_ARM_JUMP24 29 /* PC relative 24 bit - (B, BL). */ -#define R_ARM_THM_JUMP24 30 /* PC relative 24 bit (Thumb32 B.W). */ -#define R_ARM_BASE_ABS 31 /* Adjust by program base. */ -#define R_ARM_ALU_PCREL_7_0 32 /* Obsolete. */ -#define R_ARM_ALU_PCREL_15_8 33 /* Obsolete. */ -#define R_ARM_ALU_PCREL_23_15 34 /* Obsolete. */ -#define R_ARM_LDR_SBREL_11_0 35 /* Deprecated, prog. base relative. */ -#define R_ARM_ALU_SBREL_19_12 36 /* Deprecated, prog. base relative. */ -#define R_ARM_ALU_SBREL_27_20 37 /* Deprecated, prog. base relative. */ -#define R_ARM_TARGET1 38 -#define R_ARM_SBREL31 39 /* Program base relative. */ -#define R_ARM_V4BX 40 -#define R_ARM_TARGET2 41 -#define R_ARM_PREL31 42 /* 32 bit PC relative. */ -#define R_ARM_MOVW_ABS_NC 43 /* Direct 16-bit (MOVW). */ -#define R_ARM_MOVT_ABS 44 /* Direct high 16-bit (MOVT). */ -#define R_ARM_MOVW_PREL_NC 45 /* PC relative 16-bit (MOVW). */ -#define R_ARM_MOVT_PREL 46 /* PC relative (MOVT). */ -#define R_ARM_THM_MOVW_ABS_NC 47 /* Direct 16 bit (Thumb32 MOVW). */ -#define R_ARM_THM_MOVT_ABS 48 /* Direct high 16 bit - (Thumb32 MOVT). */ -#define R_ARM_THM_MOVW_PREL_NC 49 /* PC relative 16 bit - (Thumb32 MOVW). */ -#define R_ARM_THM_MOVT_PREL 50 /* PC relative high 16 bit - (Thumb32 MOVT). */ -#define R_ARM_THM_JUMP19 51 /* PC relative 20 bit - (Thumb32 B.W). */ -#define R_ARM_THM_JUMP6 52 /* PC relative X & 0x7E - (Thumb16 CBZ, CBNZ). */ -#define R_ARM_THM_ALU_PREL_11_0 53 /* PC relative 12 bit - (Thumb32 ADR.W). */ -#define R_ARM_THM_PC12 54 /* PC relative 12 bit - (Thumb32 LDR{D,SB,H,SH}). */ -#define R_ARM_ABS32_NOI 55 /* Direct 32-bit. */ -#define R_ARM_REL32_NOI 56 /* PC relative 32-bit. */ -#define R_ARM_ALU_PC_G0_NC 57 /* PC relative (ADD, SUB). */ -#define R_ARM_ALU_PC_G0 58 /* PC relative (ADD, SUB). */ -#define R_ARM_ALU_PC_G1_NC 59 /* PC relative (ADD, SUB). */ -#define R_ARM_ALU_PC_G1 60 /* PC relative (ADD, SUB). */ -#define R_ARM_ALU_PC_G2 61 /* PC relative (ADD, SUB). */ -#define R_ARM_LDR_PC_G1 62 /* PC relative (LDR,STR,LDRB,STRB). */ -#define R_ARM_LDR_PC_G2 63 /* PC relative (LDR,STR,LDRB,STRB). */ -#define R_ARM_LDRS_PC_G0 64 /* PC relative (STR{D,H}, - LDR{D,SB,H,SH}). */ -#define R_ARM_LDRS_PC_G1 65 /* PC relative (STR{D,H}, - LDR{D,SB,H,SH}). */ -#define R_ARM_LDRS_PC_G2 66 /* PC relative (STR{D,H}, - LDR{D,SB,H,SH}). */ -#define R_ARM_LDC_PC_G0 67 /* PC relative (LDC, STC). */ -#define R_ARM_LDC_PC_G1 68 /* PC relative (LDC, STC). */ -#define R_ARM_LDC_PC_G2 69 /* PC relative (LDC, STC). */ -#define R_ARM_ALU_SB_G0_NC 70 /* Program base relative (ADD,SUB). */ -#define R_ARM_ALU_SB_G0 71 /* Program base relative (ADD,SUB). */ -#define R_ARM_ALU_SB_G1_NC 72 /* Program base relative (ADD,SUB). */ -#define R_ARM_ALU_SB_G1 73 /* Program base relative (ADD,SUB). */ -#define R_ARM_ALU_SB_G2 74 /* Program base relative (ADD,SUB). */ -#define R_ARM_LDR_SB_G0 75 /* Program base relative (LDR, - STR, LDRB, STRB). */ -#define R_ARM_LDR_SB_G1 76 /* Program base relative - (LDR, STR, LDRB, STRB). */ -#define R_ARM_LDR_SB_G2 77 /* Program base relative - (LDR, STR, LDRB, STRB). */ -#define R_ARM_LDRS_SB_G0 78 /* Program base relative - (LDR, STR, LDRB, STRB). */ -#define R_ARM_LDRS_SB_G1 79 /* Program base relative - (LDR, STR, LDRB, STRB). */ -#define R_ARM_LDRS_SB_G2 80 /* Program base relative - (LDR, STR, LDRB, STRB). */ -#define R_ARM_LDC_SB_G0 81 /* Program base relative (LDC,STC). */ -#define R_ARM_LDC_SB_G1 82 /* Program base relative (LDC,STC). */ -#define R_ARM_LDC_SB_G2 83 /* Program base relative (LDC,STC). */ -#define R_ARM_MOVW_BREL_NC 84 /* Program base relative 16 - bit (MOVW). */ -#define R_ARM_MOVT_BREL 85 /* Program base relative high - 16 bit (MOVT). */ -#define R_ARM_MOVW_BREL 86 /* Program base relative 16 - bit (MOVW). */ -#define R_ARM_THM_MOVW_BREL_NC 87 /* Program base relative 16 - bit (Thumb32 MOVW). */ -#define R_ARM_THM_MOVT_BREL 88 /* Program base relative high - 16 bit (Thumb32 MOVT). */ -#define R_ARM_THM_MOVW_BREL 89 /* Program base relative 16 - bit (Thumb32 MOVW). */ -#define R_ARM_TLS_GOTDESC 90 -#define R_ARM_TLS_CALL 91 -#define R_ARM_TLS_DESCSEQ 92 /* TLS relaxation. */ -#define R_ARM_THM_TLS_CALL 93 -#define R_ARM_PLT32_ABS 94 -#define R_ARM_GOT_ABS 95 /* GOT entry. */ -#define R_ARM_GOT_PREL 96 /* PC relative GOT entry. */ -#define R_ARM_GOT_BREL12 97 /* GOT entry relative to GOT - origin (LDR). */ -#define R_ARM_GOTOFF12 98 /* 12 bit, GOT entry relative - to GOT origin (LDR, STR). */ -#define R_ARM_GOTRELAX 99 -#define R_ARM_GNU_VTENTRY 100 -#define R_ARM_GNU_VTINHERIT 101 -#define R_ARM_THM_PC11 102 /* PC relative & 0xFFE (Thumb16 B). */ -#define R_ARM_THM_PC9 103 /* PC relative & 0x1FE - (Thumb16 B/B). */ -#define R_ARM_TLS_GD32 104 /* PC-rel 32 bit for global dynamic - thread local data */ -#define R_ARM_TLS_LDM32 105 /* PC-rel 32 bit for local dynamic - thread local data */ -#define R_ARM_TLS_LDO32 106 /* 32 bit offset relative to TLS - block */ -#define R_ARM_TLS_IE32 107 /* PC-rel 32 bit for GOT entry of - static TLS block offset */ -#define R_ARM_TLS_LE32 108 /* 32 bit offset relative to static - TLS block */ -#define R_ARM_TLS_LDO12 109 /* 12 bit relative to TLS - block (LDR, STR). */ -#define R_ARM_TLS_LE12 110 /* 12 bit relative to static - TLS block (LDR, STR). */ -#define R_ARM_TLS_IE12GP 111 /* 12 bit GOT entry relative - to GOT origin (LDR). */ -#define R_ARM_ME_TOO 128 /* Obsolete. */ -#define R_ARM_THM_TLS_DESCSEQ 129 -#define R_ARM_THM_TLS_DESCSEQ16 129 -#define R_ARM_THM_TLS_DESCSEQ32 130 -#define R_ARM_THM_GOT_BREL12 131 /* GOT entry relative to GOT - origin, 12 bit (Thumb32 LDR). */ -#define R_ARM_IRELATIVE 160 -#define R_ARM_RXPC25 249 -#define R_ARM_RSBREL32 250 -#define R_ARM_THM_RPC22 251 -#define R_ARM_RREL32 252 -#define R_ARM_RABS22 253 -#define R_ARM_RPC24 254 -#define R_ARM_RBASE 255 -/* Keep this the last entry. */ -#define R_ARM_NUM 256 - -/* IA-64 specific declarations. */ - -/* Processor specific flags for the Ehdr e_flags field. */ -#define EF_IA_64_MASKOS 0x0000000f /* os-specific flags */ -#define EF_IA_64_ABI64 0x00000010 /* 64-bit ABI */ -#define EF_IA_64_ARCH 0xff000000 /* arch. version mask */ - -/* Processor specific values for the Phdr p_type field. */ -#define PT_IA_64_ARCHEXT (PT_LOPROC + 0) /* arch extension bits */ -#define PT_IA_64_UNWIND (PT_LOPROC + 1) /* ia64 unwind bits */ -#define PT_IA_64_HP_OPT_ANOT (PT_LOOS + 0x12) -#define PT_IA_64_HP_HSL_ANOT (PT_LOOS + 0x13) -#define PT_IA_64_HP_STACK (PT_LOOS + 0x14) - -/* Processor specific flags for the Phdr p_flags field. */ -#define PF_IA_64_NORECOV 0x80000000 /* spec insns w/o recovery */ - -/* Processor specific values for the Shdr sh_type field. */ -#define SHT_IA_64_EXT (SHT_LOPROC + 0) /* extension bits */ -#define SHT_IA_64_UNWIND (SHT_LOPROC + 1) /* unwind bits */ - -/* Processor specific flags for the Shdr sh_flags field. */ -#define SHF_IA_64_SHORT 0x10000000 /* section near gp */ -#define SHF_IA_64_NORECOV 0x20000000 /* spec insns w/o recovery */ - -/* Processor specific values for the Dyn d_tag field. */ -#define DT_IA_64_PLT_RESERVE (DT_LOPROC + 0) -#define DT_IA_64_NUM 1 - -/* IA-64 relocations. */ -#define R_IA64_NONE 0x00 /* none */ -#define R_IA64_IMM14 0x21 /* symbol + addend, add imm14 */ -#define R_IA64_IMM22 0x22 /* symbol + addend, add imm22 */ -#define R_IA64_IMM64 0x23 /* symbol + addend, mov imm64 */ -#define R_IA64_DIR32MSB 0x24 /* symbol + addend, data4 MSB */ -#define R_IA64_DIR32LSB 0x25 /* symbol + addend, data4 LSB */ -#define R_IA64_DIR64MSB 0x26 /* symbol + addend, data8 MSB */ -#define R_IA64_DIR64LSB 0x27 /* symbol + addend, data8 LSB */ -#define R_IA64_GPREL22 0x2a /* @gprel(sym + add), add imm22 */ -#define R_IA64_GPREL64I 0x2b /* @gprel(sym + add), mov imm64 */ -#define R_IA64_GPREL32MSB 0x2c /* @gprel(sym + add), data4 MSB */ -#define R_IA64_GPREL32LSB 0x2d /* @gprel(sym + add), data4 LSB */ -#define R_IA64_GPREL64MSB 0x2e /* @gprel(sym + add), data8 MSB */ -#define R_IA64_GPREL64LSB 0x2f /* @gprel(sym + add), data8 LSB */ -#define R_IA64_LTOFF22 0x32 /* @ltoff(sym + add), add imm22 */ -#define R_IA64_LTOFF64I 0x33 /* @ltoff(sym + add), mov imm64 */ -#define R_IA64_PLTOFF22 0x3a /* @pltoff(sym + add), add imm22 */ -#define R_IA64_PLTOFF64I 0x3b /* @pltoff(sym + add), mov imm64 */ -#define R_IA64_PLTOFF64MSB 0x3e /* @pltoff(sym + add), data8 MSB */ -#define R_IA64_PLTOFF64LSB 0x3f /* @pltoff(sym + add), data8 LSB */ -#define R_IA64_FPTR64I 0x43 /* @fptr(sym + add), mov imm64 */ -#define R_IA64_FPTR32MSB 0x44 /* @fptr(sym + add), data4 MSB */ -#define R_IA64_FPTR32LSB 0x45 /* @fptr(sym + add), data4 LSB */ -#define R_IA64_FPTR64MSB 0x46 /* @fptr(sym + add), data8 MSB */ -#define R_IA64_FPTR64LSB 0x47 /* @fptr(sym + add), data8 LSB */ -#define R_IA64_PCREL60B 0x48 /* @pcrel(sym + add), brl */ -#define R_IA64_PCREL21B 0x49 /* @pcrel(sym + add), ptb, call */ -#define R_IA64_PCREL21M 0x4a /* @pcrel(sym + add), chk.s */ -#define R_IA64_PCREL21F 0x4b /* @pcrel(sym + add), fchkf */ -#define R_IA64_PCREL32MSB 0x4c /* @pcrel(sym + add), data4 MSB */ -#define R_IA64_PCREL32LSB 0x4d /* @pcrel(sym + add), data4 LSB */ -#define R_IA64_PCREL64MSB 0x4e /* @pcrel(sym + add), data8 MSB */ -#define R_IA64_PCREL64LSB 0x4f /* @pcrel(sym + add), data8 LSB */ -#define R_IA64_LTOFF_FPTR22 0x52 /* @ltoff(@fptr(s+a)), imm22 */ -#define R_IA64_LTOFF_FPTR64I 0x53 /* @ltoff(@fptr(s+a)), imm64 */ -#define R_IA64_LTOFF_FPTR32MSB 0x54 /* @ltoff(@fptr(s+a)), data4 MSB */ -#define R_IA64_LTOFF_FPTR32LSB 0x55 /* @ltoff(@fptr(s+a)), data4 LSB */ -#define R_IA64_LTOFF_FPTR64MSB 0x56 /* @ltoff(@fptr(s+a)), data8 MSB */ -#define R_IA64_LTOFF_FPTR64LSB 0x57 /* @ltoff(@fptr(s+a)), data8 LSB */ -#define R_IA64_SEGREL32MSB 0x5c /* @segrel(sym + add), data4 MSB */ -#define R_IA64_SEGREL32LSB 0x5d /* @segrel(sym + add), data4 LSB */ -#define R_IA64_SEGREL64MSB 0x5e /* @segrel(sym + add), data8 MSB */ -#define R_IA64_SEGREL64LSB 0x5f /* @segrel(sym + add), data8 LSB */ -#define R_IA64_SECREL32MSB 0x64 /* @secrel(sym + add), data4 MSB */ -#define R_IA64_SECREL32LSB 0x65 /* @secrel(sym + add), data4 LSB */ -#define R_IA64_SECREL64MSB 0x66 /* @secrel(sym + add), data8 MSB */ -#define R_IA64_SECREL64LSB 0x67 /* @secrel(sym + add), data8 LSB */ -#define R_IA64_REL32MSB 0x6c /* data 4 + REL */ -#define R_IA64_REL32LSB 0x6d /* data 4 + REL */ -#define R_IA64_REL64MSB 0x6e /* data 8 + REL */ -#define R_IA64_REL64LSB 0x6f /* data 8 + REL */ -#define R_IA64_LTV32MSB 0x74 /* symbol + addend, data4 MSB */ -#define R_IA64_LTV32LSB 0x75 /* symbol + addend, data4 LSB */ -#define R_IA64_LTV64MSB 0x76 /* symbol + addend, data8 MSB */ -#define R_IA64_LTV64LSB 0x77 /* symbol + addend, data8 LSB */ -#define R_IA64_PCREL21BI 0x79 /* @pcrel(sym + add), 21bit inst */ -#define R_IA64_PCREL22 0x7a /* @pcrel(sym + add), 22bit inst */ -#define R_IA64_PCREL64I 0x7b /* @pcrel(sym + add), 64bit inst */ -#define R_IA64_IPLTMSB 0x80 /* dynamic reloc, imported PLT, MSB */ -#define R_IA64_IPLTLSB 0x81 /* dynamic reloc, imported PLT, LSB */ -#define R_IA64_COPY 0x84 /* copy relocation */ -#define R_IA64_SUB 0x85 /* Addend and symbol difference */ -#define R_IA64_LTOFF22X 0x86 /* LTOFF22, relaxable. */ -#define R_IA64_LDXMOV 0x87 /* Use of LTOFF22X. */ -#define R_IA64_TPREL14 0x91 /* @tprel(sym + add), imm14 */ -#define R_IA64_TPREL22 0x92 /* @tprel(sym + add), imm22 */ -#define R_IA64_TPREL64I 0x93 /* @tprel(sym + add), imm64 */ -#define R_IA64_TPREL64MSB 0x96 /* @tprel(sym + add), data8 MSB */ -#define R_IA64_TPREL64LSB 0x97 /* @tprel(sym + add), data8 LSB */ -#define R_IA64_LTOFF_TPREL22 0x9a /* @ltoff(@tprel(s+a)), imm2 */ -#define R_IA64_DTPMOD64MSB 0xa6 /* @dtpmod(sym + add), data8 MSB */ -#define R_IA64_DTPMOD64LSB 0xa7 /* @dtpmod(sym + add), data8 LSB */ -#define R_IA64_LTOFF_DTPMOD22 0xaa /* @ltoff(@dtpmod(sym + add)), imm22 */ -#define R_IA64_DTPREL14 0xb1 /* @dtprel(sym + add), imm14 */ -#define R_IA64_DTPREL22 0xb2 /* @dtprel(sym + add), imm22 */ -#define R_IA64_DTPREL64I 0xb3 /* @dtprel(sym + add), imm64 */ -#define R_IA64_DTPREL32MSB 0xb4 /* @dtprel(sym + add), data4 MSB */ -#define R_IA64_DTPREL32LSB 0xb5 /* @dtprel(sym + add), data4 LSB */ -#define R_IA64_DTPREL64MSB 0xb6 /* @dtprel(sym + add), data8 MSB */ -#define R_IA64_DTPREL64LSB 0xb7 /* @dtprel(sym + add), data8 LSB */ -#define R_IA64_LTOFF_DTPREL22 0xba /* @ltoff(@dtprel(s+a)), imm22 */ - -/* SH specific declarations */ - -/* Processor specific flags for the ELF header e_flags field. */ -#define EF_SH_MACH_MASK 0x1f -#define EF_SH_UNKNOWN 0x0 -#define EF_SH1 0x1 -#define EF_SH2 0x2 -#define EF_SH3 0x3 -#define EF_SH_DSP 0x4 -#define EF_SH3_DSP 0x5 -#define EF_SH4AL_DSP 0x6 -#define EF_SH3E 0x8 -#define EF_SH4 0x9 -#define EF_SH2E 0xb -#define EF_SH4A 0xc -#define EF_SH2A 0xd -#define EF_SH4_NOFPU 0x10 -#define EF_SH4A_NOFPU 0x11 -#define EF_SH4_NOMMU_NOFPU 0x12 -#define EF_SH2A_NOFPU 0x13 -#define EF_SH3_NOMMU 0x14 -#define EF_SH2A_SH4_NOFPU 0x15 -#define EF_SH2A_SH3_NOFPU 0x16 -#define EF_SH2A_SH4 0x17 -#define EF_SH2A_SH3E 0x18 - -/* SH relocs. */ -#define R_SH_NONE 0 -#define R_SH_DIR32 1 -#define R_SH_REL32 2 -#define R_SH_DIR8WPN 3 -#define R_SH_IND12W 4 -#define R_SH_DIR8WPL 5 -#define R_SH_DIR8WPZ 6 -#define R_SH_DIR8BP 7 -#define R_SH_DIR8W 8 -#define R_SH_DIR8L 9 -#define R_SH_SWITCH16 25 -#define R_SH_SWITCH32 26 -#define R_SH_USES 27 -#define R_SH_COUNT 28 -#define R_SH_ALIGN 29 -#define R_SH_CODE 30 -#define R_SH_DATA 31 -#define R_SH_LABEL 32 -#define R_SH_SWITCH8 33 -#define R_SH_GNU_VTINHERIT 34 -#define R_SH_GNU_VTENTRY 35 -#define R_SH_TLS_GD_32 144 -#define R_SH_TLS_LD_32 145 -#define R_SH_TLS_LDO_32 146 -#define R_SH_TLS_IE_32 147 -#define R_SH_TLS_LE_32 148 -#define R_SH_TLS_DTPMOD32 149 -#define R_SH_TLS_DTPOFF32 150 -#define R_SH_TLS_TPOFF32 151 -#define R_SH_GOT32 160 -#define R_SH_PLT32 161 -#define R_SH_COPY 162 -#define R_SH_GLOB_DAT 163 -#define R_SH_JMP_SLOT 164 -#define R_SH_RELATIVE 165 -#define R_SH_GOTOFF 166 -#define R_SH_GOTPC 167 -/* Keep this the last entry. */ -#define R_SH_NUM 256 - -/* S/390 specific definitions. */ - -/* Valid values for the e_flags field. */ - -#define EF_S390_HIGH_GPRS 0x00000001 /* High GPRs kernel facility needed. */ - -/* Additional s390 relocs */ - -#define R_390_NONE 0 /* No reloc. */ -#define R_390_8 1 /* Direct 8 bit. */ -#define R_390_12 2 /* Direct 12 bit. */ -#define R_390_16 3 /* Direct 16 bit. */ -#define R_390_32 4 /* Direct 32 bit. */ -#define R_390_PC32 5 /* PC relative 32 bit. */ -#define R_390_GOT12 6 /* 12 bit GOT offset. */ -#define R_390_GOT32 7 /* 32 bit GOT offset. */ -#define R_390_PLT32 8 /* 32 bit PC relative PLT address. */ -#define R_390_COPY 9 /* Copy symbol at runtime. */ -#define R_390_GLOB_DAT 10 /* Create GOT entry. */ -#define R_390_JMP_SLOT 11 /* Create PLT entry. */ -#define R_390_RELATIVE 12 /* Adjust by program base. */ -#define R_390_GOTOFF32 13 /* 32 bit offset to GOT. */ -#define R_390_GOTPC 14 /* 32 bit PC relative offset to GOT. */ -#define R_390_GOT16 15 /* 16 bit GOT offset. */ -#define R_390_PC16 16 /* PC relative 16 bit. */ -#define R_390_PC16DBL 17 /* PC relative 16 bit shifted by 1. */ -#define R_390_PLT16DBL 18 /* 16 bit PC rel. PLT shifted by 1. */ -#define R_390_PC32DBL 19 /* PC relative 32 bit shifted by 1. */ -#define R_390_PLT32DBL 20 /* 32 bit PC rel. PLT shifted by 1. */ -#define R_390_GOTPCDBL 21 /* 32 bit PC rel. GOT shifted by 1. */ -#define R_390_64 22 /* Direct 64 bit. */ -#define R_390_PC64 23 /* PC relative 64 bit. */ -#define R_390_GOT64 24 /* 64 bit GOT offset. */ -#define R_390_PLT64 25 /* 64 bit PC relative PLT address. */ -#define R_390_GOTENT 26 /* 32 bit PC rel. to GOT entry >> 1. */ -#define R_390_GOTOFF16 27 /* 16 bit offset to GOT. */ -#define R_390_GOTOFF64 28 /* 64 bit offset to GOT. */ -#define R_390_GOTPLT12 29 /* 12 bit offset to jump slot. */ -#define R_390_GOTPLT16 30 /* 16 bit offset to jump slot. */ -#define R_390_GOTPLT32 31 /* 32 bit offset to jump slot. */ -#define R_390_GOTPLT64 32 /* 64 bit offset to jump slot. */ -#define R_390_GOTPLTENT 33 /* 32 bit rel. offset to jump slot. */ -#define R_390_PLTOFF16 34 /* 16 bit offset from GOT to PLT. */ -#define R_390_PLTOFF32 35 /* 32 bit offset from GOT to PLT. */ -#define R_390_PLTOFF64 36 /* 16 bit offset from GOT to PLT. */ -#define R_390_TLS_LOAD 37 /* Tag for load insn in TLS code. */ -#define R_390_TLS_GDCALL 38 /* Tag for function call in general - dynamic TLS code. */ -#define R_390_TLS_LDCALL 39 /* Tag for function call in local - dynamic TLS code. */ -#define R_390_TLS_GD32 40 /* Direct 32 bit for general dynamic - thread local data. */ -#define R_390_TLS_GD64 41 /* Direct 64 bit for general dynamic - thread local data. */ -#define R_390_TLS_GOTIE12 42 /* 12 bit GOT offset for static TLS - block offset. */ -#define R_390_TLS_GOTIE32 43 /* 32 bit GOT offset for static TLS - block offset. */ -#define R_390_TLS_GOTIE64 44 /* 64 bit GOT offset for static TLS - block offset. */ -#define R_390_TLS_LDM32 45 /* Direct 32 bit for local dynamic - thread local data in LE code. */ -#define R_390_TLS_LDM64 46 /* Direct 64 bit for local dynamic - thread local data in LE code. */ -#define R_390_TLS_IE32 47 /* 32 bit address of GOT entry for - negated static TLS block offset. */ -#define R_390_TLS_IE64 48 /* 64 bit address of GOT entry for - negated static TLS block offset. */ -#define R_390_TLS_IEENT 49 /* 32 bit rel. offset to GOT entry for - negated static TLS block offset. */ -#define R_390_TLS_LE32 50 /* 32 bit negated offset relative to - static TLS block. */ -#define R_390_TLS_LE64 51 /* 64 bit negated offset relative to - static TLS block. */ -#define R_390_TLS_LDO32 52 /* 32 bit offset relative to TLS - block. */ -#define R_390_TLS_LDO64 53 /* 64 bit offset relative to TLS - block. */ -#define R_390_TLS_DTPMOD 54 /* ID of module containing symbol. */ -#define R_390_TLS_DTPOFF 55 /* Offset in TLS block. */ -#define R_390_TLS_TPOFF 56 /* Negated offset in static TLS - block. */ -#define R_390_20 57 /* Direct 20 bit. */ -#define R_390_GOT20 58 /* 20 bit GOT offset. */ -#define R_390_GOTPLT20 59 /* 20 bit offset to jump slot. */ -#define R_390_TLS_GOTIE20 60 /* 20 bit GOT offset for static TLS - block offset. */ -#define R_390_IRELATIVE 61 /* STT_GNU_IFUNC relocation. */ -/* Keep this the last entry. */ -#define R_390_NUM 62 - - -/* CRIS relocations. */ -#define R_CRIS_NONE 0 -#define R_CRIS_8 1 -#define R_CRIS_16 2 -#define R_CRIS_32 3 -#define R_CRIS_8_PCREL 4 -#define R_CRIS_16_PCREL 5 -#define R_CRIS_32_PCREL 6 -#define R_CRIS_GNU_VTINHERIT 7 -#define R_CRIS_GNU_VTENTRY 8 -#define R_CRIS_COPY 9 -#define R_CRIS_GLOB_DAT 10 -#define R_CRIS_JUMP_SLOT 11 -#define R_CRIS_RELATIVE 12 -#define R_CRIS_16_GOT 13 -#define R_CRIS_32_GOT 14 -#define R_CRIS_16_GOTPLT 15 -#define R_CRIS_32_GOTPLT 16 -#define R_CRIS_32_GOTREL 17 -#define R_CRIS_32_PLT_GOTREL 18 -#define R_CRIS_32_PLT_PCREL 19 - -#define R_CRIS_NUM 20 - - -/* AMD x86-64 relocations. */ -#define R_X86_64_NONE 0 /* No reloc */ -#define R_X86_64_64 1 /* Direct 64 bit */ -#define R_X86_64_PC32 2 /* PC relative 32 bit signed */ -#define R_X86_64_GOT32 3 /* 32 bit GOT entry */ -#define R_X86_64_PLT32 4 /* 32 bit PLT address */ -#define R_X86_64_COPY 5 /* Copy symbol at runtime */ -#define R_X86_64_GLOB_DAT 6 /* Create GOT entry */ -#define R_X86_64_JUMP_SLOT 7 /* Create PLT entry */ -#define R_X86_64_RELATIVE 8 /* Adjust by program base */ -#define R_X86_64_GOTPCREL 9 /* 32 bit signed PC relative - offset to GOT */ -#define R_X86_64_32 10 /* Direct 32 bit zero extended */ -#define R_X86_64_32S 11 /* Direct 32 bit sign extended */ -#define R_X86_64_16 12 /* Direct 16 bit zero extended */ -#define R_X86_64_PC16 13 /* 16 bit sign extended pc relative */ -#define R_X86_64_8 14 /* Direct 8 bit sign extended */ -#define R_X86_64_PC8 15 /* 8 bit sign extended pc relative */ -#define R_X86_64_DTPMOD64 16 /* ID of module containing symbol */ -#define R_X86_64_DTPOFF64 17 /* Offset in module's TLS block */ -#define R_X86_64_TPOFF64 18 /* Offset in initial TLS block */ -#define R_X86_64_TLSGD 19 /* 32 bit signed PC relative offset - to two GOT entries for GD symbol */ -#define R_X86_64_TLSLD 20 /* 32 bit signed PC relative offset - to two GOT entries for LD symbol */ -#define R_X86_64_DTPOFF32 21 /* Offset in TLS block */ -#define R_X86_64_GOTTPOFF 22 /* 32 bit signed PC relative offset - to GOT entry for IE symbol */ -#define R_X86_64_TPOFF32 23 /* Offset in initial TLS block */ -#define R_X86_64_PC64 24 /* PC relative 64 bit */ -#define R_X86_64_GOTOFF64 25 /* 64 bit offset to GOT */ -#define R_X86_64_GOTPC32 26 /* 32 bit signed pc relative - offset to GOT */ -#define R_X86_64_GOT64 27 /* 64-bit GOT entry offset */ -#define R_X86_64_GOTPCREL64 28 /* 64-bit PC relative offset - to GOT entry */ -#define R_X86_64_GOTPC64 29 /* 64-bit PC relative offset to GOT */ -#define R_X86_64_GOTPLT64 30 /* like GOT64, says PLT entry needed */ -#define R_X86_64_PLTOFF64 31 /* 64-bit GOT relative offset - to PLT entry */ -#define R_X86_64_SIZE32 32 /* Size of symbol plus 32-bit addend */ -#define R_X86_64_SIZE64 33 /* Size of symbol plus 64-bit addend */ -#define R_X86_64_GOTPC32_TLSDESC 34 /* GOT offset for TLS descriptor. */ -#define R_X86_64_TLSDESC_CALL 35 /* Marker for call through TLS - descriptor. */ -#define R_X86_64_TLSDESC 36 /* TLS descriptor. */ -#define R_X86_64_IRELATIVE 37 /* Adjust indirectly by program base */ -#define R_X86_64_RELATIVE64 38 /* 64-bit adjust by program base */ - -#define R_X86_64_NUM 39 - - -/* AM33 relocations. */ -#define R_MN10300_NONE 0 /* No reloc. */ -#define R_MN10300_32 1 /* Direct 32 bit. */ -#define R_MN10300_16 2 /* Direct 16 bit. */ -#define R_MN10300_8 3 /* Direct 8 bit. */ -#define R_MN10300_PCREL32 4 /* PC-relative 32-bit. */ -#define R_MN10300_PCREL16 5 /* PC-relative 16-bit signed. */ -#define R_MN10300_PCREL8 6 /* PC-relative 8-bit signed. */ -#define R_MN10300_GNU_VTINHERIT 7 /* Ancient C++ vtable garbage... */ -#define R_MN10300_GNU_VTENTRY 8 /* ... collection annotation. */ -#define R_MN10300_24 9 /* Direct 24 bit. */ -#define R_MN10300_GOTPC32 10 /* 32-bit PCrel offset to GOT. */ -#define R_MN10300_GOTPC16 11 /* 16-bit PCrel offset to GOT. */ -#define R_MN10300_GOTOFF32 12 /* 32-bit offset from GOT. */ -#define R_MN10300_GOTOFF24 13 /* 24-bit offset from GOT. */ -#define R_MN10300_GOTOFF16 14 /* 16-bit offset from GOT. */ -#define R_MN10300_PLT32 15 /* 32-bit PCrel to PLT entry. */ -#define R_MN10300_PLT16 16 /* 16-bit PCrel to PLT entry. */ -#define R_MN10300_GOT32 17 /* 32-bit offset to GOT entry. */ -#define R_MN10300_GOT24 18 /* 24-bit offset to GOT entry. */ -#define R_MN10300_GOT16 19 /* 16-bit offset to GOT entry. */ -#define R_MN10300_COPY 20 /* Copy symbol at runtime. */ -#define R_MN10300_GLOB_DAT 21 /* Create GOT entry. */ -#define R_MN10300_JMP_SLOT 22 /* Create PLT entry. */ -#define R_MN10300_RELATIVE 23 /* Adjust by program base. */ -#define R_MN10300_TLS_GD 24 /* 32-bit offset for global dynamic. */ -#define R_MN10300_TLS_LD 25 /* 32-bit offset for local dynamic. */ -#define R_MN10300_TLS_LDO 26 /* Module-relative offset. */ -#define R_MN10300_TLS_GOTIE 27 /* GOT offset for static TLS block - offset. */ -#define R_MN10300_TLS_IE 28 /* GOT address for static TLS block - offset. */ -#define R_MN10300_TLS_LE 29 /* Offset relative to static TLS - block. */ -#define R_MN10300_TLS_DTPMOD 30 /* ID of module containing symbol. */ -#define R_MN10300_TLS_DTPOFF 31 /* Offset in module TLS block. */ -#define R_MN10300_TLS_TPOFF 32 /* Offset in static TLS block. */ -#define R_MN10300_SYM_DIFF 33 /* Adjustment for next reloc as needed - by linker relaxation. */ -#define R_MN10300_ALIGN 34 /* Alignment requirement for linker - relaxation. */ -#define R_MN10300_NUM 35 - - -/* M32R relocs. */ -#define R_M32R_NONE 0 /* No reloc. */ -#define R_M32R_16 1 /* Direct 16 bit. */ -#define R_M32R_32 2 /* Direct 32 bit. */ -#define R_M32R_24 3 /* Direct 24 bit. */ -#define R_M32R_10_PCREL 4 /* PC relative 10 bit shifted. */ -#define R_M32R_18_PCREL 5 /* PC relative 18 bit shifted. */ -#define R_M32R_26_PCREL 6 /* PC relative 26 bit shifted. */ -#define R_M32R_HI16_ULO 7 /* High 16 bit with unsigned low. */ -#define R_M32R_HI16_SLO 8 /* High 16 bit with signed low. */ -#define R_M32R_LO16 9 /* Low 16 bit. */ -#define R_M32R_SDA16 10 /* 16 bit offset in SDA. */ -#define R_M32R_GNU_VTINHERIT 11 -#define R_M32R_GNU_VTENTRY 12 -/* M32R relocs use SHT_RELA. */ -#define R_M32R_16_RELA 33 /* Direct 16 bit. */ -#define R_M32R_32_RELA 34 /* Direct 32 bit. */ -#define R_M32R_24_RELA 35 /* Direct 24 bit. */ -#define R_M32R_10_PCREL_RELA 36 /* PC relative 10 bit shifted. */ -#define R_M32R_18_PCREL_RELA 37 /* PC relative 18 bit shifted. */ -#define R_M32R_26_PCREL_RELA 38 /* PC relative 26 bit shifted. */ -#define R_M32R_HI16_ULO_RELA 39 /* High 16 bit with unsigned low */ -#define R_M32R_HI16_SLO_RELA 40 /* High 16 bit with signed low */ -#define R_M32R_LO16_RELA 41 /* Low 16 bit */ -#define R_M32R_SDA16_RELA 42 /* 16 bit offset in SDA */ -#define R_M32R_RELA_GNU_VTINHERIT 43 -#define R_M32R_RELA_GNU_VTENTRY 44 -#define R_M32R_REL32 45 /* PC relative 32 bit. */ - -#define R_M32R_GOT24 48 /* 24 bit GOT entry */ -#define R_M32R_26_PLTREL 49 /* 26 bit PC relative to PLT shifted */ -#define R_M32R_COPY 50 /* Copy symbol at runtime */ -#define R_M32R_GLOB_DAT 51 /* Create GOT entry */ -#define R_M32R_JMP_SLOT 52 /* Create PLT entry */ -#define R_M32R_RELATIVE 53 /* Adjust by program base */ -#define R_M32R_GOTOFF 54 /* 24 bit offset to GOT */ -#define R_M32R_GOTPC24 55 /* 24 bit PC relative offset to GOT */ -#define R_M32R_GOT16_HI_ULO 56 /* High 16 bit GOT entry with unsigned - low */ -#define R_M32R_GOT16_HI_SLO 57 /* High 16 bit GOT entry with signed - low */ -#define R_M32R_GOT16_LO 58 /* Low 16 bit GOT entry */ -#define R_M32R_GOTPC_HI_ULO 59 /* High 16 bit PC relative offset to - GOT with unsigned low */ -#define R_M32R_GOTPC_HI_SLO 60 /* High 16 bit PC relative offset to - GOT with signed low */ -#define R_M32R_GOTPC_LO 61 /* Low 16 bit PC relative offset to - GOT */ -#define R_M32R_GOTOFF_HI_ULO 62 /* High 16 bit offset to GOT - with unsigned low */ -#define R_M32R_GOTOFF_HI_SLO 63 /* High 16 bit offset to GOT - with signed low */ -#define R_M32R_GOTOFF_LO 64 /* Low 16 bit offset to GOT */ -#define R_M32R_NUM 256 /* Keep this the last entry. */ - -/* MicroBlaze relocations */ -#define R_MICROBLAZE_NONE 0 /* No reloc. */ -#define R_MICROBLAZE_32 1 /* Direct 32 bit. */ -#define R_MICROBLAZE_32_PCREL 2 /* PC relative 32 bit. */ -#define R_MICROBLAZE_64_PCREL 3 /* PC relative 64 bit. */ -#define R_MICROBLAZE_32_PCREL_LO 4 /* Low 16 bits of PCREL32. */ -#define R_MICROBLAZE_64 5 /* Direct 64 bit. */ -#define R_MICROBLAZE_32_LO 6 /* Low 16 bit. */ -#define R_MICROBLAZE_SRO32 7 /* Read-only small data area. */ -#define R_MICROBLAZE_SRW32 8 /* Read-write small data area. */ -#define R_MICROBLAZE_64_NONE 9 /* No reloc. */ -#define R_MICROBLAZE_32_SYM_OP_SYM 10 /* Symbol Op Symbol relocation. */ -#define R_MICROBLAZE_GNU_VTINHERIT 11 /* GNU C++ vtable hierarchy. */ -#define R_MICROBLAZE_GNU_VTENTRY 12 /* GNU C++ vtable member usage. */ -#define R_MICROBLAZE_GOTPC_64 13 /* PC-relative GOT offset. */ -#define R_MICROBLAZE_GOT_64 14 /* GOT entry offset. */ -#define R_MICROBLAZE_PLT_64 15 /* PLT offset (PC-relative). */ -#define R_MICROBLAZE_REL 16 /* Adjust by program base. */ -#define R_MICROBLAZE_JUMP_SLOT 17 /* Create PLT entry. */ -#define R_MICROBLAZE_GLOB_DAT 18 /* Create GOT entry. */ -#define R_MICROBLAZE_GOTOFF_64 19 /* 64 bit offset to GOT. */ -#define R_MICROBLAZE_GOTOFF_32 20 /* 32 bit offset to GOT. */ -#define R_MICROBLAZE_COPY 21 /* Runtime copy. */ -#define R_MICROBLAZE_TLS 22 /* TLS Reloc. */ -#define R_MICROBLAZE_TLSGD 23 /* TLS General Dynamic. */ -#define R_MICROBLAZE_TLSLD 24 /* TLS Local Dynamic. */ -#define R_MICROBLAZE_TLSDTPMOD32 25 /* TLS Module ID. */ -#define R_MICROBLAZE_TLSDTPREL32 26 /* TLS Offset Within TLS Block. */ -#define R_MICROBLAZE_TLSDTPREL64 27 /* TLS Offset Within TLS Block. */ -#define R_MICROBLAZE_TLSGOTTPREL32 28 /* TLS Offset From Thread Pointer. */ -#define R_MICROBLAZE_TLSTPREL32 29 /* TLS Offset From Thread Pointer. */ - -/* TILEPro relocations. */ -#define R_TILEPRO_NONE 0 /* No reloc */ -#define R_TILEPRO_32 1 /* Direct 32 bit */ -#define R_TILEPRO_16 2 /* Direct 16 bit */ -#define R_TILEPRO_8 3 /* Direct 8 bit */ -#define R_TILEPRO_32_PCREL 4 /* PC relative 32 bit */ -#define R_TILEPRO_16_PCREL 5 /* PC relative 16 bit */ -#define R_TILEPRO_8_PCREL 6 /* PC relative 8 bit */ -#define R_TILEPRO_LO16 7 /* Low 16 bit */ -#define R_TILEPRO_HI16 8 /* High 16 bit */ -#define R_TILEPRO_HA16 9 /* High 16 bit, adjusted */ -#define R_TILEPRO_COPY 10 /* Copy relocation */ -#define R_TILEPRO_GLOB_DAT 11 /* Create GOT entry */ -#define R_TILEPRO_JMP_SLOT 12 /* Create PLT entry */ -#define R_TILEPRO_RELATIVE 13 /* Adjust by program base */ -#define R_TILEPRO_BROFF_X1 14 /* X1 pipe branch offset */ -#define R_TILEPRO_JOFFLONG_X1 15 /* X1 pipe jump offset */ -#define R_TILEPRO_JOFFLONG_X1_PLT 16 /* X1 pipe jump offset to PLT */ -#define R_TILEPRO_IMM8_X0 17 /* X0 pipe 8-bit */ -#define R_TILEPRO_IMM8_Y0 18 /* Y0 pipe 8-bit */ -#define R_TILEPRO_IMM8_X1 19 /* X1 pipe 8-bit */ -#define R_TILEPRO_IMM8_Y1 20 /* Y1 pipe 8-bit */ -#define R_TILEPRO_MT_IMM15_X1 21 /* X1 pipe mtspr */ -#define R_TILEPRO_MF_IMM15_X1 22 /* X1 pipe mfspr */ -#define R_TILEPRO_IMM16_X0 23 /* X0 pipe 16-bit */ -#define R_TILEPRO_IMM16_X1 24 /* X1 pipe 16-bit */ -#define R_TILEPRO_IMM16_X0_LO 25 /* X0 pipe low 16-bit */ -#define R_TILEPRO_IMM16_X1_LO 26 /* X1 pipe low 16-bit */ -#define R_TILEPRO_IMM16_X0_HI 27 /* X0 pipe high 16-bit */ -#define R_TILEPRO_IMM16_X1_HI 28 /* X1 pipe high 16-bit */ -#define R_TILEPRO_IMM16_X0_HA 29 /* X0 pipe high 16-bit, adjusted */ -#define R_TILEPRO_IMM16_X1_HA 30 /* X1 pipe high 16-bit, adjusted */ -#define R_TILEPRO_IMM16_X0_PCREL 31 /* X0 pipe PC relative 16 bit */ -#define R_TILEPRO_IMM16_X1_PCREL 32 /* X1 pipe PC relative 16 bit */ -#define R_TILEPRO_IMM16_X0_LO_PCREL 33 /* X0 pipe PC relative low 16 bit */ -#define R_TILEPRO_IMM16_X1_LO_PCREL 34 /* X1 pipe PC relative low 16 bit */ -#define R_TILEPRO_IMM16_X0_HI_PCREL 35 /* X0 pipe PC relative high 16 bit */ -#define R_TILEPRO_IMM16_X1_HI_PCREL 36 /* X1 pipe PC relative high 16 bit */ -#define R_TILEPRO_IMM16_X0_HA_PCREL 37 /* X0 pipe PC relative ha() 16 bit */ -#define R_TILEPRO_IMM16_X1_HA_PCREL 38 /* X1 pipe PC relative ha() 16 bit */ -#define R_TILEPRO_IMM16_X0_GOT 39 /* X0 pipe 16-bit GOT offset */ -#define R_TILEPRO_IMM16_X1_GOT 40 /* X1 pipe 16-bit GOT offset */ -#define R_TILEPRO_IMM16_X0_GOT_LO 41 /* X0 pipe low 16-bit GOT offset */ -#define R_TILEPRO_IMM16_X1_GOT_LO 42 /* X1 pipe low 16-bit GOT offset */ -#define R_TILEPRO_IMM16_X0_GOT_HI 43 /* X0 pipe high 16-bit GOT offset */ -#define R_TILEPRO_IMM16_X1_GOT_HI 44 /* X1 pipe high 16-bit GOT offset */ -#define R_TILEPRO_IMM16_X0_GOT_HA 45 /* X0 pipe ha() 16-bit GOT offset */ -#define R_TILEPRO_IMM16_X1_GOT_HA 46 /* X1 pipe ha() 16-bit GOT offset */ -#define R_TILEPRO_MMSTART_X0 47 /* X0 pipe mm "start" */ -#define R_TILEPRO_MMEND_X0 48 /* X0 pipe mm "end" */ -#define R_TILEPRO_MMSTART_X1 49 /* X1 pipe mm "start" */ -#define R_TILEPRO_MMEND_X1 50 /* X1 pipe mm "end" */ -#define R_TILEPRO_SHAMT_X0 51 /* X0 pipe shift amount */ -#define R_TILEPRO_SHAMT_X1 52 /* X1 pipe shift amount */ -#define R_TILEPRO_SHAMT_Y0 53 /* Y0 pipe shift amount */ -#define R_TILEPRO_SHAMT_Y1 54 /* Y1 pipe shift amount */ -#define R_TILEPRO_DEST_IMM8_X1 55 /* X1 pipe destination 8-bit */ -/* Relocs 56-59 are currently not defined. */ -#define R_TILEPRO_TLS_GD_CALL 60 /* "jal" for TLS GD */ -#define R_TILEPRO_IMM8_X0_TLS_GD_ADD 61 /* X0 pipe "addi" for TLS GD */ -#define R_TILEPRO_IMM8_X1_TLS_GD_ADD 62 /* X1 pipe "addi" for TLS GD */ -#define R_TILEPRO_IMM8_Y0_TLS_GD_ADD 63 /* Y0 pipe "addi" for TLS GD */ -#define R_TILEPRO_IMM8_Y1_TLS_GD_ADD 64 /* Y1 pipe "addi" for TLS GD */ -#define R_TILEPRO_TLS_IE_LOAD 65 /* "lw_tls" for TLS IE */ -#define R_TILEPRO_IMM16_X0_TLS_GD 66 /* X0 pipe 16-bit TLS GD offset */ -#define R_TILEPRO_IMM16_X1_TLS_GD 67 /* X1 pipe 16-bit TLS GD offset */ -#define R_TILEPRO_IMM16_X0_TLS_GD_LO 68 /* X0 pipe low 16-bit TLS GD offset */ -#define R_TILEPRO_IMM16_X1_TLS_GD_LO 69 /* X1 pipe low 16-bit TLS GD offset */ -#define R_TILEPRO_IMM16_X0_TLS_GD_HI 70 /* X0 pipe high 16-bit TLS GD offset */ -#define R_TILEPRO_IMM16_X1_TLS_GD_HI 71 /* X1 pipe high 16-bit TLS GD offset */ -#define R_TILEPRO_IMM16_X0_TLS_GD_HA 72 /* X0 pipe ha() 16-bit TLS GD offset */ -#define R_TILEPRO_IMM16_X1_TLS_GD_HA 73 /* X1 pipe ha() 16-bit TLS GD offset */ -#define R_TILEPRO_IMM16_X0_TLS_IE 74 /* X0 pipe 16-bit TLS IE offset */ -#define R_TILEPRO_IMM16_X1_TLS_IE 75 /* X1 pipe 16-bit TLS IE offset */ -#define R_TILEPRO_IMM16_X0_TLS_IE_LO 76 /* X0 pipe low 16-bit TLS IE offset */ -#define R_TILEPRO_IMM16_X1_TLS_IE_LO 77 /* X1 pipe low 16-bit TLS IE offset */ -#define R_TILEPRO_IMM16_X0_TLS_IE_HI 78 /* X0 pipe high 16-bit TLS IE offset */ -#define R_TILEPRO_IMM16_X1_TLS_IE_HI 79 /* X1 pipe high 16-bit TLS IE offset */ -#define R_TILEPRO_IMM16_X0_TLS_IE_HA 80 /* X0 pipe ha() 16-bit TLS IE offset */ -#define R_TILEPRO_IMM16_X1_TLS_IE_HA 81 /* X1 pipe ha() 16-bit TLS IE offset */ -#define R_TILEPRO_TLS_DTPMOD32 82 /* ID of module containing symbol */ -#define R_TILEPRO_TLS_DTPOFF32 83 /* Offset in TLS block */ -#define R_TILEPRO_TLS_TPOFF32 84 /* Offset in static TLS block */ -#define R_TILEPRO_IMM16_X0_TLS_LE 85 /* X0 pipe 16-bit TLS LE offset */ -#define R_TILEPRO_IMM16_X1_TLS_LE 86 /* X1 pipe 16-bit TLS LE offset */ -#define R_TILEPRO_IMM16_X0_TLS_LE_LO 87 /* X0 pipe low 16-bit TLS LE offset */ -#define R_TILEPRO_IMM16_X1_TLS_LE_LO 88 /* X1 pipe low 16-bit TLS LE offset */ -#define R_TILEPRO_IMM16_X0_TLS_LE_HI 89 /* X0 pipe high 16-bit TLS LE offset */ -#define R_TILEPRO_IMM16_X1_TLS_LE_HI 90 /* X1 pipe high 16-bit TLS LE offset */ -#define R_TILEPRO_IMM16_X0_TLS_LE_HA 91 /* X0 pipe ha() 16-bit TLS LE offset */ -#define R_TILEPRO_IMM16_X1_TLS_LE_HA 92 /* X1 pipe ha() 16-bit TLS LE offset */ - -#define R_TILEPRO_GNU_VTINHERIT 128 /* GNU C++ vtable hierarchy */ -#define R_TILEPRO_GNU_VTENTRY 129 /* GNU C++ vtable member usage */ - -#define R_TILEPRO_NUM 130 - - -/* TILE-Gx relocations. */ -#define R_TILEGX_NONE 0 /* No reloc */ -#define R_TILEGX_64 1 /* Direct 64 bit */ -#define R_TILEGX_32 2 /* Direct 32 bit */ -#define R_TILEGX_16 3 /* Direct 16 bit */ -#define R_TILEGX_8 4 /* Direct 8 bit */ -#define R_TILEGX_64_PCREL 5 /* PC relative 64 bit */ -#define R_TILEGX_32_PCREL 6 /* PC relative 32 bit */ -#define R_TILEGX_16_PCREL 7 /* PC relative 16 bit */ -#define R_TILEGX_8_PCREL 8 /* PC relative 8 bit */ -#define R_TILEGX_HW0 9 /* hword 0 16-bit */ -#define R_TILEGX_HW1 10 /* hword 1 16-bit */ -#define R_TILEGX_HW2 11 /* hword 2 16-bit */ -#define R_TILEGX_HW3 12 /* hword 3 16-bit */ -#define R_TILEGX_HW0_LAST 13 /* last hword 0 16-bit */ -#define R_TILEGX_HW1_LAST 14 /* last hword 1 16-bit */ -#define R_TILEGX_HW2_LAST 15 /* last hword 2 16-bit */ -#define R_TILEGX_COPY 16 /* Copy relocation */ -#define R_TILEGX_GLOB_DAT 17 /* Create GOT entry */ -#define R_TILEGX_JMP_SLOT 18 /* Create PLT entry */ -#define R_TILEGX_RELATIVE 19 /* Adjust by program base */ -#define R_TILEGX_BROFF_X1 20 /* X1 pipe branch offset */ -#define R_TILEGX_JUMPOFF_X1 21 /* X1 pipe jump offset */ -#define R_TILEGX_JUMPOFF_X1_PLT 22 /* X1 pipe jump offset to PLT */ -#define R_TILEGX_IMM8_X0 23 /* X0 pipe 8-bit */ -#define R_TILEGX_IMM8_Y0 24 /* Y0 pipe 8-bit */ -#define R_TILEGX_IMM8_X1 25 /* X1 pipe 8-bit */ -#define R_TILEGX_IMM8_Y1 26 /* Y1 pipe 8-bit */ -#define R_TILEGX_DEST_IMM8_X1 27 /* X1 pipe destination 8-bit */ -#define R_TILEGX_MT_IMM14_X1 28 /* X1 pipe mtspr */ -#define R_TILEGX_MF_IMM14_X1 29 /* X1 pipe mfspr */ -#define R_TILEGX_MMSTART_X0 30 /* X0 pipe mm "start" */ -#define R_TILEGX_MMEND_X0 31 /* X0 pipe mm "end" */ -#define R_TILEGX_SHAMT_X0 32 /* X0 pipe shift amount */ -#define R_TILEGX_SHAMT_X1 33 /* X1 pipe shift amount */ -#define R_TILEGX_SHAMT_Y0 34 /* Y0 pipe shift amount */ -#define R_TILEGX_SHAMT_Y1 35 /* Y1 pipe shift amount */ -#define R_TILEGX_IMM16_X0_HW0 36 /* X0 pipe hword 0 */ -#define R_TILEGX_IMM16_X1_HW0 37 /* X1 pipe hword 0 */ -#define R_TILEGX_IMM16_X0_HW1 38 /* X0 pipe hword 1 */ -#define R_TILEGX_IMM16_X1_HW1 39 /* X1 pipe hword 1 */ -#define R_TILEGX_IMM16_X0_HW2 40 /* X0 pipe hword 2 */ -#define R_TILEGX_IMM16_X1_HW2 41 /* X1 pipe hword 2 */ -#define R_TILEGX_IMM16_X0_HW3 42 /* X0 pipe hword 3 */ -#define R_TILEGX_IMM16_X1_HW3 43 /* X1 pipe hword 3 */ -#define R_TILEGX_IMM16_X0_HW0_LAST 44 /* X0 pipe last hword 0 */ -#define R_TILEGX_IMM16_X1_HW0_LAST 45 /* X1 pipe last hword 0 */ -#define R_TILEGX_IMM16_X0_HW1_LAST 46 /* X0 pipe last hword 1 */ -#define R_TILEGX_IMM16_X1_HW1_LAST 47 /* X1 pipe last hword 1 */ -#define R_TILEGX_IMM16_X0_HW2_LAST 48 /* X0 pipe last hword 2 */ -#define R_TILEGX_IMM16_X1_HW2_LAST 49 /* X1 pipe last hword 2 */ -#define R_TILEGX_IMM16_X0_HW0_PCREL 50 /* X0 pipe PC relative hword 0 */ -#define R_TILEGX_IMM16_X1_HW0_PCREL 51 /* X1 pipe PC relative hword 0 */ -#define R_TILEGX_IMM16_X0_HW1_PCREL 52 /* X0 pipe PC relative hword 1 */ -#define R_TILEGX_IMM16_X1_HW1_PCREL 53 /* X1 pipe PC relative hword 1 */ -#define R_TILEGX_IMM16_X0_HW2_PCREL 54 /* X0 pipe PC relative hword 2 */ -#define R_TILEGX_IMM16_X1_HW2_PCREL 55 /* X1 pipe PC relative hword 2 */ -#define R_TILEGX_IMM16_X0_HW3_PCREL 56 /* X0 pipe PC relative hword 3 */ -#define R_TILEGX_IMM16_X1_HW3_PCREL 57 /* X1 pipe PC relative hword 3 */ -#define R_TILEGX_IMM16_X0_HW0_LAST_PCREL 58 /* X0 pipe PC-rel last hword 0 */ -#define R_TILEGX_IMM16_X1_HW0_LAST_PCREL 59 /* X1 pipe PC-rel last hword 0 */ -#define R_TILEGX_IMM16_X0_HW1_LAST_PCREL 60 /* X0 pipe PC-rel last hword 1 */ -#define R_TILEGX_IMM16_X1_HW1_LAST_PCREL 61 /* X1 pipe PC-rel last hword 1 */ -#define R_TILEGX_IMM16_X0_HW2_LAST_PCREL 62 /* X0 pipe PC-rel last hword 2 */ -#define R_TILEGX_IMM16_X1_HW2_LAST_PCREL 63 /* X1 pipe PC-rel last hword 2 */ -#define R_TILEGX_IMM16_X0_HW0_GOT 64 /* X0 pipe hword 0 GOT offset */ -#define R_TILEGX_IMM16_X1_HW0_GOT 65 /* X1 pipe hword 0 GOT offset */ -#define R_TILEGX_IMM16_X0_HW0_PLT_PCREL 66 /* X0 pipe PC-rel PLT hword 0 */ -#define R_TILEGX_IMM16_X1_HW0_PLT_PCREL 67 /* X1 pipe PC-rel PLT hword 0 */ -#define R_TILEGX_IMM16_X0_HW1_PLT_PCREL 68 /* X0 pipe PC-rel PLT hword 1 */ -#define R_TILEGX_IMM16_X1_HW1_PLT_PCREL 69 /* X1 pipe PC-rel PLT hword 1 */ -#define R_TILEGX_IMM16_X0_HW2_PLT_PCREL 70 /* X0 pipe PC-rel PLT hword 2 */ -#define R_TILEGX_IMM16_X1_HW2_PLT_PCREL 71 /* X1 pipe PC-rel PLT hword 2 */ -#define R_TILEGX_IMM16_X0_HW0_LAST_GOT 72 /* X0 pipe last hword 0 GOT offset */ -#define R_TILEGX_IMM16_X1_HW0_LAST_GOT 73 /* X1 pipe last hword 0 GOT offset */ -#define R_TILEGX_IMM16_X0_HW1_LAST_GOT 74 /* X0 pipe last hword 1 GOT offset */ -#define R_TILEGX_IMM16_X1_HW1_LAST_GOT 75 /* X1 pipe last hword 1 GOT offset */ -#define R_TILEGX_IMM16_X0_HW3_PLT_PCREL 76 /* X0 pipe PC-rel PLT hword 3 */ -#define R_TILEGX_IMM16_X1_HW3_PLT_PCREL 77 /* X1 pipe PC-rel PLT hword 3 */ -#define R_TILEGX_IMM16_X0_HW0_TLS_GD 78 /* X0 pipe hword 0 TLS GD offset */ -#define R_TILEGX_IMM16_X1_HW0_TLS_GD 79 /* X1 pipe hword 0 TLS GD offset */ -#define R_TILEGX_IMM16_X0_HW0_TLS_LE 80 /* X0 pipe hword 0 TLS LE offset */ -#define R_TILEGX_IMM16_X1_HW0_TLS_LE 81 /* X1 pipe hword 0 TLS LE offset */ -#define R_TILEGX_IMM16_X0_HW0_LAST_TLS_LE 82 /* X0 pipe last hword 0 LE off */ -#define R_TILEGX_IMM16_X1_HW0_LAST_TLS_LE 83 /* X1 pipe last hword 0 LE off */ -#define R_TILEGX_IMM16_X0_HW1_LAST_TLS_LE 84 /* X0 pipe last hword 1 LE off */ -#define R_TILEGX_IMM16_X1_HW1_LAST_TLS_LE 85 /* X1 pipe last hword 1 LE off */ -#define R_TILEGX_IMM16_X0_HW0_LAST_TLS_GD 86 /* X0 pipe last hword 0 GD off */ -#define R_TILEGX_IMM16_X1_HW0_LAST_TLS_GD 87 /* X1 pipe last hword 0 GD off */ -#define R_TILEGX_IMM16_X0_HW1_LAST_TLS_GD 88 /* X0 pipe last hword 1 GD off */ -#define R_TILEGX_IMM16_X1_HW1_LAST_TLS_GD 89 /* X1 pipe last hword 1 GD off */ -/* Relocs 90-91 are currently not defined. */ -#define R_TILEGX_IMM16_X0_HW0_TLS_IE 92 /* X0 pipe hword 0 TLS IE offset */ -#define R_TILEGX_IMM16_X1_HW0_TLS_IE 93 /* X1 pipe hword 0 TLS IE offset */ -#define R_TILEGX_IMM16_X0_HW0_LAST_PLT_PCREL 94 /* X0 pipe PC-rel PLT last hword 0 */ -#define R_TILEGX_IMM16_X1_HW0_LAST_PLT_PCREL 95 /* X1 pipe PC-rel PLT last hword 0 */ -#define R_TILEGX_IMM16_X0_HW1_LAST_PLT_PCREL 96 /* X0 pipe PC-rel PLT last hword 1 */ -#define R_TILEGX_IMM16_X1_HW1_LAST_PLT_PCREL 97 /* X1 pipe PC-rel PLT last hword 1 */ -#define R_TILEGX_IMM16_X0_HW2_LAST_PLT_PCREL 98 /* X0 pipe PC-rel PLT last hword 2 */ -#define R_TILEGX_IMM16_X1_HW2_LAST_PLT_PCREL 99 /* X1 pipe PC-rel PLT last hword 2 */ -#define R_TILEGX_IMM16_X0_HW0_LAST_TLS_IE 100 /* X0 pipe last hword 0 IE off */ -#define R_TILEGX_IMM16_X1_HW0_LAST_TLS_IE 101 /* X1 pipe last hword 0 IE off */ -#define R_TILEGX_IMM16_X0_HW1_LAST_TLS_IE 102 /* X0 pipe last hword 1 IE off */ -#define R_TILEGX_IMM16_X1_HW1_LAST_TLS_IE 103 /* X1 pipe last hword 1 IE off */ -/* Relocs 104-105 are currently not defined. */ -#define R_TILEGX_TLS_DTPMOD64 106 /* 64-bit ID of symbol's module */ -#define R_TILEGX_TLS_DTPOFF64 107 /* 64-bit offset in TLS block */ -#define R_TILEGX_TLS_TPOFF64 108 /* 64-bit offset in static TLS block */ -#define R_TILEGX_TLS_DTPMOD32 109 /* 32-bit ID of symbol's module */ -#define R_TILEGX_TLS_DTPOFF32 110 /* 32-bit offset in TLS block */ -#define R_TILEGX_TLS_TPOFF32 111 /* 32-bit offset in static TLS block */ -#define R_TILEGX_TLS_GD_CALL 112 /* "jal" for TLS GD */ -#define R_TILEGX_IMM8_X0_TLS_GD_ADD 113 /* X0 pipe "addi" for TLS GD */ -#define R_TILEGX_IMM8_X1_TLS_GD_ADD 114 /* X1 pipe "addi" for TLS GD */ -#define R_TILEGX_IMM8_Y0_TLS_GD_ADD 115 /* Y0 pipe "addi" for TLS GD */ -#define R_TILEGX_IMM8_Y1_TLS_GD_ADD 116 /* Y1 pipe "addi" for TLS GD */ -#define R_TILEGX_TLS_IE_LOAD 117 /* "ld_tls" for TLS IE */ -#define R_TILEGX_IMM8_X0_TLS_ADD 118 /* X0 pipe "addi" for TLS GD/IE */ -#define R_TILEGX_IMM8_X1_TLS_ADD 119 /* X1 pipe "addi" for TLS GD/IE */ -#define R_TILEGX_IMM8_Y0_TLS_ADD 120 /* Y0 pipe "addi" for TLS GD/IE */ -#define R_TILEGX_IMM8_Y1_TLS_ADD 121 /* Y1 pipe "addi" for TLS GD/IE */ - -#define R_TILEGX_GNU_VTINHERIT 128 /* GNU C++ vtable hierarchy */ -#define R_TILEGX_GNU_VTENTRY 129 /* GNU C++ vtable member usage */ - -#define R_TILEGX_NUM 130 - -/* OR1K relocations */ -#define R_OR1K_NONE 0 -#define R_OR1K_32 1 -#define R_OR1K_16 2 -#define R_OR1K_8 3 -#define R_OR1K_LO_16_IN_INSN 4 -#define R_OR1K_HI_16_IN_INSN 5 -#define R_OR1K_INSN_REL_26 6 -#define R_OR1K_GNU_VTENTRY 7 -#define R_OR1K_GNU_VTINHERIT 8 -#define R_OR1K_32_PCREL 9 -#define R_OR1K_16_PCREL 10 -#define R_OR1K_8_PCREL 11 -#define R_OR1K_GOTPC_HI16 12 -#define R_OR1K_GOTPC_LO16 13 -#define R_OR1K_GOT16 14 -#define R_OR1K_PLT26 15 -#define R_OR1K_GOTOFF_HI16 16 -#define R_OR1K_GOTOFF_LO16 17 -#define R_OR1K_COPY 18 -#define R_OR1K_GLOB_DAT 19 -#define R_OR1K_JMP_SLOT 20 -#define R_OR1K_RELATIVE 21 -#define R_OR1K_TLS_GD_HI16 22 -#define R_OR1K_TLS_GD_LO16 23 -#define R_OR1K_TLS_LDM_HI16 24 -#define R_OR1K_TLS_LDM_LO16 25 -#define R_OR1K_TLS_LDO_HI16 26 -#define R_OR1K_TLS_LDO_LO16 27 -#define R_OR1K_TLS_IE_HI16 28 -#define R_OR1K_TLS_IE_LO16 29 -#define R_OR1K_TLS_LE_HI16 30 -#define R_OR1K_TLS_LE_LO16 31 -#define R_OR1K_TLS_TPOFF 32 -#define R_OR1K_TLS_DTPOFF 33 -#define R_OR1K_TLS_DTPMOD 34 - -#define R_OR1K_NUM 35 - -#ifdef __cplusplus -} -#endif - -#endif /* elf.h */ diff --git a/litex/soc/software/include/dyld/link.h b/litex/soc/software/include/dyld/link.h deleted file mode 100644 index effa32b8b..000000000 --- a/litex/soc/software/include/dyld/link.h +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef __LINK_H -#define __LINK_H - -#include -#include - -#define ElfW(type) Elf32_##type - -struct dl_phdr_info { - ElfW(Addr) dlpi_addr; - const char *dlpi_name; - const ElfW(Phdr) *dlpi_phdr; - ElfW(Half) dlpi_phnum; -}; - -#ifdef __cplusplus -extern "C" { -#endif - -extern int dl_iterate_phdr (int (*__callback) (struct dl_phdr_info *, - size_t, void *), - void *__data); - -#ifdef __cplusplus -} -#endif - -#endif /* __LINK_H */ diff --git a/litex/soc/software/include/fdlibm/fdlibm.h b/litex/soc/software/include/fdlibm/fdlibm.h deleted file mode 100644 index 60a8df6cc..000000000 --- a/litex/soc/software/include/fdlibm/fdlibm.h +++ /dev/null @@ -1,216 +0,0 @@ - -/* @(#)fdlibm.h 1.5 04/04/22 */ -/* - * ==================================================== - * Copyright (C) 2004 by Sun Microsystems, Inc. All rights reserved. - * - * Permission to use, copy, modify, and distribute this - * software is freely granted, provided that this notice - * is preserved. - * ==================================================== - */ - -/* Sometimes it's necessary to define __LITTLE_ENDIAN explicitly - but these catch some common cases. */ - -#if defined(i386) || defined(i486) || \ - defined(intel) || defined(x86) || defined(i86pc) || \ - defined(__alpha) || defined(__osf__) -#define __LITTLE_ENDIAN -#endif - -#ifdef __LITTLE_ENDIAN -#define __HI(x) *(1+(int*)&x) -#define __LO(x) *(int*)&x -#define __HIp(x) *(1+(int*)x) -#define __LOp(x) *(int*)x -#else -#define __HI(x) *(int*)&x -#define __LO(x) *(1+(int*)&x) -#define __HIp(x) *(int*)x -#define __LOp(x) *(1+(int*)x) -#endif - -#ifdef __STDC__ -#define __P(p) p -#else -#define __P(p) () -#endif - -/* - * ANSI/POSIX - */ - -extern int signgam; - -#define MAXFLOAT ((float)3.40282346638528860e+38) - -enum fdversion {fdlibm_ieee = -1, fdlibm_svid, fdlibm_xopen, fdlibm_posix}; - -#define _LIB_VERSION_TYPE enum fdversion -#define _LIB_VERSION _fdlib_version - -/* if global variable _LIB_VERSION is not desirable, one may - * change the following to be a constant by: - * #define _LIB_VERSION_TYPE const enum version - * In that case, after one initializes the value _LIB_VERSION (see - * s_lib_version.c) during compile time, it cannot be modified - * in the middle of a program - */ -extern _LIB_VERSION_TYPE _LIB_VERSION; - -#define _IEEE_ fdlibm_ieee -#define _SVID_ fdlibm_svid -#define _XOPEN_ fdlibm_xopen -#define _POSIX_ fdlibm_posix - -struct exception { - int type; - char *name; - double arg1; - double arg2; - double retval; -}; - -#define HUGE MAXFLOAT - -/* - * set X_TLOSS = pi*2**52, which is possibly defined in - * (one may replace the following line by "#include ") - */ - -#define X_TLOSS 1.41484755040568800000e+16 - -#define DOMAIN 1 -#define SING 2 -#define OVERFLOW 3 -#define UNDERFLOW 4 -#define TLOSS 5 -#define PLOSS 6 - -/* - * ANSI/POSIX - */ -extern double acos __P((double)); -extern double asin __P((double)); -extern double atan __P((double)); -extern double atan2 __P((double, double)); -extern double cos __P((double)); -extern double sin __P((double)); -extern double tan __P((double)); - -extern double cosh __P((double)); -extern double sinh __P((double)); -extern double tanh __P((double)); - -extern double exp __P((double)); -extern double frexp __P((double, int *)); -extern double ldexp __P((double, int)); -extern double log __P((double)); -extern double log10 __P((double)); -extern double modf __P((double, double *)); - -extern double pow __P((double, double)); -extern double sqrt __P((double)); - -extern double ceil __P((double)); -extern double fabs __P((double)); -extern double floor __P((double)); -extern double fmod __P((double, double)); - -extern double erf __P((double)); -extern double erfc __P((double)); -extern double gamma __P((double)); -extern double hypot __P((double, double)); -extern int isnan __P((double)); -extern int finite __P((double)); -extern double j0 __P((double)); -extern double j1 __P((double)); -extern double jn __P((int, double)); -extern double lgamma __P((double)); -extern double y0 __P((double)); -extern double y1 __P((double)); -extern double yn __P((int, double)); - -extern double acosh __P((double)); -extern double asinh __P((double)); -extern double atanh __P((double)); -extern double cbrt __P((double)); -extern double logb __P((double)); -extern double nextafter __P((double, double)); -extern double remainder __P((double, double)); -#ifdef _SCALB_INT -extern double scalb __P((double, int)); -#else -extern double scalb __P((double, double)); -#endif - -extern int matherr __P((struct exception *)); - -/* - * IEEE Test Vector - */ -extern double significand __P((double)); - -/* - * Functions callable from C, intended to support IEEE arithmetic. - */ -extern double copysign __P((double, double)); -extern int ilogb __P((double)); -extern double rint __P((double)); -extern double scalbn __P((double, int)); - -/* - * BSD math library entry points - */ -extern double expm1 __P((double)); -extern double log1p __P((double)); - -/* - * Reentrant version of gamma & lgamma; passes signgam back by reference - * as the second argument; user must allocate space for signgam. - */ -#ifdef _REENTRANT -extern double gamma_r __P((double, int *)); -extern double lgamma_r __P((double, int *)); -#endif /* _REENTRANT */ - -/* ieee style elementary functions */ -extern double __ieee754_sqrt __P((double)); -extern double __ieee754_acos __P((double)); -extern double __ieee754_acosh __P((double)); -extern double __ieee754_log __P((double)); -extern double __ieee754_atanh __P((double)); -extern double __ieee754_asin __P((double)); -extern double __ieee754_atan2 __P((double,double)); -extern double __ieee754_exp __P((double)); -extern double __ieee754_cosh __P((double)); -extern double __ieee754_fmod __P((double,double)); -extern double __ieee754_pow __P((double,double)); -extern double __ieee754_lgamma_r __P((double,int *)); -extern double __ieee754_gamma_r __P((double,int *)); -extern double __ieee754_lgamma __P((double)); -extern double __ieee754_gamma __P((double)); -extern double __ieee754_log10 __P((double)); -extern double __ieee754_sinh __P((double)); -extern double __ieee754_hypot __P((double,double)); -extern double __ieee754_j0 __P((double)); -extern double __ieee754_j1 __P((double)); -extern double __ieee754_y0 __P((double)); -extern double __ieee754_y1 __P((double)); -extern double __ieee754_jn __P((int,double)); -extern double __ieee754_yn __P((int,double)); -extern double __ieee754_remainder __P((double,double)); -extern int __ieee754_rem_pio2 __P((double,double*)); -#ifdef _SCALB_INT -extern double __ieee754_scalb __P((double,int)); -#else -extern double __ieee754_scalb __P((double,double)); -#endif - -/* fdlibm kernel function */ -extern double __kernel_standard __P((double,double,int)); -extern double __kernel_sin __P((double,double,int)); -extern double __kernel_cos __P((double,double)); -extern double __kernel_tan __P((double,double,int)); -extern int __kernel_rem_pio2 __P((double*,double*,int,int,int,const int*)); diff --git a/litex/soc/software/libbase/Makefile b/litex/soc/software/libbase/Makefile index 39181c521..4cfa62e93 100755 --- a/litex/soc/software/libbase/Makefile +++ b/litex/soc/software/libbase/Makefile @@ -1,51 +1,29 @@ include ../include/generated/variables.mak include $(SOC_DIRECTORY)/software/common.mak -OBJECTS = exception.o \ - libc.o \ - errno.o \ - crc16.o \ - crc32.o \ - console.o \ - system.o \ - id.o \ - uart.o \ - time.o \ - qsort.o \ - strtod.o \ - spiflash.o \ - strcasecmp.o \ - i2c.o \ - div64.o \ - progress.o \ - memtest.o \ - sim_debug.o +OBJECTS = \ + crc16.o \ + crc32.o \ + system.o \ + progress.o \ + memtest.o \ + uart.o \ + spiflash.o \ + i2c.o -all: crt0.o libbase.a libbase-nofloat.a +all: libbase.a -libbase.a: $(OBJECTS) vsnprintf.o - $(AR) crs libbase.a $(OBJECTS) vsnprintf.o - -libbase-nofloat.a: $(OBJECTS) vsnprintf-nofloat.o - $(AR) crs libbase-nofloat.a $(OBJECTS) vsnprintf-nofloat.o +libbase.a: $(OBJECTS) + $(AR) crs libbase.a $(OBJECTS) # pull in dependency info for *existing* .o files -include $(OBJECTS:.o=.d) -vsnprintf-nofloat.o: $(LIBBASE_DIRECTORY)/vsnprintf.c - $(call compile,-DNO_FLOAT) - %.o: $(LIBBASE_DIRECTORY)/%.c $(compile) -%.o: $(LIBBASE_DIRECTORY)/%.S - $(assemble) - -crt0.o: $(CPU_DIRECTORY)/crt0.S - $(assemble) - .PHONY: all clean clean: - $(RM) $(OBJECTS) crt0.o vsnprintf.o vsnprintf-nofloat.o - $(RM) libbase.a libbase-nofloat.a .*~ *~ + $(RM) $(OBJECTS) + $(RM) libbase.a .*~ *~ diff --git a/litex/soc/software/include/base/console.h b/litex/soc/software/libbase/console.h similarity index 87% rename from litex/soc/software/include/base/console.h rename to litex/soc/software/libbase/console.h index a1cf59928..8776baf05 100644 --- a/litex/soc/software/include/base/console.h +++ b/litex/soc/software/libbase/console.h @@ -12,10 +12,10 @@ typedef int (*console_read_nonblock_hook)(void); void console_set_write_hook(console_write_hook h); void console_set_read_hook(console_read_hook r, console_read_nonblock_hook rn); -char readchar(void); -int readchar_nonblock(void); +#define readchar getchar +#define putsnonl(X) fputs(X, stdout) -void putsnonl(const char *s); +int readchar_nonblock(void); #ifdef __cplusplus } diff --git a/litex/soc/software/include/base/crc.h b/litex/soc/software/libbase/crc.h similarity index 100% rename from litex/soc/software/include/base/crc.h rename to litex/soc/software/libbase/crc.h diff --git a/litex/soc/software/libbase/crc16.c b/litex/soc/software/libbase/crc16.c index a14d0ed8f..732c3c587 100644 --- a/litex/soc/software/libbase/crc16.c +++ b/litex/soc/software/libbase/crc16.c @@ -1,4 +1,4 @@ -#include +#include "crc.h" #ifndef SMALL_CRC static const unsigned int crc16_table[256] = { diff --git a/litex/soc/software/libbase/crc32.c b/litex/soc/software/libbase/crc32.c index 68f7b336c..54bdf8750 100644 --- a/litex/soc/software/libbase/crc32.c +++ b/litex/soc/software/libbase/crc32.c @@ -3,7 +3,7 @@ * For conditions of distribution and use, see copyright notice in zlib.h */ -#include +#include "crc.h" #ifndef SMALL_CRC static const unsigned int crc_table[256] = { diff --git a/litex/soc/software/libbase/div64.c b/litex/soc/software/libbase/div64.c deleted file mode 100644 index 98d77480d..000000000 --- a/litex/soc/software/libbase/div64.c +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (C) 2003 Bernardo Innocenti - * - * Based on former do_div() implementation from asm-parisc/div64.h: - * Copyright (C) 1999 Hewlett-Packard Co - * Copyright (C) 1999 David Mosberger-Tang - * - * - * Generic C version of 64bit/32bit division and modulo, with - * 64bit result and 32bit remainder. - * - * The fast case for (n>>32 == 0) is handled inline by do_div(). - * - * Code generated for this function might be very inefficient - * for some CPUs. __div64_32() can be overridden by linking arch-specific - * assembly versions such as arch/ppc/lib/div64.S and arch/sh/lib/div64.S. - */ - -#include - -#include - -uint32_t __div64_32(uint64_t *n, uint32_t base) -{ - uint64_t rem = *n; - uint64_t b = base; - uint64_t res, d = 1; - uint32_t high = rem >> 32; - - /* Reduce the thing a bit first */ - res = 0; - if (high >= base) { - high /= base; - res = (uint64_t) high << 32; - rem -= (uint64_t) (high*base) << 32; - } - - while ((int64_t)b > 0 && b < rem) { - b = b+b; - d = d+d; - } - - do { - if (rem >= b) { - rem -= b; - res += d; - } - b >>= 1; - d >>= 1; - } while (d); - - *n = res; - return rem; -} diff --git a/litex/soc/software/libbase/errno.c b/litex/soc/software/libbase/errno.c deleted file mode 100644 index 4e91f78e9..000000000 --- a/litex/soc/software/libbase/errno.c +++ /dev/null @@ -1,208 +0,0 @@ -#include -#include - -int errno; - -/************************************************************************ - * Based on: lib/string/lib_strerror.c - * - * Copyright (C) 2007, 2009, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * 3. Neither the name NuttX nor the names of its contributors may be - * used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ************************************************************************/ - -struct errno_strmap_s -{ - int errnum; - char *str; -}; - -/* This table maps all error numbers to descriptive strings. - * The only assumption that the code makes with regard to this - * this table is that it is order by error number. - * - * The size of this table is quite large. Its size can be - * reduced by eliminating some of the more obscure error - * strings. - */ - -struct errno_strmap_s g_errnomap[] = -{ - { EPERM, EPERM_STR }, - { ENOENT, ENOENT_STR }, - { ESRCH, ESRCH_STR }, - { EINTR, EINTR_STR }, - { EIO, EIO_STR }, - { ENXIO, ENXIO_STR }, - { E2BIG, E2BIG_STR }, - { ENOEXEC, ENOEXEC_STR }, - { EBADF, EBADF_STR }, - { ECHILD, ECHILD_STR }, - { EAGAIN, EAGAIN_STR }, - { ENOMEM, ENOMEM_STR }, - { EACCES, EACCES_STR }, - { EFAULT, EFAULT_STR }, - { ENOTBLK, ENOTBLK_STR }, - { EBUSY, EBUSY_STR }, - { EEXIST, EEXIST_STR }, - { EXDEV, EXDEV_STR }, - { ENODEV, ENODEV_STR }, - { ENOTDIR, ENOTDIR_STR }, - { EISDIR, EISDIR_STR }, - { EINVAL, EINVAL_STR }, - { ENFILE, ENFILE_STR }, - { EMFILE, EMFILE_STR }, - { ENOTTY, ENOTTY_STR }, - { ETXTBSY, ETXTBSY_STR }, - { EFBIG, EFBIG_STR }, - { ENOSPC, ENOSPC_STR }, - { ESPIPE, ESPIPE_STR }, - { EROFS, EROFS_STR }, - { EMLINK, EMLINK_STR }, - { EPIPE, EPIPE_STR }, - { EDOM, EDOM_STR }, - { ERANGE, ERANGE_STR }, - { EDEADLK, EDEADLK_STR }, - { ENAMETOOLONG, ENAMETOOLONG_STR }, - { ENOLCK, ENOLCK_STR }, - { ENOSYS, ENOSYS_STR }, - { ENOTEMPTY, ENOTEMPTY_STR }, - { ELOOP, ELOOP_STR }, - { ENOMSG, ENOMSG_STR }, - { EIDRM, EIDRM_STR }, - { ECHRNG, ECHRNG_STR }, - { EL2NSYNC, EL2NSYNC_STR }, - { EL3HLT, EL3HLT_STR }, - { EL3RST, EL3RST_STR }, - { ELNRNG, ELNRNG_STR }, - { EUNATCH, EUNATCH_STR }, - { ENOCSI, ENOCSI_STR }, - { EL2HLT, EL2HLT_STR }, - { EBADE, EBADE_STR }, - { EBADR, EBADR_STR }, - { EXFULL, EXFULL_STR }, - { ENOANO, ENOANO_STR }, - { EBADRQC, EBADRQC_STR }, - { EBADSLT, EBADSLT_STR }, - { EBFONT, EBFONT_STR }, - { ENOSTR, ENOSTR_STR }, - { ENODATA, ENODATA_STR }, - { ETIME, ETIME_STR }, - { ENOSR, ENOSR_STR }, - { ENONET, ENONET_STR }, - { ENOPKG, ENOPKG_STR }, - { EREMOTE, EREMOTE_STR }, - { ENOLINK, ENOLINK_STR }, - { EADV, EADV_STR }, - { ESRMNT, ESRMNT_STR }, - { ECOMM, ECOMM_STR }, - { EPROTO, EPROTO_STR }, - { EMULTIHOP, EMULTIHOP_STR }, - { EDOTDOT, EDOTDOT_STR }, - { EBADMSG, EBADMSG_STR }, - { EOVERFLOW, EOVERFLOW_STR }, - { ENOTUNIQ, ENOTUNIQ_STR }, - { EBADFD, EBADFD_STR }, - { EREMCHG, EREMCHG_STR }, - { ELIBACC, ELIBACC_STR }, - { ELIBBAD, ELIBBAD_STR }, - { ELIBSCN, ELIBSCN_STR }, - { ELIBMAX, ELIBMAX_STR }, - { ELIBEXEC, ELIBEXEC_STR }, - { EILSEQ, EILSEQ_STR }, - { ERESTART, ERESTART_STR }, - { ESTRPIPE, ESTRPIPE_STR }, - { EUSERS, EUSERS_STR }, - { ENOTSOCK, ENOTSOCK_STR }, - { EDESTADDRREQ, EDESTADDRREQ_STR }, - { EMSGSIZE, EMSGSIZE_STR }, - { EPROTOTYPE, EPROTOTYPE_STR }, - { ENOPROTOOPT, ENOPROTOOPT_STR }, - { EPROTONOSUPPORT, EPROTONOSUPPORT_STR }, - { ESOCKTNOSUPPORT, ESOCKTNOSUPPORT_STR }, - { EOPNOTSUPP, EOPNOTSUPP_STR }, - { EPFNOSUPPORT, EPFNOSUPPORT_STR }, - { EAFNOSUPPORT, EAFNOSUPPORT_STR }, - { EADDRINUSE, EADDRINUSE_STR }, - { EADDRNOTAVAIL, EADDRNOTAVAIL_STR }, - { ENETDOWN, ENETDOWN_STR }, - { ENETUNREACH, ENETUNREACH_STR }, - { ENETRESET, ENETRESET_STR }, - { ECONNABORTED, ECONNABORTED_STR }, - { ECONNRESET, ECONNRESET_STR }, - { ENOBUFS, ENOBUFS_STR }, - { EISCONN, EISCONN_STR }, - { ENOTCONN, ENOTCONN_STR }, - { ESHUTDOWN, ESHUTDOWN_STR }, - { ETOOMANYREFS, ETOOMANYREFS_STR }, - { ETIMEDOUT, ETIMEDOUT_STR }, - { ECONNREFUSED, ECONNREFUSED_STR }, - { EHOSTDOWN, EHOSTDOWN_STR }, - { EHOSTUNREACH, EHOSTUNREACH_STR }, - { EALREADY, EALREADY_STR }, - { EINPROGRESS, EINPROGRESS_STR }, - { ESTALE, ESTALE_STR }, - { EUCLEAN, EUCLEAN_STR }, - { ENOTNAM, ENOTNAM_STR }, - { ENAVAIL, ENAVAIL_STR }, - { EISNAM, EISNAM_STR }, - { EREMOTEIO, EREMOTEIO_STR }, - { EDQUOT, EDQUOT_STR }, - { ENOMEDIUM, ENOMEDIUM_STR }, - { EMEDIUMTYPE, EMEDIUMTYPE_STR } -}; - -#define NERRNO_STRS (sizeof(g_errnomap) / sizeof(struct errno_strmap_s)) - -char *strerror(int errnum) -{ - int ndxlow = 0; - int ndxhi = NERRNO_STRS - 1; - int ndxmid; - - do - { - ndxmid = (ndxlow + ndxhi) >> 1; - if (errnum > g_errnomap[ndxmid].errnum) - { - ndxlow = ndxmid + 1; - } - else if (errnum < g_errnomap[ndxmid].errnum) - { - ndxhi = ndxmid - 1; - } - else - { - return g_errnomap[ndxmid].str; - } - } - while (ndxlow <= ndxhi); - return "Unknown error"; -} diff --git a/litex/soc/software/libbase/i2c.c b/litex/soc/software/libbase/i2c.c index 800f926f8..c6af33765 100644 --- a/litex/soc/software/libbase/i2c.c +++ b/litex/soc/software/libbase/i2c.c @@ -1,5 +1,6 @@ // This file is Copyright (c) 2020 Antmicro -#include +#include "i2c.h" + #include #ifdef CSR_I2C_BASE diff --git a/litex/soc/software/include/base/i2c.h b/litex/soc/software/libbase/i2c.h similarity index 100% rename from litex/soc/software/include/base/i2c.h rename to litex/soc/software/libbase/i2c.h diff --git a/litex/soc/software/libbase/id.c b/litex/soc/software/libbase/id.c deleted file mode 100644 index d2d7b513a..000000000 --- a/litex/soc/software/libbase/id.c +++ /dev/null @@ -1,18 +0,0 @@ -#include -#include -#include -#include -#include - -#define DFII_ADDR_SHIFT CONFIG_CSR_ALIGNMENT/8 - -void get_ident(char *ident) -{ -#ifdef CSR_IDENTIFIER_MEM_BASE - int i; - for(i=0;i<256;i++) - ident[i] = MMPTR(CSR_IDENTIFIER_MEM_BASE + DFII_ADDR_SHIFT*i); -#else - ident[0] = 0; -#endif -} diff --git a/litex/soc/software/include/base/jsmn.h b/litex/soc/software/libbase/jsmn.h similarity index 100% rename from litex/soc/software/include/base/jsmn.h rename to litex/soc/software/libbase/jsmn.h diff --git a/litex/soc/software/include/base/lfsr.h b/litex/soc/software/libbase/lfsr.h similarity index 100% rename from litex/soc/software/include/base/lfsr.h rename to litex/soc/software/libbase/lfsr.h diff --git a/litex/soc/software/libbase/libc.c b/litex/soc/software/libbase/libc.c deleted file mode 100644 index 7a2728bb7..000000000 --- a/litex/soc/software/libbase/libc.c +++ /dev/null @@ -1,700 +0,0 @@ -/* - * MiSoC - * Copyright (C) 2007, 2008, 2009, 2010, 2011 Sebastien Bourdeauducq - * Copyright (C) Linus Torvalds and Linux kernel developers - * - * 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, version 3 of the License. - * - * 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, see . - */ - -#include -#include -#include -#include -#include -#include -#include - -/** - * strchr - Find the first occurrence of a character in a string - * @s: The string to be searched - * @c: The character to search for - */ -char *strchr(const char *s, int c) -{ - for (; *s != (char)c; ++s) - if (*s == '\0') - return NULL; - return (char *)s; -} - -/** - * strpbrk - Find the first occurrence of a set of characters - * @cs: The string to be searched - * @ct: The characters to search for - */ -char *strpbrk(const char *cs, const char *ct) -{ - const char *sc1, *sc2; - - for (sc1 = cs; *sc1 != '\0'; ++sc1) { - for (sc2 = ct; *sc2 != '\0'; ++sc2) { - if (*sc1 == *sc2) - return (char *)sc1; - } - } - return NULL; -} - -/** - * strrchr - Find the last occurrence of a character in a string - * @s: The string to be searched - * @c: The character to search for - */ -char *strrchr(const char *s, int c) -{ - const char *p = s + strlen(s); - do { - if (*p == (char)c) - return (char *)p; - } while (--p >= s); - return NULL; -} - -/** - * strnchr - Find a character in a length limited string - * @s: The string to be searched - * @count: The number of characters to be searched - * @c: The character to search for - */ -char *strnchr(const char *s, size_t count, int c) -{ - for (; count-- && *s != '\0'; ++s) - if (*s == (char)c) - return (char *)s; - return NULL; -} - -/** - * strcpy - Copy a %NUL terminated string - * @dest: Where to copy the string to - * @src: Where to copy the string from - */ -char *strcpy(char *dest, const char *src) -{ - char *tmp = dest; - - while ((*dest++ = *src++) != '\0') - /* nothing */; - return tmp; -} - -/** - * strncpy - Copy a length-limited, %NUL-terminated string - * @dest: Where to copy the string to - * @src: Where to copy the string from - * @count: The maximum number of bytes to copy - * - * The result is not %NUL-terminated if the source exceeds - * @count bytes. - * - * In the case where the length of @src is less than that of - * count, the remainder of @dest will be padded with %NUL. - * - */ -char *strncpy(char *dest, const char *src, size_t count) -{ - char *tmp = dest; - - while (count) { - if ((*tmp = *src) != 0) - src++; - tmp++; - count--; - } - return dest; -} - -/** - * strcmp - Compare two strings - * @cs: One string - * @ct: Another string - */ -int strcmp(const char *cs, const char *ct) -{ - signed char __res; - - while (1) { - if ((__res = *cs - *ct++) != 0 || !*cs++) - break; - } - return __res; -} - -/** - * strncmp - Compare two strings using the first characters only - * @cs: One string - * @ct: Another string - * @count: Number of characters - */ -int strncmp(const char *cs, const char *ct, size_t count) -{ - signed char __res; - size_t n; - - n = 0; - __res = 0; - while (n < count) { - if ((__res = *cs - *ct++) != 0 || !*cs++) - break; - n++; - } - return __res; -} - -/** - * strcat - Append one %NUL-terminated string to another - * @dest: The string to be appended to - * @src: The string to append to it - */ -char *strcat(char *dest, const char *src) -{ - char *tmp = dest; - - while (*dest) - dest++; - while ((*dest++ = *src++) != '\0') - ; - return tmp; -} - -/** - * strncat - Append a length-limited, %NUL-terminated string to another - * @dest: The string to be appended to - * @src: The string to append to it - * @count: The maximum numbers of bytes to copy - * - * Note that in contrast to strncpy(), strncat() ensures the result is - * terminated. - */ -char *strncat(char *dest, const char *src, size_t count) -{ - char *tmp = dest; - - if (count) { - while (*dest) - dest++; - while ((*dest++ = *src++) != 0) { - if (--count == 0) { - *dest = '\0'; - break; - } - } - } - return tmp; -} - -/** - * strlen - Find the length of a string - * @s: The string to be sized - */ -size_t strlen(const char *s) -{ - const char *sc; - - for (sc = s; *sc != '\0'; ++sc) - /* nothing */; - return sc - s; -} - -/** - * strnlen - Find the length of a length-limited string - * @s: The string to be sized - * @count: The maximum number of bytes to search - */ -size_t strnlen(const char *s, size_t count) -{ - const char *sc; - - for (sc = s; count-- && *sc != '\0'; ++sc) - /* nothing */; - return sc - s; -} - -/** - * strspn - Calculate the length of the initial substring of @s which only contain letters in @accept - * @s: The string to be searched - * @accept: The string to search for - */ -size_t strspn(const char *s, const char *accept) -{ - const char *p; - const char *a; - size_t count = 0; - - for (p = s; *p != '\0'; ++p) { - for (a = accept; *a != '\0'; ++a) { - if (*p == *a) - break; - } - if (*a == '\0') - return count; - ++count; - } - return count; -} - -/** - * memcmp - Compare two areas of memory - * @cs: One area of memory - * @ct: Another area of memory - * @count: The size of the area. - */ -int memcmp(const void *cs, const void *ct, size_t count) -{ - const unsigned char *su1, *su2; - int res = 0; - - for (su1 = cs, su2 = ct; 0 < count; ++su1, ++su2, count--) - if ((res = *su1 - *su2) != 0) - break; - return res; -} - -/** - * memset - Fill a region of memory with the given value - * @s: Pointer to the start of the area. - * @c: The byte to fill the area with - * @count: The size of the area. - */ -void *memset(void *s, int c, size_t count) -{ - char *xs = s; - - while (count--) - *xs++ = c; - return s; -} - -/** - * memcpy - Copies one area of memory to another - * @dest: Destination - * @src: Source - * @n: The size to copy. - */ -void *memcpy(void *to, const void *from, size_t n) -{ - char *tmp = to; - const char *s = from; - - while (n--) - *tmp++ = *s++; - return to; -} - -/** - * memmove - Copies one area of memory to another, overlap possible - * @dest: Destination - * @src: Source - * @n: The size to copy. - */ -void *memmove(void *dest, const void *src, size_t count) -{ - char *tmp, *s; - - if(dest <= src) { - tmp = (char *) dest; - s = (char *) src; - while(count--) - *tmp++ = *s++; - } else { - tmp = (char *)dest + count; - s = (char *)src + count; - while(count--) - *--tmp = *--s; - } - - return dest; -} - -/** - * strstr - Find the first substring in a %NUL terminated string - * @s1: The string to be searched - * @s2: The string to search for - */ -char *strstr(const char *s1, const char *s2) -{ - size_t l1, l2; - - l2 = strlen(s2); - if (!l2) - return (char *)s1; - l1 = strlen(s1); - while (l1 >= l2) { - l1--; - if (!memcmp(s1, s2, l2)) - return (char *)s1; - s1++; - } - return NULL; -} - -/** - * memchr - Find a character in an area of memory. - * @s: The memory area - * @c: The byte to search for - * @n: The size of the area. - * - * returns the address of the first occurrence of @c, or %NULL - * if @c is not found - */ -void *memchr(const void *s, int c, size_t n) -{ - const unsigned char *p = s; - while (n-- != 0) { - if ((unsigned char)c == *p++) { - return (void *)(p - 1); - } - } - return NULL; -} - -/** - * strtoul - convert a string to an unsigned long - * @nptr: The start of the string - * @endptr: A pointer to the end of the parsed string will be placed here - * @base: The number base to use - */ -unsigned long strtoul(const char *nptr, char **endptr, unsigned int base) -{ - unsigned long result = 0,value; - - if (!base) { - base = 10; - if (*nptr == '0') { - base = 8; - nptr++; - if ((toupper(*nptr) == 'X') && isxdigit(nptr[1])) { - nptr++; - base = 16; - } - } - } else if (base == 16) { - if (nptr[0] == '0' && toupper(nptr[1]) == 'X') - nptr += 2; - } - while (isxdigit(*nptr) && - (value = isdigit(*nptr) ? *nptr-'0' : toupper(*nptr)-'A'+10) < base) { - result = result*base + value; - nptr++; - } - if (endptr) - *endptr = (char *)nptr; - return result; -} - -/** - * strtol - convert a string to a signed long - * @nptr: The start of the string - * @endptr: A pointer to the end of the parsed string will be placed here - * @base: The number base to use - */ -long strtol(const char *nptr, char **endptr, int base) -{ - if(*nptr=='-') - return -strtoul(nptr+1,endptr,base); - return strtoul(nptr,endptr,base); -} - -int skip_atoi(const char **s) -{ - int i=0; - - while (isdigit(**s)) - i = i*10 + *((*s)++) - '0'; - return i; -} - -char *number(char *buf, char *end, unsigned long num, int base, int size, int precision, int type) -{ - char c,sign,tmp[66]; - const char *digits; - static const char small_digits[] = "0123456789abcdefghijklmnopqrstuvwxyz"; - static const char large_digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; - int i; - - digits = (type & PRINTF_LARGE) ? large_digits : small_digits; - if (type & PRINTF_LEFT) - type &= ~PRINTF_ZEROPAD; - if (base < 2 || base > 36) - return NULL; - c = (type & PRINTF_ZEROPAD) ? '0' : ' '; - sign = 0; - if (type & PRINTF_SIGN) { - if ((signed long) num < 0) { - sign = '-'; - num = - (signed long) num; - size--; - } else if (type & PRINTF_PLUS) { - sign = '+'; - size--; - } else if (type & PRINTF_SPACE) { - sign = ' '; - size--; - } - } - if (type & PRINTF_SPECIAL) { - if (base == 16) - size -= 2; - else if (base == 8) - size--; - } - i = 0; - if (num == 0) - tmp[i++]='0'; - else while (num != 0) { - tmp[i++] = digits[num % base]; - num = num / base; - } - if (i > precision) - precision = i; - size -= precision; - if (!(type&(PRINTF_ZEROPAD+PRINTF_LEFT))) { - while(size-->0) { - if (buf < end) - *buf = ' '; - ++buf; - } - } - if (sign) { - if (buf < end) - *buf = sign; - ++buf; - } - if (type & PRINTF_SPECIAL) { - if (base==8) { - if (buf < end) - *buf = '0'; - ++buf; - } else if (base==16) { - if (buf < end) - *buf = '0'; - ++buf; - if (buf < end) - *buf = digits[33]; - ++buf; - } - } - if (!(type & PRINTF_LEFT)) { - while (size-- > 0) { - if (buf < end) - *buf = c; - ++buf; - } - } - while (i < precision--) { - if (buf < end) - *buf = '0'; - ++buf; - } - while (i-- > 0) { - if (buf < end) - *buf = tmp[i]; - ++buf; - } - while (size-- > 0) { - if (buf < end) - *buf = ' '; - ++buf; - } - return buf; -} - -/** - * vscnprintf - Format a string and place it in a buffer - * @buf: The buffer to place the result into - * @size: The size of the buffer, including the trailing null space - * @fmt: The format string to use - * @args: Arguments for the format string - * - * The return value is the number of characters which have been written into - * the @buf not including the trailing '\0'. If @size is <= 0 the function - * returns 0. - * - * Call this function if you are already dealing with a va_list. - * You probably want scnprintf() instead. - */ -int vscnprintf(char *buf, size_t size, const char *fmt, va_list args) -{ - size_t i; - - i=vsnprintf(buf,size,fmt,args); - return (i >= size) ? (size - 1) : i; -} - - -/** - * snprintf - Format a string and place it in a buffer - * @buf: The buffer to place the result into - * @size: The size of the buffer, including the trailing null space - * @fmt: The format string to use - * @...: Arguments for the format string - * - * The return value is the number of characters which would be - * generated for the given input, excluding the trailing null, - * as per ISO C99. If the return is greater than or equal to - * @size, the resulting string is truncated. - */ -int snprintf(char * buf, size_t size, const char *fmt, ...) -{ - va_list args; - int i; - - va_start(args, fmt); - i=vsnprintf(buf,size,fmt,args); - va_end(args); - return i; -} - -/** - * scnprintf - Format a string and place it in a buffer - * @buf: The buffer to place the result into - * @size: The size of the buffer, including the trailing null space - * @fmt: The format string to use - * @...: Arguments for the format string - * - * The return value is the number of characters written into @buf not including - * the trailing '\0'. If @size is <= 0 the function returns 0. - */ - -int scnprintf(char * buf, size_t size, const char *fmt, ...) -{ - va_list args; - size_t i; - - va_start(args, fmt); - i = vsnprintf(buf, size, fmt, args); - va_end(args); - return (i >= size) ? (size - 1) : i; -} - -/** - * vsprintf - Format a string and place it in a buffer - * @buf: The buffer to place the result into - * @fmt: The format string to use - * @args: Arguments for the format string - * - * The function returns the number of characters written - * into @buf. Use vsnprintf() or vscnprintf() in order to avoid - * buffer overflows. - * - * Call this function if you are already dealing with a va_list. - * You probably want sprintf() instead. - */ -int vsprintf(char *buf, const char *fmt, va_list args) -{ - return vsnprintf(buf, INT_MAX, fmt, args); -} - -/** - * sprintf - Format a string and place it in a buffer - * @buf: The buffer to place the result into - * @fmt: The format string to use - * @...: Arguments for the format string - * - * The function returns the number of characters written - * into @buf. Use snprintf() or scnprintf() in order to avoid - * buffer overflows. - */ -int sprintf(char * buf, const char *fmt, ...) -{ - va_list args; - int i; - - va_start(args, fmt); - i=vsnprintf(buf, INT_MAX, fmt, args); - va_end(args); - return i; -} - -/* From linux/lib/ctype.c, Copyright (C) 1991, 1992 Linus Torvalds */ -const unsigned char _ctype[] = { -_C,_C,_C,_C,_C,_C,_C,_C, /* 0-7 */ -_C,_C|_S,_C|_S,_C|_S,_C|_S,_C|_S,_C,_C, /* 8-15 */ -_C,_C,_C,_C,_C,_C,_C,_C, /* 16-23 */ -_C,_C,_C,_C,_C,_C,_C,_C, /* 24-31 */ -_S|_SP,_P,_P,_P,_P,_P,_P,_P, /* 32-39 */ -_P,_P,_P,_P,_P,_P,_P,_P, /* 40-47 */ -_D,_D,_D,_D,_D,_D,_D,_D, /* 48-55 */ -_D,_D,_P,_P,_P,_P,_P,_P, /* 56-63 */ -_P,_U|_X,_U|_X,_U|_X,_U|_X,_U|_X,_U|_X,_U, /* 64-71 */ -_U,_U,_U,_U,_U,_U,_U,_U, /* 72-79 */ -_U,_U,_U,_U,_U,_U,_U,_U, /* 80-87 */ -_U,_U,_U,_P,_P,_P,_P,_P, /* 88-95 */ -_P,_L|_X,_L|_X,_L|_X,_L|_X,_L|_X,_L|_X,_L, /* 96-103 */ -_L,_L,_L,_L,_L,_L,_L,_L, /* 104-111 */ -_L,_L,_L,_L,_L,_L,_L,_L, /* 112-119 */ -_L,_L,_L,_P,_P,_P,_P,_C, /* 120-127 */ -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 128-143 */ -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 144-159 */ -_S|_SP,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P, /* 160-175 */ -_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P,_P, /* 176-191 */ -_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U,_U, /* 192-207 */ -_U,_U,_U,_U,_U,_U,_U,_P,_U,_U,_U,_U,_U,_U,_U,_L, /* 208-223 */ -_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L,_L, /* 224-239 */ -_L,_L,_L,_L,_L,_L,_L,_P,_L,_L,_L,_L,_L,_L,_L,_L}; /* 240-255 */ - -/** - * rand - Returns a pseudo random number - */ - -static unsigned int randseed; -unsigned int rand(void) -{ - randseed = 129 * randseed + 907633385; - return randseed; -} - -void srand(unsigned int seed) -{ - randseed = seed; -} - -void abort(void) -{ - printf("Aborted."); - while(1); -} - -uint32_t htonl(uint32_t n) -{ - union { int i; char c; } u = { 1 }; - return u.c ? bswap_32(n) : n; -} - -uint16_t htons(uint16_t n) -{ - union { int i; char c; } u = { 1 }; - return u.c ? bswap_16(n) : n; -} - -uint32_t ntohl(uint32_t n) -{ - union { int i; char c; } u = { 1 }; - return u.c ? bswap_32(n) : n; -} - -uint16_t ntohs(uint16_t n) -{ - union { int i; char c; } u = { 1 }; - return u.c ? bswap_16(n) : n; -} diff --git a/litex/soc/software/libbase/memtest.c b/litex/soc/software/libbase/memtest.c index 7d4d3e2b5..52de87520 100644 --- a/litex/soc/software/libbase/memtest.c +++ b/litex/soc/software/libbase/memtest.c @@ -1,7 +1,7 @@ #include "memtest.h" +#include "lfsr.h" #include -#include #include #include @@ -252,10 +252,11 @@ int memtest_data(unsigned int *addr, unsigned long size, int random, struct memt return errors; } -void memspeed(unsigned int *addr, unsigned long size, bool read_only) +void memspeed(unsigned int *addr, unsigned long size, bool read_only, bool random) { volatile unsigned long *array = (unsigned long *)addr; int i; + unsigned int seed_32 = 0; uint32_t start, end; unsigned long write_speed = 0; unsigned long read_speed; @@ -263,6 +264,10 @@ void memspeed(unsigned int *addr, unsigned long size, bool read_only) const unsigned int sz = sizeof(unsigned long); printf("Memspeed at %p (", addr); + if (random) + printf("Random, "); + else + printf("Sequential, "); print_size(size); printf(")...\n"); @@ -297,9 +302,20 @@ void memspeed(unsigned int *addr, unsigned long size, bool read_only) timer0_en_write(1); timer0_update_value_write(1); start = timer0_value_read(); - for(i = 0; i < size/sz; i++) { - data = array[i]; + + int num = size/sz; + + if (random) { + for (i = 0; i < size/sz; i++) { + seed_32 = seed_to_data_32(seed_32, i); + data = array[seed_32 % num]; + } + } else { + for (i = 0; i < size/sz; i++) { + data = array[i]; + } } + timer0_update_value_write(1); end = timer0_value_read(); uint64_t numerator = ((uint64_t)size)*((uint64_t)CONFIG_CLOCK_FREQUENCY); diff --git a/litex/soc/software/include/base/memtest.h b/litex/soc/software/libbase/memtest.h similarity index 97% rename from litex/soc/software/include/base/memtest.h rename to litex/soc/software/libbase/memtest.h index 8ea4c3528..c0541f2f2 100644 --- a/litex/soc/software/include/base/memtest.h +++ b/litex/soc/software/libbase/memtest.h @@ -20,7 +20,7 @@ int memtest_bus(unsigned int *addr, unsigned long size); int memtest_addr(unsigned int *addr, unsigned long size, int random); int memtest_data(unsigned int *addr, unsigned long size, int random, struct memtest_config *config); -void memspeed(unsigned int *addr, unsigned long size, bool read_only); +void memspeed(unsigned int *addr, unsigned long size, bool read_only, bool random); int memtest(unsigned int *addr, unsigned long maxsize); #endif /* __MEMTEST_H */ diff --git a/litex/soc/software/libbase/progress.c b/litex/soc/software/libbase/progress.c index 2c5bac3b4..d4d510c69 100644 --- a/litex/soc/software/libbase/progress.c +++ b/litex/soc/software/libbase/progress.c @@ -17,12 +17,11 @@ * */ -#include #include #include +#include -#include -#include +#include "progress.h" #define FILESIZE_MAX 100000000 #define HASHES_PER_LINE 40 @@ -42,8 +41,7 @@ void show_progress(int now) if (progress_max && progress_max != FILESIZE_MAX) { uint64_t tmp = (int64_t)now * HASHES_PER_LINE; - do_div(tmp, progress_max); - now = tmp; + now = lldiv(tmp, progress_max).quot; } while (printed < now) { diff --git a/litex/soc/software/include/base/progress.h b/litex/soc/software/libbase/progress.h similarity index 100% rename from litex/soc/software/include/base/progress.h rename to litex/soc/software/libbase/progress.h diff --git a/litex/soc/software/libbase/qsort.c b/litex/soc/software/libbase/qsort.c deleted file mode 100644 index 7fab2f4dc..000000000 --- a/litex/soc/software/libbase/qsort.c +++ /dev/null @@ -1,215 +0,0 @@ -/**************************************************************************** - * lib/stdlib/lib_qsort.c - * - * Copyright (C) 2007, 2009, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt - * - * Leveraged from: - * - * Copyright (c) 1992, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - ****************************************************************************/ - -#include - -#define min(a, b) (a) < (b) ? a : b - -#define swapcode(TYPE, parmi, parmj, n) \ - { \ - long i = (n) / sizeof (TYPE); \ - register TYPE *pi = (TYPE *) (parmi); \ - register TYPE *pj = (TYPE *) (parmj); \ - do { \ - register TYPE t = *pi; \ - *pi++ = *pj; \ - *pj++ = t; \ - } while (--i > 0); \ - } - -#define SWAPINIT(a, size) \ - swaptype = ((char *)a - (char *)0) % sizeof(long) || \ - size % sizeof(long) ? 2 : size == sizeof(long)? 0 : 1; - -#define swap(a, b) \ - if (swaptype == 0) \ - { \ - long t = *(long *)(a); \ - *(long *)(a) = *(long *)(b); \ - *(long *)(b) = t; \ - } \ - else \ - { \ - swapfunc(a, b, size, swaptype); \ - } - -#define vecswap(a, b, n) if ((n) > 0) swapfunc(a, b, n, swaptype) - -static inline void swapfunc(char *a, char *b, int n, int swaptype); -static inline char *med3(char *a, char *b, char *c, - int (*compar)(const void *, const void *)); - -static inline void swapfunc(char *a, char *b, int n, int swaptype) -{ - if(swaptype <= 1) - { - swapcode(long, a, b, n) - } - else - { - swapcode(char, a, b, n) - } -} - -static inline char *med3(char *a, char *b, char *c, - int (*compar)(const void *, const void *)) -{ - return compar(a, b) < 0 ? - (compar(b, c) < 0 ? b : (compar(a, c) < 0 ? c : a )) - :(compar(b, c) > 0 ? b : (compar(a, c) < 0 ? a : c )); -} - -/**************************************************************************** - * Name: qsort - * - * Description: - * Qsort routine from Bentley & McIlroy's "Engineering a Sort Function". - * - ****************************************************************************/ - -void qsort(void *base, size_t nmemb, size_t size, - int(*compar)(const void *, const void *)) -{ - char *pa, *pb, *pc, *pd, *pl, *pm, *pn; - int d, r, swaptype, swap_cnt; - -loop: - SWAPINIT(base, size); - swap_cnt = 0; - if (nmemb < 7) - { - for (pm = (char *) base + size; pm < (char *) base + nmemb * size; pm += size) - { - for (pl = pm; pl > (char *) base && compar(pl - size, pl) > 0; pl -= size) - { - swap(pl, pl - size); - } - } - return; - } - - pm = (char *) base + (nmemb / 2) * size; - if (nmemb > 7) - { - pl = base; - pn = (char *) base + (nmemb - 1) * size; - if (nmemb > 40) - { - d = (nmemb / 8) * size; - pl = med3(pl, pl + d, pl + 2 * d, compar); - pm = med3(pm - d, pm, pm + d, compar); - pn = med3(pn - 2 * d, pn - d, pn, compar); - } - pm = med3(pl, pm, pn, compar); - } - swap(base, pm); - pa = pb = (char *) base + size; - - pc = pd = (char *) base + (nmemb - 1) * size; - for (;;) - { - while (pb <= pc && (r = compar(pb, base)) <= 0) - { - if (r == 0) - { - swap_cnt = 1; - swap(pa, pb); - pa += size; - } - pb += size; - } - while (pb <= pc && (r = compar(pc, base)) >= 0) - { - if (r == 0) - { - swap_cnt = 1; - swap(pc, pd); - pd -= size; - } - pc -= size; - } - - if (pb > pc) - { - break; - } - - swap(pb, pc); - swap_cnt = 1; - pb += size; - pc -= size; - } - - if (swap_cnt == 0) - { - /* Switch to insertion sort */ - - for (pm = (char *) base + size; pm < (char *) base + nmemb * size; pm += size) - { - for (pl = pm; pl > (char *) base && compar(pl - size, pl) > 0; pl -= size) - { - swap(pl, pl - size); - } - } - return; - } - - pn = (char *) base + nmemb * size; - r = min(pa - (char *)base, pb - pa); - vecswap(base, pb - r, r); - r = min(pd - pc, pn - pd - (int)size); - vecswap(pb, pn - r, r); - - if ((r = pb - pa) > (int)size) - { - qsort(base, r / size, size, compar); - } - - if ((r = pd - pc) > (int)size) - { - /* Iterate rather than recurse to save stack space */ - base = pn - r; - nmemb = r / size; - goto loop; - } -} - diff --git a/litex/soc/software/libbase/spiflash.c b/litex/soc/software/libbase/spiflash.c index c1681c086..e39c9a8fc 100644 --- a/litex/soc/software/libbase/spiflash.c +++ b/litex/soc/software/libbase/spiflash.c @@ -2,7 +2,7 @@ #if (defined CSR_SPIFLASH_BASE && defined SPIFLASH_PAGE_SIZE) -#include +#include "spiflash.h" #define PAGE_PROGRAM_CMD 0x02 #define WRDI_CMD 0x04 diff --git a/litex/soc/software/include/base/spiflash.h b/litex/soc/software/libbase/spiflash.h similarity index 100% rename from litex/soc/software/include/base/spiflash.h rename to litex/soc/software/libbase/spiflash.h diff --git a/litex/soc/software/libbase/strcasecmp.c b/litex/soc/software/libbase/strcasecmp.c deleted file mode 100644 index c7edcc01f..000000000 --- a/litex/soc/software/libbase/strcasecmp.c +++ /dev/null @@ -1,61 +0,0 @@ -/**************************************************************************** - * libc/string/lib_strcasecmp.c - * - * Copyright (C) 2008-2009, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * 3. Neither the name NuttX nor the names of its contributors may be - * used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - *****************************************************************************/ - -/**************************************************************************** - * Included Files - *****************************************************************************/ - -#include -#include - -/**************************************************************************** - * Public Functions - *****************************************************************************/ - -int strcasecmp(const char *cs, const char *ct) -{ - int result; - for (;;) - { - if ((result = (int)toupper(*cs) - (int)toupper(*ct)) != 0 || !*cs) - { - break; - } - - cs++; - ct++; - } - return result; -} diff --git a/litex/soc/software/libbase/strtod.c b/litex/soc/software/libbase/strtod.c deleted file mode 100644 index 38b4b3913..000000000 --- a/litex/soc/software/libbase/strtod.c +++ /dev/null @@ -1,234 +0,0 @@ -/**************************************************************************** - * lib/string/lib_strtod.c - * Convert string to double - * - * Copyright (C) 2002 Michael Ringgaard. All rights reserved. - * Copyright (C) 2006-2007 H. Peter Anvin. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the project nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************/ - -/**************************************************************************** - * Included Files - ****************************************************************************/ - -#include -#include -#include - -/**************************************************************************** - * Pre-processor definitions - ****************************************************************************/ - -/* These are predefined with GCC, but could be issues for other compilers. If - * not defined, an arbitrary big number is put in for now. These should be - * added to nuttx/compiler for your compiler. - */ - -#if !defined(__DBL_MIN_EXP__) || !defined(__DBL_MAX_EXP__) -# ifdef CONFIG_CPP_HAVE_WARNING -# warning "Size of exponent is unknown" -# endif -# undef __DBL_MIN_EXP__ -# define __DBL_MIN_EXP__ (-1021) -# undef __DBL_MAX_EXP__ -# define __DBL_MAX_EXP__ (1024) -#endif - -/**************************************************************************** - * Private Functions - ****************************************************************************/ - -static inline int is_real(double x) -{ - const double infinite = 1.0/0.0; - return (x < infinite) && (x >= -infinite); -} - -/**************************************************************************** - * Public Functions - ****************************************************************************/ - -/***************************************************(************************ - * Name: strtod - * - * Description: - * Convert a string to a double value - * - ****************************************************************************/ - -double strtod(const char *str, char **endptr) -{ - double number; - int exponent; - int negative; - char *p = (char *) str; - double p10; - int n; - int num_digits; - int num_decimals; - const double infinite = 1.0/0.0; - - /* Skip leading whitespace */ - - while (isspace(*p)) - { - p++; - } - - /* Handle optional sign */ - - negative = 0; - switch (*p) - { - case '-': - negative = 1; /* FALLTHRU */ /* to increment position */ - case '+': - p++; - } - - number = 0.; - exponent = 0; - num_digits = 0; - num_decimals = 0; - - /* Process string of digits */ - - while (isdigit(*p)) - { - number = number * 10. + (*p - '0'); - p++; - num_digits++; - } - - /* Process decimal part */ - - if (*p == '.') - { - p++; - - while (isdigit(*p)) - { - number = number * 10. + (*p - '0'); - p++; - num_digits++; - num_decimals++; - } - - exponent -= num_decimals; - } - - if (num_digits == 0) - { - errno = ERANGE; - return 0.0; - } - - /* Correct for sign */ - - if (negative) - { - number = -number; - } - - /* Process an exponent string */ - - if (*p == 'e' || *p == 'E') - { - /* Handle optional sign */ - - negative = 0; - switch(*++p) - { - case '-': - negative = 1; /* FALLTHRU */ /* to increment pos */ - case '+': - p++; - } - - /* Process string of digits */ - - n = 0; - while (isdigit(*p)) - { - n = n * 10 + (*p - '0'); - p++; - } - - if (negative) - { - exponent -= n; - } - else - { - exponent += n; - } - } - - if (exponent < __DBL_MIN_EXP__ || - exponent > __DBL_MAX_EXP__) - { - errno = ERANGE; - return infinite; - } - - /* Scale the result */ - - p10 = 10.; - n = exponent; - if (n < 0) n = -n; - while (n) - { - if (n & 1) - { - if (exponent < 0) - { - number /= p10; - } - else - { - number *= p10; - } - } - n >>= 1; - p10 *= p10; - } - - if (!is_real(number)) - { - errno = ERANGE; - } - - if (endptr) - { - *endptr = p; - } - - return number; -} - diff --git a/litex/soc/software/libbase/system.c b/litex/soc/software/libbase/system.c index e42589a0a..896e7b4b1 100644 --- a/litex/soc/software/libbase/system.c +++ b/litex/soc/software/libbase/system.c @@ -1,5 +1,4 @@ #include -#include #include #include diff --git a/litex/soc/software/libbase/time.c b/litex/soc/software/libbase/time.c deleted file mode 100644 index 2d04d719f..000000000 --- a/litex/soc/software/libbase/time.c +++ /dev/null @@ -1,33 +0,0 @@ -#include -#include - -void time_init(void) -{ - int t; - - timer0_en_write(0); - t = 2*CONFIG_CLOCK_FREQUENCY; - timer0_reload_write(t); - timer0_load_write(t); - timer0_en_write(1); -} - -int elapsed(int *last_event, int period) -{ - int t, dt; - - timer0_update_value_write(1); - t = timer0_reload_read() - timer0_value_read(); - if(period < 0) { - *last_event = t; - return 1; - } - dt = t - *last_event; - if(dt < 0) - dt += timer0_reload_read(); - if((dt > period) || (dt < 0)) { - *last_event = t; - return 1; - } else - return 0; -} diff --git a/litex/soc/software/libbase/uart.c b/litex/soc/software/libbase/uart.c index 0f4b76c82..c63727476 100644 --- a/litex/soc/software/libbase/uart.c +++ b/litex/soc/software/libbase/uart.c @@ -1,4 +1,5 @@ -#include +#include "uart.h" + #include #include @@ -154,4 +155,4 @@ void uart_sync(void) #endif -#endif \ No newline at end of file +#endif diff --git a/litex/soc/software/include/base/uart.h b/litex/soc/software/libbase/uart.h similarity index 100% rename from litex/soc/software/include/base/uart.h rename to litex/soc/software/libbase/uart.h diff --git a/litex/soc/software/libbase/vsnprintf.c b/litex/soc/software/libbase/vsnprintf.c deleted file mode 100644 index 1ac2e18cd..000000000 --- a/litex/soc/software/libbase/vsnprintf.c +++ /dev/null @@ -1,319 +0,0 @@ -/* - * MiSoC - * Copyright (C) 2007, 2008, 2009 Sebastien Bourdeauducq - * Copyright (C) Linux kernel developers - * - * 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, version 3 of the License. - * - * 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, see . - */ - -#include -#include -#include -#include -#include -#include - -/** - * vsnprintf - Format a string and place it in a buffer - * @buf: The buffer to place the result into - * @size: The size of the buffer, including the trailing null space - * @fmt: The format string to use - * @args: Arguments for the format string - * - * The return value is the number of characters which would - * be generated for the given input, excluding the trailing - * '\0', as per ISO C99. If you want to have the exact - * number of characters written into @buf as return value - * (not including the trailing '\0'), use vscnprintf(). If the - * return is greater than or equal to @size, the resulting - * string is truncated. - * - * Call this function if you are already dealing with a va_list. - * You probably want snprintf() instead. - */ -int vsnprintf(char *buf, size_t size, const char *fmt, va_list args) -{ - int len; - unsigned long long num; - int i, base; - char *str, *end, c; - const char *s; - - int flags; /* flags to number() */ - - int field_width; /* width of output field */ - int precision; /* min. # of digits for integers; max - number of chars for from string */ - int qualifier; /* 'h', 'l', or 'L' for integer fields */ - /* 'z' support added 23/7/1999 S.H. */ - /* 'z' changed to 'Z' --davidm 1/25/99 */ - /* 't' added for ptrdiff_t */ - - /* Reject out-of-range values early. Large positive sizes are - used for unknown buffer sizes. */ - if (unlikely((int) size < 0)) - return 0; - - str = buf; - end = buf + size; - - /* Make sure end is always >= buf */ - if (end < buf) { - end = ((void *)-1); - size = end - buf; - } - - for (; *fmt ; ++fmt) { - if (*fmt != '%') { - if (str < end) - *str = *fmt; - ++str; - continue; - } - - /* process flags */ - flags = 0; - repeat: - ++fmt; /* this also skips first '%' */ - switch (*fmt) { - case '-': flags |= PRINTF_LEFT; goto repeat; - case '+': flags |= PRINTF_PLUS; goto repeat; - case ' ': flags |= PRINTF_SPACE; goto repeat; - case '#': flags |= PRINTF_SPECIAL; goto repeat; - case '0': flags |= PRINTF_ZEROPAD; goto repeat; - } - - /* get field width */ - field_width = -1; - if (isdigit(*fmt)) - field_width = skip_atoi(&fmt); - else if (*fmt == '*') { - ++fmt; - /* it's the next argument */ - field_width = va_arg(args, int); - if (field_width < 0) { - field_width = -field_width; - flags |= PRINTF_LEFT; - } - } - - /* get the precision */ - precision = -1; - if (*fmt == '.') { - ++fmt; - if (isdigit(*fmt)) - precision = skip_atoi(&fmt); - else if (*fmt == '*') { - ++fmt; - /* it's the next argument */ - precision = va_arg(args, int); - } - if (precision < 0) - precision = 0; - } - - /* get the conversion qualifier */ - qualifier = -1; - if (*fmt == 'h' || *fmt == 'l' || *fmt == 'L' || - *fmt =='Z' || *fmt == 'z' || *fmt == 't') { - qualifier = *fmt; - ++fmt; - if (qualifier == 'l' && *fmt == 'l') { - qualifier = 'L'; - ++fmt; - } - } - - /* default base */ - base = 10; - - switch (*fmt) { - case 'c': - if (!(flags & PRINTF_LEFT)) { - while (--field_width > 0) { - if (str < end) - *str = ' '; - ++str; - } - } - c = (unsigned char) va_arg(args, int); - if (str < end) - *str = c; - ++str; - while (--field_width > 0) { - if (str < end) - *str = ' '; - ++str; - } - continue; - - case 's': - s = va_arg(args, char *); - if (s == NULL) - s = ""; - - len = strnlen(s, precision); - - if (!(flags & PRINTF_LEFT)) { - while (len < field_width--) { - if (str < end) - *str = ' '; - ++str; - } - } - for (i = 0; i < len; ++i) { - if (str < end) - *str = *s; - ++str; ++s; - } - while (len < field_width--) { - if (str < end) - *str = ' '; - ++str; - } - continue; - - case 'p': - if (field_width == -1) { - field_width = 2*sizeof(void *); - flags |= PRINTF_ZEROPAD | PRINTF_SPECIAL; - } - str = number(str, end, - (unsigned long) va_arg(args, void *), - 16, field_width, precision, flags); - continue; - -#ifndef NO_FLOAT - case 'g': - case 'f': { - double f, g; - - f = va_arg(args, double); - if(f < 0.0) { - if(str < end) - *str = '-'; - str++; - f = -f; - } - - g = pow(10.0, floor(log10(f))); - if(g < 1.0) { - if(str < end) - *str = '0'; - str++; - } - while(g >= 1.0) { - if(str < end) - *str = '0' + fmod(f/g, 10.0); - str++; - g /= 10.0; - } - - if(str < end) - *str = '.'; - str++; - - for(i=0;i<6;i++) { - f = fmod(f*10.0, 10.0); - if(str < end) - *str = '0' + f; - str++; - } - - continue; - } -#endif - - case 'n': - /* FIXME: - * What does C99 say about the overflow case here? */ - if (qualifier == 'l') { - long * ip = va_arg(args, long *); - *ip = (str - buf); - } else if (qualifier == 'Z' || qualifier == 'z') { - size_t * ip = va_arg(args, size_t *); - *ip = (str - buf); - } else { - int * ip = va_arg(args, int *); - *ip = (str - buf); - } - continue; - - case '%': - if (str < end) - *str = '%'; - ++str; - continue; - - /* integer number formats - set up the flags and "break" */ - case 'o': - base = 8; - break; - - case 'X': - flags |= PRINTF_LARGE; - /* FALLTHRU */ - case 'x': - base = 16; - break; - - case 'd': - case 'i': - flags |= PRINTF_SIGN; - case 'u': - break; - - default: - if (str < end) - *str = '%'; - ++str; - if (*fmt) { - if (str < end) - *str = *fmt; - ++str; - } else { - --fmt; - } - continue; - } - if (qualifier == 'L') - num = va_arg(args, long long); - else if (qualifier == 'l') { - num = va_arg(args, unsigned long); - if (flags & PRINTF_SIGN) - num = (signed long) num; - } else if (qualifier == 'Z' || qualifier == 'z') { - num = va_arg(args, size_t); - } else if (qualifier == 't') { - num = va_arg(args, ptrdiff_t); - } else if (qualifier == 'h') { - num = (unsigned short) va_arg(args, int); - if (flags & PRINTF_SIGN) - num = (signed short) num; - } else { - num = va_arg(args, unsigned int); - if (flags & PRINTF_SIGN) - num = (signed int) num; - } - str = number(str, end, num, base, - field_width, precision, flags); - } - if (size > 0) { - if (str < end) - *str = '\0'; - else - end[-1] = '\0'; - } - /* the trailing null byte doesn't count towards the total */ - return str-buf; -} diff --git a/litex/soc/software/libc/Makefile b/litex/soc/software/libc/Makefile new file mode 100644 index 000000000..ba073651d --- /dev/null +++ b/litex/soc/software/libc/Makefile @@ -0,0 +1,74 @@ +include ../include/generated/variables.mak +include $(SOC_DIRECTORY)/software/common.mak + +all: libc.a stdio.c.o missing.c.o + +CPUFAMILY= + +CFLAGS = $(COMMONFLAGS) -fexceptions -Wpragmas + +# FIXME: Generate from Python. +ifneq ($(findstring $(CPU), serv femtorv picorv32 minerva vexriscv vexriscv_smp ibex cv32e40p rocket blackparrot),) + CPUFAMILY = riscv +else ifeq ($(CPU), lm32) + CPUFAMILY = lm32 +else ifeq ($(CPU), mor1kx) + CPUFAMILY = or1k +else ifeq ($(CPU), microwatt) + CPUFAMILY = powerpc + CFLAGS += -DLONG_LONG_MIN=LLONG_MIN -DLONG_LONG_MAX=LLONG_MAX -DLONG_LONG_MIN=LLONG_MIN -DULONG_LONG_MAX=ULLONG_MAX +else ifeq ($(CPU), zynq7000) + CPUFAMILY = arm +else + $(error Unsupported CPU) +endif + +define CROSSFILE +[binaries] +c = '$(TRIPLE)-gcc' +ar = '$(TRIPLE)-gcc-ar' +as = '$(TRIPLE)-as' +nm = '$(TRIPLE)-gcc-nm' +strip = '$(TRIPLE)-strip' + +[host_machine] +system = 'unknown' +cpu_family = '$(CPUFAMILY)' +cpu = '$(CPU)' +endian = '$(CPUENDIANNESS)' + +[built-in options] +c_args = [ $(foreach flag,$(filter-out $(DEPFLAGS) -flto,$(CFLAGS)),'$(flag)',) ] +c_link_args = [ $(foreach flag,$(filter-out -flto,$(LDFLAGS)),'$(flag)',) ] +endef + +export CROSSFILE +cross.txt: + @echo "$$CROSSFILE" > $@ + +libc.a: cross.txt + if [ -d "$(LIBC_DIRECTORY)/$(CPUFAMILY)" ]; then \ + cp $(LIBC_DIRECTORY)/$(CPUFAMILY)/* $(PICOLIBC_DIRECTORY)/newlib/libc/machine/$(CPUFAMILY)/ ;\ + fi + + meson $(PICOLIBC_DIRECTORY) \ + -Dmultilib=false \ + -Dpicocrt=false \ + -Dthread-local-storage=false \ + -Dio-long-long=true \ + -Dformat-default=integer \ + -Dincludedir=picolibc/$(TRIPLE)/include \ + -Dlibdir=picolibc/$(TRIPLE)/lib \ + --cross-file cross.txt + + meson compile + cp newlib/libc.a libc.a + +stdio.c.o: $(LIBC_DIRECTORY)/stdio.c + $(compile) + $(AR) csr libc.a $@ + +missing.c.o: $(LIBC_DIRECTORY)/missing.c + $(compile) + $(AR) csr libc.a $@ + diff --git a/litex/soc/software/libc/lm32/meson.build b/litex/soc/software/libc/lm32/meson.build new file mode 100644 index 000000000..09804d424 --- /dev/null +++ b/litex/soc/software/libc/lm32/meson.build @@ -0,0 +1,48 @@ +# +# SPDX-License-Identifier: BSD-3-Clause +# +# Copyright © 2019 Keith Packard +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided +# with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +# OF THE POSSIBILITY OF SUCH DAMAGE. +# +srcs_machine = [ + 'setjmp.S', +] + +foreach target : targets + value = get_variable('target_' + target) + set_variable('lib_machine' + target, + static_library('machine' + target, + srcs_machine, + pic: false, + include_directories: inc, + c_args: value[1] + arg_fnobuiltin)) +endforeach + diff --git a/litex/soc/software/libc/missing.c b/litex/soc/software/libc/missing.c new file mode 100644 index 000000000..c70d8f368 --- /dev/null +++ b/litex/soc/software/libc/missing.c @@ -0,0 +1,25 @@ +/* This file contains functions that were missing + * during picolibc compilation. They are only stubs + * and should be probably replaced with more + * meaningful versions. + */ + +#include + +int getentropy(void *v, size_t s) { + return -1; +} + +int getpid(void) { + return 1; +} + +void _exit(int code) { + while (1); +} + +int kill(int pid, int name) { + _exit(0); + return 0; +} + diff --git a/litex/soc/software/libbase/exception.c b/litex/soc/software/libc/or1k/exception.c similarity index 99% rename from litex/soc/software/libbase/exception.c rename to litex/soc/software/libc/or1k/exception.c index a0c775682..c4b893767 100644 --- a/litex/soc/software/libbase/exception.c +++ b/litex/soc/software/libc/or1k/exception.c @@ -1,12 +1,13 @@ #include #include +#include #include void isr(void); #ifdef __or1k__ -#include +#include #define EXTERNAL_IRQ 0x8 diff --git a/litex/soc/software/libc/or1k/meson.build b/litex/soc/software/libc/or1k/meson.build new file mode 100644 index 000000000..9cd7e39ff --- /dev/null +++ b/litex/soc/software/libc/or1k/meson.build @@ -0,0 +1,49 @@ +# +# SPDX-License-Identifier: BSD-3-Clause +# +# Copyright © 2019 Keith Packard +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# 2. Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided +# with the distribution. +# +# 3. Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +# OF THE POSSIBILITY OF SUCH DAMAGE. +# +srcs_machine = [ + 'setjmp.S', + 'exception.c', +] + +foreach target : targets + value = get_variable('target_' + target) + set_variable('lib_machine' + target, + static_library('machine' + target, + srcs_machine, + pic: false, + include_directories: inc, + c_args: value[1] + arg_fnobuiltin)) +endforeach + diff --git a/litex/soc/software/libbase/console.c b/litex/soc/software/libc/stdio.c similarity index 51% rename from litex/soc/software/libbase/console.c rename to litex/soc/software/libc/stdio.c index cd62b5c68..67ab0a990 100644 --- a/litex/soc/software/libbase/console.c +++ b/litex/soc/software/libc/stdio.c @@ -1,12 +1,26 @@ -#include -#include +/* Most of the code here is ported from console.c + * with slightly changed function signatures and + * names. It sets up for stdin, stdout and + * stderr files. + * To simpify things, we can create one file + * which can be both read from and written to, + * and assign it to all three of them. + * + * It does mean, that in future it is possible to + * provide stderr for example which could be non- + * blocking for example. + * + * For more information on usage and how to create + * those files look into picolibc/doc/os.md. + */ + #include -#include + +#include +#include #include -FILE *stdin, *stdout, *stderr; - static console_write_hook write_hook; static console_read_hook read_hook; static console_read_nonblock_hook read_nonblock_hook; @@ -23,18 +37,22 @@ void console_set_read_hook(console_read_hook r, console_read_nonblock_hook rn) } #ifdef CSR_UART_BASE -int putchar(int c) +static int +dummy_putc(char c, FILE *file) { + (void) file; uart_write(c); if(write_hook != NULL) write_hook(c); if (c == '\n') - putchar('\r'); + dummy_putc('\r', NULL); return c; } -char readchar(void) +static int +dummy_getc(FILE *file) { + (void) file; while(1) { if(uart_read_nonblock()) return uart_read(); @@ -51,15 +69,19 @@ int readchar_nonblock(void) #else -int putchar(int c) +static int +dummy_putc(char c, FILE *file) { + (void) file; if(write_hook != NULL) write_hook(c); return c; } -char readchar(void) +static int +dummy_getc(FILE *file) { + (void) file; while(1) { if((read_nonblock_hook != NULL) && read_nonblock_hook()) return read_hook(); @@ -70,42 +92,11 @@ int readchar_nonblock(void) { return ((read_nonblock_hook != NULL) && read_nonblock_hook()); } - #endif -int puts(const char *s) -{ - putsnonl(s); - putchar('\n'); - return 1; -} +static FILE __stdio = FDEV_SETUP_STREAM(dummy_putc, dummy_getc, NULL, _FDEV_SETUP_RW); -void putsnonl(const char *s) -{ - while(*s) { - putchar(*s); - s++; - } -} +FILE *const stdout = &__stdio; +FILE *const stderr = &__stdio; +FILE *const stdin = &__stdio; -#define PRINTF_BUFFER_SIZE 256 - -int vprintf(const char *fmt, va_list args) -{ - int len; - char outbuf[PRINTF_BUFFER_SIZE]; - len = vscnprintf(outbuf, sizeof(outbuf), fmt, args); - outbuf[len] = 0; - putsnonl(outbuf); - return len; -} - -int printf(const char *fmt, ...) -{ - int len; - va_list args; - va_start(args, fmt); - len = vprintf(fmt, args); - va_end(args); - return len; -} diff --git a/litex/soc/software/libcompiler_rt/Makefile b/litex/soc/software/libcompiler_rt/Makefile index 39a980660..5fb46c0b9 100644 --- a/litex/soc/software/libcompiler_rt/Makefile +++ b/litex/soc/software/libcompiler_rt/Makefile @@ -20,10 +20,10 @@ libcompiler_rt.a: $(OBJECTS) mulsi3.o -include $(OBJECTS:.o=.d) mulsi3.o: $(SOC_DIRECTORY)/software/libcompiler_rt/mulsi3.c - $(compile) + $(call compile,-fno-lto) %.o: $(COMPILER_RT_DIRECTORY)/lib/builtins/%.c - $(compile) + $(call compile,-fno-lto) .PHONY: all clean diff --git a/litex/soc/software/liblitedram/sdram.c b/litex/soc/software/liblitedram/sdram.c index 1e65d9601..de4958532 100644 --- a/litex/soc/software/liblitedram/sdram.c +++ b/litex/soc/software/liblitedram/sdram.c @@ -6,6 +6,7 @@ // This file is Copyright (c) 2018 Jean-François Nguyen // This file is Copyright (c) 2018 Sergiusz Bazanski // This file is Copyright (c) 2018 Tim 'mithro' Ansell +// This file is Copyright (c) 2021 Antmicro // License: BSD #include @@ -13,8 +14,9 @@ #include #include -#include -#include + +#include +#include #ifdef CSR_SDRAM_BASE #include @@ -57,7 +59,7 @@ __attribute__((unused)) void cdelay(int i) #define MEMTEST_DATA_SIZE (2*1024*1024) #endif -#define DFII_PIX_DATA_BYTES SDRAM_PHY_DATABITS*SDRAM_PHY_XDR/8 +#define DFII_PIX_DATA_BYTES SDRAM_PHY_DFI_DATABITS/8 int sdram_get_databits(void) { return SDRAM_PHY_DATABITS; @@ -299,7 +301,7 @@ static void print_scan_errors(unsigned int errors) { #endif } -#define READ_CHECK_TEST_PATTERN_MAX_ERRORS (SDRAM_PHY_PHASES*2*32) +#define READ_CHECK_TEST_PATTERN_MAX_ERRORS (8*SDRAM_PHY_PHASES*DFII_PIX_DATA_BYTES/SDRAM_PHY_MODULES) static unsigned int sdram_write_read_check_test_pattern(int module, unsigned int seed) { int p, i; @@ -346,8 +348,12 @@ static unsigned int sdram_write_read_check_test_pattern(int module, unsigned int /* Read back test pattern */ csr_rd_buf_uint8(sdram_dfii_pix_rddata_addr(p), tst, DFII_PIX_DATA_BYTES); /* Verify bytes matching current 'module' */ - errors += popcount(prs[p][ SDRAM_PHY_MODULES-1-module] ^ tst[ SDRAM_PHY_MODULES-1-module]); - errors += popcount(prs[p][2*SDRAM_PHY_MODULES-1-module] ^ tst[2*SDRAM_PHY_MODULES-1-module]); + for (int i = 0; i < DFII_PIX_DATA_BYTES; ++i) { + int j = p * DFII_PIX_DATA_BYTES + i; + if (j % SDRAM_PHY_MODULES == SDRAM_PHY_MODULES-1-module) { + errors += popcount(prs[p][i] ^ tst[i]); + } + } } #ifdef SDRAM_PHY_ECP5DDRPHY @@ -1254,7 +1260,7 @@ int sdram_init(void) #endif return 0; } - memspeed((unsigned int *) MAIN_RAM_BASE, MEMTEST_DATA_SIZE, false); + memspeed((unsigned int *) MAIN_RAM_BASE, MEMTEST_DATA_SIZE, false, 0); #endif #ifdef CSR_DDRCTRL_BASE ddrctrl_init_done_write(1); diff --git a/litex/soc/software/libliteeth/tftp.c b/litex/soc/software/libliteeth/tftp.c index b976496d8..48fb15419 100644 --- a/litex/soc/software/libliteeth/tftp.c +++ b/litex/soc/software/libliteeth/tftp.c @@ -10,7 +10,7 @@ #include #include -#include +#include #include "udp.h" #include "tftp.h" diff --git a/litex/soc/software/libliteeth/udp.c b/litex/soc/software/libliteeth/udp.c index 985120743..7f201763c 100644 --- a/litex/soc/software/libliteeth/udp.c +++ b/litex/soc/software/libliteeth/udp.c @@ -12,9 +12,9 @@ #ifdef CSR_ETHMAC_BASE #include -#include +#include #include -#include +#include #include "udp.h" diff --git a/litex/soc/software/liblitespi/spiflash.c b/litex/soc/software/liblitespi/spiflash.c index 548dc33d0..cdc4552e1 100644 --- a/litex/soc/software/liblitespi/spiflash.c +++ b/litex/soc/software/liblitespi/spiflash.c @@ -4,7 +4,8 @@ #include #include #include -#include +#include +#include #include #include @@ -12,16 +13,20 @@ #include "spiflash.h" -#if defined(CSR_SPIFLASH_PHY_BASE) && defined(CSR_SPIFLASH_CORE_BASE) - //#define SPIFLASH_DEBUG -//#define SPIFLASH_MODULE_DUMMY_BITS 8 + +#if defined(CSR_SPIFLASH_CORE_BASE) int spiflash_freq_init(void) { - unsigned int lowest_div = spiflash_phy_clk_divisor_read(); - unsigned int crc = crc32((unsigned char *)SPIFLASH_BASE, SPI_FLASH_BLOCK_SIZE); - unsigned int crc_test = crc; + +#ifdef CSR_SPIFLASH_PHY_CLK_DIVISOR_ADDR + + unsigned int lowest_div, crc, crc_test; + + lowest_div = spiflash_phy_clk_divisor_read(); + crc = crc32((unsigned char *)SPIFLASH_BASE, SPI_FLASH_BLOCK_SIZE); + crc_test = crc; #if SPIFLASH_DEBUG printf("Testing against CRC32: %08x\n\r", crc); @@ -29,7 +34,7 @@ int spiflash_freq_init(void) /* Check if block is erased (filled with 0xFF) */ if(crc == CRC32_ERASED_FLASH) { - printf("Block of size %d, started on address 0x%lx is erased. Cannot proceed with SPI Flash frequency test.\n\r", SPI_FLASH_BLOCK_SIZE, SPIFLASH_BASE); + printf("First SPI Flash block erased, unable to perform freq test.\n\r"); return -1; } @@ -41,18 +46,24 @@ int spiflash_freq_init(void) #endif } lowest_div++; - printf("SPI Flash clk configured to %d MHz\n", (spiflash_core_sys_clk_freq_read()/(2*(1 + lowest_div)))/1000000); + printf("SPI Flash clk configured to %d MHz\n", (SPIFLASH_PHY_FREQUENCY/(2*(1 + lowest_div)))/1000000); spiflash_phy_clk_divisor_write(lowest_div); +#else + + printf("SPI Flash clk configured to %ld MHz\n", (unsigned long)(SPIFLASH_PHY_FREQUENCY/1e6)); + +#endif + return 0; } void spiflash_dummy_bits_setup(unsigned int dummy_bits) { - spiflash_phy_dummy_bits_write((uint32_t)dummy_bits); + spiflash_core_mmap_dummy_bits_write((uint32_t)dummy_bits); #if SPIFLASH_DEBUG - printf("Dummy bits set to: %d\n\r", spi_dummy_bits_read()); + printf("Dummy bits set to: %d\n\r", spiflash_core_mmap_dummy_bits_read()); #endif } @@ -82,18 +93,18 @@ static void spiflash_master_write(uint32_t val, size_t len, size_t width, uint32 #endif +void spiflash_memspeed(void) { + /* Test Sequential Read accesses */ + memspeed((unsigned int *) SPIFLASH_BASE, 4096, 1, 0); + + /* Test Random Read accesses */ + memspeed((unsigned int *) SPIFLASH_BASE, 4096, 1, 1); +} + void spiflash_init(void) { - int ret; + printf("\nInitializing %s SPI Flash @0x%08lx...\n", SPIFLASH_MODULE_NAME, SPIFLASH_BASE); - printf("Initializing %s SPI Flash...\n", SPIFLASH_MODULE_NAME); - - /* Clk frequency auto-calibration. */ - ret = spiflash_freq_init(); - if (ret < 0) - return; - - /* Dummy bits setup. */ #ifdef SPIFLASH_MODULE_DUMMY_BITS spiflash_dummy_bits_setup(SPIFLASH_MODULE_DUMMY_BITS); #endif @@ -115,6 +126,13 @@ void spiflash_init(void) #endif +#ifndef SPIFLASH_SKIP_FREQ_INIT + /* Clk frequency auto-calibration. */ + spiflash_freq_init(); +#endif + + /* Test SPI Flash speed */ + spiflash_memspeed(); } #endif diff --git a/litex/soc/software/liblitespi/spiflash.h b/litex/soc/software/liblitespi/spiflash.h index fd846aced..e76a7d2a2 100644 --- a/litex/soc/software/liblitespi/spiflash.h +++ b/litex/soc/software/liblitespi/spiflash.h @@ -1,13 +1,12 @@ #ifndef __LITESPI_FLASH_H #define __LITESPI_FLASH_H -#include - -#define SPI_FLASH_BLOCK_SIZE 256 -#define CRC32_ERASED_FLASH 0xFEA8A821 +#define SPI_FLASH_BLOCK_SIZE 256 +#define CRC32_ERASED_FLASH 0xFEA8A821 int spiflash_freq_init(void); void spiflash_dummy_bits_setup(unsigned int dummy_bits); +void spiflash_memspeed(void); void spiflash_init(void); #endif /* __LITESPI_FLASH_H */ diff --git a/litex/tools/litex_client.py b/litex/tools/litex_client.py index ee6ab39e4..de9e54896 100644 --- a/litex/tools/litex_client.py +++ b/litex/tools/litex_client.py @@ -31,8 +31,8 @@ class RemoteClient(EtherboneIPC, CSRBuilder): csr_data_width = 32 self.host = host self.port = port - self.base_address = base_address self.debug = debug + self.base_address = base_address if base_address is not None else 0 def open(self): if hasattr(self, "socket"): diff --git a/litex/tools/litex_contributors.py b/litex/tools/litex_contributors.py index 2c2f51cf7..fc6afb4af 100755 --- a/litex/tools/litex_contributors.py +++ b/litex/tools/litex_contributors.py @@ -30,6 +30,11 @@ class Author: # Use Git Log + Processing to create the list of Contibutors --------------------------------------- +companies = { + "Antmicro" : "Antmicro.com", + "Google" : "Google.com", +} + def list_contributors(path): # Create .csv with git log. @@ -43,6 +48,11 @@ def list_contributors(path): name = line[0] email = line[1] year = line[2][:4] + # For companies, replace individuals with company name/email. + for companies_name, companies_email in companies.items(): + if companies_email.lower() in email: + name = companies_name + email = companies_email if name in authors.keys(): authors[name].add_year(int(year)) else: diff --git a/litex/tools/litex_json2dts.py b/litex/tools/litex_json2dts_linux.py similarity index 92% rename from litex/tools/litex_json2dts.py rename to litex/tools/litex_json2dts_linux.py index 304acc2be..85e6430d2 100755 --- a/litex/tools/litex_json2dts.py +++ b/litex/tools/litex_json2dts_linux.py @@ -10,9 +10,9 @@ import sys import json import argparse +import os - -def generate_dts(d, initrd_start=None, initrd_size=None, polling=False): +def generate_dts(d, initrd_start=None, initrd_size=None, initrd=None, root_device=None, polling=False): kB = 1024 mB = kB*1024 @@ -44,18 +44,33 @@ def generate_dts(d, initrd_start=None, initrd_size=None, polling=False): if initrd_size is None: initrd_size = default_initrd_size + if initrd == "enabled" or initrd is None: + initrd_enabled = True + elif initrd == "disabled": + initrd_enabled = False + else: + initrd_enabled = True + initrd_size = os.path.getsize(initrd) + + if root_device is None: + root_device = "ram0" + dts += """ chosen {{ - bootargs = "mem={main_ram_size_mb}M@0x{main_ram_base:x} rootwait console=liteuart earlycon=sbi root=/dev/ram0 init=/sbin/init swiotlb=32"; + bootargs = "{console} {rootfs}";""".format( + console = "console=liteuart earlycon=liteuart,0x{:x}".format(d["csr_bases"]["uart"]), + rootfs = "rootwait root=/dev/{}".format(root_device)) + + if initrd_enabled is True: + dts += """ linux,initrd-start = <0x{linux_initrd_start:x}>; - linux,initrd-end = <0x{linux_initrd_end:x}>; - }}; -""".format( - main_ram_base = d["memories"]["main_ram"]["base"], - main_ram_size = d["memories"]["main_ram"]["size"], - main_ram_size_mb = d["memories"]["main_ram"]["size"] // mB, - linux_initrd_start = d["memories"]["main_ram"]["base"] + initrd_start, - linux_initrd_end = d["memories"]["main_ram"]["base"] + initrd_start + initrd_size) + linux,initrd-end = <0x{linux_initrd_end:x}>;""".format( + linux_initrd_start = d["memories"]["main_ram"]["base"] + initrd_start, + linux_initrd_end = d["memories"]["main_ram"]["base"] + initrd_start + initrd_size) + + dts += """ + }; +""" # CPU ------------------------------------------------------------------------------------------ @@ -275,8 +290,10 @@ def generate_dts(d, initrd_start=None, initrd_size=None, polling=False): reg = <0x{ethmac_csr_base:x} 0x7c>, <0x{ethphy_csr_base:x} 0x0a>, <0x{ethmac_mem_base:x} 0x{ethmac_mem_size:x}>; - tx-fifo-depth = <{ethmac_tx_slots}>; - rx-fifo-depth = <{ethmac_rx_slots}>; + reg-names = "mac", "mdio", "buffer"; + litex,rx-slots = <{ethmac_rx_slots}>; + litex,tx-slots = <{ethmac_tx_slots}>; + litex,slot-size = <{ethmac_slot_size}>; {ethmac_interrupt} status = "okay"; }}; @@ -285,8 +302,9 @@ def generate_dts(d, initrd_start=None, initrd_size=None, polling=False): ethmac_csr_base = d["csr_bases"]["ethmac"], ethmac_mem_base = d["memories"]["ethmac"]["base"], ethmac_mem_size = d["memories"]["ethmac"]["size"], - ethmac_tx_slots = d["constants"]["ethmac_tx_slots"], ethmac_rx_slots = d["constants"]["ethmac_rx_slots"], + ethmac_tx_slots = d["constants"]["ethmac_tx_slots"], + ethmac_slot_size = d["constants"]["ethmac_slot_size"], ethmac_interrupt = "" if polling else "interrupts = <{}>;".format(d["constants"]["ethmac_interrupt"])) # USB OHCI ------------------------------------------------------------------------------------- @@ -621,10 +639,13 @@ def generate_dts(d, initrd_start=None, initrd_size=None, polling=False): return dts def main(): + parser = argparse.ArgumentParser(description="LiteX's CSR JSON to Linux DTS generator") parser.add_argument("csr_json", help="CSR JSON file") parser.add_argument("--initrd-start", type=int, help="Location of initrd in RAM (relative, default depends on CPU)") parser.add_argument("--initrd-size", type=int, help="Size of initrd (default=8MB)") + parser.add_argument("--initrd", type=str, help="Supports arguments 'enabled', 'disabled' or a file name. Set to 'disabled' if you use a kernel built in rootfs or have your rootfs on an SD card partition. If a file name is provied the size of the file will be used instead of --initrd-size. (default=enabled)") + parser.add_argument("--root-device", type=str, help="Device that has our rootfs, if using initrd use the default. For SD card's use something like mmcblk0p3. (default=ram0)") parser.add_argument("--polling", action="store_true", help="Force polling mode on peripherals") args = parser.parse_args() @@ -632,6 +653,8 @@ def main(): r = generate_dts(d, initrd_start = args.initrd_start, initrd_size = args.initrd_size, + initrd = args.initrd, + root_device = args.root_device, polling = args.polling, ) print(r) diff --git a/litex/tools/litex_json2dts_zephyr.py b/litex/tools/litex_json2dts_zephyr.py new file mode 100755 index 000000000..3fcb40639 --- /dev/null +++ b/litex/tools/litex_json2dts_zephyr.py @@ -0,0 +1,182 @@ +#!/usr/bin/env python3 + +# Copyright (c) 2019-2021 Antmicro +# Copyright (c) 2021 Henk Vergonet +# +# Zephyr DTS & config overlay generator for LiteX SoC. +# +# This script parses LiteX 'csr.json' file and generates DTS and config +# files overlay for Zephyr. + +# Changelog: +# - 2021-07-05 Henk Vergonet +# removed dependency on intermediate interpretation layers +# switch to JSON csr +# fix uart size parameter +# - 2021-07-15 Henk Vergonet +# added identifier_mem handler as dna0 +# added spiflash as spi0 +# + +import argparse +import json + + +# DTS formatting +def dts_open(name, parm): return "&{} {{\n".format(parm.get('alias', name)) +def dts_close(): return "};\n" +def dts_intr(name, csr): return " interrupts = <{} 0>;\n".format( + hex(csr['constants'][name + '_interrupt'])) +def dts_reg(regs): return " reg = <{}>;\n".format(regs) + + +# DTS handlers +def disabled_handler(name, parm, csr): + return " status = \"disabled\";\n" + + +def ram_handler(name, parm, csr): + return dts_reg(" ".join([ + hex(csr['memories'][name]['base']), + hex(csr['memories'][name]['size'])])) + + +def ethmac_handler(name, parm, csr): + dtsi = dts_reg(" ".join([ + hex(csr['csr_bases'][name]), + hex(parm['size']), + hex(csr['memories'][name]['base']), + hex(csr['memories'][name]['size'])])) + dtsi += dts_intr(name, csr) + return dtsi + + +def i2c_handler(name, parm, csr): + dtsi = dts_reg(" ".join([ + hex(csr['csr_bases'][name]), + hex(parm['size']), + hex(csr['csr_bases'][name] + parm['size']), + hex(parm['size'])])) + dtsi += dts_intr(name, csr) + return dtsi + + +def peripheral_handler(name, parm, csr): + dtsi = dts_reg(" ".join([ + hex(csr['csr_bases'][name]), + hex(parm['size'])])) + try: + dtsi += dts_intr(name, csr) + except KeyError as e: + print(' dtsi key', e, 'not found, no interrupt override') + return dtsi + + +overlay_handlers = { + 'uart': { + 'handler': peripheral_handler, + 'alias': 'uart0', + 'size': 0x20, + 'config_entry': 'UART_LITEUART' + }, + 'timer0': { + 'handler': peripheral_handler, + 'size': 0x40, + 'config_entry': 'LITEX_TIMER' + }, + 'ethmac': { + 'handler': ethmac_handler, + 'alias': 'eth0', + 'size': 0x80, + 'config_entry': 'ETH_LITEETH' + }, + 'spiflash': { + 'handler': peripheral_handler, + 'alias': 'spi0', + 'size': 12, + 'config_entry': 'SPI_LITESPI' + }, + 'i2c0' : { + 'handler': i2c_handler, + 'size': 0x4, + 'config_entry': 'I2C_LITEX' + }, + 'main_ram': { + 'handler': ram_handler, + 'alias': 'ram0', + }, + 'identifier_mem': { + 'handler': peripheral_handler, + 'alias': 'dna0', + 'size': 0x100, + } +} + + +def generate_dts_config(csr): + dts = cnf = '' + + for name, parm in overlay_handlers.items(): + print('Generating overlay for:',name) + enable = 'y' + dtsi = dts_open(name, parm) + + try: + dtsi += parm['handler'](name, parm, csr) + except KeyError as e: + print(' dtsi key', e, 'not found, disable', name) + enable = 'n' + dtsi += disabled_handler(name, parm, csr) + + dtsi += dts_close() + dts += dtsi + if 'config_entry' in parm: + cnf += ' -DCONFIG_' + parm['config_entry'] + '=' + enable + + for name, value in csr['csr_bases'].items(): + if name not in overlay_handlers.keys(): + print('No overlay handler for:', name, 'at', hex(value)) + + return dts, cnf + + +# helpers +def print_or_save(filepath, lines): + """ Prints given string on standard output or to the file. + + Args: + filepath (string): path to the file lines should be written to + or '-' to write to a standard output + lines (string): content to be printed/written + """ + if filepath == '-': + print(lines) + else: + with open(filepath, 'w') as f: + f.write(lines) + + +def parse_args(): + parser = argparse.ArgumentParser() + parser.add_argument('conf_file', + help='JSON configuration generated by LiteX') + parser.add_argument('--dts', action='store', required=True, + help='Output DTS overlay file') + parser.add_argument('--config', action='store', required=True, + help='Output config overlay file') + return parser.parse_args() + + +def main(): + args = parse_args() + + with open(args.conf_file) as f: + csr = json.load(f) + dts, config = generate_dts_config(csr) + + print_or_save(args.dts, dts) + print_or_save(args.config, config) + + +if __name__ == '__main__': + main() diff --git a/litex/tools/litex_json2renode.py b/litex/tools/litex_json2renode.py new file mode 100755 index 000000000..c7f243ad7 --- /dev/null +++ b/litex/tools/litex_json2renode.py @@ -0,0 +1,885 @@ +#!/usr/bin/env python3 +""" +Copyright (c) 2019-2021 Antmicro + +Renode platform definition (repl) and script (resc) generator for LiteX SoC. + +This script parses LiteX 'csr.json' file and generates scripts for Renode +necessary to emulate the given configuration of the LiteX SoC. +""" + +import os +import sys +import json +import pprint +import zlib +import argparse + + +# those memory regions are handled in a special way +# and should not be generated automatically +non_generated_mem_regions = ['ethmac', 'csr'] + + +def get_descriptor(csr, name, size=None): + res = { 'base': csr['csr_bases'][name], 'constants': {} } + + for c in csr['constants']: + if c.startswith('{}_'.format(name)): + res['constants'][c[len(name) + 1:]] = csr['constants'][c] + + if size: + res['size'] = size + + return res + + +def generate_sysbus_registration(descriptor, + skip_braces=False, region=None, skip_size=False): + """ Generates system bus registration information + consisting of a base address and an optional shadow + address. + + Args: + descriptor (dict): dictionary containing 'address', + 'shadowed_address' (might be None) and + optionally 'size' fields + skip_braces (bool): determines if the registration info should + be put in braces + region (str or None): name of the region, if None the default + one is assumed + skip_size (bool): if set to true do not set size + + Returns: + string: registration information + """ + + def generate_registration_entry(address, size=None, name=None): + if name: + if not size: + raise Exception('Size must be provided when registering non-default region') + return 'sysbus new Bus.BusMultiRegistration {{ address: {}; size: {}; region: "{}" }}'.format(hex(address), hex(size), name) + if size: + return "sysbus <{}, +{}>".format(hex(address), hex(size)) + return "sysbus {}".format(hex(address)) + + address = descriptor['base'] + size = descriptor['size'] if 'size' in descriptor and not skip_size else None + + if 'shadowed_address' in descriptor: + result = "{}; {}".format( + generate_registration_entry(address, size, region), + generate_registration_entry(descriptor['shadowed_address'], size, region)) + else: + result = generate_registration_entry(address, size, region) + + if not skip_braces: + result = "{{ {} }}".format(result) + + return result + + +def generate_ethmac(csr, name, **kwargs): + """ Generates definition of 'ethmac' peripheral. + + Args: + csr (dict): LiteX configuration + name (string): name of the peripheral + kwargs (dict): additional parameters, including 'buffer' + + Returns: + string: repl definition of the peripheral + """ + buf = csr['memories']['ethmac'] + phy = get_descriptor(csr, 'ethphy', 0x800) + peripheral = get_descriptor(csr, name) + + result = """ +ethmac: Network.LiteX_Ethernet{} @ {{ + {}; + {}; + {} +}} +""".format('_CSR32' if csr['constants']['config_csr_data_width'] == 32 else '', + generate_sysbus_registration(peripheral, + skip_braces=True), + generate_sysbus_registration(buf, + skip_braces=True, region='buffer'), + generate_sysbus_registration(phy, + skip_braces=True, region='phy')) + + interrupt_name = '{}_interrupt'.format(name) + if interrupt_name in csr['constants']: + result += ' -> cpu@{}\n'.format( + csr['constants'][interrupt_name]) + + result += """ + +ethphy: Network.EthernetPhysicalLayer @ ethmac 0 + VendorSpecific1: 0x4400 // MDIO status: 100Mbps + link up +""" + + return result + + +def generate_memory_region(region_descriptor): + """ Generates definition of memory region. + + Args: + region_descriptor (dict): memory region description + + Returns: + string: repl definition of the memory region + """ + + result = "" + + if 'original_address' in region_descriptor: + result += """ +This memory region's base address has been +realigned to allow to simulate it - +Renode currently supports memory regions +with base address aligned to 0x1000. + +The original base address of this memory region +was {}. +""".format(hex(region_descriptor['original_address'])) + + if 'original_size' in region_descriptor: + result += """ +This memory region's size has been +extended to allow to simulate it - +Renode currently supports memory regions +of size being a multiple of 0x1000. + +The original size of this memory region +was {} bytes. +""".format(hex(region_descriptor['original_size'])) + + if result != "": + result = """ +/* WARNING: +{} +*/""".format(result) + + result += """ +{}: Memory.MappedMemory @ {} + size: {} +""".format(region_descriptor['name'], + generate_sysbus_registration(region_descriptor, skip_size=True), + hex(region_descriptor['size'])) + + return result + + +def generate_silencer(csr, name, **kwargs): + """ Silences access to a memory region. + + Args: + csr (dict): LiteX configuration + name (string): name of the peripheral + kwargs (dict): additional parameters, not used + + Returns: + string: repl definition of the silencer + """ + return """ +sysbus: + init add: + SilenceRange <{} 0x200> # {} +""".format(csr['csr_bases'][name], name) + + +def get_cpu_type(csr): + kind = None + variant = None + + config_cpu_type = next((k for k in csr['constants'].keys() if k.startswith('config_cpu_type_')), None) + if config_cpu_type: + kind = config_cpu_type[len('config_cpu_type_'):] + + config_cpu_variant = next((k for k in csr['constants'].keys() if k.startswith('config_cpu_variant_')), None) + if config_cpu_variant: + variant = config_cpu_variant[len('config_cpu_variant_'):] + + return (kind, variant) + + +def generate_cpu(csr, time_provider): + """ Generates definition of a CPU. + + Returns: + string: repl definition of the CPU + """ + kind, variant = get_cpu_type(csr) + + if kind == 'vexriscv' or kind == 'vexriscv_smp': + result = """ +cpu: CPU.VexRiscv @ sysbus +""" + if variant == 'linux': + result += """ + cpuType: "rv32ima" + privilegeArchitecture: PrivilegeArchitecture.Priv1_10 +""" + elif variant in ["i", "im", "ima", "imac"]: + result += """ + cpuType: "rv32{}" +""".format(variant) + else: + result += """ + cpuType: "rv32im" +""" + if time_provider: + result += """ + timeProvider: {} +""".format(time_provider) + + if kind == 'vexriscv_smp': + result += """ + builtInIrqController: false +""" + + return result + elif kind == 'picorv32': + return """ +cpu: CPU.PicoRV32 @ sysbus + cpuType: "rv32imc" +""" + elif kind == 'ibex': + return """ +cpu: CPU.RiscV32 @ sysbus + cpuType: "rv32imc" + timeProvider: empty + interruptMode: InterruptMode.Vectored +""" + else: + raise Exception('Unsupported cpu type: {}'.format(kind)) + + +def generate_peripheral(csr, name, **kwargs): + """ Generates definition of a peripheral. + + Args: + csr (dict): LiteX configuration + name (string): name of the peripheral + kwargs (dict): additional parameterss, including + 'model' and 'properties' + + Returns: + string: repl definition of the peripheral + """ + + peripheral = get_descriptor(csr, name) + + model = kwargs['model'] + if csr['constants']['config_csr_data_width'] == 32 and 'model_CSR32' in kwargs: + model = kwargs['model_CSR32'] + + result = '\n{}: {} @ {}\n'.format( + kwargs['name'] if 'name' in kwargs else name, + model, + generate_sysbus_registration(peripheral)) + + for constant, val in peripheral['constants'].items(): + if 'ignored_constants' not in kwargs or constant not in kwargs['ignored_constants']: + if constant == 'interrupt': + result += ' -> cpu@{}\n'.format(val) + else: + result += ' {}: {}\n'.format(constant, val) + + if 'properties' in kwargs: + for prop, val in kwargs['properties'].items(): + result += ' {}: {}\n'.format(prop, val(csr)) + + if 'interrupts' in kwargs: + for prop, val in kwargs['interrupts'].items(): + result += ' {} -> {}\n'.format(prop, val()) + + return result + + +def generate_spiflash(csr, name, **kwargs): + """ Generates definition of an SPI controller with attached flash memory. + + Args: + csr (dict): LiteX configuration + name (string): name of the peripheral + kwargs (dict): additional parameterss, including + 'model' and 'properties' + + Returns: + string: repl definition of the peripheral + """ + + peripheral = get_descriptor(csr, name) + + result = """ +spi_flash: SPI.LiteX_SPI_Flash @ {{ + {} +}} + +mt25q: SPI.Micron_MT25Q @ spi_flash + underlyingMemory: spiflash +""".format( + generate_sysbus_registration(peripheral, skip_braces=True)) + return result + + +def generate_cas(csr, name, **kwargs): + result = generate_peripheral(csr, name, model='GPIOPort.LiteX_ControlAndStatus', ignored_constants=['leds_count', 'switches_count', 'buttons_count']) + + peripheral = get_descriptor(csr, name) + + leds_count = int(peripheral['constants']['leds_count']) + switches_count = int(peripheral['constants']['switches_count']) + buttons_count = int(peripheral['constants']['buttons_count']) + + for i in range(leds_count): + result += """ + {} -> led{}@0 +""".format(i, i) + + for i in range(leds_count): + result += """ +led{}: Miscellaneous.LED @ cas {} +""".format(i, i) + + for i in range(switches_count): + result += """ +switch{}: Miscellaneous.Button @ cas {} + -> cas@{} +""".format(i, i + 32, i + 32) + + for i in range(buttons_count): + result += """ +button{}: Miscellaneous.Button @ cas {} + -> cas@{} +""".format(i, i + 64, i + 64) + + return result + + +def generate_mmc(csr, name, **kwargs): + """ Generates definition of 'mmc' peripheral. + + Args: + csr (dict): LiteX configuration + name (string): name of the peripheral + kwargs (dict): additional parameters, including 'core', 'reader' and 'writer' + + Returns: + string: repl definition of the peripheral + """ + + # FIXME: Get litex to generate CSR region size into output information + # currently only a base address is present + peripheral = get_descriptor(csr, name) + core = get_descriptor(csr, 'sdcore', 0x100) + reader = get_descriptor(csr, 'sdblock2mem', 0x100) + writer = get_descriptor(csr, 'sdmem2block', 0x100) + + result = """ +mmc_controller: SD.LiteSDCard{} @ {{ + {}; // phy + {}; + {}; + {} +}} +""".format('_CSR32' if csr['constants']['config_csr_data_width'] == 32 else '', + generate_sysbus_registration(peripheral, + skip_braces=True), + generate_sysbus_registration(core, + skip_braces=True, region='core'), + generate_sysbus_registration(reader, + skip_braces=True, region='reader'), + generate_sysbus_registration(writer, + skip_braces=True, region='writer')) + + return result + + +def generate_clint(clint, frequency): + # TODO: this is configuration for VexRiscv - add support for other CPU types + result = """ +clint: IRQControllers.CoreLevelInterruptor @ {} + frequency: {} + [0, 1] -> cpu@[101, 100] +""".format(generate_sysbus_registration(clint, + skip_braces=True, + skip_size=True), + frequency) + + return result + + +def generate_plic(plic): + # TODO: this is configuration for VexRiscv - add support for other CPU types + result = """ +plic: IRQControllers.PlatformLevelInterruptController @ {} + [0-3] -> cpu@[8-11] + numberOfSources: 31 + numberOfTargets: 2 + prioritiesEnabled: false +""".format(generate_sysbus_registration(plic, + skip_braces=True, + skip_size=True)) + + return result + + +def get_clock_frequency(csr): + """ + Args: + csr (dict): LiteX configuration + + Returns: + int: system clock frequency + """ + # in different LiteX versions this property + # has different names + return csr['constants']['config_clock_frequency' if 'config_clock_frequency' in csr['constants'] else 'system_clock_frequency'] + + +peripherals_handlers = { + 'uart': { + 'handler': generate_peripheral, + 'model': 'UART.LiteX_UART', + 'ignored_constants': ['polling'] + }, + 'timer0': { + 'handler': generate_peripheral, + 'model': 'Timers.LiteX_Timer', + 'model_CSR32': 'Timers.LiteX_Timer_CSR32', + 'properties': { + 'frequency': + lambda c: get_clock_frequency(c) + } + }, + 'ethmac': { + 'handler': generate_ethmac, + }, + 'cas': { + 'handler': generate_cas, + }, + 'cpu': { + 'name': 'cpu_timer', + 'handler': generate_peripheral, + 'model': 'Timers.LiteX_CPUTimer', + 'properties': { + 'frequency': + lambda c: get_clock_frequency(c) + }, + 'interrupts': { + # IRQ #100 in Renode's VexRiscv model is mapped to Machine Timer Interrupt + 'IRQ': lambda: 'cpu@100' + } + }, + 'ddrphy': { + 'handler': generate_silencer + }, + 'sdram': { + 'handler': generate_silencer + }, + 'spiflash': { + 'handler': generate_spiflash + }, + 'spi': { + 'handler': generate_peripheral, + 'model': 'SPI.LiteX_SPI', + 'ignored_constants': ['interrupt'] # model in Renode currently doesn't support interrupts + }, + 'ctrl': { + 'handler': generate_peripheral, + 'model': 'Miscellaneous.LiteX_SoC_Controller', + 'model_CSR32': 'Miscellaneous.LiteX_SoC_Controller_CSR32' + }, + 'i2c0': { + 'handler': generate_peripheral, + 'model': 'I2C.LiteX_I2C' + }, + 'sdphy': { + 'handler': generate_mmc, + }, + 'spisdcard': { + 'handler': generate_peripheral, + 'model': 'SPI.LiteX_SPI', + 'ignored_constants': ['interrupt'] # model in Renode currently doesn't support interrupts + }, +} + + +def genereate_etherbone_bridge(name, address, port): + # FIXME: for now the width is fixed to 0x800 + return """ +{}: EtherboneBridge @ sysbus <{}, +0x800> + port: {} +""".format(name, hex(address), port) + + +def generate_repl(csr, etherbone_peripherals, autoalign): + """ Generates platform definition. + + Args: + csr (dict): LiteX configuration + + etherbone_peripherals (dict): collection of peripherals + that should not be simulated directly in Renode, + but connected to it over an etherbone bridge on + a provided port number + + autoalign (list): list of memory regions names that + should be automatically re-aligned + + Returns: + string: platform defition containing all supported + peripherals and memory regions + """ + result = "" + + + # RISC-V CPU in Renode requires memory region size + # to be a multiple of 4KB - this is a known limitation + # (not a bug) and there are no plans to handle smaller + # memory regions for now + memories = [] + for m in csr['memories']: + x = dict(csr['memories'][m]) + x['name'] = m + memories.append(x) + + for mem_region in filter_memory_regions(memories, alignment=0x1000, autoalign=autoalign): + result += generate_memory_region(mem_region) + + time_provider = None + if 'clint' in csr['memories']: + result += generate_clint(csr['memories']['clint'], csr['constants']['config_clock_frequency']) + time_provider = 'clint' + + if 'plic' in csr['memories']: + result += generate_plic(csr['memories']['plic']) + + if not time_provider and 'cpu' in csr['csr_bases']: + time_provider = 'cpu_timer' + + result += generate_cpu(csr, time_provider) + + for name, address in csr['csr_bases'].items(): + if name not in peripherals_handlers: + print('Skipping unsupported peripheral `{}` at {}' + .format(name, hex(address))) + continue + + if name in etherbone_peripherals: + # generate an etherbone bridge for the peripheral + port = etherbone_peripherals[name] + result += genereate_etherbone_bridge(name, address, port) + pass + else: + # generate an actual model of the peripheral + h = peripherals_handlers[name] + result += h['handler'](csr, name, **h) + + return result + + +def filter_memory_regions(raw_regions, alignment=None, autoalign=[]): + """ Filters memory regions skipping those of linker type + and those from `non_generated_mem_regions` list + and verifying if they have proper size and do not overlap. + + Args: + raw_regions (list): list of memory regions parsed from + the configuration file + alignment (int or None): memory size boundary + + autoalign (list): list of memory regions names that + should be automatically re-aligned + Returns: + list: reduced, sorted list of memory regions to be generated + in a repl file + """ + previous_region = None + + raw_regions.sort(key=lambda x: x['base']) + for r in raw_regions: + if 'linker' in r['type']: + print('Skipping linker region: {}'.format(r['name'])) + continue + + if 'io' in r['type']: + print('Skipping io region: {}'.format(r['name'])) + continue + + if r['name'] in non_generated_mem_regions: + print('Skipping pre-defined memory region: {}'.format(r['name'])) + continue + + if alignment is not None: + size_mismatch = r['size'] % alignment + address_mismatch = r['base'] % alignment + + if address_mismatch != 0: + if r['name'] in autoalign: + r['original_address'] = r['base'] + r['base'] -= address_mismatch + print('Re-aligning `{}` memory region base address from {} to {} due to limitations in Renode'.format(r['name'], hex(r['original_address']), hex(r['base']))) + else: + print('Error: `{}` memory region base address ({}) is not aligned to {}. This configuration cannot be currently simulated in Renode'.format(r['name'], hex(r['size']), hex(alignment))) + sys.exit(1) + + if size_mismatch != 0: + if r['name'] in autoalign: + r['original_size'] = r['size'] + r['size'] += alignment - size_mismatch + print('Extending `{}` memory region size from {} to {} due to limitations in Renode'.format(r['name'], hex(r['original_size']), hex(r['size']))) + else: + print('Error: `{}` memory region size ({}) is not aligned to {}. This configuration cannot be currently simulated in Renode'.format(r['name'], hex(r['size']), hex(alignment))) + sys.exit(1) + + if previous_region is not None and (previous_region['base'] + previous_region['size']) > (r['base'] + r['size']): + print("Error: detected overlaping memory regions: `{}` and `{}`".format(r['name'], previous_region['name'])) + sys.exit(1) + + previous_region = r + yield r + + +def generate_resc(csr, args, flash_binaries={}, tftp_binaries={}): + """ Generates platform definition. + + Args: + csr (dict): LiteX configuration + args (object): configuration + flash_binaries (dict): dictionary with paths and offsets of files + to load into flash + tftp_binaries (dict): dictionary with paths and names of files + to serve with the built-in TFTP server + + Returns: + string: platform defition containing all supported peripherals + and memory regions + """ + cpu_type, _ = get_cpu_type(csr) + + result = """ +using sysbus +mach create "litex-{}" +machine LoadPlatformDescription @{} +machine StartGdbServer 10001 +showAnalyzer sysbus.uart +showAnalyzer sysbus.uart Antmicro.Renode.Analyzers.LoggingUartAnalyzer +""".format(cpu_type, args.repl) + + rom_base = csr['memories']['rom']['base'] if 'rom' in csr['memories'] else None + if rom_base is not None and args.bios_binary: + # load LiteX BIOS to ROM + result += """ +sysbus LoadBinary @{} {} +cpu PC {} +""".format(args.bios_binary, rom_base, rom_base) + + + if args.tftp_ip: + result += """ + +emulation CreateNetworkServer "server" "{}" +server StartTFTP {} +""".format(args.tftp_ip, args.tftp_port) + + for name, path in tftp_binaries.items(): + result += """ +server.tftp ServeFile @{} "{}" """.format(path, name) + + result += """ + +emulation CreateSwitch "switch" +connector Connect ethmac switch +connector Connect server switch +""" + + elif args.configure_network: + # configure network to allow netboot + result += """ +emulation CreateSwitch "switch" +emulation CreateTap "{}" "tap" +connector Connect ethmac switch +connector Connect host.tap switch +""".format(args.configure_network) + elif flash_binaries: + if 'flash_boot_address' not in csr['constants']: + print('Warning! There is no flash memory to load binaries to') + else: + # load binaries to spiflash to boot from there + + for offset in flash_binaries: + path = flash_binaries[offset] + flash_boot_address = int(csr['constants']['flash_boot_address'], 0) + offset + + firmware_data = open(path, 'rb').read() + crc32 = zlib.crc32(firmware_data) + + result += 'sysbus WriteDoubleWord {} {}\n'.format(hex(flash_boot_address), hex(len(firmware_data))) + result += 'sysbus WriteDoubleWord {} {}\n'.format(hex(flash_boot_address + 4), hex(crc32)) + result += 'sysbus LoadBinary @{} {}\n'.format(path, hex(flash_boot_address + 8)) + + return result + + +def print_or_save(filepath, lines): + """ Prints given string on standard output or to the file. + + Args: + filepath (string): path to the file lines should be written to + or '-' to write to a standard output + lines (string): content to be printed/written + """ + if filepath == '-': + print(lines) + else: + with open(filepath, 'w') as f: + f.write(lines) + + +def parse_flash_binaries(csr, args): + flash_binaries = {} + + if args.firmware_binary: + flash_binaries[0] = args.firmware_binary + + if args.flash_binaries_args: + for entry in args.flash_binaries_args: + path, separator, offset_or_label = entry.rpartition(':') + if separator == '': + print("Flash binary '{}' is in a wrong format. It should be 'path:offset'".format(entry)) + sys.exit(1) + + # offset can be either a number or one of the constants from the configuration + try: + # try a number first... + offset = int(offset_or_label, 0) + except ValueError: + # ... if it didn't work, check constants + if offset_or_label in csr['constants']: + offset = int(csr['constants'][offset_or_label], 0) + else: + print("Offset is in a wrong format. It should be either a number or one of the constants from the configuration file:") + print("\n".join("\t{}".format(c) for c in csr['constants'].keys())) + sys.exit(1) + + flash_binaries[offset] = path + + return flash_binaries + + +def check_tftp_binaries(args): + """ + Expected format is: + * path_to_the_binary + * path_to_the_binary:alternative_name + """ + + if args.tftp_ip is None and len(args.tftp_binaries_args) > 0: + print('The TFPT server IP address must be provided') + sys.exit(1) + + tftp_binaries = {} + + for entry in args.tftp_binaries_args: + path, separator, name = entry.rpartition(':') + if separator == '': + # this means that no alternative name is provided, so we use the original one + name = os.path.basename(entry) + path = entry + + if name in tftp_binaries: + print('File with name {} specified more than one - please check your configuration.'.format(name)) + sys.exit(1) + + tftp_binaries[name] = path + + return tftp_binaries + + +def check_etherbone_peripherals(peripherals): + result = {} + for p in peripherals: + + name, separator, port = p.rpartition(':') + if separator == '': + print("Etherbone peripheral `{}` is in a wrong format. It should be in 'name:port'".format(p)) + sys.exit(1) + + if name not in peripherals_handlers: + print("Unsupported peripheral '{}'. Available ones:\n".format(name)) + print("\n".join("\t{}".format(c) for c in peripherals_handlers.keys())) + sys.exit(1) + + if name == 'cpu': + print("CPU must be simulated in Renode") + sys.exit(1) + + result[name] = port + + return result + + +def parse_args(): + parser = argparse.ArgumentParser() + parser.add_argument('conf_file', + help='JSON configuration generated by LiteX') + parser.add_argument('--resc', action='store', + help='Output script file') + parser.add_argument('--repl', action='store', + help='Output platform definition file') + parser.add_argument('--configure-network', action='store', + help='Generate virtual network and connect it to host') + parser.add_argument('--bios-binary', action='store', + help='Path to the BIOS binary') + parser.add_argument('--firmware-binary', action='store', + help='Path to the binary to load into boot flash') + parser.add_argument('--flash-binary', action='append', dest='flash_binaries_args', + help='Path and an address of the binary to load into boot flash') + parser.add_argument('--etherbone', action='append', dest='etherbone_peripherals', + default=[], + help='Peripheral to connect over etherbone bridge') + parser.add_argument('--auto-align', action='append', dest='autoalign_memor_regions', + default=[], + help='List of memory regions to align automatically (necessary due to limitations in Renode)') + parser.add_argument('--tftp-binary', action='append', dest='tftp_binaries_args', default=[], + help='Path and an optional alternative name of the binary to serve by the TFTP server') + parser.add_argument('--tftp-server-ip', action='store', dest='tftp_ip', + help='The IP address of the TFTP server') + parser.add_argument('--tftp-server-port', action='store', default=69, type=int, dest='tftp_port', + help='The port number of the TFTP server') + args = parser.parse_args() + + return args + + +def main(): + args = parse_args() + + with open(args.conf_file) as f: + csr = json.load(f) + + etherbone_peripherals = check_etherbone_peripherals(args.etherbone_peripherals) + + if args.repl: + print_or_save(args.repl, generate_repl(csr, etherbone_peripherals, args.autoalign_memor_regions)) + + if args.resc: + if not args.repl: + print("REPL is needed when generating RESC file") + sys.exit(1) + else: + flash_binaries = parse_flash_binaries(csr, args) + tftp_binaries = check_tftp_binaries(args) + + print_or_save(args.resc, generate_resc(csr, args, + flash_binaries, + tftp_binaries)) + + +if __name__ == '__main__': + main() diff --git a/litex/tools/litex_term.py b/litex/tools/litex_term.py index 606d7d60d..863e78f7c 100755 --- a/litex/tools/litex_term.py +++ b/litex/tools/litex_term.py @@ -87,8 +87,8 @@ else: from litex import RemoteClient class BridgeUART: - def __init__(self, name="uart_xover", host="localhost", base_address=0): # FIXME: add command line arguments - self.bus = RemoteClient(host=host, base_address=base_address) + def __init__(self, name="uart_xover", host="localhost", base_address=None, csr_csv=None): + self.bus = RemoteClient(host=host, base_address=base_address, csr_csv=csr_csv) present = False for k, v in self.bus.regs.d.items(): if f"{name}_" in k: @@ -97,6 +97,10 @@ class BridgeUART: if not present: raise ValueError(f"CrossoverUART {name} not present in design.") + # FIXME: On PCIe designs, CSR is remapped to 0 to limit BAR0 size. + if base_address is None and hasattr(self.bus.bases, "pcie_phy"): + self.bus.base_address = -self.bus.mems.csr.base + def open(self): self.bus.open() self.file, self.name = pty.openpty() @@ -534,17 +538,19 @@ class LiteXTerm: def _get_args(): parser = argparse.ArgumentParser() parser.add_argument("port", help="Serial port (eg /dev/tty*, bridge, jtag)") - parser.add_argument("--speed", default=115200, help="Serial baudrate") - parser.add_argument("--serial-boot", default=False, action='store_true', help="Automatically initiate serial boot") - parser.add_argument("--kernel", default=None, help="Kernel image") - parser.add_argument("--kernel-adr", default="0x40000000", help="Kernel address") - parser.add_argument("--images", default=None, help="JSON description of the images to load to memory") + parser.add_argument("--speed", default=115200, help="Serial baudrate") + parser.add_argument("--serial-boot", default=False, action='store_true', help="Automatically initiate serial boot") + parser.add_argument("--kernel", default=None, help="Kernel image") + parser.add_argument("--kernel-adr", default="0x40000000", help="Kernel address") + parser.add_argument("--images", default=None, help="JSON description of the images to load to memory") - parser.add_argument("--bridge-name", default="uart_xover", help="Bridge UART name to use (present in design/csr.csv)") + parser.add_argument("--csr-csv", default=None, help="SoC CSV file") + parser.add_argument("--base-address", default=None, help="CSR base address") + parser.add_argument("--bridge-name", default="uart_xover", help="Bridge UART name to use (present in design/csr.csv)") - parser.add_argument("--jtag-name", default="jtag_uart", help="JTAG UART type: jtag_uart (default), jtag_atlantic") - parser.add_argument("--jtag-config", default="openocd_xc7_ft2232.cfg", help="OpenOCD JTAG configuration file for jtag_uart") - parser.add_argument("--jtag-chain", default=1, help="JTAG chain.") + parser.add_argument("--jtag-name", default="jtag_uart", help="JTAG UART type: jtag_uart (default), jtag_atlantic") + parser.add_argument("--jtag-config", default="openocd_xc7_ft2232.cfg", help="OpenOCD JTAG configuration file for jtag_uart") + parser.add_argument("--jtag-chain", default=1, help="JTAG chain.") return parser.parse_args() def main(): @@ -555,7 +561,8 @@ def main(): if args.port in ["bridge", "jtag"]: raise NotImplementedError if args.port in ["bridge", "crossover"]: # FIXME: 2021-02-18, crossover for retro-compatibility remove and update targets? - bridge = BridgeUART(name=args.bridge_name) + base_address = None if args.base_address is None else int(args.base_address) + bridge = BridgeUART(base_address=base_address, csr_csv=args.csr_csv, name=args.bridge_name) bridge.open() port = os.ttyname(bridge.name) elif args.port in ["jtag"]: diff --git a/litex/tools/remote/comm_udp.py b/litex/tools/remote/comm_udp.py index 2e30ba1fa..6e1dae0a8 100644 --- a/litex/tools/remote/comm_udp.py +++ b/litex/tools/remote/comm_udp.py @@ -42,6 +42,7 @@ class CommUDP(CSRBuilder): packet = EtherbonePacket() packet.pf = 1 packet.encode() + packet.bytes += bytes([0x00, 0x00, 0x00, 0x00]) # Add Padding as payload. self.socket.sendto(packet.bytes, (ip, port)) # ...and get/check server's response. diff --git a/litex_setup.py b/litex_setup.py index 222073f58..c6fad34fe 100755 --- a/litex_setup.py +++ b/litex_setup.py @@ -23,6 +23,7 @@ repos = [ ("nmigen", ("https://github.com/nmigen/", True, True, None)), # LiteX SoC builder + ("pythondata-software-picolibc", ("https://github.com/antmicro/", True, True, None)), ("pythondata-software-compiler_rt", ("https://github.com/litex-hub/", False, True, None)), ("litex", ("https://github.com/enjoy-digital/", False, True, None)), @@ -44,7 +45,7 @@ repos = [ # Optional LiteX data ("pythondata-misc-tapcfg", ("https://github.com/litex-hub/", False, True, None)), - ("pythondata-misc-opentitan", ("https://github.com/litex-hub/", False, True, None)), + ("pythondata-misc-opentitan", ("https://github.com/litex-hub/", False, True, 0xe43566c)), ("pythondata-misc-usb_ohci", ("https://github.com/litex-hub/", False, True, None)), ("pythondata-cpu-lm32", ("https://github.com/litex-hub/", False, True, None)), ("pythondata-cpu-mor1kx", ("https://github.com/litex-hub/", False, True, None)), @@ -103,7 +104,7 @@ if len(sys.argv) < 2: # Check/Update litex_setup.py -litex_setup_url = "https://raw.githubusercontent.com/enjoy-digital/litex/master/litex_setup.py" +litex_setup_url = "https://raw.githubusercontent.com/antmicro/litex/libbase-replacement/litex_setup.py" current_sha1 = hashlib.sha1(open(os.path.realpath(__file__)).read().encode("utf-8")).hexdigest() print("[checking litex_setup.py]...") try: diff --git a/setup.py b/setup.py index 965288d74..7986eebc4 100755 --- a/setup.py +++ b/setup.py @@ -22,6 +22,9 @@ setup( ], packages=find_packages(exclude=("test*", "sim*", "doc*")), include_package_data=True, + package_data={ + 'litex.soc.doc': ['static/*'] + }, platforms=["Any"], keywords="HDL ASIC FPGA hardware design", classifiers=[ @@ -41,8 +44,11 @@ setup( "litex_cli=litex.tools.litex_client:main", "litex_sim=litex.tools.litex_sim:main", "litex_read_verilog=litex.tools.litex_read_verilog:main", - "litex_json2dts=litex.tools.litex_json2dts:main", + "litex_json2dts_linux=litex.tools.litex_json2dts_linux:main", + "litex_json2dts_zephyr=litex.tools.litex_json2dts_zephyr:main", + "litex_json2renode=litex.tools.litex_json2renode:main", "litex_bare_metal_demo=litex.soc.software.demo.demo:main", + "litex_contributors=litex.tools.litex_contributors:main", # short names "lxterm=litex.tools.litex_term:main", "lxserver=litex.tools.litex_server:main", diff --git a/test/test_axi.py b/test/test_axi.py index 0d406271e..3b4a63c8c 100644 --- a/test/test_axi.py +++ b/test/test_axi.py @@ -23,13 +23,20 @@ class Burst: def to_beats(self): r = [] - for i in range(self.len + 1): + burst_length = self.len + 1 + burst_size = 2**self.size + for i in range(burst_length): if self.type == BURST_INCR: offset = i*2**(self.size) r += [Beat(self.addr + offset)] elif self.type == BURST_WRAP: - offset = (i*2**(self.size))%((2**self.size)*(self.len + 1)) - r += [Beat(self.addr + offset)] + assert burst_length in [2, 4, 8, 16] + assert (self.addr % burst_size) == 0 + burst_base = self.addr - self.addr % (burst_length * burst_size) + burst_offset = self.addr % (burst_length * burst_size) + burst_addr = burst_base + (burst_offset + i*burst_size) % (burst_length * burst_size) + #print("0x{:08x}".format(burst_addr)) + r += [Beat(burst_addr)] else: r += [Beat(self.addr)] return r @@ -86,6 +93,7 @@ class TestAXI(unittest.TestCase): yield ax.ready.eq(0) yield ax_addr = (yield ax.addr) + #print("0x{:08x}".format(ax_addr)) if ax_addr != beat.addr: self.errors += 1 yield @@ -102,6 +110,7 @@ class TestAXI(unittest.TestCase): bursts.append(Burst(prng.randrange(2**32), BURST_FIXED, prng.randrange(255), log2_int(32//8))) bursts.append(Burst(prng.randrange(2**32), BURST_INCR, prng.randrange(255), log2_int(32//8))) bursts.append(Burst(4, BURST_WRAP, 4-1, log2_int(2))) + bursts.append(Burst(0x80000160, BURST_WRAP, 0x3, 0b100)) # generate expected dut output (beats for reference) beats = [] diff --git a/test/test_clock.py b/test/test_clock.py index a1795149c..8d5fce8ac 100644 --- a/test/test_clock.py +++ b/test/test_clock.py @@ -121,6 +121,15 @@ class TestClock(unittest.TestCase): pll.expose_dpa() pll.compute_config() + # Test corner cases that have historically had trouble: + pll = ECP5PLL() + pll.register_clkin(Signal(), 100e6) + pll.create_clkout(ClockDomain("clkout1"), 350e6) + pll.create_clkout(ClockDomain("clkout2"), 350e6) + pll.create_clkout(ClockDomain("clkout3"), 175e6) + pll.create_clkout(ClockDomain("clkout4"), 175e6) + pll.compute_config() + # Lattice / NX def test_nxpll(self): pll = NXPLL()