#!/usr/bin/tclsh if 0 { do_test do_bur do_bios do_clean do_zip } set builds { test bur bios } proc do_zip {} { do_clean cd .. set file [format "i412-%s.tar.gz" [clock format [clock seconds] -format %Y%m%d-%H%M%S]] exec tar cvzf $file i412 } proc do_clean {} { foreach build $::builds { file delete -force $build } } proc getSyms { o tabName } { global objdump upvar $tabName tab set cnt 0 set syms [join [lrange [split [exec $objdump -t $o] \n] 4 end]] foreach { address type section a b c name } $syms { incr cnt set tab($name) 0x$address } return $cnt } proc depend { left rights make } { set doit 0 if { ![file exists $left] } { #puts stdout "[pwd]/$left <- $rights n" incr doit } { foreach right $rights { if { [file mtime $left]<=[file mtime $right] } { #puts stdout "$left <- $rights d" incr doit break } } } if { $doit } { uplevel $make } } #exec $objdump -i #list.cpp interrupt.cpp proc build { gen memories sections } { set prefix i486-elf- set prefix "" set cc ${prefix}c++ set as ${prefix}c++ set ld ${prefix}ld set objdump ${prefix}objdump set objcopy ${prefix}objcopy puts stdout $gen depend $gen makefile.tcl { exec rm -fR $gen } depend $gen {} { file mkdir $gen } set ld_ld [list] #lappend ld_ld "OUTPUT_FORMAT(elf32-i386, elf32-big, elf32-little)" lappend ld_ld MEMORY lappend ld_ld "\{" foreach { name org len } $memories { lappend ld_ld "\t$name : org = $org, len = $len" } lappend ld_ld "\}" lappend ld_ld "" lappend ld_ld SECTIONS lappend ld_ld "\{" set cc_flags [list -m32 -mtune=i486 -fno-exceptions -fno-stack-protector -fno-rtti -fno-enforce-eh-specs -Wno-non-virtual-dtor \ -fdelete-null-pointer-checks -fomit-frame-pointer -fno-unroll-loops -fno-unroll-all-loops -fno-peel-loops \ -falign-functions=4 -falign-labels=4 -falign-loops=4 -falign-jumps=4 -fno-inline-functions ] foreach { section where opts sources } $sections { set ld_sec " $section :\n\t\{\n" foreach file $sources { set extension [file extension $file] set file [file rootname $file] append ld_sec "\t\t$gen/$file.o(.text)\n" #file delete $gen/$file.o depend $gen/$file.o $file$extension { switch -exact -- $extension { .S { puts stdout $file.S exec $cc -E $file.S -o $gen/$file.s -DARCH_I80486 -D_$gen eval [list exec $cc -c $gen/$file.s -Wa,-al -o $gen/$file.o >$gen/$file.l] $cc_flags #puts stdout [exec $objdump --all-headers $gen/$file.o] } .cpp { puts stdout $file.cpp eval [list exec $cc -c $file.cpp -Winline -finline-limit=80000 -Wall -S $opts -DARCH_I80486 -D_$gen -DMODULE(a,b)=[format "a##%s##b" $file] -o $gen/$file.s] $cc_flags eval [list exec $cc -c $gen/$file.s $opts -Wa,-al $opts -o $gen/$file.o] $cc_flags } default {} } } } append ld_sec "\t\} >$where" lappend ld_ld $ld_sec } lappend ld_ld { .comment : { } .text : { *(.text.*) } >rom .rodata : { *(.rodata.str1.1) *(.rodata.*) } >rom .gnu.linkonce : { *(.gnu.linkonce.r.*) } >rom .data : { *(.data) } >ram .bss : { *(.bss) } >ram } lappend ld_ld "\}" depend $gen/$gen.ld makefile.tcl { set f [open $gen/$gen.ld {WRONLY TRUNC CREAT}] foreach line $ld_ld { puts $f $line } close $f } exec $ld -melf_i386 -nostdlib --noinhibit-exec -T $gen/$gen.ld -M -o $gen/$gen.out >$gen/$gen.map catch { #exec $objcopy --only-section=.text0 --only-section=.text1 --only-section=.text2 --only-section=.rodata --output-target=binary $gen/$gen.out $gen/$gen.bin exec $objcopy --output-target=binary $gen/$gen.out $gen/$gen.bin exec $objdump --disassemble-all $gen/$gen.out --architecture=i386 >$gen/$gen.bin.reverse puts stdout [format "%s %d" $gen/$gen.bin [file size $gen/$gen.bin]] } } proc do_test {} { build test { ram 0x00110000 0x00010000 rom 0x00000700 0x00001c00 } { .text ram -O3 { test.cpp } } } proc do_bur {} { build bur { ram 0x00180000 0x00080000 rom 0x00000700 0x00001c00 } { .text0 rom -O1 { reset.S boot.S } .text1 rom -O3 { entryC.cpp burBiosFlasher.cpp uart.cpp flashAmd.cpp flashIntel.cpp } } } proc do_bios {} { build bios { ram 0x00080000 0x00020000 rom 0x000f8000 0x00007000 boot 0x000ff000 0x00000ff0 reset 0x000ffff0 0x00000010 } { .text0 rom -O3 { b.cpp uart.cpp pci.cpp cmdLine.cpp flashAmd.cpp flashIntel.cpp cxxabi.cpp config.cpp ohci.cpp fei82559.cpp ip.cpp tftp.cpp ethernetCapable.cpp socketUdp.cpp } .text1 boot -O3 { boot.S entryC.cpp } .text2 reset -O1 { reset.S } } } #getSyms boot.o boot.syms #exec $cc -c boot_.s -o boot.o #exec $objdump --disassemble -s $gen/boot.o >boot.o.reverse #exec $objdump --disassemble-all -s test.o #source reverse/bios.tcl #i386::load bios.bin 0x000f8000 #lappend i386::todos 0x000ffff0 #i386::diss 32768 bios.bin.reverse.s proc go { {what do_bios}} { if { 0==[string length $what] } { set what do_bios } uplevel $what } proc compile {} { uplevel do_clean } if { $argc!=0 } { eval $argv } { do_bios } return zipIt clean set gen bur set file boot set errorInfo "" messageFile [exec $objdump --all-headers $gen/reset.o] messageFile [exec $objdump --all-headers $gen/boot.o] exec $objdump --disassemble-all --target binary 000FFF00.DAT --architecture=i386 >boot.reverse exec $objdump --disassemble-all -s C:/Tornado.2.0/target/proj/cp312/default/romInit.o >romInit.reverse set boot.syms(_romIdtr) fileOpen result.txt fileOpen boot.o.reverse fileOpen boot.bin.reverse fileOpen boot.map fileOpen boot_.s source ymodem.tcl set ser [open com1: RDWR] fconfigure $ser -mode 9600,n,8,1 -buffersize 2048 -blocking 0 -buffering none -translation crlf puts $ser "" set line [read $ser] puts $ser "yload 0070:0000" after 500 send $ser boot.bin puts $ser "go 0070:0000" #puts $ser $ascii::esc close $ser exec c:/Tornado.2.0/host/x86-win32/bin/vxcopy \ C:/Tornado.2.0/target/config/pc486/bootrom_uncmp \ F:/dev/i412/bootrom.sys p 0 0x0a 0 0x10 0xe0000000 p 0 0x0a 0 0x14 0x0000c000 p 0 0x0a 0 0x18 0xe0020000 p 0 0x0a 0 0x04 0x02900007 p 0 0x0a 0 0x3c 0x3808010a p 0 0x12 0 0x5c 0x0000aaaa foreach build { bios bur test } { foreach file [glob -nocomplain "$build/*"] { file delete $file } }