mirror of
https://github.com/drasko/codezero.git
synced 2026-01-12 02:43:15 +01:00
111 lines
3.1 KiB
Python
111 lines
3.1 KiB
Python
# -*- mode: python; coding: utf-8; -*-
|
|
|
|
# Codezero -- a microkernel for embedded systems.
|
|
#
|
|
# Copyright © 2009 B Labs Ltd
|
|
|
|
import os.path
|
|
import sys, subprocess, shutil
|
|
from os.path import *
|
|
|
|
Import('config', 'environment', 'images')
|
|
|
|
e = environment.Clone()
|
|
e.Replace(PROGSUFFIX = '')
|
|
e.Append(LINKFLAGS = ['-T' + e['bootdesc_dir'] + '/linker.lds'])
|
|
#e.Append(LINKFLAGS = ['-T' + '/linker.lds'])
|
|
|
|
PROJRELROOT = '../../../../'
|
|
|
|
sys.path.append(os.path.abspath(PROJRELROOT))
|
|
|
|
from scripts.config.projpaths import *
|
|
from scripts.config.configuration import *
|
|
from tools.pyelf import elf
|
|
|
|
config = configuration_retrieve()
|
|
|
|
bootdesc_template = \
|
|
'''
|
|
/* This file is autogenerated, do not edit by hand. */
|
|
|
|
/* Supervisor task at load time. */
|
|
struct svc_image {
|
|
char name[16];
|
|
unsigned int phys_start;
|
|
unsigned int phys_end;
|
|
} __attribute__((__packed__));
|
|
|
|
/* Supervisor task descriptor at load time */
|
|
struct bootdesc {
|
|
int desc_size;
|
|
int total_images;
|
|
struct svc_image images[];
|
|
} __attribute__((__packed__));
|
|
|
|
struct bootdesc bootdesc = {
|
|
.desc_size = sizeof(struct bootdesc) + sizeof(struct svc_image) * %s,
|
|
.total_images = %s,
|
|
.images = {
|
|
%s
|
|
},
|
|
};
|
|
'''
|
|
|
|
image_template = \
|
|
''' [%s] = {
|
|
.name = "%s",
|
|
.phys_start = %s,
|
|
.phys_end = %s,
|
|
},
|
|
'''
|
|
|
|
def conv_hex(val):
|
|
hexval = hex(val)
|
|
if hexval[-1:] == 'L':
|
|
hexval = hexval[:-1]
|
|
return hexval
|
|
|
|
def image_lma_start_end(img):
|
|
elffile = elf.ElfFile.from_file(img)
|
|
paddr_first = 0
|
|
paddr_start = 0
|
|
paddr_end = 0
|
|
for pheader in elffile.pheaders:
|
|
x = pheader.ai
|
|
if str(x.p_type) != "LOAD":
|
|
continue
|
|
if paddr_first == 0:
|
|
paddr_first = 1
|
|
paddr_start = x.p_paddr.value
|
|
if paddr_start > x.p_paddr.value:
|
|
paddr_start = x.p_paddr.value
|
|
if paddr_end < x.p_paddr + x.p_memsz:
|
|
paddr_end = x.p_paddr + x.p_memsz
|
|
return paddr_start, paddr_end
|
|
|
|
def generate_bootdesc(target, source, env):
|
|
with open(target[0].path, 'w+' ) as f:
|
|
images_string = ''
|
|
for index in range(len(source)):
|
|
start, end = image_lma_start_end(source[index].path)
|
|
images_string += image_template % (str(index), basename(source[index].path), conv_hex(start), conv_hex(end))
|
|
f.write(bootdesc_template % (len(source), len(source), images_string))
|
|
|
|
def relocate_bootdesc(target, source, env):
|
|
bootdesc_raw = source[0]
|
|
images = source[1:]
|
|
mm0 = images[0]
|
|
start, end = image_lma_start_end(mm0.path)
|
|
print config.toolchain_userspace + "objcopy --adjust-section-vma .data=" \
|
|
+ conv_hex(end) + " " + bootdesc_raw.path
|
|
os.system(config.toolchain_userspace + "objcopy --adjust-section-vma .data=" \
|
|
+ conv_hex(end) + " " + bootdesc_raw.path)
|
|
shutil.copyfile(bootdesc_raw.path, target[0].path)
|
|
|
|
bootdesc_c = e.Command('bootdesc.c', images, generate_bootdesc)
|
|
bootdesc_raw = e.Program('bootdesc_raw', bootdesc_c)
|
|
bootdesc = e.Command('bootdesc.elf', [bootdesc_raw, images], relocate_bootdesc)
|
|
|
|
Return('bootdesc')
|