|
|
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:
15: class LoadInfo;
16: class MainRAMDevice;
17:
18: // RAM から呼ばれてファイルを読み込むだけのヘルパー。
19: class BootLoader : public Object
20: {
21: using inherited = Object;
22: public:
1.1.1.3 root 23: explicit BootLoader(MainRAMDevice *mainram_);
1.1 root 24: ~BootLoader() override;
25:
1.1.1.4 ! root 26: // info で指定された実行ファイルを mainram にロードする。
1.1.1.2 root 27: // data, size が指定されていればバッファから読み込む。
28: // 指定されていなければホストの path から読み込む。
29: // (path はいずれにしてもエラー出力の際に使う)
1.1.1.4 ! root 30: static bool LoadExec(MainRAMDevice *mainram_, LoadInfo *info);
1.1.1.2 root 31:
1.1.1.4 ! root 32: // info で指定されたデータファイルを mainram にロードする。
1.1.1.2 root 33: // data, size が指定されていればバッファから読み込む。
34: // 指定されていなければホストの path から読み込む。
35: // (path はいずれにしてもエラー出力の際に使う)
1.1.1.4 ! root 36: static bool LoadData(MainRAMDevice *mainram_, LoadInfo *info);
! 37:
! 38: bool LoadExec(LoadInfo *);
1.1.1.2 root 39: bool LoadData(LoadInfo *);
1.1 root 40:
41: private:
1.1.1.2 root 42: bool LoadExecFromFile(LoadInfo *);
43: bool LoadExecFromBuf(LoadInfo *);
1.1 root 44: bool LoadGzFile(LoadInfo *);
45: bool Load_aout(LoadInfo *);
46: bool Load_elf32(LoadInfo *);
47: bool Load_elf32_exec(LoadInfo *);
48: bool Load_elf32_rel(LoadInfo *);
49: bool Load_elf32_sym(LoadInfo *, std::string&);
50:
1.1.1.3 root 51: MainRAMDevice *mainram {};
1.1 root 52: };
53:
54: // 実行ファイルを読み込む際の受け渡しパラメータ
55: class LoadInfo {
56: public:
57: LoadInfo();
1.1.1.3 root 58: explicit LoadInfo(const char *path_);
1.1 root 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.