@@ -13,66 +13,73 @@ void kthread()
1313 lib::initgraph::postsched_init_engine.run ();
1414 pmm::reclaim_bootloader_memory ();
1515
16- // TODO-SCHED-REWRITE
17- // sched::thread_t *thread = nullptr;
18- // {
19- // lib::path_view path { "/usr/bin/bash" };
20- // lib::info("loading {}", path);
21-
22- // auto ret = vfs::resolve(std::nullopt, path);
23- // if (!ret.has_value())
24- // lib::panic("could not resolve {}", path);
25-
26- // auto res = vfs::reduce(ret->parent, ret->target);
27- // if (!res.has_value())
28- // lib::panic("could not reduce {}", path);
29-
30- // auto file = vfs::file::create(res.value(), 0, 0, 0);
31- // auto format = bin::exec::identify(file);
32- // if (!format)
33- // lib::panic("could not identify {} file format", path);
34-
35- // auto pmap = std::make_shared<vmm::pagemap>();
36- // auto proc = sched::create_pid1(std::move(pmap));
37-
38- // proc->ruid = proc->euid = proc->suid = 1000;
39- // proc->rgid = proc->egid = proc->sgid = 1000;
40-
41- // lib::path_view tty_path { "/dev/ttyS0" };
42- // ret = vfs::resolve(std::nullopt, tty_path);
43- // if (!ret.has_value())
44- // lib::panic("could not resolve {}", tty_path);
45- // auto tty = vfs::filedesc::create(ret->target, vfs::o_rdwr, proc->pid);
46- // if (!tty || !tty->file)
47- // lib::panic("could not create {} filedesc", tty_path);
48- // if (!tty->file->open(0))
49- // lib::panic("could not open {}", tty_path);
50-
51- // proc->fdt->allocate_fd(tty, 0, false);
52- // proc->fdt->dup(0, 1, false, false);
53- // proc->fdt->dup(0, 2, false, false);
54-
55- // thread = format->load({
56- // .pathname = path.data(),
57- // .file = file,
58- // .interp = { },
59- // .argv = { path.basename().data() },
60- // .envp = {
61- // "TERM=linux",
62- // "USER=ilobilix",
63- // "HOME=/home/ilobilix",
64- // "PATH=/usr/local/bin:/bin:/usr/bin:/sbin:/usr/sbin"
65- // }
66- // }, proc);
67-
68- // if (!thread)
69- // lib::panic("could not create a thread for {}", path);
70-
71- // thread->status = sched::status::ready;
72- // }
16+ sched::thread_t *thread = nullptr ;
17+ {
18+ lib::path_view path { " /usr/bin/bash" };
19+ lib::info (" loading {}" , path);
20+
21+ auto ret = vfs::resolve (std::nullopt , path);
22+ if (!ret.has_value ())
23+ lib::panic (" could not resolve {}" , path);
24+
25+ auto res = vfs::reduce (ret->parent , ret->target );
26+ if (!res.has_value ())
27+ lib::panic (" could not reduce {}" , path);
28+
29+ auto file = vfs::file::create (res.value (), 0 , 0 , 0 );
30+ auto format = bin::exec::identify (file);
31+ if (!format)
32+ lib::panic (" could not identify {} file format" , path);
33+
34+ auto proc = sched::create_process (nullptr );
35+
36+ proc->vmspace = std::make_shared<vmm::vmspace>(
37+ std::make_shared<vmm::pagemap>()
38+ );
39+
40+ proc->vfs = std::make_shared<sched::process_t ::vfs_state>();
41+ proc->vfs ->root = vfs::get_root (true );
42+ proc->vfs ->cwd = proc->vfs ->root ;
43+
44+ proc->fdt = std::make_shared<vfs::fdtable>();
45+ proc->cred = std::make_shared<sched::cred_t >();
46+
47+ proc->cred ->ruid = proc->cred ->euid = proc->cred ->suid = 1000 ;
48+ proc->cred ->rgid = proc->cred ->egid = proc->cred ->sgid = 1000 ;
49+
50+ lib::path_view tty_path { " /dev/ttyS0" };
51+ ret = vfs::resolve (std::nullopt , tty_path);
52+ if (!ret.has_value ())
53+ lib::panic (" could not resolve {}" , tty_path);
54+ auto tty = vfs::filedesc::create (ret->target , vfs::o_rdwr, proc->pid );
55+ if (!tty || !tty->file )
56+ lib::panic (" could not create {} filedesc" , tty_path);
57+ if (!tty->file ->open (0 ))
58+ lib::panic (" could not open {}" , tty_path);
59+
60+ proc->fdt ->alloc (tty, 0 , false );
61+ proc->fdt ->dup (0 , 1 , false , false );
62+ proc->fdt ->dup (0 , 2 , false , false );
63+
64+ thread = format->load ({
65+ .pathname = path.data (),
66+ .file = file,
67+ .interp = { },
68+ .argv = { path.basename ().data () },
69+ .envp = {
70+ " TERM=linux" ,
71+ " USER=ilobilix" ,
72+ " HOME=/home/ilobilix" ,
73+ " PATH=/usr/local/bin:/bin:/usr/bin:/sbin:/usr/sbin"
74+ }
75+ }, proc);
76+
77+ if (!thread)
78+ lib::panic (" could not create a thread for {}" , path);
79+ }
7380
7481 lib::log::wait_for_logs ();
75- // sched::enqueue_new(thread);
82+ sched::enqueue_new (thread);
7683}
7784
7885extern " C" [[noreturn]] void kmain ()
0 commit comments