星期五, 11月 18, 2005

LinuxBIOS test build

LJ的porting文章2005/06 http://www.linuxjournal.com/node/8120/print
cwlinux 寫的說明 http://www.cwlinux.com/downloads/linuxbios-sdk/docs/manual/linuxbios_sdk-5.html
checkout LinuxBIOSv2
$ svn co svn://openbios.org/repos/trunk/LinuxBIOSv2
checkout後,會顯示checkout的snapshot version.例如:
Checked out revision 2090
http://snapshots.linuxbios.org/ 可以看到每次的snapshot,也可以download個別的snapshot。其中也會有每個snapshot的autobuild的log。

svn checkout只會update 有變更的部份(這也是version control system的功能)

download完後,到 Document中make,Error : 找不到epstopdf,找到屬於tetex package.所以install
#aptitude install tetex-bin
***後來發現還要tetex-extra
install完後,make就會build documentation下的檔案,產生pdf檔。
Document就是一個porting的範例:LinuxBIOS on AMD64以下是筆記:

Build Requirement

  • GCC 3.3.1
  • binutils 2.14.90.0.5
  • Python 2.3
  • CVS 1.11.6

LinuxBIOS config overview

  • Firmware image configure file位置在 freebios2/targets/<vendor&~~SPECIAL_REMOVE! #~~gt;/<mainboard>/., default config file name : Config.lb
  • Mainboard相關的config file位置在freebios2/src/mainboard/<vendor& gt;/<mainboard% gt;.,Configuration file檔名是Config.lb。包含的資訊像是:cpu type,northbridge, southbridge,,hypertransport,superIO。

Building LinuxBIOS

LinuxBIOS的source code和Makefile設計將build的object file獨立於src之外,這是為了要讓不同的target同時存在,不會互相影響。Build的動作分為兩個部份:
  • Create Build Tree,存放configure tool產生的file和build產生的object file。
  • compile LinuxBIOS,產生可燒錄的flash image。
第一步的動作由script : freebios/targets/buildtargets完成,以AMD Solo Athlon64為例:
$ cd freebios2/targets
$ ./buildtargets amd/solo
以上的動作會create一個folder: freebios2/targets/amd/solo/solo,folder中包含所有config file。接著,build :
$ cd amd/solo/solo
$ make
LinuxBIOS image的filename設定在 firmware image configuration file裏,以這個例子來看,是solo.rom。

Programmign LinuxBIOS to flash memory

產生的LinuxBIOS image檔可以用來燒錄在bios的flash memory中,可以用燒錄器或是linux的flash driver : devbios或mtd。

LinuxBIOS configuration

接著說明LinuxBIOS的configuration file內容,所有configuration file都有一些共同的地方...
  • default config file name : Config.lb
  • config file中的變數要用VARNAME宣告
  • #開始的行是註解
  • configuration有區分statement和options。Statement規劃了LinuxBIOS configuration file的動作。Options則是configuration和build時的變數
  • Default configuration value可以在mainboard的configuration file中設定
  • Options 可以修改default的設定,Options設定在freebios2/targets/< vendor>/<mainboard>/Config.lb (keyword option)

Common Configuration Statements

  • uses
    所有variable都要先宣告:
    Example:
    uses   ROM_IMGE_SIZE
    NOTE:只有configuration system中的configuration variable可以使用. LinuxBIOS會check freebios2/src/config/Options.lb中宣告的variable決定哪些使可用變數
  • default
    用來設定一個configuration variable的default value,這些value可以被overwrite,通常用在mainboard configuration file中,
    Example:
    default  ROM_IMAGE_SIZE=0x10000
    variable間可以互相使用來作為value:
    default FALLBACK_SIZE=ROM_SIZE
    也可以使用基本的計算:
    default  FALLBACK=(ROM_SIZE - NORMAL_SIZE)
    String value要用"括起來default CC="gcc m32"
  • option< >option基本上和default的功能類似,但是只能用在build target configuration files(freebios2/targets/<vendor>/<mainboard>). option可以用來設定或是修改default設定的值。statement和default一樣。

Firmware image specific configuration

LinuxBIOS 可以為廷一個hardware platform create不同的image,每個image可以設定不同的output,payload(bootloader或linux kernel),組成的subimage。

Firmware Image specific keyword

以下是firmware相關的configuration keyword
  • romimage
    定義最後的LinuxBIOS image,一般都會有兩個romimage產出:normal, fallback。
    每 個romimage都要指定包含mainboad configuration file的mainboard目錄和payload,pathload是一個指向payload binary 的static path.(payload就是LinuxBIOS開機完成後,要load的source ,一般會是bootloader或是真正的Linux Image)
    romimage "normal"
    option USE_FALLBACK_IMAGE=0
    option ROM_IMAGE_SIZE=0x10000
    option LINUXBIOS_EXTRA_VERSION=".0Normal"
    mainboard amd/solo
    payload /suse/stepan/tg3ide_disk.zelf
    end
  • buildrom<>這一個statement用來指定要build那一個LinuxBIOS image:
    buildrom  ./solo.rom ROM_SIZE  "normal"  "fallback"

Firmware image configuration options

除了以上的option外,以下是其他的一些option:
  • CC
    設定C Compiler, default是$(CROSS_COMPILE)gcc, 當build AMD64 LinuxBIOS image時要設定在gcc m32
  • CONFIG_CHIP_CONFIGURE
    使用新的chip_configure的方式來config (nonpci) devices. build AMD64時要設為1
  • MAXIMUM_CONSOLE_LOGLEVEL
    Default是8,決定要印出的error level是最高level是多少,min是0,max是10。
  • DEFAULT_CONSOLE_LOGLEVEL
    console顯示這個level的error,default是7,main 0, max 10
  • CONFIG_CONSOLE_SERIAL8250
    log message由8250的serial device送出,Default 是0,使用AMD64時要設為1.
  • ROM_SIZE
    最終的ROM image size,沒有default value.
  • FALLBACK_SIZE
    Fallback image size,default 65536 bytes,不包含FALLBACK payload.
  • HAVE_OPTION_TABLE
    Export CMOS option table. Default 0, 如果mainboard有CMOS memory而且要用來存放LinuxBIOS參數的話,就設為1
  • CONFIG_ROM_STREAM
    Boot image是在ROM中 (另一個設定是CONFIG_IDE_STREAM,代表Boot image是在ide裝置)
  • HAVE_FALLBACK_BOOT
    如果要fallback boot功能的話,就設為1,default是0
以下是romimage section用的statement
  • USE_FALLBACK_IMAGE
    要使用fallback image的話就設為1,default是0
  • ROM_IMAGE_SIZE
    default image size,default是65536 bytes
  • LINUXBIOS_EXTRA_VERSION
    LinuxBIOS的extra version label,default是空字串,可以加入任何你希望加在標準版本字串後的字串。

Mainboard相關的configuration


設 定mainboard相關的bridge, CPU, 也包含一些low-level 使用romcc 和 assembler compile的startup code。這些code enable caches, registers, 早期的mtrr 設定,fallback mechanism, dram初始話,.....
NOTEmainboard configuration中不能使用option keyword。而藥用default keyword.
以下是相關的keyword:
  • arch
    CPU的架構,AMD64要設i386.
    Example:
    arch  i386  end
  • cpu
    設定cpu???:
    cpu k8 "cpu0" end
    ***同一個板子可以放兩顆不一樣的cpu嗎?
  • driver
    這個keyword將obj檔加入image的driver section中,代表PCI device的initialization code將可以使用這個obj檔內的function:
    driver  mainboard.o
  • object
    這個keyword將obj檔加入LinuxBIOS的 image中,這樣加入的obj檔的function可以被所有LinuxBIOS的code使用(包含driver):
    object reset.o
  • makerule< >增加build process的build rules.當使用外部工具(非標準的gcc... binutil..etc)時會用到。LinuxBIOS AMD64使用romcc來build startup code,這部份在auto.c中。
    在configuration file中要加入如何使用romgcc build aoto.c:
    makerule  ./auto.E
    depends "$(MAINBOARD)/auto.c option_table.h ./romcc"
    action "./romcc -E -mcpu=k8 -O2 I$(TOP)/src -I. $(CPPFLAGS) $(MAINBOARD)/auto.c -o $@"
    end
    makerule ./auto.inc
    depends "$(MAINBOARD)/auto.c option_table.h /romcc"
    action "./romcc -mcpu=k8 -O2 I$(TOP)/src -I. $(CPPFLAGS) $(MAINBOARD)/auto.c -o $@"
    end
    每個makerule中要包含file dependency, actions (就像一般的makefile一樣)
  • mainboardinit<>這個keyword可以將任意的assembler code加入LinuxBIOS image中。用在early infrastructure initialization (如切換進入protect mode):
    mainboardinit cpu/i386/entry16.inc
  • ldscript
    用這個keyword指定ld 使用的link script檔:
    ldscript  /cpu/i386/entry16.lds
  • dir
    LinuxBIOS包含很多mainboard的port,所以很多共同的code會放在某一個共用的目錄中,用這個keyword可以指定共用code目錄的位置:
    dir/pc80
  • config
    new chip configuration scheme need this.
    config  chip.h
  • register
    這個keyword可以放在任何地方,作為設定code參數的方法,裏如以下的宣告就可以讓code 藉由com1存取到config file的參數
    resiter  "com1" = " {1, 0, 0x3f8, 4}"
  • northbridge
    指 定系統的northbriede,AMD64系統可以有很多northbridge(一個 cpu一個),每個northbridge都要宣告,包含code的relative path (relatice to : freebios2/src/northbridge).
    northbridge  amd/amdk8  "mc0"
    [..]
    end
  • southbridge
    LinuxBIOS為簡化設定,除northbridge外所有的device都是為 southbridge。
    從cpu來看,southbridge是經由northbridge連接到cpu的, southbridge宣告在每一個他連到的northbridgev宣告中。
    同樣,每個bridge都要宣告他的code relative path和unique name。
    如果是hypertransport device,用link keyword宣告他連到的hypertransport link.
    northbrige amd/amdk8  "mc0"
    [..]
    sourthbridge amd/amd8111 "amd8111" link 0
    [...]
    end
    [..]
    end
  • pci
    這只在northbridge或southbridge中出現,用來描述PCI device,通常bridge section都會有很多pci keyword宣告。
    pci 有on/off option可以指定這個device是enable或是disable。
    northbridge amd/amdk8  "mc1"
    pci 0:19.0
    pci 0:19.0
    pci 0:19.0
    pci 0:19.1
    pci 0:19.2
    pci 0.19.3
    end
    or
    southbridge amd/amd8111 "amd8111" link 0
    pci 0:0.0
    pci 0:1.0 on
    pci 0:1.1 on
    [..]
    end
  • superio< >SuperIO的設置方式和bridge的方式大概類似,code在freebios2/src/superio/。和pci device不一樣的管理方式,使用PnP的device。如果SuportIO和southbridge相連,就要宣告在southbridge的 section裏。
    superio NSC/pc87360 link 1
    pnp 2e.0
    pnp 2e.1
    pnp 24.4
    ...
    register "com1" = "{1, 0, 0x3f8, 4}"
    register "lpt" = "{1}"
    end

Mainboard specific configuration options

以下用在mainboard的設定,用default 來設定
  • HAVE_HARD_RESET
    代表有hard reset功能,default 是沒有
  • HAVE_PIRQ_TABLE
    代表有IRQ Table,default是沒有
  • IRQ_SLOT_COUNT
    IRQ slot的數目,default並沒有定義
  • HAVE_MP_TABLE
    build MP table,default不build
  • have_OPTION_TABLE
    export CMOS option table,default不export
  • CONFIG_SMP
    support SMP (symmetric multiprocessing)。default是沒有
  • CONFIG_MAX_CPUS
    當有定義CONFIG_SMP時,這個定義CPU的數量
  • CONFIG_IOAPIC
    enable IOAPIC,在AMD64系統要boot 64bit Linux kernel時,這個選項一定要enable。
  • STACK_SIZE
    LinuxBIOS的stack size,function call的stack size,default是0x2000 (8k)
  • HEAP_SIZE
    LinuxBIOS的heap size,LinuxBIOS function使用malloc() function時使用的memory。default 0x2000,AMD64 一般要設0x4000
  • XIP_ROM_BASE
    當LinuxBIOS使用execution from ROM時,cache的start address。
  • XIP_ROM_SIZE
    同上,size。
  • CONFIG_COMPRESS
    image是壓縮的。使用壓縮的image會慢一點點。




到targets下run buildtareget.sh,指定一個platform後會產生一個.mak檔,到那個platform下make,開始動作,但是到最後build rom時出現錯誤。
在Documentation folder裏有Config這個檔,說明LinuxBIOS的config檔的格式,LinuxBIOS因為要符合很多個platform, Chipset,CPU,Motherboard。所以需要一個特殊的config檔,以避免source code有分支。

沒有留言:

網誌存檔