# HG changeset patch # User Windel Bouwman # Date 1398945792 -7200 # Node ID d056b552d3f4855bb152a004e3455c130c2dfaab # Parent 94f5b719ad0b848b7450dc356cdacd3e13c2ab25 Made better use of layout diff -r 94f5b719ad0b -r d056b552d3f4 examples/c3/build.xml --- a/examples/c3/build.xml Sun Apr 27 17:50:25 2014 +0200 +++ b/examples/c3/build.xml Thu May 01 14:03:12 2014 +0200 @@ -10,7 +10,9 @@ - + diff -r 94f5b719ad0b -r d056b552d3f4 examples/qemu_a9_hello/build.xml --- a/examples/qemu_a9_hello/build.xml Sun Apr 27 17:50:25 2014 +0200 +++ b/examples/qemu_a9_hello/build.xml Thu May 01 14:03:12 2014 +0200 @@ -4,7 +4,13 @@ - + + diff -r 94f5b719ad0b -r d056b552d3f4 kernel/arch/qemu_vexpress/startup_a9.asm --- a/kernel/arch/qemu_vexpress/startup_a9.asm Sun Apr 27 17:50:25 2014 +0200 +++ b/kernel/arch/qemu_vexpress/startup_a9.asm Thu May 01 14:03:12 2014 +0200 @@ -1,5 +1,5 @@ -section code +section reset interrupt_vector_table: ivt_reset: B start ; 0x0 reset diff -r 94f5b719ad0b -r d056b552d3f4 kernel/build.xml --- a/kernel/build.xml Sun Apr 27 17:50:25 2014 +0200 +++ b/kernel/build.xml Thu May 01 14:03:12 2014 +0200 @@ -8,7 +8,14 @@ - + + diff -r 94f5b719ad0b -r d056b552d3f4 python/ppci/buildfunctions.py --- a/python/ppci/buildfunctions.py Sun Apr 27 17:50:25 2014 +0200 +++ b/python/ppci/buildfunctions.py Thu May 01 14:03:12 2014 +0200 @@ -19,6 +19,7 @@ from . import DiagnosticsManager, CompilerError from .tasks import TaskError + def fix_target(tg): """ Try to return an instance of the Target class """ if isinstance(tg, Target): @@ -122,14 +123,12 @@ return output -def link(objects, layout): +def link(objects, layout, target): """ Links the iterable of objects into one using the given layout """ objects = list(map(fix_object, objects)) layout = fix_layout(layout) - linker = Linker() + target = fix_target(target) + linker = Linker(target) output_obj = linker.link(objects, layout) return output_obj - -def objcopy(obj): - return diff -r 94f5b719ad0b -r d056b552d3f4 python/ppci/buildtasks.py --- a/python/ppci/buildtasks.py Sun Apr 27 17:50:25 2014 +0200 +++ b/python/ppci/buildtasks.py Thu May 01 14:03:12 2014 +0200 @@ -7,7 +7,7 @@ import logging from .tasks import Task, TaskError, register_task -from .buildfunctions import c3compile, link, assemble +from .buildfunctions import c3compile, link, assemble, fix_object from pyyacc import ParserException from . import CompilerError @@ -82,20 +82,29 @@ """ Link together a collection of object files """ def run(self): layout = self.relpath(self.get_argument('layout')) + target = self.get_argument('target') objects = self.open_file_set(self.get_argument('objects')) - output_file = self.relpath(self.get_argument('output')) + output_filename = self.relpath(self.get_argument('output')) try: - output_obj = link(objects, layout) + output_obj = link(objects, layout, target) except CompilerError as e: raise TaskError(e.msg) - # TODO: use layout here: - code = output_obj.get_section('code').data - with open(output_file, 'wb') as f: - f.write(code) + + # Store output: + with open(output_filename, 'w') as f: + output_obj.save(f) +@register_task("objcopy") class ObjCopyTask(Task): def run(self): - pass + image_name = self.get_argument('imagename') + output_filename = self.relpath(self.get_argument('output')) + object_filename = self.relpath(self.get_argument('objectfile')) + obj = fix_object(object_filename) + image = obj.get_image(image_name) + with open(output_filename, 'wb') as f: + f.write(image) + diff -r 94f5b719ad0b -r d056b552d3f4 python/ppci/layout.py --- a/python/ppci/layout.py Sun Apr 27 17:50:25 2014 +0200 +++ b/python/ppci/layout.py Thu May 01 14:03:12 2014 +0200 @@ -5,19 +5,20 @@ class Layout: def __init__(self): - self.mems = [] + self.memories = [] def add_memory(self, memory): - self.mems.append(memory) + self.memories.append(memory) def __eq__(self, other): - return self.mems == other.mems + return self.memories == other.memories def __repr__(self): - return str(self.mems) + return str(self.memories) class Memory: + """ Specification of how a memory may look like and what it contains. """ def __init__(self, name): self.inputs = [] self.name = name @@ -34,6 +35,7 @@ def __eq__(self, other): return str(self) == str(other) + class Input: pass diff -r 94f5b719ad0b -r d056b552d3f4 python/ppci/linker.py --- a/python/ppci/linker.py Sun Apr 27 17:50:25 2014 +0200 +++ b/python/ppci/linker.py Thu May 01 14:03:12 2014 +0200 @@ -1,161 +1,46 @@ import logging -import struct from .objectfile import ObjectFile from . import CompilerError -from .bitfun import encode_imm32 from .layout import Layout, Section -def align(x, m): - while ((x % m) != 0): - x = x + 1 - return x - -def wrap_negative(x, bits): - b = struct.unpack('> 2 - section.data[reloc.offset] = rel8 - - -@reloc('wrap_new11') -def apply_wrap_new11(reloc, sym, section, reloc_value): - offset = sym.value - (align(reloc_value, 2) + 4) - assert offset in range(-2048, 2046, 2) - imm11 = wrap_negative(offset >> 1, 11) - section.data[reloc.offset] = (imm11 & 0xff) - section.data[reloc.offset + 1] |= (imm11 >> 8) & 0x7 - - -@reloc('rel8') -def apply_rel8(reloc, sym, section, reloc_value): - assert sym.value % 2 == 0 - offset = sym.value - (align(reloc_value, 2) + 4) - assert offset in range(-256, 254, 2), str(offset) + str(reloc) - imm8 = wrap_negative(offset >> 1, 8) - section.data[reloc.offset] = imm8 - - -@reloc('bl_imm11_imm10') -def apply_bl_imm11(reloc, sym, section, reloc_value): - assert sym.value % 2 == 0 - offset = sym.value - (align(reloc_value, 2) + 4) - assert offset in range(-16777216, 16777214, 2), str(offset) - imm32 = wrap_negative(offset >> 1, 32) - imm11 = imm32 & 0x7FF - imm10 = (imm32 >> 11) & 0x3FF - s = (imm32 >> 24) & 0x1 - section.data[reloc.offset + 2] = imm11 & 0xFF - section.data[reloc.offset + 3] |= (imm11 >> 8) & 0x7 - section.data[reloc.offset] = imm10 & 0xff - section.data[reloc.offset + 1] |= ((imm10 >> 8) & 0x3) | (s << 2) +class Linker: + """ Merges the sections of several object files and + performs relocation """ + def __init__(self, target): + self.logger = logging.getLogger('Linker') + self.target = target -@reloc('b_imm11_imm6') -def apply_b_imm11_imm6(reloc, sym, section, reloc_value): - assert sym.value % 2 == 0 - offset = sym.value - (align(reloc_value, 2) + 4) - assert offset in range(-1048576, 1048574, 2), str(offset) - imm32 = wrap_negative(offset >> 1, 32) - imm11 = imm32 & 0x7FF - imm6 = (imm32 >> 11) & 0x3F - s = (imm32 >> 24) & 0x1 - section.data[reloc.offset + 2] = imm11 & 0xFF - section.data[reloc.offset + 3] |= (imm11 >> 8) & 0x7 - section.data[reloc.offset] |= imm6 - section.data[reloc.offset + 1] |= (s << 2) - -# ARM reloc!! -# TODO: move to target classes??? -@reloc('b_imm24') -def apply_b_imm24(reloc, sym, section, reloc_value): - assert sym.value % 4 == 0 - assert reloc_value % 4 == 0 - offset = (sym.value - (reloc_value + 8)) - rel24 = wrap_negative(offset >> 2, 24) - section.data[reloc.offset+2] = (rel24 >> 16) & 0xFF - section.data[reloc.offset+1] = (rel24 >> 8) & 0xFF - section.data[reloc.offset+0] = rel24 & 0xFF - - -@reloc('ldr_imm12') -def apply_ldr_imm12(reloc, sym, section, reloc_value): - assert sym.value % 4 == 0 - assert reloc_value % 4 == 0 - offset = (sym.value - (reloc_value + 8)) - U = 1 - if offset < 0: - offset = -offset - U = 0 - assert offset < 4096, str(sym) + str(section) + str(reloc) - section.data[reloc.offset+2] |= (U << 7) - section.data[reloc.offset+1] |= (offset >> 8) & 0xF - section.data[reloc.offset+0] = offset & 0xFF - -@reloc('adr_imm12') -def apply_adr_imm12(reloc, sym, section, reloc_value): - assert sym.value % 4 == 0 - assert reloc_value % 4 == 0 - offset = (sym.value - (reloc_value + 8)) - U = 2 - if offset < 0: - offset = -offset - U = 1 - assert offset < 4096 - offset = encode_imm32(offset) - section.data[reloc.offset+2] |= (U << 6) - section.data[reloc.offset+1] |= (offset >> 8) & 0xF - section.data[reloc.offset+0] = offset & 0xFF - -@reloc('absaddr32') -def apply_absaddr32(reloc, sym, section, reloc_value): - assert sym.value % 4 == 0 - assert reloc_value % 4 == 0 - offset = sym.value - section.data[reloc.offset+3] = (offset >> 24) & 0xFF - section.data[reloc.offset+2] = (offset >> 16) & 0xFF - section.data[reloc.offset+1] = (offset >> 8) & 0xFF - section.data[reloc.offset+0] = offset & 0xFF - - -class Linker: - """ Merges the sections of several object files and - performs relocation """ - def __init__(self): - self.logger = logging.getLogger('Linker') + def layout_sections(self, dst, layout): + """ Use the given layout to place sections into memories """ + # Create sections with address: + dst.images = {} + for mem in layout.memories: + cur_addr = mem.location + output_memory = bytearray() + for memory_input in mem.inputs: + if type(memory_input) is Section: + section = dst.get_section(memory_input.section_name) + section.address = cur_addr + cur_addr += section.Size + output_memory += section.data + # TODO: align sections + else: + print(memory_input) + dst.images[mem.name] = bytes(output_memory) def link(self, objs, layout): assert type(objs) is list assert type(layout) is Layout # Create new object file to store output: - self.dst = ObjectFile() - - # Create sections with address: - for mem in layout.mems: - for inp in mem.inputs: - if type(inp) is Section: - self.dst.get_section(inp.section_name).address = mem.location + dst = ObjectFile() # First copy all sections into output sections: for iobj in objs: offsets = {} # Merge sections: for in_s in iobj.sections.values(): - out_s = self.dst.get_section(in_s.name) + out_s = dst.get_section(in_s.name) # TODO: align section in other way: while out_s.Size % 4 != 0: out_s.add_data(bytes([0])) @@ -167,35 +52,39 @@ # Merge symbols: for sym in iobj.symbols.values(): - out_s = self.dst.get_section(sym.section) - value = offsets[sym.section] + out_s.address + sym.value - self.dst.add_symbol(sym.name, value, sym.section) + out_s = dst.get_section(sym.section) + value = offsets[sym.section] + sym.value + dst.add_symbol(sym.name, value, sym.section) self.logger.debug('{} at 0x{:08X} in section {}'.format(sym.name, value, sym.section)) # Merge relocations: for reloc in iobj.relocations: offset = offsets[reloc.section] + reloc.offset - self.dst.add_relocation(reloc.sym, offset, reloc.typ, reloc.section) + dst.add_relocation(reloc.sym, offset, reloc.typ, reloc.section) # Apply layout rules: - # TODO + self.layout_sections(dst, layout) # Perform relocations: - for reloc in self.dst.relocations: + for reloc in dst.relocations: # Lookup symbol: - if reloc.sym not in self.dst.symbols: + if reloc.sym not in dst.symbols: raise CompilerError('Undefined reference "{}"'.format(reloc.sym)) - sym = self.dst.symbols[reloc.sym] - # patch up: - section = self.dst.get_section(reloc.section) + + sym_value = dst.get_symbol_value(reloc.sym) + section = dst.get_section(reloc.section) # Determine location in memory of reloc patchup position: reloc_value = section.address + reloc.offset - if reloc.typ in reloc_map: - f = reloc_map[reloc.typ] - f(reloc, sym, section, reloc_value) + if reloc.typ in self.target.reloc_map: + f = self.target.reloc_map[reloc.typ] + f(reloc, sym_value, section, reloc_value) else: raise NotImplementedError('Unknown relocation type {}'.format(reloc.typ)) - return self.dst + # Create memories for the second time + # TODO: make this nicer? + self.layout_sections(dst, layout) + + return dst diff -r 94f5b719ad0b -r d056b552d3f4 python/ppci/objectfile.py --- a/python/ppci/objectfile.py Sun Apr 27 17:50:25 2014 +0200 +++ b/python/ppci/objectfile.py Thu May 01 14:03:12 2014 +0200 @@ -67,6 +67,7 @@ self.symbols = {} self.sections = {} self.relocations = [] + self.images = {} def find_symbol(self, name): return self.symbols[name] @@ -92,6 +93,14 @@ self.sections[name] = Section(name) return self.sections[name] + def get_image(self, name): + return self.images[name] + + def get_symbol_value(self, name): + symbol = self.find_symbol(name) + section = self.get_section(symbol.section) + return symbol.value + section.address + def __eq__(self, other): return (self.symbols == other.symbols) and \ (self.sections == other.sections) and \ @@ -109,6 +118,13 @@ return deserialize(json.load(f)) +def bin2asc(data): + return binascii.hexlify(data).decode('ascii') + +def asc2bin(data): + return bytearray(binascii.unhexlify(data.encode('ascii'))) + + def serialize(x): res = {} if isinstance(x, ObjectFile): @@ -123,10 +139,13 @@ res['relocations'] = [] for reloc in x.relocations: res['relocations'].append(serialize(reloc)) + res['images'] = {} + for image_name in x.images: + res['images'][image_name] = bin2asc(x.images[image_name]) elif isinstance(x, Section): res['name'] = x.name res['address'] = hex(x.address) - res['data'] = binascii.hexlify(x.data).decode('ascii') + res['data'] = bin2asc(x.data) elif isinstance(x, Symbol): res['name'] = x.name res['value'] = hex(x.value) @@ -144,11 +163,13 @@ for section in d['sections']: so = obj.get_section(section['name']) so.address = make_num(section['address']) - so.data = bytearray(binascii.unhexlify(section['data'].encode('ascii'))) + so.data = asc2bin(section['data']) for reloc in d['relocations']: obj.add_relocation(reloc['symbol'], make_num(reloc['offset']), reloc['type'], reloc['section']) for sym in d['symbols']: obj.add_symbol(sym['name'], make_num(sym['value']), sym['section']) + for image_name in d['images']: + obj.images[image_name] = asc2bin(d['images'][image_name]) return obj diff -r 94f5b719ad0b -r d056b552d3f4 python/ppci/target/basetarget.py --- a/python/ppci/target/basetarget.py Sun Apr 27 17:50:25 2014 +0200 +++ b/python/ppci/target/basetarget.py Thu May 01 14:03:12 2014 +0200 @@ -1,5 +1,7 @@ import types from ppci import CompilerError +from ..bitfun import encode_imm32 +import struct """ Base classes for defining a target @@ -101,6 +103,7 @@ self.asm_keywords = [] self.generate_base_rules() + self.reloc_map = reloc_map # TODO: make this target specific. def generate_base_rules(self): # Base rules for constants: @@ -148,3 +151,134 @@ def add_lowering(self, cls, f): """ Add a function to the table of lowering options for this target """ self.lower_functions[cls] = f + + def add_reloc(self, name, f): + self.reloc_map[name] = f + + + +def align(x, m): + while ((x % m) != 0): + x = x + 1 + return x + +def wrap_negative(x, bits): + b = struct.unpack('> 2 + section.data[reloc.offset] = rel8 + + +@reloc('wrap_new11') +def apply_wrap_new11(reloc, sym_value, section, reloc_value): + offset = sym_value - (align(reloc_value, 2) + 4) + assert offset in range(-2048, 2046, 2) + imm11 = wrap_negative(offset >> 1, 11) + section.data[reloc.offset] = (imm11 & 0xff) + section.data[reloc.offset + 1] |= (imm11 >> 8) & 0x7 + + +@reloc('rel8') +def apply_rel8(reloc, sym_value, section, reloc_value): + assert sym_value % 2 == 0 + offset = sym_value - (align(reloc_value, 2) + 4) + assert offset in range(-256, 254, 2), str(offset) + str(reloc) + imm8 = wrap_negative(offset >> 1, 8) + section.data[reloc.offset] = imm8 + + +@reloc('bl_imm11_imm10') +def apply_bl_imm11(reloc, sym_value, section, reloc_value): + assert sym_value % 2 == 0 + offset = sym_value - (align(reloc_value, 2) + 4) + assert offset in range(-16777216, 16777214, 2), str(offset) + imm32 = wrap_negative(offset >> 1, 32) + imm11 = imm32 & 0x7FF + imm10 = (imm32 >> 11) & 0x3FF + s = (imm32 >> 24) & 0x1 + section.data[reloc.offset + 2] = imm11 & 0xFF + section.data[reloc.offset + 3] |= (imm11 >> 8) & 0x7 + section.data[reloc.offset] = imm10 & 0xff + section.data[reloc.offset + 1] |= ((imm10 >> 8) & 0x3) | (s << 2) + +@reloc('b_imm11_imm6') +def apply_b_imm11_imm6(reloc, sym_value, section, reloc_value): + assert sym_value % 2 == 0 + offset = sym_value - (align(reloc_value, 2) + 4) + assert offset in range(-1048576, 1048574, 2), str(offset) + imm32 = wrap_negative(offset >> 1, 32) + imm11 = imm32 & 0x7FF + imm6 = (imm32 >> 11) & 0x3F + s = (imm32 >> 24) & 0x1 + section.data[reloc.offset + 2] = imm11 & 0xFF + section.data[reloc.offset + 3] |= (imm11 >> 8) & 0x7 + section.data[reloc.offset] |= imm6 + section.data[reloc.offset + 1] |= (s << 2) + +# ARM reloc!! +# TODO: move to target classes??? +@reloc('b_imm24') +def apply_b_imm24(reloc, sym_value, section, reloc_value): + assert sym_value % 4 == 0 + assert reloc_value % 4 == 0 + offset = (sym_value - (reloc_value + 8)) + rel24 = wrap_negative(offset >> 2, 24) + section.data[reloc.offset+2] = (rel24 >> 16) & 0xFF + section.data[reloc.offset+1] = (rel24 >> 8) & 0xFF + section.data[reloc.offset+0] = rel24 & 0xFF + + +@reloc('ldr_imm12') +def apply_ldr_imm12(reloc, sym_value, section, reloc_value): + assert sym_value % 4 == 0 + assert reloc_value % 4 == 0 + offset = (sym_value - (reloc_value + 8)) + U = 1 + if offset < 0: + offset = -offset + U = 0 + assert offset < 4096, str(sym) + str(section) + str(reloc) + section.data[reloc.offset+2] |= (U << 7) + section.data[reloc.offset+1] |= (offset >> 8) & 0xF + section.data[reloc.offset+0] = offset & 0xFF + +@reloc('adr_imm12') +def apply_adr_imm12(reloc, sym_value, section, reloc_value): + assert sym_value % 4 == 0 + assert reloc_value % 4 == 0 + offset = (sym_value - (reloc_value + 8)) + U = 2 + if offset < 0: + offset = -offset + U = 1 + assert offset < 4096 + offset = encode_imm32(offset) + section.data[reloc.offset+2] |= (U << 6) + section.data[reloc.offset+1] |= (offset >> 8) & 0xF + section.data[reloc.offset+0] = offset & 0xFF + +@reloc('absaddr32') +def apply_absaddr32(reloc, sym_value, section, reloc_value): + assert sym_value % 4 == 0 + assert reloc_value % 4 == 0 + offset = sym_value + section.data[reloc.offset+3] = (offset >> 24) & 0xFF + section.data[reloc.offset+2] = (offset >> 16) & 0xFF + section.data[reloc.offset+1] = (offset >> 8) & 0xFF + section.data[reloc.offset+0] = offset & 0xFF diff -r 94f5b719ad0b -r d056b552d3f4 test/m3_bare/build.xml --- a/test/m3_bare/build.xml Sun Apr 27 17:50:25 2014 +0200 +++ b/test/m3_bare/build.xml Thu May 01 14:03:12 2014 +0200 @@ -3,7 +3,13 @@ - + + diff -r 94f5b719ad0b -r d056b552d3f4 test/testarmasm.py --- a/test/testarmasm.py Sun Apr 27 17:50:25 2014 +0200 +++ b/test/testarmasm.py Thu May 01 14:03:12 2014 +0200 @@ -10,7 +10,7 @@ class ArmAssemblerTestCase(AsmTestCaseBase): """ ARM-mode (not thumb-mode) instruction assembly test case """ def setUp(self): - self.t = arm_target + self.target = arm_target self.obj = ObjectFile() self.ostream = BinaryOutputStream(self.obj) self.ostream.select_section('code') diff -r 94f5b719ad0b -r d056b552d3f4 test/testasm.py --- a/test/testasm.py Sun Apr 27 17:50:25 2014 +0200 +++ b/test/testasm.py Thu May 01 14:03:12 2014 +0200 @@ -63,7 +63,7 @@ def check(self, hexstr, layout=Layout()): self.assembler.flush() - self.obj = link([self.obj], layout) + self.obj = link([self.obj], layout, self.target) data = bytes(self.obj.get_section('code').data) self.assertSequenceEqual(bytes.fromhex(hexstr), data) diff -r 94f5b719ad0b -r d056b552d3f4 test/testbintools.py --- a/test/testbintools.py Sun Apr 27 17:50:25 2014 +0200 +++ b/test/testbintools.py Thu May 01 14:03:12 2014 +0200 @@ -60,7 +60,7 @@ o1.add_relocation('undefined_sym', 0, 'rel8', '.text') o2 = ObjectFile() with self.assertRaises(CompilerError): - o3 = link([o1, o2], layout.Layout()) + o3 = link([o1, o2], layout.Layout(), 'arm') def testDuplicateSymbol(self): o1 = ObjectFile() @@ -70,7 +70,7 @@ o2.get_section('.text') o2.add_symbol('a', 0, '.text') with self.assertRaises(CompilerError): - o3 = link([o1, o2], layout.Layout()) + o3 = link([o1, o2], layout.Layout(), 'arm') def testRel8Relocation(self): o1 = ObjectFile() @@ -79,7 +79,7 @@ o2 = ObjectFile() o2.get_section('.text').add_data(bytes([0]*100)) o2.add_symbol('a', 24, '.text') - o3 = link([o1, o2], layout.Layout()) + o3 = link([o1, o2], layout.Layout(), 'arm') def testSymbolValues(self): o1 = ObjectFile() @@ -88,7 +88,7 @@ o2 = ObjectFile() o2.get_section('.text').add_data(bytes([0]*100)) o2.add_symbol('a', 2, '.text') - o3 = link([o1, o2], layout.Layout()) + o3 = link([o1, o2], layout.Layout(), 'arm') self.assertEqual(110, o3.find_symbol('a').value) self.assertEqual(24, o3.find_symbol('b').value) self.assertEqual(208, o3.get_section('.text').Size) @@ -111,10 +111,10 @@ o2.get_section('data').add_data(bytes([0]*100)) o2.add_symbol('a', 2, 'data') o2.add_symbol('c', 2, 'code') - o3 = link([o1, o2], memory_layout) - self.assertEqual(0x20000000+2, o3.find_symbol('a').value) - self.assertEqual(0x08000000+24, o3.find_symbol('b').value) - self.assertEqual(0x08000000+110, o3.find_symbol('c').value) + o3 = link([o1, o2], memory_layout, 'arm') + self.assertEqual(0x20000000+2, o3.get_symbol_value('a')) + self.assertEqual(0x08000000+24, o3.get_symbol_value('b')) + self.assertEqual(0x08000000+110, o3.get_symbol_value('c')) self.assertEqual(208, o3.get_section('code').Size) self.assertEqual(100, o3.get_section('data').Size) diff -r 94f5b719ad0b -r d056b552d3f4 test/testmsp430asm.py --- a/test/testmsp430asm.py Sun Apr 27 17:50:25 2014 +0200 +++ b/test/testmsp430asm.py Thu May 01 14:03:12 2014 +0200 @@ -9,7 +9,7 @@ class Msp430AssemblerTestCase(AsmTestCaseBase): def setUp(self): - self.t = msp430target + self.target = msp430target self.obj = ObjectFile() self.ostream = BinaryOutputStream(self.obj) self.ostream.select_section('code') diff -r 94f5b719ad0b -r d056b552d3f4 test/testsamples.py --- a/test/testsamples.py Sun Apr 27 17:50:25 2014 +0200 +++ b/test/testsamples.py Thu May 01 14:03:12 2014 +0200 @@ -6,6 +6,7 @@ from ppci.buildfunctions import assemble, c3compile, link startercode = """ +section reset mov sp, 0x30000 ; setup stack pointer BL sample_start ; Branch to sample start local_loop: @@ -147,11 +148,12 @@ relpath('..', 'kernel', 'src', 'io.c3'), io.StringIO(modarchcode), io.StringIO(src)], [], 'arm') - o3 = link([o1, o2], io.StringIO(arch_mmap)) + o3 = link([o2, o1], io.StringIO(arch_mmap), 'arm') + img_data = o3.get_image('image') sample_filename = 'testsample.bin' with open(sample_filename, 'wb') as f: - f.write(o3.get_section('code').data) + f.write(img_data) # Check bin file exists: self.assertTrue(os.path.isfile(sample_filename)) diff -r 94f5b719ad0b -r d056b552d3f4 test/testthumbasm.py --- a/test/testthumbasm.py Sun Apr 27 17:50:25 2014 +0200 +++ b/test/testthumbasm.py Thu May 01 14:03:12 2014 +0200 @@ -7,7 +7,7 @@ class ThumbAssemblerTestCase(AsmTestCaseBase): def setUp(self): - self.t = thumb_target + self.target = thumb_target self.obj = ObjectFile() self.ostream = BinaryOutputStream(self.obj) self.ostream.select_section('code') diff -r 94f5b719ad0b -r d056b552d3f4 user/build.xml --- a/user/build.xml Sun Apr 27 17:50:25 2014 +0200 +++ b/user/build.xml Thu May 01 14:03:12 2014 +0200 @@ -4,7 +4,9 @@ - +