OpenCores
URL https://opencores.org/ocsvn/c0or1k/c0or1k/trunk

Subversion Repositories c0or1k

[/] [c0or1k/] [trunk/] [scripts/] [loader/] [generate_loader_asm.py] - Rev 2

Compare with Previous | Blame | View Log

#! /usr/bin/env python2.6
# -*- mode: python; coding: utf-8; -*-
#
#  Codezero -- a microkernel for embedded systems.
#
#  Copyright © 2009  B Labs Ltd
#
import os, sys, shelve, subprocess
from os.path import join
from configure import *
 
PROJRELROOT = '../../'
 
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), PROJRELROOT)))
 
from config.projpaths import *
from config.configuration import *
from config.lib import *
 
config = configuration_retrieve()
 
# Convert address from python literal to numeric value
def address_remove_literal(address):
    value = hex(int(address, 16) - 0xf0000000)
    if value[-1] in ['l', 'L']:
        value = value[:-1]
    return value
 
ksym_header = \
'''
/*
 * %s autogenerated from %s.
 * by %s
 *
 * This file is included by the loader sources so that any
 * kernel symbol address can be known in advance and stopped
 * at by debuggers before virtual memory is enabled.
 */
'''
 
assembler_symbol_definition = \
'''
.section .text
.align 4
.global %s
.type %s, function
.equ %s, %s
'''
 
def generate_ksym_to_loader(target_path, source_path):
    symbols = ['break_virtual']
    with open(target_path, 'w') as asm_file:
        asm_file.write(ksym_header % (target_path, source_path, sys.argv[0]))
        for symbol in symbols:
            process = \
                subprocess.Popen(config.toolchain_kernel + 'objdump -d ' + \
                                 source_path + ' | grep "<' + \
                                        symbol + '>"', shell=True, \
                                        stdout=subprocess.PIPE)
            assert process.wait() == 0
            address, name = process.stdout.read().split()
            assert '<' + symbol + '>:' == name
            asm_file.write(assembler_symbol_definition % \
                           (symbol, symbol, symbol, \
                            address_remove_literal(address)))
 
decl_sect_asm = \
'''
.align 4
.section %s
.incbin "%s"
'''
 
 
def generate_image_S(target_path, images):
    kern_fname = 'kernel.elf'
    conts_fname = 'containers.elf'
    fbody = ''
    with open(target_path, 'w+') as images_S:
        for img in images:
            if os.path.basename(img.path) == kern_fname:
                fbody += decl_sect_asm % ('.kernel', img)
            if os.path.basename(img.path) == conts_fname:
                fbody += decl_sect_asm % ('.containers', img)
        images_S.write(fbody)
 
if __name__ == "__main__":
    if len(sys.argv) == 1:
        generate_ksym_to_loader(join(PROJROOT, 'loader/ksyms.S'), \
                                join(BUILDDIR, 'kernel.elf'))
    elif len(sys.argv) == 3:
        generate_ksym_to_loader(sys.argv[1], sys.argv[1])
    else:
        print "Usage: %s <asm filename> <kernel image filename>" % sys.argv[0]
 
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.