#Nyaux
1 messages · Page 28 of 1
wait did i miss a convo
no it was in our dms
damn
currently I have gotten it down to:
his computer is haunted
i wanna see an obyaux kernel ngl
I mean I don't feel like writing two kernels alongside each other
or rewriting obos
so he should come work with me on obos :^)
yeah
maybe nyaux should just work on obos instead
not mess with core kernel components
(if hes okay with that)
ye
writing syscalls/mlibc sysdeps can't go that wrong, right?
not mess with the vmm
(not even I'd let myself mess with the vmm)
I mean there is one relatively simple thing in the vmm that could be done
which is updating the swap to disk interface
and it's actually like really simple
you'd just need to reimplement 5 functions
set some function pointers
shite
I never rewrote Mm_ChangeSwapProvider
anyway, I'll stop literring the nyaux thread
come work on my kernel 
wasn't that like nyx/gaia
nyaux without the au
nyaux but not australian
vinix/lyre/whatever copied their sysdeps had xorg very unstable because of one specific mistake on the sysdeps
O_O
what was it
they were passing the timeout to ppoll wrong
actually some sysdeps in obos might translate into multiple syscalls
which require you to like know the kernel in-and-out
like fork
probably will translate to like 10 different syscalls
idk the exact number
1 to fork the current vmm context
1 to create a new process object
2 to make a new thread + one bootstrap function to get the thread in the same state as the thread doing the fork
1 to allocate a stack for said thread
1 to clone the handle table unto the new process
sounds slow
if I did it in the kernel, the only difference is that there would be less switches from ring3->ring0
yeah which is the expensive part of a syscall
lol
youd also save a bunch of syscall validation
honestly just do batch syscalling :^)
io_uring in obos
have any kernels actually done this
u can extend it to do arbitrary syscalls
syscall_uring
what's the man page for io_uring
struct obos_syscall_args
{
uint32_t number;
uint64_t pars[5];
};
void Sys_RunSyscalls(struct obos_syscall_args* syscalls, size_t nSyscalls):```
or even better
use AML
so I can chain syscall results
do not guarantee the order of syscalls
randomise them
genius
or I can be sane and just have a Sys_Fork in-kernel
to save ring 3 -> ring 0 switches when forking
spawn a thread per syscall
and not make a batch syscall mechanism
i mean a kernel worker thread
I'll just design a bytecode mechanism to batch syscalls (not)
run everything in ring 0 and you won't have to do cpl switching
(pseudocode)
NewCtx = RUN_SYSCALL Sys_HandleClone, HANDLE_CURR_VMM_CONTEXT
RUN_SYSCALL Sys_ProcessStart, newCtx, HANDLE_INVALID```
anyway that's enough schizophrenia while doing osdev
(for the day)
5343 packages to upgrade 
I now must go implement PCI
when you forget to upgrade your packages after a week
I'm just upgrading fedora 40 -> 41
tomorrow I have school 
me too 
ofc when I actually want to work on OBOS
school comes
and then after school and homework and shit I'm too tired to work
on OBOS

the only time I'm motivated enough to code is 2-4 am
but I need to sleep
go to sleep
imagine having motivation for osdev
it's called userspace dev in osdev
and being bored of porting shit
the fun stuff lies in your first couple ports and writing the kernel
or just come work on obos
kerneldev is fun
osdev is not
this
Is nyauxmaster Australian?
Irish
Ah
If only someone could properly implement TLB shootdowns and working set in my kernel...
(The kernel is only 15k LoC
)
if only I was working on this kernel with someone
♫ 99 little bugs in the code ♫
♫ 99 little bugs ♫
♫ take one down, patch it around ♫
♫ 137 little bugs in the code ♫
♫ 99 little bugs in the code ♫
♫ 99 little bugs ♫
♫ take one down, patch it around ♫
♫ 137 little bugs in the code ♫
nyaux theme song
♫ 137 little bugs in the code ♫
♫ 137 little bugs ♫
♫ take one down, patch it around ♫
♫ 93,428,471,930,587,234,682,318,095,723,456,932,108,653,294,867,394,583,495,715,902,847,523,905,
♫ 99 little bugs in the code ♫
♫ 99 little bugs ♫
♫ take one down, patch it around ♫
♫ 137 little bugs id♫i♫
♫,g♫ goll ♫♫ behi tepl 3wo9
nt ioutaul♫
ete9h sitttcdno9kch 7ceed ee cu u19e t ond♫tbo sa e a regn tb h
nnli♫tls tdi
somebody forgot to use locks
pthtahchh 9937. ni coSegmentation fault
mmm
Hi guys got a stomach bug rn
I don’t think I can today
Maybe tmrw if it gets better
I hope anyways
Anyways love y’all !!!!
cya tmrw :D
debug your stomach
LMAOOOO
But didn’t we just hear about what happens when you try to do that
someone on the osdev forums helped me spot it
was with the hhdm pages being incorrectly set cause of one stupid fucking variable
it was with the page tables
so
yea
no more vmm region corruptiuon uacpi boots
i will try turning on ksan
ksan still doesnt work
2097152
no :)
anyways i want a break for today i had a really bad mental breakdown cause everyone was making fun of me in valorant earlier and i was crying and stuff
im not in the mood to do much rn
tmrw ill work on scheduler
sorry timers*
then smp then scheduling
ykyk
i know its stupid to cry over some people on valorant but
they were
take time for yourself pls 
really fucking mean
they said a lot of things, they even found my parents facebook
and made fun of my family
and they were like
thats fucked
yea
yeah they're giant assholes
thanks
sorry you had to go through that
people on valorant are actually horrible people
@kind root
cool
yea
are u like mad at me or anything (sorry if this is a stupid question)
i just wanted to make sure
nah
okay thats good that ur not mad
either way going forward nyaux wont be stuck anymore
and i hope to reach bash soon
why am i so sure? because im not going to make the same mistakes i did last time
ive learned from my hell
thats good
average valorant player
had a similar experience once but i only witnessed it, it wasn't directed at me but my friend, there was this guy on our team and he was so bad everyone just kept flaming and insulting him but for some reason he decided to bully my friend lol
he found my friend's ig and tried finding more info but just ended up embarrassing himself, said he'd type some fucked up stuff to her mom but ended up doing nothing, later i found his discord and it turned out he was selling some shitty minecraft hacks to 12 year olds or something lol
i kinda wanna steal the linux hashmap implmentation
cause i cant find any good hashmaps that work well in a freestanding c enviorment
thank god i can use the bsd 2 clause
what do u guys think
just make your own 😎
nah im too lazy for that 😎
nah ima steal it :)
WAIT
FACEBVOOK
fucking facebook
yk what
ill make my own
:)
idk about good
but I found some hashmap library online
and did some stuff to make it work
freestanding*
lemme see
i think ill just make my own
and it depends on this
forgot about hashmaps
ill just use a 2d array
no nvm
ill just use a slow linear array
idfk
anyone have the elf spec for x86 64
all im finding on google is i386
(32 bit)
man elf
i am not using man pages
cause i swear to god there was a better spec
that was for x86 64
and shit
idfk where that spec has gone

the linux manpage is pretty complete
enough to make a loader
wdym, the sysv abi?
yea
for x86 64
describes everything abt elf
all im seeing is this garbage 32 bit specs
there was like one like this but for x64
i mean the differences between loading a 32-bit elf and a 64-bit elf aren't that huge
id still rather have the proper spec
i found this "spec" but its not rlly a pdf and more an ugly webpage
it is the proper spec thjo
ima just install dark reader cause this hurts my eyes
and read this one
Just do a hash map
no bro i made a shitty hashmap in userspace
Oh good
IT WAS SHITTY AND LIKE IT had corruption issues or something some keys went to 444????
and i cant get any library one working cause like
my free takes in size
as well
and i tried to modify the library but
didnt rlly work
Valgrind time
Probably worth fixing that too
how
???
i need size4\
how tf will i know then
hmmm?
how will i know if i should use my slab allocator or my vmm region allocator
metadata
it shouldn't be that difficult to make your code remember the size to pass to free
it's not necessarily wrong to require that imo
considering it's not a stdlib free
wish C++ could somehow make operator delete[] take a size
yea i have the slab metadata in the start of the page but idfk if i can trust just checking if theres a reasonable slab metadata entry at the start of the page
i think that's a thing?
I think you need to pass the size explicitly
I guess that’s fair
Though articles on implementing malloc are a dime a dozen
why do you want one
what is your use
ah TIL
in the past you needed -fsized-deallocation for clang
maybe I'm mixing it up with delete[] though?
but it seems that it's not necessary nowadays (at least on trunk)
eh you could just use a binary search tree for that
function name and address of the starting function
An in-depth explanation on how we can implement hash tables in pure C. The article covers the following topics: hash functions, separate chaninig and open addressing
An explanation of how to implement a simple hash table data structure, with code and examples in the C programming language.
not really? just sort the array by address and you can do a binary search on it
im good man
can sort it when generating instead of at runtime
These were the first two articles I found
i know how they work
yeah but that's not a real BST 
wanna see my shit impl?
do this tho
yeah but you also don't need one :^)
that's simple
:^)
my shit hashmap impl
(I have no idea what those are i just know they are complex (and used by xfs))
Pastebin.com is the number one paste tool since 2002. Pastebin is a website where you can store text online for a set period of time.
Time to implement a database from scratch to learn 
might try doing XFS one day
select name from symbols where starting_address=$0
just link sqlite into your kernel for this
:^)
anyways im going back to writing elf structs like a dumb loser
not a bad idea
would be doable

isnt there a mainstream kernel that does that tho
Just don’t use it for satanism
I vaguely remember Windows linking it or something, not sure if it was in the kernel
oh come on
bro
What
dw about it
btw this is wrong in many ways
I KNOW ITS FUCKING 4AM
you should read the tutorials chicken sent honestly
would help
im fine
i dont need no hashmap
ill do a binary search or whatever tf
there
oh ok
dies\
why
cause like my hashmap was shitty
anyways its 4am
i think i go sleep
Also some of those are supposed to be signed
you're not handling collisions first of all
oh
yea ik
whats the second thing
and yeah the problem is likely collisions
yea
ok ill redo the hashmap from scratch with the tutorials
tmrw
NOW WISH ME GOOD NIGHT 😡
i go eep
@cinder plinth 😡
what
gn
gn
what happened to rust 
ub
it turns out writing unsafe rust like c is not a very good idea
you shouldnt use modulo
uint64_t hash_to_index(uint64_t hash, uint64_t size) { return (((uint64_t)(uint32_t)hash) * size) >> 32; }
The compiler will optimize it anyway
no it wont
because this is a different algorithm
lol
it does a slightly different thing
it still uniformly distributes the hashes
but it saves a division which is good
and it lets you use prime sized hash tables
Ok I shall do that too then
good
is using that with a 64-bit hash worth it tho if you just discard the upper bits?
or well ig the hash is still better?
first, a 64 bit hash isnt that much more expensive
also, you use it to accelerate the equality check
that's just a mixer function btw
not a complete hash function
you should totally embed xxhash
come on bro just one more dependency
yeah of course
or wyhash or murmurhash3 or something else
or siphash
I use murmurhash2a
/*
MurmurHash2a, by Austin Appleby
*/
uint64_t murmur_hash(const void *key, size_t len, uint64_t seed) {
const uint64_t m = 0xc6a4a7935bd1e995LLU;
const int r = 47;
uint64_t h = seed ^ (len * m);
auto data = (const uint64_t *)key;
const uint64_t *end = (len >> 3) + data;
while (data != end) {
uint64_t k = *data++;
k *= m;
k ^= k >> r;
k *= m;
h ^= k;
h *= m;
}
auto data2 = (const unsigned char *)data;
switch (len & 7) {
case 7:
h ^= (uint64_t)(data2[6]) << 48;
case 6:
h ^= (uint64_t)(data2[5]) << 40;
case 5:
h ^= (uint64_t)(data2[4]) << 32;
case 4:
h ^= (uint64_t)(data2[3]) << 24;
case 3:
h ^= (uint64_t)(data2[2]) << 16;
case 2:
h ^= (uint64_t)(data2[1]) << 8;
case 1:
h ^= (uint64_t)(data2[0]);
h *= m;
default:
break;
};
h ^= h >> r;
h *= m;
h ^= h >> r;
return h;
}
just one more dependency
400 dependencies later
400 dependencies
did you mean: a rust hello world?
hey sorry ive been busy all friday
parents took me on a trip
we went to the cinema
!!!
well they dropped me off at the cinema
and then we had kfc
and then we went to the park
was fun
ill work on nyaux later today!
glad you had fun! 
but how does that work
I AM SO SORRY GUYS BUT SCHOOL
I STUDIED
ALL DAY
CAUSE I MISSED SO MUCH SCHOOL
😭

oki i work on hashmap now
some of the math was complicated but im guessing u have these things called "buckets" that u index into with the hash and if u treverse the linked list to find ur value pair right?
i dont understand the growing part however
like do u just add another entry
if u have a collission
how many buckets should u have?
are u able to create MORE buckets?
so many questions
Well ideally one per value
when do u make more
When too many collisions
okay
i can have a collission counter
if it reaches 10
ill create a new bucket
good design?
U can always adjust the algorithm later
whats the better algorithm
true
not funny
do a linked list for now
you can do a fancy tree later
might use a rbtree for mine
simple bst is fine tho
is it my fault my brain is stupid
seriously
Huh, there are rb trees in hash tables?
and i dont spam
For what purpose
who said i spammed infy
finding a key in a bunch of buckets
No one, I was making a general joke
i didnt find it funny
Is hard to make a joke everyone would find funny
fair
U only search one bucket because u know the hash tho
can u apologise though cause i kinda felt like it was making fun of me
Eh sure sorry if that sounded offensive to you
oki forgiven
instead of linking buckets in a list you use a tree
Ah, I think you're using the word bucket incorrectly
maybe
Bucket would be one singular tree in this case
So efficiently finding the value if there are collisions so a lot of them end up in the same bucket
Makes sense
A bucket is just like a data structure to store values that matched a specific hash, a linked list usually for a simple implementation
Ye
All depends on what sort of values and how many of them u want to have
Sometimes u literally make a dynamic array + linear search and that ends up being faster
im just gonna do seperate chaining for now
yeah because
cache
Basically yeah
ill keep a variable of how many key value pairs are in the hashmap, if it exceeds a number
Especially for small objects
ill add another bucket
it's like hashmaps
they are O(1) best case but that 1 can be slow
so trees might be better in theory
but not in practice
i think this is better
Yeah I mean 1 just means its the same amount of time for any N, but the baseline can be very slow
Yes
yea
like a dynamic array
if size >= capacity { capacity *= 2}
please dont ruin your schooling with osdev lol
what did you even need a hashmap for
exactly
function name and address pairs
yea
you don't need a hashmap for that tbh
exactly
if you sort them you can just binary search them if you want it to be slightly faster
but like no need for a hashmap
yea
broski
ah yes
section header with type 1235125125125
elf signature is correct
like sir
???
lol
okay
my suspesion is that
the calculation for the seciton in the for loop is wrong
which i dont understand
???

(Elf64_Shdr *)hdr + hdr->e_shoff
you are doing that
but i wrapped it under parenthises?\
i CAN SPELL
CANT
😭
wait yeah my bad I were looking at the git code, didn't realize the image had different code nvm, it wasn't even the same line
ill push it to git
also that's not what I meant, I meant the first line
Quicksort is an efficient, general-purpose sorting algorithm. Quicksort was developed by British computer scientist Tony Hoare in 1959 and published in 1961. It is still a commonly used algorithm for sorting. Overall, it is slightly faster than merge sort and heapsort for randomized data, particularly on larger distributions.
Quicksort is a divi...
okay i got it working through a bubblesort
@kind root look!!
^^^
congrats
timers then scheduler
then vfs and file systems
then userspace
yippie!

Heapsort 
damn nyaux being worked on
good stuff
meanwhile i got a bit sidetracked and i'm building a language with a friend and i'll probably use it to write yet another kernel 
what does the language look like?
the syntax looks kind of like pascal with begin/end for blocks and an interface/implementation thing, though interface is implied and right now we're lacking any sort of class concept/object oriented programing but i think we might just add UFCS and call it a day
it's not really well thought out and we are improvising :^)
arr.sort((a, b) => a < b)
sorted binary tree
bubblesort my beloved
Do insertion sort, it's a lot faster and still simple
You can't even recognize what bubblesort looks like
umm no
this is bubblesort
😡
i understand bubblesort very well
because it is easy
quicksort is easy too but
i made it poop my array
and im too lazy to debug that
bubblesort is lit 2 for loops
lol
😭
uhda on nyaux when 
uhda is out?
ill unironically use it if it was ready for use
not at this stage tho
well it works as far as I have tested but its only like 3 machines along with qemu, Ill have to try fixing some kind of bug on my astral oss impl so I can make a proper test image
not at this stage but whenever i reach the point where i am able to run a good amount of userspace programs (bash, binutils, etc) ill port in uhda
it wont be long now
few more weeks
timers -> scheduler -> timers -> vfs -> tmpfs -> dev devices -> elf loading -> -> driver loading -> xsave/fpu shi -> syscalls -> mlibc -> bash
-> more syscalls -> more and more syscalls -> unix signals? -> uhhhh
doom port ig?
wait I forgot something
yep
Bogo sort
Miracle sort
I shall port it
it will be my sidequest today
ok maybe not today
one day my OS will play pink floyd tho 😎
I mean you can always download + convert it to raw pcm using ffmpeg and then use it as a kernel module + play it inside the kernel 
that's basically what I do for testing it
yeah I know
but I cba to port uhda rn
I should probs port uacpi first
what I plan on doing is just a /dev/audio
then cat a file to it
and the uhda_kernel_pci_allocate_irq i'm not sure how to do
well it's basically just supposed to setup msi/msix/legacy irq for the device and wire it up to some cpu vector (that then calls the provided handler fn with the arg when it occurred)
maybe I should document them better
also not all of them are really necessary if you don't plan on disconnecting the device like the irq deallocate function
ok so it should be easily portable
what about uhda_kernel_pci_enable_irq?
is that just a sti
it's for the pci device's irq (msi/msix/legacy irq enable bit)
its also not really necessary if you enable the irq already in the pci irq allocation function
uhda = subproject('uhda')
uhda_sources = uhda.get_variable('sources')
my_kernel_sources += uhda_sources
uhda_includes = uhda.get_variable('includes')
my_kernel_includes += uhda_includes
btw
why didnt you just declare a dependency
it could probably be made a dependency too, idk how would that work with the compilation flags tho (and this is also what uacpi does)
should work fine
uhda = declare_dependency(sources: blabla, include_directories: blabla)
then you can just do something like dependency('uhda')
maybe I should try that, as long as the compilation flags are inherited from the parent project then that would be easier to use
then you just find all the files and add the include dir manually the same way you do for uacpi
i have a question
for allocating an irq what does that mean?
im so confused
and uacpi right wants to install an interrupt handler?
i have to allocate an irq?
but what does that mean
and how does that work

also unrelated but nyaux device file icon concept
idfk
but still what does this mean 
Interrupt vectors are a resource, like memory
do you have device files yet :p
soon ™️
Some are available for use, some are in-use by things. So if you need a vector for a device to send you an interrupt, you allocate it. Installing an IRQ handler just means "hey call this function when the interrupt is fired"
okay i see
also btw if yall forgot
nyaux logo
never forget
😡
anyways im gonna make install interrupt handler and uninstall
allocating them
and give them to uacpi to use
for whatever tf it wants
AFTER I SLEEP
CAUSE I DIDNT SLEEP
YET
AND ITS 7AM
💀
ive been awake all night
i was working on the hpet anyway
which works btw!!!
lapic timer AFTER i get irq allocation shit
then scheduler then vfs then tmpfs then device files and yada
Yeah you should sleep, make sure to look after yourself
@kind root i have a question, uacpi_interrupt_handler doesnt take stackframe directly so it would not be able to be installed. what do i do 
also what is ctx
??
is passed to the provided handler for every invocation???
huh
i want to impl this
and what am i supposed to do with handle a firmware request
you don't need to do anything there
just return uacpi_status_ok?
you make a wrapper function
for the interrupt, if your interrupt handler functions use a different format
mhm like taking a stackframe
yes
what next?
?
well eg. if your interrupt fn is of the form c bool irq(void* arg, irq_frame* frame); then you have some kind of wrapper eg. ```c
typedef struct {
uacpi_interrupt_handler fn;
uacpi_handle ctx;
} uacpi_irq_wrap_info;
bool uacpi_wrap_irq_fn(void* arg, irq_frame* frame) {
uacpi_irq_info* info = arg;
return info->fn(info->ctx) == UACPI_INTERRUPT_HANDLED;
}
uacpi_status uacpi_kernel_install_interrupt_handler(uacpi_u32 irq, uacpi_interrupt_handler handler, uacpi_handle ctx, uacpi_handle* out_irq_handle) {
uint8_t vec = idt_allocate();
uacpi_irq_wrap_info* info = kmalloc(sizeof(uacpi_irq_wrap_info));
info->fn = handler;
info->ctx = ctx;
*out_irq_handle = (uacpi_handle) info;
register_irq_handler(vec, uacpi_wrap_irq_fn, info);
io_apic_register_isa_irq_or_gsi(irq, vec);
}
so i gotta make my interrupt handlers take in a void *arg as well
okay
also whats with io_apic_register_isa_irq_or_gsi for? why are we doing that
and whats with register_irq_handker taking in info?? huh
its the void* argument
ummm
you don't have to do it exactly like this, it was just an example
i have an array of function pointers like this
how is that gonna work
to put something in void * how will the assembly stub code know
the irq that uacpi gives is usually an isa irq for which there can be an override if you use the io-apic, if using pic then you just use that pic irq
okay i get u there
void *isr_ctxt[256];?
oh okay
then mov isr_ctxt(%rip + %rax * $8), %rsi assuming it's the index is in rax?
ill have it uacpi_irq_wrap_info *blahblah[256]
i can do it in c
cause it can be a global var
so no need
why? its not uacpi specific
what should it be then
void*
okay
then the drivers and whatever can put anything they want in there
you should start at 32 as 31 is reserved, idk if it's actually used by anything tho
okay
looks good?
also thanks for catching that
except for the sharing of interrupts yes but you likely don't need that to start with
sharing of interrupts?
there can be multiple devices sharing the same interrupt pin
that bad or good?
well its bad because then you have to allow installing multiple irq handlers for the same idt entry + then when you actually get that irq you loop through the handlers until you find one that acknowledges the irq (and the handlers have to check if the device/other thing they are for actually generated it or not)
but i dont do that
its a thing you run into especially with eg. legacy pci interrupts, there are only so many pci interrupt pins
lol
neither
its just a thing that exists
u only have e.g. 220 idt entries per cpu
there can be e.g. a thousand devices generating interrupts
okay then
how do i know when i should allocate a cpu idt entry for a handler
or
use some same idt entry
??
well generally never
what
the way it works in linux for example
it has a per-cpu structure of available idt slots
when something wants a slot, it loops through cpus, find the one with least slots occupied, and allocates one out of that
and what if u have thousand of devices
generating interrupts
and u dont have enough
idt entries
if u have thousand of devices
u probably have a lot of cpus
so u get 220 * num_cpus slots
some devices still share the same physical origin, so u have to have multiple listeners on a slot
basically u have to think of this as detached things
idt entry is not the same as the irq origin
as irq can always be redirected anywhere
but the same irq can only be redirected to one place
you can keep a list of handlers for each idt entry or whatever
nvm that reply lol, it wasn't related to that
well linux does return -ENOSPC
so request_irq just fails
u can easily reach this limit if u have a lot of virtio devices
because it does a per-cpu queue
so per-cpu irq
so after about 200 virtio devices you're done
yea i get u on that which wont be for me to worry about
all i need to do is
have a cpu struct of
how much entries i have allocated
and such
u need to care about this if u want to support legacy pci interrupt routing
because that only has 4 irqs for all devices on the system
should i care about this??
probably not
okay
no i dont wanna support pci with no msi
that comes from
late 90s rihgt?
right*
if so im not doing it
kinda
yea okay
u can do lspci -vvv on your pc
and see what has MSI and what doesnt
it would look like:
Capabilities: [40] MSI-X: Enable+ Count=64 Masked-
Vector table: BAR=2 offset=00000000
PBA: BAR=2 offset=00000400
which i dont care
thinking about this I realized that in my kernel I do it incorrectly
I allocate a new cpu irq vector for each pci device using a legacy irq and then install it for the io apic gsi, ig Ill have to first check if the io-apic already has a configured entry for that and if yes then get the vector out of that + reuse it before allocating a new one
bruh
okay what im going to do for now because i dont have smp yet
do the same thing but pretend u only have one cpu
this is the thing i was talking about
yea i see
dw ill figure this out and change this around as i get smp working
for now
im just gonna
get this working
oh and do i put anything into out irq handle
well its a thing u use to identify this specific irq if its ever uninstalled, so up to u
can i just put a number in it

ill put the vec that was allocated
when i uninstall
ill allocate a int on heap
set it to vec
make the ptr in the handle
no its the actual io-apic/pic irq you have to configure
uh huh
lol
??
yea i havent written code for the ioapic yet lol
u cant just ignore the irq number lol
well you don't need that function at all unless you want events
if u have rebased pic its just 32 + irq
no i dont have pic
im not doing pic
ill write ioapic soon
for now
ima just install the handler
whichll do ABSOLUTELY nothing
but eh
lol

maybe mark your printf with __attribute__((format(printf, 1, 2)))
nah its okay
or gnu_printf if clang
trust
and
im not making it so im required to give at least 2 parameters
oh
at compile time
gnu_printf
printf works too
not on clang
yea that works
works just fine
idk i remember it not working for some reason, i have these ifdefs everywhere
;compile cclang_trunk ```c
attribute((format(printf, 1, 2))) void d(const char* fmt, ...) {}
int main() {
d("%d");
}
<source>:3:9: warning: more '%' conversions than data arguments [-Wformat-insufficient-args]
3 | d("%d");
| ~^
1 warning generated.
maybe someone else can enlighten me
actually no
#ifdef __clang__
#define UACPI_PRINTF_DECL(fmt_idx, args_idx) \
__attribute__((format(printf, fmt_idx, args_idx)))
#else
#define UACPI_PRINTF_DECL(fmt_idx, args_idx) \
__attribute__((format(gnu_printf, fmt_idx, args_idx)))
#endif
the other way around
works on gcc
gnu_printf is the gcc way
yeah warning: format ‘%d’ expects a matching ‘int’ argument [-Wformat=] on gcc with format(printf
yea so it works
so do both work or
;compile
__attribute__((format(printf, 1, 2))) void d(const char* fmt, ...) {}
int main() {
d("%d");
}
No output.
nvm
didnt seem to do anything
;compile -Wall -Wextra
<source>: In function 'd':
<source>:1:58: warning: unused parameter 'fmt' [-Wunused-parameter]
1 | __attribute__((format(printf, 1, 2))) void d(const char* fmt, ...) {}
| ~~~~~~~~~~~~^~~
<source>: In function 'main':
<source>:3:9: warning: format '%d' expects a matching 'int' argument [-Wformat=]
3 | d("%d");
| ~^
| |
| int
;compile cclang_trunk
__attribute__((format(gnu_printf, 1, 2))) void d(const char* fmt, ...) {}
int main() {
d("%d");
}
<source>:1:16: warning: 'format' attribute argument not supported: gnu_printf [-Wignored-attributes]
1 | __attribute__((format(gnu_printf, 1, 2))) void d(const char* fmt, ...) {}
| ^
1 warning generated.
maybe because new gcc
Text is just fancy numbers
it is
text is unfancy numbers
105 110 102 121 32 97 110 100 32 111 98 101 114 114 111 119 32 97 114 101 32 109 97 100 101 32 111 102 32 112 105 122 122 97
Cringe decimal ascii
😡
@hexed mango 69 20 6C 6F 76 65 20 69 74 61 6E 69 74 75 6D
@frigid cliff zoe i hope u become soggy pizza thats left in the microwave
Ok well it’s in all caps
🍕
sometiems pizza tastes better the next day ngl
L take
L take
Maybe you need to burn me at the stake but it’s true
chat, force her to use nyaux as her daily driver
ok what is your fav food
Idk
capital punishment
As long as it can run gcc and write and save code
worse then death penalty
soon 
if u stop playing val
What rank are you even
play cs instead
i didnt even play today i focused on osdev today thank you very much
😡
its like valorant but without the cringe abilities
I like valorant more
skill issue
Cs ranking sucks tho
u have faceit
whats cringe is ur mega skill issue
which is also kernel level anti cheat