Hello, I have recently been putting a lot of work into my OS, so much so that I wanted to do progress reports here. For context, it is 64-bit, was microkernel-based but now is different, has software context switching, virtual memory allocation with de-allocation, userspace, processes (I call each background helper process a service/module), Linux-like logging, queue-based PS/2 (soon to be USB) input system, works fully on real hardware with it's own bootloader, a full graphics library for the OS, and is public domain
#saalty's unnamed OS
1 messages ยท Page 1 of 1 (latest)
Always cool to see stuff that runs on real hardware, shame about the closed source nature though.
Yeah, I will probably change my mind about the closed source decision.
It's not mature enough for me to confidently to say what it will be
tbh, I mainly decided on it because I am afraid my code is pretty ugly
alright it's public domain now
normally I wouldn't change my mind so fast, but I was unsure of it being proprietary myself
anyways, lets get to my OS's goals
## Goals for my OS:
# 1. USB
I plan on adding EHCI support soon.
# 2. Games
I am planning on porting some 3d games to it, with my half-assed OpenGL 3.3 implementation.
# 3. Compatibility
I will add PE-64 (is this how you call it?) file loading and ELF64. 32-bit programs will not be able to run in this OS.
# 4. Window manager
I will replicate how Android looks.
# 5. File system
I will try making this OS have no file system :)
So right now I am working on adding a nice temporary WM.
I could also add a mouse service while I am at it.
also, here is a random screenshot of it on real hardware
Now I have to decide whether I want a terminal or not.
just experienced this weird bug when attempting to print keyboard input
Jesus fucking christ, this bug is scary debugging-wise
The actual text rendering seems fine
What in the fuck
How does it mess up that beautifully
Also I have to fix logging it seems
Yup, long mode
Interesting project, will check out the Github
Alright!
Do note that some parts of the code may be slightly off.
Just confirmed that the OS still works on real hardware, awesome
Also sorry for my blurry lens
seems cool
nice
Is it worth it to implement AHCI?
I am thinking of implementing it over using ATA PIO to read
ATA PIO doesn't exist anymore on real hardware and even when it did, it was piss slow
i would suggest NVMe as an alternative to AHCI
it's very common now and writing a driver is simpler than for AHCI
ahci is still very common, so i would say its worth supporting if you want to cover a wider range of today's hardware
obviously nvme is superior, mainly because of the speeds, but hard drives are still the king for price/size ratio and i dont think sata will go anywhere anytime soon
they will
Alright, I don't have an NVMe drive anywhere, so i guess AHCI is my best option then.
I only have SATA drives
i mean nvme drives are really affordable but i still can get an hdd twice the capacity for the same/slightly lower price, ~300 usd for 4tb nvme and ~250 usd for 8tb hdd
gen 3 nvmes are slightly cheaper at around ~250 usd for 4tb
but im still not sure how i feel about solid state drives for archiving purposes
I personally wouldn't call over 75 dollar drives affordable lol
it all comes down to price/gb imo
no point in buying 4 $75 drives when i can buy a $250 one and have 4 time the capacity in a single drive
and the $250 one has a better price/gb ratio, so you get more for less, technically
its just that you pay more to get more, obviously
I'm just saying, I never needed more than 500 gigs ๐
๐ฌ
I am not hoarding data at all, so I have used around 200 gb so far lol
But, I am getting an NVMe drive in a few days
Because it looks like AHCI is quite similar to EHCI, and I do not like EHCI
One quick look at the NVMe osdev wiki page shows that yeah, I will have a lot more fun with NVMe
AHCI is pretty simple, idk how EHCI works at all but given its usb i wouldnt expect it to work anything like that
interesting
qemu also knows how to emulate NVMe so that should help ๐
Yeah, thank god qemu has NVMe emulation
wait, what am I doing, I can start writing the driver right now then ๐
The structures and registers seem very similar
GitHub
Companion code to https://wiki.osdev.org/NVMe. Contribute to codepilot/NVMe-how-to development by creating an account on GitHub.
this is pretty funny
Javascript is the last language I would use for osdev
I also sadly caught a cold so development will be slow for a few days
alright, now I have an NVMe drive
Someone somewhere is probably developing an electron based javascript operating system
50% memory usage at idle
Good idea
Lmao
NVMe fully working on my machine
It's driver time
Thanks, Windows! Now I can make a GPU driver for an RTX card ๐
also, havent done any progress on the OS so far because the cold I caught requires that I take a lot of rest
In a few days I'll start with making an NVMe driver
ah fuck it, I'll start making it right now. I'll document my progress.
Right now, I am making a brute force PCI scanner for NVMe devices because I am lazy
Alright, NVMe device successfully found on PCI
Now to test if it finds my actual NVMe on real hardware
Phew, I think it found it
Alright, next step is uh
This probably is going to be the least fun step
Busmastering DMA enabled I think
god I am such a noob
But I believe in my ability to learn
alright, really liking my progress so far, I have calculated the max page size for an NVMe controller
this is not too bad
It always feels nice when specifications start to make sense ๐
Now the controller is reset
Alright, here is the exciting part, I am at the point where I can enable the controller
Getting really close to having a somewhat capable NVMe driver
well, somewhat close
Phew, moment of truth, time to send a read sectors command. My I/O queues are set up
This really sucks, I have to apparently use IOAPIC as well
And apparently I could have to parse AML
This is so sketchy
I am actually angry
But looks like NVMe drives don't even need IOAPIC to be initialized
Thank god
You shouldn't need pin based interrupts for nvme
I remember the spec strongly recommends msix (and msi as a fallback)
Yeah I now use msi-x
But I don't see the opcode for the read command anywhere in the specs
Oh, a little ctrl-f shows it's 0x2
ah yes, so for the IO queues you'll want to reference the NVM command set spec
yup
I cant see where I select the namespace to use for the read
Maybe I need to set it when creating my I/O queues?
There's a field called nsid, it's used for most commands so I think it's listed under the generic command structure
it was dword 1 or 2 from memory
oh yeah, dword 1, alright
also - am I calculating my 64-bit bar0 correctly?
uint64_t bar0 = ((uint64_t)pci_header.BAR0 & 0xFFFFFFF0) | ((uint64_t)pci_header.BAR1 << 32);
I have a feeling that I am not even communicating with the NVMe controller
because read command is not doing anything
Finally, NVMe Identify command is working!
Only took 17 continuous hours!
I am really proud of myself
Now I have to fix the read command and then I can take a well-deserved break
How the hell does my OS work on real hardware but not on emulator
The emulator in question is Virtualbox
that can happen quite often
yeah mine triple faults
or restarts
I don't know yet
cli
hlt
is your best friend
yup
I really done just spilled water on my computer
I would've done osdev if now I didn't have to wait for it to dry
And my USB stick that I copy my OS to might be fucked
And my drives... might be fucked too
i prefer break
Is it an assembly instruction?
no its a gdb command
break is pretty nice, but in cases where you cannot connect to gdb you might have no other choice than cli hlt
why would you not be able to connect to gdb
Computer is running fine it seems
Installing Gentoo, so I will not be osdeving for a day or two
It's been a long break but I'll be back soon
I don't know why I bother to even say that, no one cares lol
my condolences
Alright, gentoo installed, time to migrate my OS to this gentoo installation
I have not given up on this OS, I will start work on the nvme driver again today
Good thing with Linux I can just mount my drive where my OS is stored and just copy it over to my Gentoo installation
Okay now I have it on Gentoo
Great
Now I only have to install Qemu then off to debugging
I'm back, so the nvme driver still doesn't work
After weeks of debugging
It'll be easy they said
At least I can send admin commands successfully, not IO though
FINALLY IT WORKS
OR a driver for an existing fs design
how does one even go about designing a filesystem?
by knowing what the goals are
and having a toolbox of knowledge about data structures and which ones best apply to disks and stuff
90% of the time someones "own file system" ends up being fat with a couple minor changes
Idk, just fuck around I guess
You're completely right, because implementing things exactly to spec is boring when you can just not
yeah my own is just FAT with an inode table
do you have a shell yet
Yes
just dwm
why adhere to the xorg spec when you can just hack together your own implementation of whatever the fuck you want B)
as long as you understand it, it's all good
true lmao
Yeah I'll just port DWM directly
But right now, I have a filesystem which supports directories of any size and any depth
Adding files soon
My brother actually made me a background which will be the default background for this OS
that's actually pretty
Yeah ๐
reminds me of windows vista
Yup, I think instead of embedding the background image in the OS, I will just write some file manager tool for Linux that can add files to my filesystem, like this background
wow, that's really nice!
๐
Now I cannot test my OS on real hardware because I don't want to overwrite my very important nvme drive
File read/writing almost done in my filesystem driver, soon I will make an ls, cat, and a little makeshift nano
Oh, and touch and rm
Mkdir
Wow, already have a ton of possibilities
Latest progress, getting closer to linux
There is also a recursive remove command which I am proud of
nice work ๐ ๐
ahh, nice!
just curious, how's the work on your version of nano / a text editor going?
I haven't done work on it yet, however I plan for it to be finished tomorrow when I wake up ๐
o7
Github updated
I have a name: SaltyOS
Sorry, I've already settled on TheOS (it's already the name in my default background)
found here
THEOS, which translates from Greek as "God", is an operating system which started out as OASIS, a microcomputer operating system for small computers that use the Z80 processor. When the operating system was launched for the IBM Personal Computer/AT in 1982, the decision was taken to change the name from OASIS to THEOS, short for THE Operating Sy...
TheOS is already taken
Alright, then The OS
Ok then
I am soon going to make a text editor now which will be pretty exciting, but first cat command
Okay guys, time to test my OS on bare metal.
I moved my important files out of my NVMe drive.
Page fault!
Uh oh
And when I remove the NVMe initialization it works
Well, not disk io of course, but everything else works
This will be a long night
Of debugging
๐๐ This definitely will be fun
the window manager is a tui?
It's GUI using VBE as a backend, it's just the debug console
ah
Ah! I think it's not working because I forgot to align my data structures to the NVME controller's page size
Nope
I will create a debug kernel log function for convenience
It's been like 3 hours of debugging so far, but making amazing progress
My BAR calculation or finding is not correct it seems
4 hours
Got admin commands working on real hardware so far
testing on real hardware is based
Yeah, I will never be satisfied if my OS only works in emulator
Once my NVMe driver works on real hardware, I will be very, very well set for a ton of features
yeah, i feel the same way. what's the point if you OS doesn't work on your hardware? i understand the usefulness of virtual machines for quick development
Yeah, virtual machines are nice for when you have the critical stuff out of the way like drivers and are just making some UI or something
I just found this thread and it's really cool that you got this far by yourself! Also are you planning to add something so that you can make apps for your os?
Thanks! I am planning to add shell script support to my OS that I can save to my OS filesystem and run them, and after that I will put my OpenGL 3.3 implementation into the OS to allow 3d apps
nice
The OpenGL implementation I made even has its own shader compiler which I am proud of lol
wow
My nvme driver now works on real hardware!
Ez4saalty
The NVMe driver on real hardware
nice colors
Thanks!
since when was ls recursive
What do you mean?
now that I am back, I just now realized you meant the "touch bruh?hello". It would not create a file inside bruh, there was just a bug that made slashes always be question marks
better example
It feels so nice how my computer flashes lights on every one of my disk reads, it recognizes it fully ๐
Now it automatically adds home, bin, and etc directories
good stuff ๐ ๐
ahh, that's a nice touch
Yup, next step: I made an interpreter for my programming language that should be extremely easy to port
I will make my first programs in my OS!
that's so based
Thanks, it also comes with a compiler that luckily compiles to 64bit nasm assembly, so maybe I could port an assembler later
dont you already have some
like ls
etc
They're built/embedded into the OS, so I would not say they are programs
I'm so jealous lolz, that's some great progress
thanks!
I finished porting my language by the way
just doing some finishing touches
And whats even better: I HAVE SPINNING DONUT CODE FOR IT!
With lighting and all that stuff
TORUS GANG
Man, this port is taking way longer than expected, sorry guys
Got the interpreter running code, but has a few bugs to fix before I show you guys
oh that's neat!
Spinning donut coming soon!
Also, thanks so much guys for the support of this OS
5.6k loc so far
Do you have a github with your current progress in it?
https://github.com/waternine9/untitled-os here you go, its public domain
Ty
๐
well im lost
๐
havent touched the bootloader in a while
oh bruh
this
global bootentry
bootentry: jmp entry0
db "UNTITLED_OS"
entry0:
jmp 0:entry
needs to be
global bootentry
bootentry: jmp 0:entry0
db "UNTITLED_OS"
entry0:
jmp entry
also this is taken straight out of my local repo as it is right now, so its not too polished
the mov to sp needs to be right after the mov to ss
because a mov to ss disables interrupts for the next instruction
either that, or wrap it in cli/sti
but that wastes more valuable bytes
oh i never knew that, thanks
ill patch it up rq
Can't believe this is my own programming language, OS, kernel, and bootloader. I feel proud of myself
also updated the github
Next I have to port dwm and make some terminal emulator
this looks like C
i think you should be! it's quite the achievement
Thanks!
What do you mean?
you said its your own language
Yeah, it looks like C but it has differences https://github.com/waternine9/bflang
(porting the C++ was a pain)
Main thing to take away is the difference in casting:
byte:someByte = 120;
int:final = cast(int:someByte);
However what made it easier is I removed the compiler, as I only want to interpret the code, not compile it to assembly
i don't think saalty meant to imply that the OS was written in their language, just that they had written an interpreter for their own language
(to be fair, i haven't had a look at the repo)
I meant that the spinning donut is in my language
oh haha that was one of the first things i did too
Nice
Oh I mean I did my spinning donut in my own programming language in the video
is it running in userspace btw?
Yeah 64bit userspace
nice
i think mine wasn't back then
i don't remember lol, haven't worked on my kernel in a while
well i have written a few lines here and there but i've had other projects
Yeah, it's the same with me, I've only recently been putting in work on it
like my fantasy computer for example
i don't think i've posted about it here on osdev yet, might do later on when there is some actual software for it
Nice
currently the only software is a test suite lmao
i wrote an emulator in C++ and i also have a implementation in verilog
verilog one is rather simple, it isn't even pipelined
What is Verilog?
a hardware description language, you design hardware with it
Oh alright.
it's different from something like C
althrough verilog does have C-like syntax
i'm actually surprised i managed to even pull this off within a month. I never did anything in verilog before
Yeah, I've heard of people using it for various hardware projects, I wish I knew about Verilog before designing my breadboard CPU
i mean for a breadboard CPU it wouldn't be that useful i think?
i don't think you can get any easy to build logic out of it
well unless you work with it at the logic gate level
but that takes away basically all the convenience
It was at logic gate level, just used some ICs for memory and that's it
i mean
i guess verilog could have been useful
still easier than putting logic gates together in some software and on top of that you can run your CPU on any FPGA
I wouldn't want to use FPGAs as I was, and still am, designing the PCB for it
I don't intend it to be practical, more of a learning experience
i mean nowadays designing a CPU that is practical is generally hard
it's gonna have to be complicated otherwise there will always just be one with better performance and lower power consumption
and if you make a simple one like this it's gonna be incredibly far from anything useful for anything other than having fun
mine is also just for fun
Welp I don't have to worry about that, I program to attract girls, not practicality
๐
lmao
Progress update so far is I implemented arrays in the interpreter I ported, and working now on debugging APIC and making the NVMe driver interrupt based
How hard would it be to port xorg?
it's hard but not that hard all things considered
the hardest part is probably sockets
Hmm, yeah I would need some sort of networking for it
i wouldn't call UNIX sockets networking strictly
Oh you mean that type of sockets
Yeah, I think it'll be alright to implement
First got to get my NVMe driver and language to a stable point though
i think you want a good working system before you even think about porting something like xorg
you dont have a proper shell yet afaict
Yeah my system is still premature and the shell was lazily done, but it should be easy to polish things up and get everything stable, the main problem is the NVMe driver right now I would say
well do you plan on porting bash or creating your own shell
My own shell
that will take some time then
assuming it isnt literally just looking up a program name then running it
Yeah, I don't want my shell to be nearly as complex as bash right now, maybe later I will port bash
why not as complex as bash?
or maybe not quite as much but typing the name of a program is hardly a shell
you need things like pipes etc
I will add parameter handling and stuff, I am not too sure yet ๐
NVMe driver works fully interrupt based now with MSI-X and APIC, previously I was waiting a constant time by reading from port 0x80
I feel really, really good now that I got that out the way
I knew that was insanity ๐
Lol, that's a bit cursed
yeah lmao
AML is batshit crazy
Alright, I detected the IOAPIC on real hardware
I will take another day break as I am going to be dropping out of high school, and I have to get things sorted out.
you've probably made up your mind but everyone I know who dropped out of high school regretted it immensely
In almost every case it either stunts you for a few years (which is if you get a GED or get lucky) or dooms you to mediocrity for life
If there's any way you can graduate even a little late you should do that instead even if it swallows up a whole summer or something
I almost dropped out at one point and I'm extremely glad that I didn't
my dad keeps telling me to drop out
I incorrectly thought all was lost because even if I graduated my gpa would be so bad that I wouldn't get into even a state university so I thought it didn't matter
I graduated by the skin of my teeth and then found out your HS gpa doesn't even matter because you should probably do your gen eds and lower division major courses at a community college anyway (because it's absurdly cheaper, and they accept anybody, IF you have a high school diploma or equivalent!) and that's all they'll look at when you transfer
Where do you live
scotland
Your dad is silly
he seems to think since i got an internship that i no longer require education
Yeah, I am aware that it can screw a lot of things up, but sadly I don't have options school-wise, as it has been getting harder and harder to do school at all due to severe OCD and ADHD, and I have reached my breaking point. I don't want to go fully into the details, but all I can say is I wish things wouldn't have turned out this way. Today my dad was actually quite excited, because he was going to buy me a new processor because I was going to do my schoolwork after a year and a half. Few hours later I mentally broke down because of that, so I told him to just not buy it. It's quite sad
Well like I said if you live in the US you'll get a second chance at community college no matter how bad you did in HS but only if you get your diploma
College is easier than HS at least in my experience
I live in Canada
It's probably similar
usually its the opposite
hey guys, I will most probably not drop out first of all, second of all I will now be accepting any contributions with open hands while I take a few days to work on a side project
github is here, I will accept PRs that are beneficial to the project ๐
after the break I will continue debugging my interrupt handling
(note, running it wont show much)
What resources does the innovative GPU man use for developing lil igpu library
I have decided that breaks are for losers, and will start making an iGPU driver
Very nice
I highly recommend integrating lil to save you the torture, if youโre sure you want to do it yourself, itโs a tiny bit of intel docs, sprinkled with some Linux code, based on a metric truckload of reverse engineering GOP drivers, fucking around with passthrough for testing, comparing register dumps against Linux, and a bunch of heavy lifting from potentially already existing drm code in managarm and Mesa llvmpipe for the software rendering (eventually mesa hardware acceleration but weโre not there yet)
alright, I will save myself and port lil instead which I hope will be easier
I will have to port it because there is no haswell option last time I checked
alright, I think its most wise for me to just wait
Holy shit, I was using flags or'ed together which were secretly
#define MALLOC_AVAILABLE_BIT 52
#define MALLOC_NO_EXECUTE_BIT 63
This is for page allocation
This might be why APIC is failing
It might not actually disable cache
Nope
BRUH
Now it works
The redirection table entries, I thought the first entry was for ISA IRQ 0
Turns out its second
god I hope this works on real hw
ACPI is utter dogshit, for this next step I need to parse AML. I am not going to
Oh wait, AML is not needed
PHEW
At least my OS boots now
Finally keyboard works now too
Alright, this shit is done, next step is debugging my language interpreter
shit is not done, NVMe driver hangs in userspace
gotta love osdev
this is confusing, NVMe driver handles multiple I/O commands just fine at kernel space
On a side note, the OS is now 7k loc, including kernel and bootloader
Close to being my first ever 10k loc project
That would take too long for some kid who develops at 500 loc per week
I focus on increasing the functional density of code rather than lines
Going to spend more time now on polishing and modernizing aspects of the OS
sometimes I feel like this stuff doesnt even interest me and that I am just a masochist
any updates?
Yeah, sorry I took a 2 week break, I am debugging the NVMe driver right now
My motivation is a sine wave
same lol
if presumably 1 means you're motivated, and 0 means you're not motivated, then what would -1 mean?
you motivate others?
motivated to not do anything related probably
this
I just had -1 motivation again, now should be all motivated though
The problem right now is I am using my NVMe driver in my syscall handler, and I cannot wait for the NVMe interrupt in another interrupt
just suspend the process until its done?
No, that would suck
And what do you even mean by process? It is done in the kernel
you were talking abou syscalls, so I assumed youz have a scheduler sorry
Im just trolling
I need to wait for the NVMe interrupt inside my syscall handler
1,suspend the currently running process
fuck
๐
1, suspend the currently running process
2, go to the next process, if its the only process, go to a dummy waiting thing
3, when the interrupt arrives, do the thing
4, unsuspend the process so it will run next time
You are completely missing my point, I am waiting for the interrupt synchronously. I am calling my NVMe driver many times in my syscall handler for filesystem tasks.
"process" there is nothing process related in what I am doing
I also call my NVMe driver before any scheduler even starts (and it works in this case), but when I call it in my syscall handler called by processes, it is nested interrupts
my point is to exit the handler and do smth else in the meantime
thats basically impossible, as filesystem tasks are not done by a process, its done by the kernel syscall handler
I am so bored
how about creating a separate thread for the nvme driver?
nah that probably wouldn't work
yeah I dont think theres a good way to do that
then maybe do AHCI or ATA instead
who needs NVME in 1923 anyways?
see what I did?
warped back 100 years
i'd probably look at how OpenBSD's nvme driver works, I heard it's (it as in OpenBSD, not the driver itself) is written very well
I dont have words for how stupid what you just said is, I am not giving up on NVMe. If any other OS can do it, I can too
I will find a way
how does NVME work on architectures with no interrupt support?
like interrupts has to be an Intel thing right?
... What?
what
man, if you dont have anything helpful to say, dont say it
btw its useful to have some kind of 'wait for event' function, for things like this. So you can wait on the nvme driver to do its thing.
Also you dont need to have interrupts disabled inside your system call handler the whole time, really just any critical stuff you do at the entry - then it can continue on like any other thread. Meaning you can receive other interrupts, like from devices.
welcome back btw
Oh alright, so I guess I should be able to do a simple sti while waiting for interrupt and then restore the interrupt flag after
yeah that'd work, you'd benefit from making it more generic though
a system call is just an entry to the kernel doing something for a thread
you should be able to switch from the syscall handler, it should be still executing in the context of a process, itโs just that the stack, cs, as and rip arenโt user ones
Yeah, I'd really have to redesign things for that though. I will redesign it later though, I just want to do it quick and dirty for now
why
?
so I guess I should make the syscall add itself as a process, and suspend the process that called it until the syscall is complete.
HOLY SHIT! Thank you!
i said the same thing right after that :p
That is the solution
oh right ๐
nonono
gotta be quick around here ๐
basically when you enter the syscall you donโt do anything special
you just do kernel stuff instead i guess
ugh i am terrible at explaining
even if the hardware does special things like disabling interrupts, you want to return to some kind of normal state - so you can be pre-empted like normal, etc
and iโm not sure what you currently do for syscalls
my syscall is done the old fashioned way, through int 0x80
so ideally it would look like:
- user code performs a syscall
- kernel code starts running with whatever the cpu setup for you
- some critical syscall setup happens
- kernel drops back to normal operating state and continues on with syscall
[ ... normal operation happens ... ] - at some point later the syscall does what it's thing, and returns to the user code.
how you actually trigger a syscall is an implementation detail
and ideally the critical section at the start (time with interrupts disabled) is very small
hmm, I think what I will end up doing is the syscall will do everything purely inside it only if it doesnt require interrupts itself. If it does need interrupts, like in this case, then an OS worker process will be added that will do the things it needs to (the process that called this syscall would be suspended during this time)
so the syscall handler itself will exit right after the worker process is added
one of the other reasons for wanting to keep interrupts enabled (at least imho) is for timekeeping
I mean that as a general comment, not a critique of your idea ๐
yeah, because timers need interrupts to function most of the time
Thanks for all the help man, I will try to get my idea working soon
all good, and good luck
thanks
why?
why not just do it in a thread context
Why would I do it in a thread context
I will be accepting suggestions for the name of this OS
I will give some of my ideas, and will give upvote/downvote reactions to them so you can vote
Sadly I dont have any ideas
I have decided that syscalls will now be processed in their own thread and not inside an interrupt context, to avoid interference with other processes and its safer than nested interrupts
This should be quick to implement
I also think that this is what Windows does
not all syscalls really need that
something like exit basically consists of moving the process out of the queue and then letting waiting threads know it has exited
right, I will only put the handler in a thread if it requires interrupts
like for nvme
yes that makes more sense
yup
SAALTY'S BACK BAYBEEE LET'S FUCKING GO
here's an easy one, (though not necessarily a good one)
S.O.S Saalty's Operating System
ILS - i love salt
wdym?
hey, doubles as a call for help! Good name!
L.O.S.S. Operating System Schematics
hmgmd not happy with this one, but loss lmfao
L.O.S.S. Operating System, Saalty('s)
lmfao
why overcomplicate by spawning new threads, blocking on other threads when you can just do all the work in the syscall handler? if you need to wait for a device (like an nvme drive, though that should be abstracted away obviously) you can simply wait, maybe reschedule, if you don't have an event system you can busy loop (bad) and let the process get preempted, and when an nvme interrupt arrives and the interrupt handler does its job you can break out of the busy loop (BAD BAD BAD) in the syscall handler and proceed
though you really shouldn't have to loop and wait for that stuff in the syscall handler... as i said it should be neatly abstracted away behind some device interface, done through the vfs
so all you should do in the syscall handler is call vfs_read or whatever you're trying to do, and that might block - but that's okay, it will wait for an event that will be raised by the nvme completion handler or whatever, and the thread will be unblocked, vfs_read will return back to the syscall handler and return back to userspace
I dont have a VFS, and I think I will just busy loop as this event system stuff doesnt really interest me. I dont see whats so wrong with a busy loop
because that way you don't give up the cpu time to other threads, instead you just waste it waiting for something
of course instead of busy looping you can just yield
idk why i didnt say that in the example
i have round robin single-processor scheduler, it shouldnt matter
ok let me put it that way, every thread gets its own time slice, and if one thread spends its time slice doing nothing, that's bad
of course you can't control what user programs do exactly, but you should avoid doing that in the kernel
that gives other threads more time to run while you wait for an interrupt to occur
ah whatever, I dont care too much about the performance of this OS, just functionality
if a few threads try to read/write to the disk at once it will also become unusable... so
its nothing crazy, you literally reschedule to another process instead of waiting pointlessly...
its not even an optimization it's something you should do ๐
I will not have multiple disk IO at the same time, it will be purely synchronous
if another process wants to do IO while another process is doing IO, it will be forced to wait through mutex because anything more advanced I am not getting paid enough for lol
IT WORKS YOU FUCKERS, IT WORKS!
๐
Finally!
Now syscalls get cleanly handled in their own thread and I can finally do disk I/O again
Now I have to get back to debugging the OS's script interpreter
and disk I/O is much safer now
We should celebrate this somehow, it took me months to get this working
wine
If I put my OpenGL implementation in the OS, it will turn into a mean 10k loc
Now thinking of whether its worth it to implement SMP... I have it implemented in my old OS, but adapting it to my current OS would be a pain...
I am just REALLY glad I got interrupts for NVMe fully working
The rust crab irritates the shit out of me, just saying
^^^ I agree with that
when implementing SMP you will have to rewrite lots of code just because either it was thread unsafe, either it wouldn't apply to a smp system
designing the os from ground up with smp in mind will result in more reliable and solid code
trust me, I've gone through a no-smp to a smp transition and was a pain to do so
yeah, I guess its staying single core, I am way past the point of the code being flexible enough to allow SMP
I did that transition when I had a full userspace with drivers working
its just too much of a pain
I will get this OS on real hardware again, only thing I need to fix is the APIC/IOAPIC initialization
Everything works on real hardware other than APIC/IOAPIC initialization
I am going to reverse engineer my motherboard's firmware's GOP implementation to hopefully get started on iGPU driver for this OS
seems a bit strange to me to do that now but ๐
isn't the bios encrypted in some way or at least obsfucated? ik that apple does that
firmware**
my motherboard's one isnt encrypted or obfuscated
I am getting logical and reasonable assembly code when disassembling it
then I wish you good luck!
thanks!
I will get to it in 1 hour
if I dont then someone please remind me with ping
AAA instruction perfectly describes how I am feeling right now
AAAAAAAAAAAAAAAAAAAA
im going to take break from re and write a POSIX compat layer
will take 1 week break from this OS to write an x86_64 PC emulator
I think I am burnt out heavily, so I will take a huge break until I feel motivated enough again to work on this OS. Actually in december, I will gain a development team member (who is my friend), so will probably come back in december
Really sorry for all these interruptions in development, I fully intend to keep developing this OS, I just need to get out of burnout
that's okay bud, i'm here for you (probably won't be able to help much cuz i'm very inexperienced), at least as moral support. enjoy your break :)
Thanks! I will try to enjoy it lol
burnt out? mee too lmao
well
no need to repeat what mangomeep said
:0!
Making good progress, and this is actually enjoyable to develop
#ifndef FREESL_H
#define FREESL_H
#ifdef FREESL_FREESTANDING
#ifdef FREESL_MALLOC_IMPL
#define malloc(_Size) FREESL_MALLOC_IMPL(_Size)
#else
#error "freesl: Please provide a `malloc` implementation defined as FREESL_MALLOC_IMPL"
#endif
#ifdef FREESL_FREE_IMPL
#define free(_Block) FREESL_FREE_IMPL(_Block)
#else
#error "freesl: Please provide a `free` implementation defined as FREESL_FREE_IMPL"
#endif
#else
#include <stdlib.h>
#endif // FREESL_FREESTANDING
#include <stdbool.h>
#include <stdint.h>
#include <stddef.h>
typedef enum
{
FSL_TOK_ASSIGN,
FSL_TOK_ADD,
FSL_TOK_SUB,
FSL_TOK_MUL,
FSL_TOK_DIV,
FSL_TOK_VAR,
FSL_TOK_CONST,
FSL_TOK_SWIZZLE,
FSL_TOK_CAST,
FSL_TOK_CALL,
FSL_TOK_MEMBER_ACCESS
} FreeSL_TokenType;
typedef enum
{
FSL_TYPE_INT,
FSL_TYPE_FLOAT,
FSL_TYPE_VEC2,
FSL_TYPE_VEC3,
FSL_TYPE_VEC4,
FSL_TYPE_MAT2,
FSL_TYPE_MAT3,
FSL_TYPE_MAT4,
FSL_TYPE_INT,
FSL_TYPE_CUSTOM
} FreeSL_TypeOrigin;
typedef struct _FreeSL_Type
{
FreeSL_TypeOrigin origin;
size_t size;
// Only if origin is custom
struct _FreeSL_Type* members;
size_t member_count;
} FreeSL_Type;
typedef struct
{
char* data;
size_t size;
} FreeSL_String;
typedef struct
{
FreeSL_String name;
FreeSL_Type type;
void* data;
bool is_array;
// Only if is array
size_t count;
} FreeSL_Var;
typedef struct
{
FreeSL_TypeOrigin type; // Not FreeSL_Type because constants can only be builtin types
void* data;
} FreeSL_Const;
typedef struct
{
FreeSL_TokenType type;
// Only if is var
FreeSL_Var* var;
// Only if is const
FreeSL_Const constant;
} FreeSL_Token;
#endif // FREESL_H
what I have so far
It will support structs too
version 330 will hopefully be mostly supported
At first, it will just directly execute the AST tree for simplicity, but then I will make it compile into my own bytecode
its going good so far
about 50% done the core C interpreter for it that I will build off of
working blazing fast after burnout lol
proof of progress
so I can generate AST for C code now
maybe could make two branches of it, one for GLSL and the other one for plain C
people be porting some C compiler while I make a custom one ๐
I will share progress soon
well, if you've written the code already...
what do you mean?
for this ^
if you've already written some of the code for a c compiler, you might as well write a custom one
even if I had no code for it yet, I would do it because it hurts to port such massive compilers, plus its extra cool kid points to do it all myself
fuck yeah B)
opengl without accelarated graphics? are you on crack?
what do you mean "are you on crack", the performance is not modern but the feature set is
I dont plan to fucking run cyberpunk lmao
Maybe like 10-poly quick demos
no, you're just ignorant
the lexers/parsers are fully done, except one tiny bug which I will fix today
best thing about it, is its for an existing language (glsl) so I can run existing shaders
have you made any other programming languages?
yes I made 5 others
in increasing complexity
this is by far my most complex parser I have ever made
im workingg on a language on the side myself parsers are not easy lol
yeah, its one of the harder things I learned to do, but the key is, is abstracting away the operations on the raw source code as much as possible
I mean, why not? Software implementations do exist.
Ofc it won't be able to run the latest games in real time, but often that's not the only reason one would do that.
Managarm does it too. Your point?
Llvm to the rescue
too massive
You are just straight up calling him ignorant, that's just rude,especially without saying why you did that
You just said "why not?" And then brought in the facts. No "you are ignorant" or "your point?"
699th message
That "your point?" is a bit rude
Don't be assholes
Look at his BIO, he is very depressed right now
My point? It is that you should be like lukflug
Considering that what lolguy said was rude too, I dont get your point here
Depression is not an excuse to be rude as well
plus I dont think calling someone ignorant is very rude, just informs them to look more deeply into what they are saying I guess
Enough of this though, back to my compiler
Parsed this huge ShaderToy shader into an AST tree (no codegen yet).
I got a preprocessor, structs, and much more. (this is the GLSL compiler for it)
no actual openGL functions implemented yet, just decided to start with hardest thing first
also just implemented function overloading
Stop referring to yourself in the third person, you're not fooling anyone.
And people were rude because you yourself were rude with your comment.
the fact that opengl is usually implemented in hardware doesn't make it hardware-only
thats the beauty of it
yeah
plus it can be efficient in software if avx or any kinf of simd is used
basically opengl works with lots of number and matrix operations and those can be accelerated using said simd
I don't find software opengl that bad
I really want to see your implementation run half life 1
I wouldn't have treated the "are you on crack?" as an insult
tbh I never knew OpenGL wasn't hardware-only
then "your point?" isn't either
hm i never knew x86 cpu's weren't hardware only
:)
what about arm cpus? they surely must be hardware only right?
enough mocking around, anything can be implemented in software
didn't think of it this way :p
except touching grass
touching grass is only hardware sadly
Finally I am back
I got the OS working fully on real hardware again just recently, this time with the NVMe driver being interrupt based
Also happy new year guys!
welcome back!
merry new year & welcome back saalty!
i had a look at the github and it doesn't seem like it's been updated in a while, but i'm interesting in having a look at the latest version. i'd like to see if i could get it running on my hardware lol
Thanks guys!
I pushed the latest version just now for you ๐
It will use the first NVMe drive it finds as the filesystem, so make sure you have at least 1 NVMe drive in your computer and make sure you are not using any of them for anything else
You can use this disk image I compiled
What if said drive had multiple partitions?
partition table just gets overwritten probably, it doesnt care about partitions
That sounds like a future issue but you do you
probably not going to be an issue as I am not using my NVMe drive for anything else
also the kernel now uses APIC and IOAPIC for interrupts rather than the old PIC
well... that's gonna be an issue for me, seeing as i've only got a laptop with a builtin nvme drive... with all of my stuff on it
i'll check it out with qemu tho :3
well i cloned the repo and ran make
/usr/bin/ld: /tmp/ccnTGF6I.o: in function `InitTable':
vmalloc32.c:(.text+0x3ba): undefined reference to `__stack_chk_fail'
yeah, you shouldnt run it then
(on your laptop)
that is really weird, it works for me
-fno-stack-protector -fno-stack-check
those flags exist in the c-template for a reason...
alternatively, you'll have to implement the stack protector runtime, which evidently it's not in this case
The stack protector runtime is only like a function and a variable
Pretty useful sometimes
didnt know about these flags, should be fixed now
every OS needs some entertainment, so I am adding a gambling system
it will be a CS-like case opener
well
it draws a white line at the top of the screen, then it quits qemu
qemu-system-x86_64 -hda bin/boot.img -drive file=bin/storage.disk,format=raw,if=none,id=nvm -device nvme,serial=deadbeef,id=nvme-ctrl-0 -device nvme-ns,drive=nvm,nsid=1 -no-reboot -m 4G -smp 1
make sure you are doing this command
lmao what
if you have bad luck it deletes itself
suicide linux vibes
if you get bankrupt then you cannot play the game ever again unless you cheat and put a new balance inside the /sys/gamble.conf file
Nice!
how big does the storage.disk file have to be btw? i just used dd to fill up 5GB
any size
but 128 MiB is recommended
oh okay lol
well the command in the makefile or the .bat file doesn't have "-smp 1", but it still crashes the same way. it gets to draw a white line up the top, then it closes qemu
i don't know much about qemu but i believe there's some debugging built into it? again, i don't know much, but if somebody taught me i'd be happy to provide whatever info is needed
so have you decided on a name for this os yet? ๐
well it's either TheOS or SOS, afaik
hmm, I will try to find whats causing this later, for now I am going to start on the network stack
The name should be uhhhhhhhhhh
god I am indecisive
uhhhhhhhh
Wait thats perfect
Alright, uhhhhhhhh is the name of the OS
Its official
saalty's named OS (uhhhhhhhhOS)
u8h
u8h doesnt seem as funi
yay! finally got a name
yup!
Actually instead of a network stack, I'll implement xHCI for USB mouse and keyboard
More urgent
xHCI docs downloaded, time to grab some popcorn.
grab some tissues, you'll need them when you break down while reading the docs
๐ข
xHCI driver going good, getting nice progress.
Some of it is a lot like NVMe
Which is good
XHCI driver is going amazing so far, 90% of the way to having the xHCI controller fully initialized!
Wow cool
typedef struct
{
uint32_t RunStop : 1;
uint32_t HCReset : 1;
uint32_t IntEnable : 1;
uint32_t HSErrorEnable : 1;
uint32_t Reserved0 : 3;
uint32_t LHCReset : 1;
uint32_t CSS : 1;
uint32_t CRS : 1;
uint32_t EWE : 1;
uint32_t EU3Stop : 1;
uint32_t Reserved1 : 1;
uint32_t CMEnable : 1;
uint32_t ETEnable : 1;
uint32_t TSCEnable : 1;
uint32_t VTIOEnable : 1;
uint32_t Reserved2 : 15;
} USBCMD;
Thank god for this syntax man, this has saved me so much time, I love it, I really love it
I think they are called bit fields
what is that syntax? / what does it do? i've never seen it before
Its where you can specify the size of an integer struct member in bits. So when you access that member, the value of it will be zeroed out after the size in bits (but the next member will still have its value intact). Note that the sign bit is also at bit (size - 1), if the struct member is signed.
do note that bitfields can have weird behaviour
why? and what exactly?
You'll still be loading and storing bytes/dwords/etc as thats how cpus work. If you're dealing with mmio this could lead to side effects.
wouldnt you need to do this anyway?
Wanted to take a moment to thank everyone here who has supported me so far, I am truly grateful. OS development is changing my life in good ways, its just a field like no other I have ever done, and I credit my progress to you guys who have been sticking with me in this journey. Thank you a thousand times โค๏ธ
hey guys, theres not any progress update yet because I am being hit by a wave of procrastination, will try to work more on this now though
sorry about this ๐ข
No problem!
i don't know why but i assumed this was just C, is it C or C++? (or something else entirely?)
its C ๐ everything in the OS is C or assembly
I love C, C is great
Loving C is my fate
I love that char size is always eight
I would go to a different state
Just so that me and C could go on a date
As you can tell, I am tired
I am restless, my mood has expired
I dont know why I am rhyming
At least its for something that is loving
i need an emotional support buddy
aw buddy
My friend is also now working on this OS, and the XHCI driver is now in the debugging stage
This is the project link by the way
XHCI driver is here
or, at least the progress on it ๐
it was never joever,
we're joe back
Indeed... ๐ ?
i'm sorry i'm suffer from extreme mental degradation due to being online
a small translation: welcome back :)
thanks!
and me too, i am just good at keeping my degradation away ๐
we got xhci reset working! we didn't do aligned reads, and the only way we found out that was the issue is by reading source code from qemu
^ ske is the one contributing as well
we did a lot of progress today
The next thing we will likely work on is getting HPET working for a precise sleep function for drivers
(because we need sleep function for xhci)
the ultimate goal is to implement the mouse
i have never heard of an embedded keyboard before
laptop keyboards?
i mean like, laptop keybard
most are ps/2
ok then we can probably use ps/2 as a fallback if there is no usb keyboard
does the bootloader use UEFI or BIOS loading since on all intel processors from 2020 and above do not support BIOS anymore.
that is incorrect btw
intel processors after 2020 can totally support BIOS with an external GPU that supports the legacy video modes needed
the bootloader is solely BIOS-based, but this is not really a concern as my CPU will probably not be upgraded for years
EFI will probably come.. at some point
while it is more fun to develop the BIOS version we'll do that
i think at least that part of osdev is having that enjoyment of doing it yourself
sure whatever you say
i mean of course if you done it many times it's not that interesting, probably will be same for me eventually
it's a hobby because it's interesting
bootloader dev isn't really osdev and it easily detracts from the actual osdev experience if you get distracted
it's also not a super trivial thing to get right, especially if running on real hardware is a concern
Hello everyone, its been long since we last posted but right now I am finally working on this OS again, so right now I am making a driver structure system
I am making a generalized storage driver structure right now, so that we can abstract away the type of storage devices and just have, y'know, storage devices
There will be commands to find what driver a storage device is using, for example
| storage0 - nvme
| storage1 - usb
| storage2 - usb
| storage3 - sata
On the XHCI side of things, we'll probably have to stop using bitfields which will take some time to rewrite all the structure members
Cool to see you're still going
yeah, this must be my only long-term project lol
the goals have definitely changed lol
well what are they now?
## Goals for my OS:
# 1. USB
Currently implementing xHCI.
# 2. Games
I am planning on porting some 3d games to it, with my half-assed OpenGL 3.3 implementation. And will add my GLSL parser/soon-to-be-interpreter to it too
# 3. Compatibility
Not sure about being compatible with existing applications, will probably just make my own format
# 4. Window manager
I will replicate how Android looks, but will add features from PC operating systems, like Windows
# 5. File system
My own custom file system will be implemented (done)
# 6. Driver management
Create a way to generalize/abstract drivers to make the OS cleaner and more modern
@worthy jasper
Oh, and I will make drivers get their IRQ dynamically allocated!
After this will also have to finally make a kernel panic function...
Pushed my latest progress
Coming together very nicely
It was thought to be impossible
Huge things are coming to this OS!
Major update!!!!
The changelog:
- Added a driver manager which can abstract storage devices from their drivers and automatically get their format detected with any of the available Filesystem drivers
- The driver manager accepts StorageDrivers and FilesystemDrivers for now, but once XHCI/USB is finished there will be mouse and keyboard drivers
- Deprecated the IDE/ATA driver
- The codebase got a big cleanup!
- Notably, idt.c is much much cleaner now and doesnt contain the kernel's drawing functions anymore
- The kernel's drawing functions got moved to draw.c/draw.h in the same directory
- The drivers now no longer have their designated IRQ line hardcoded; the driver manager passes the next available IRQ line to a driver if the driver requests IRQ support, which the driver can then hook up to its own IRQ handler
- Added a panic function with its own string formatter, also displays the file which caused the panic
https://github.com/waternine9/untitled-os/commit/3ac5510bf9ee7956b90d07a0e04669bd9c76dc5a
@nocturne shale helped a lot too, notably the string formatter (which I suck at making lol)
Next thing to do right now is rewrite the XHCI driver to not use bitfields, and make commands to list devices and their respective drivers and more file ops
The OS is moved to codeberg because I lost my github account due to its mandatory 2FA
o7
saalty's unnamed OS
Decided to also scrap that name and keep this OS unnamed, until I get a great name idea which might be never lmao
definitely fair tbh
yeah i think there is beauty in anonymity, so its probably going to stay this way
Yeah I think so too! beauty in anonymity
LOL
why not just... get 2FA?
contrary to popular belief you don't need a phone number for 2FA; you can use an authenticator app/device
I don't exactly care that you aren't using github anymore but that is a stupid reason to give it up
thing is, i tried using an authenticator app. And that backfired dramatically when I uninstalled windows and switched to linux, since windows had the original installation with its secret code that i must have in order to login to other devices.
I just want to be able to login painlessly
that's why you keep the backup codes somewhere
eh github stinki and owned by microsoft
Yeah I should've stored them in the cloud, but its whatever. Github is starting to suck anyway, and 2fa is annoying in general.
Been procrastinating recently, like a lot, but this project is far from abandoned for anyone interested in its development.
I still have plans for major features (like OpenGL 3.3 support), and while I cannot predict how long it will take, I can say its coming.
But, first thing to finish right now is USB/xHCI support, which will provide much better support for HID than the PS/2 emulation from the firmware that the OS is reliant on right now.
For example, PS/2 mouse doesnt work on my hardware, which could be because my PS/2 driver is flawed, or because the firmware is flawed. I dont want to spend a lot of time debugging just to find out its the firmware's issue.
Figure 1, graph of my motivation. (x axis being time, y axis being motivation)
Yeah, I feel this.
Same here, but this would be more accurate
oh man, april fools even reaching this server's "serious" announcements
Limine will now be a GRUB fork, in order to benefit from a lightweight I knew it was a joke after reading "lightweight"
but, april fools aside, me and ske will be developing a windows compatibility layer for this OS. (meaning xhci will have to wait for now)
The goal is to support windows 10 notepad
where in particular are you talking about?
drawman.c is probably what you are talking about
I was quite indeed aware of logical or, but I personally think seperating each of those conditions looks more readable
All files
there are only 2 other files that have if statements than can reduce to ||, and there is not much cases of them
for the other files i might reduce them, but the cases in drawman.c are intentional
A windows 10 compatibility layer well all I can say is best of luck man hope you can somehow survive that programming hell since that means you have to support ... windows.h dun dun dun no but for real I feel bad for you for having to remake windows.h.
remaking the early versions of the API is not that bad
COM and OLE are where it's at
He doesn't have to remake windows.h
Programs for windows are already compiled
i think windows.h is the least of your problems if you want compatibility with windows anyway
Well they said they wanted windows 10 compatibility which means they need to be able to reverse every single bit of windows that notepad relays on. And how would they even do that like would they make apps run on the OS itself or on a wine like app.
Notepad probably encompasses a lot of stuff
What else do you think
port Wine 
actually writing all of those functions

isnt it just a bunch of syscalls, dll support, and making some system dlls and making a pe file loader
and I wont have to write windows.h because I will not support compilation for windows programs
To be honest I have no idea about how stuff like that works but it seems like if it were that simple we would see more people implementing Windows apps' support. I could be wrong though
It is
Its just that... Windows has quite a lot
Oh I thought you wanted to be able to like build and run windows apps
I really don't want to sound discouraging and pessimistic and I'm sorry from the bottom of my heart if I do but I mean there's the ReactOS project which has lots of contributors and they've been trying to get Windows stuff to run for years (edit: it does run but it's far from perfect). It's a very ambitious goal what you're talking about
But if you're up for a challenge and don't necessarily aim for something perfect, then that's a fun project indeed, best of luck!
Basic Windows stuff probably isn't that difficult. You could run most 1985-1993 Windows apps within a few months
Yeah, sounds fair enough
But after win95 things take a complication turn
thing is, reactos aims to support much much more than notepad
like browsers
yeah I get what you're saying
there is a guy who made windows xp notepad work in 30k loc of just assembly
so this shows me that its not toooo ambitious
but I am attempting to do win10 which will introduce many complications
but then again, you dont do osdev to do things the easy way.
the thing is that the windows usermode dlls have a ton of functions
I'm thinking I can look at the symbol table of notepad's PE file and just implement the symbols it uses
yeah you can do that, but its still likely a good amount
also one recommendation: don't put nulls into the import address table entries
because that makes it very painful to see which function it called, I did that mistake
its definitely doable dont listen to what anyone says
just go for it
I mean you could target windows 1.0 notepad instead
it would be faster but not as good
faster to make
and run
i think not
I forgot /s
True xp on the other hand
You'd probably have to support both 32-bit and 64-bit DLLs to support modern windows programs
As iirc, some applications use both 32-bit and 64-bit DLLs
Nvm
I forgot that that would be practically impossible
a good chunk of windows programs are 32-bit still though
even ones shipped with windows afaik
Steam 
got it!
exactly
no
This is what I think is the symbol table of Notepad, which doesnt seem like tooooo many things
well, its quite a lot actually
every heard of: objdump
i dont have it
No WSL?
i have wsl but i am lazy
You'd really rather see that garbled mess than type two commands
inspecting notepad in notepad is what god intended
windows/system32/notepad
-x should work iirc
Is notepad stripped?
its divine intervention preventing you from doing such acts, you must use Notepad
llvm-readobj --coff-imports /mnt/c/Windows/System32/notepad.exe```
$ objdump -x ./.var/app/com.valvesoftware.Steam/.local/share/Steam/steamapps/compatdata/1493710/pfx/drive_c/windows/system32/notepad.exe
...
There is an import table in .idata at 0x14000c000
The Import Tables (interpreted .idata section contents)
vma: Hint Time Forward DLL First
Table Stamp Chain Name Thunk
0000c000 0000c0c8 00000000 00000000 0000d208 0000c510
DLL Name: advapi32.dll
vma: Hint/Ord Member-Name Bound-To
c958 253 IsTextUnicode
c968 391 RegCloseKey
c978 398 RegCreateKeyExW
c98c 436 RegOpenKeyW
c99c 446 RegQueryValueExW
c9b0 463 RegSetValueExW
...
inspecting steam proton notepad i see
i think they rewrote notepad
might be less painful to go with the one from before the rewrite
