|
|
1.1 root 1: //
2: // nono
3: // Copyright (C) 2022 nono project
4: // Licensed under nono-license.txt
5: //
6:
7: //
8: // ローダ
9: //
10:
11: #pragma once
12:
13: #include "object.h"
14: #include "iodevstream.h"
15:
16: class LoadInfo;
17: class MainRAMDevice;
18:
19: // RAM から呼ばれてファイルを読み込むだけのヘルパー。
20: class BootLoader : public Object
21: {
22: using inherited = Object;
23: public:
24: BootLoader(MainRAMDevice *ram_);
25: ~BootLoader() override;
26:
1.1.1.2 ! root 27: // info で指定された実行ファイルをロードする。
! 28: // data, size が指定されていればバッファから読み込む。
! 29: // 指定されていなければホストの path から読み込む。
! 30: // (path はいずれにしてもエラー出力の際に使う)
! 31: bool LoadExec(LoadInfo *);
! 32:
! 33: // info で指定されたデータファイルをロードする。
! 34: // data, size が指定されていればバッファから読み込む。
! 35: // 指定されていなければホストの path から読み込む。
! 36: // (path はいずれにしてもエラー出力の際に使う)
! 37: bool LoadData(LoadInfo *);
1.1 root 38:
39: private:
1.1.1.2 ! root 40: bool LoadExecFromFile(LoadInfo *);
! 41: bool LoadExecFromBuf(LoadInfo *);
1.1 root 42: bool LoadGzFile(LoadInfo *);
43: bool Load_aout(LoadInfo *);
44: bool Load_elf32(LoadInfo *);
45: bool Load_elf32_exec(LoadInfo *);
46: bool Load_elf32_rel(LoadInfo *);
47: bool Load_elf32_sym(LoadInfo *, std::string&);
48: void WriteFromHost(IODeviceStream&, const void *, int);
49: void readfile_global(uint32, const void *, int);
50:
51: MainRAMDevice *ram {};
52: };
53:
54: // 実行ファイルを読み込む際の受け渡しパラメータ
55: class LoadInfo {
56: public:
57: LoadInfo();
58: LoadInfo(const char *path_);
59: LoadInfo(const char *path_, const uint8 *data_, size_t size_);
60:
61: // ファイルから読み込む時はファイルパスを指定する。
1.1.1.2 ! root 62: // バッファから読み込む時はエラーの時に表示される名前を指定する。
1.1 root 63: const char *path {};
64:
1.1.1.2 ! root 65: // バッファから読み込む際は、データ本体とそのサイズを指定する。
! 66: // ファイルから読み込む時は 0 を指定しておくこと (ただし内部で使用する)。
1.1 root 67: const uint8 *data {};
68: size_t size {};
69:
1.1.1.2 ! root 70: // シンボルテーブルを読み込まない場合は false をセットする。
! 71: // デフォルトは true。
! 72: bool loadsym {};
! 73:
! 74: // RAM にロードした先頭アドレスを返す。
1.1 root 75: uint32 start {};
76:
1.1.1.2 ! root 77: // RAM にロードしたファイルのエントリポイントを返す。
1.1 root 78: uint32 entry {};
79:
1.1.1.2 ! root 80: // RAM にロードしたカーネル本体の後のシンボル開始アドレスを返す。
1.1 root 81: uint32 sym {};
82:
1.1.1.2 ! root 83: // RAM にロードした最終アドレス(の次のアドレス)を返す。
1.1 root 84: uint32 end {};
85: };
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.