48 lines
1.8 KiB
Python
Executable File
48 lines
1.8 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
#
|
|
# Copyright (c) 2020 Intel Corporation
|
|
# SPDX-License-Identifier: Apache-2.0
|
|
|
|
# ADSP devices have their RAM regions mapped twice, once in the 512MB
|
|
# region from 0x80000000-0x9fffffff and again from
|
|
# 0xa0000000-0xbfffffff. The first mapping is set in the CPU to
|
|
# bypass the L1 cache, and so access through pointers in that region
|
|
# is coherent between CPUs (but slow). The second region accesses the
|
|
# same memory through the L1 cache and requires careful flushing when
|
|
# used with shared data.
|
|
#
|
|
# This distinction is exposed in the linker script, where some symbols
|
|
# (e.g. stack regions) are linked into cached memory, but others
|
|
# (general kernel memory) are not. But the rimage signing tool
|
|
# doesn't understand that and fails if regions aren't contiguous.
|
|
#
|
|
# Walk the sections in the ELF file, changing the VMA/LMA of each
|
|
# uncached section to the equivalent address in the cached area of
|
|
# memory.
|
|
|
|
import os
|
|
import sys
|
|
from elftools.elf.elffile import ELFFile
|
|
|
|
objcopy_bin = sys.argv[1]
|
|
elffile = sys.argv[2]
|
|
|
|
fixup =[]
|
|
with open(elffile, "rb") as fd:
|
|
elf = ELFFile(fd)
|
|
for s in elf.iter_sections():
|
|
addr = s.header.sh_addr
|
|
if 0x80000000 <= addr < 0xa0000000:
|
|
print(f"fix_elf_addrs.py: Moving section {s.name} to cached SRAM region")
|
|
fixup.append(s.name)
|
|
|
|
for s in fixup:
|
|
# Note redirect: the sof-derived linker scripts currently emit
|
|
# some zero-length sections at address zero. This is benign, and
|
|
# the linker is happy, but objcopy will emit an unsilenceable
|
|
# error (no --quiet option, no -Werror=no-whatever, nothing).
|
|
# Just swallow the error stream for now pending rework to the
|
|
# linker framework.
|
|
cmd = f"{objcopy_bin} --change-section-address {s}+0x20000000 {elffile} 2>/dev/null"
|
|
os.system(cmd)
|