Could I swap Ubuntu's or Android's kernel with this, while keeping those OSes bootable?
It might seem obscure, but syscalls to get access to kernel requires a tight integration on compilation and linking. So this is their approach and this is where the compatibility really means something : since you can cross compile on another machine, they don't need the full toolchain right away. Just compile your code on a linux machine, and run it there. You're at the mercy of all missing kernel API implementations, but it looks like a very good strategy if you aim is to code a kernel, as you only have to focus on actual syscalls implementation without getting distracted by toolchain.
Receiving a gift does not confer obligations on the recipient.
People can license their code however they please, but comparing open source software to a gift is not an argument for permissive licenses.
Anyone can write Photoshop (provided reasonable resources). The problem is going to be proprietary file format and compatibility with the ecosystem. It's same with hardware, except several orders of magnitude worse.
https://www.kernel.org/doc/html/v4.10/process/stable-api-non...
Per your link
> Note: Please realize that this article describes the in kernel interfaces, not the kernel to userspace interfaces.
What's the threat? Solaris/Illumos, the BSDs, even Windows, have all tried -sometimes more than once- to be compatible with the Linux ABI, and in the end they've all given up because the Linux ABI evolves way too fast to keep up and is underdocumented. Someday someone -perhaps TFA- will succeed in building momentum for a well-defined and highly functional least common denominator subset of the Linux ABI, and that will be a very good thing (IMO) regardless of their choice of license.
I guess you imagine that everyone will switch to Moss and oh-noes!-everyone-will-be-free-to-not-contribute-back!! So what?
I have to say the GPL trolling in this post is some of the worst I've ever seen on HN. Literally 99% of the comments GPL trolls coming in and thread shitting everywhere. It's genuinely disgusting.
Also, are there any opportunities to make this kernel significantly faster than Linux’s?
A more concrete mid-term goal is for it to be 'self-hosting'. By that I mean you could edit the code, download dependencies and compile the kernel from within Moss.
- Moving away from the too-small 4kb default page size (while having a good strategy for dealing with fragmentation)?
- Make it easy to minimize/track interrupts on a core, for low-latency contexts
We've seen this movie before with the BSDs. Hardware vendors love permissive licenses because they can fork, add their proprietary HAL/drivers, and ship a closed binary blob without ever upstreaming a single fix.
Linux won specifically because the GPL forced the "greedy" actors to collaborate. In the embedded space, an MIT kernel is just free R&D for a vendor who will lock the bootloader anyway.
I mean, this is not different from bitching about someone writing their custom kernel in C++ instead of Rust, or Zig. It’s not your project! Let people do their own thing! MIT is a perfectly fine license; maybe the lack of zealotry associated with it would even be a positive thing for whatever community might be built around this eventually, if the author is even interested in having other contributions.
Linux rather famously has avoided the GPL3 and is distributed under a modified GPL2. This license allows binary blob modules. We are all very familiar with this.
As a result, the kernel that matches your description above that ships in the highest volume is Linux by a massive margin. Can you run a fully open source Linux kernel on your Android phone? Probably not. You do not have the drivers. You may not pass the security checks.
Do companies like Broadcomm “collaborate” on Linux even in the PC or Mac space? Not really.
On the other side, companies that use FreeBSD do actually contribute a lot of code. This includes Netflix most famously but even Sony gives back.
The vast majority of vendors that use Linux embedded never contribute a single line of code (like 80% or more at least - maybe 98%). Very few of them even make the kernel code they use available. I worked in video surveillance where every video recorder and camera in the entire industry is Linux based at this point. Almost none of them distribute source code.
But even the story behind the GPL or not is wrong in the real world.
You get great industry players like Valve that contribute a lot of code. And guess what, a lot of that code is licensed permissively. And a lot of other companies continue to Mesa, Wayland, Xorg, pipewire, and other parts of the stack that are permissively licensed. The level of contribution has nothing to do with the GPL.
How about other important projects? There are more big companies contributing to LLVM/Clang (permissive) than there are to GCC (GPL).
In fact, the GPL often discourages collaboration. Apple is a great example of a company that will not contribute to even the GPL projects that they rely on. But they do contribute a fair bit of Open Source code permisssively. And they are not even one of the “good guys” in Open Source.
This comment is pure ideological mythology.
Not true. Yes, companies choose not to contribute, so they discourage themselves. It's not inherent to the GPL.
Probably not, but possibly yes. Which is more than the cuck license guarantees. See postmarketOS and such, which would be impossible in a BSD world.
>The vast majority of vendors that use Linux embedded never contribute a single line of code
It doesn't matter. The point is just that they can be legally compelled to if needed. That is better than nothing.
>The level of contribution has nothing to do with the GPL.
None of this would be feasible if linux wasn't a platform where the drivers work. They wouldn't have worked on the linux userspace in the first place if it didn't have driver support: it wouldn't be a viable competitor to windows and the whole PC platform would probably be locked down anyways without a decent competitor. Permissive software is parasitic in this sense that it benefits from inter-operating in a copyleft environment but cooperates with attempts to lock down the market.
LLVM was made after GCC and is designed with a different architecture. It is apples and oranges.
Apple is a great example of a company that is flooding the world with locked-down devices. Everything they do is an obstacle to general purpose computing. What do they meaningfully commit to the public domain? Swift? Webkit? It is part of a strategy to improve their lock-in and ultimately make collaboration impossible.
It's obvious Sony is keeping certain drivers closed source while open sourcing other things, and why Nvidia decided to go with an open source driver. It's not hard to understand why, it could be some pressure or a modified GPL2.
But then LLVM showed up and showed it is no longer imperative to have a viral license to sustain corporate OSS. That might've not been possible without the land clearing GCC accomplished, but times are different now and corporations have a better understanding and relationship with OSS.
The GPL has enough area to opt out of contributing (i.e. services businesses or just stacking on immense complexity in a BSP so as to ensure vendor lockin) that it isn't a defining concern for most users.
Therefore I don't think Linux' success has much to do with GPL. It has been effective in the BSP space, but the main parts most people care about and associate with Linux could easily be MIT with no significant consequence on velocity and participation. In fact, a lot of the DRM code (graphics drivers) are dual-licensed thusly.
I am not sure I remember everything right, but as far as I remember Apple originally maintained a fork of gcc for its objective-c language and didn't provide clean patches upstream, instead it threw its weight behind LLVM the moment it became even remotely viable so it could avoid the issue entirely.
Also gcc didn't provide APIs for IDE integration early on, causing significant issues with attempts to implement features like refactoring support on top of it. People had the choice of either using llvm, half ass it with ctags or stick with plain text search and replace like RMS intended.
The authors almost certainly gave a bit of thought to their choice of license. The choice of license is a "business choice" that has to do with the author(s)' goals, and it is a choice best seen as intending to achieve those goals. Those goals can be very different from your own goals, and that's fine! There is no need to shame TFA for their choice of license, or implicitly for their goals as opposed to yours.
How do we know that? It seems to me that a greater factor in the success of Linux was the idealism and community. It was about freedom. Linux was the "Revolution OS" and the hacker community couldn't but fall in love with Linux and its community that embodied their ideals. They contributed to it and they founded new kinds of firms that (at least when they began) committed themselves to respect those principles.
I realise the memory of Linux's roots in hacker culture is fading away fast but I really do think this might have been the key factor in Linux's growth. It reached a critical mass that way.
I'm quite certain of the fact that this was more important anyway than the fact that, for instance, Linksys had to (eventually! they didn't at first) release the source code to their modifications to the Linux kernel to run on the WRT54G. I don't think things like that played much of a role at all.
Linksys were certainly kind enough to permit people to flash their own firmware to that router, and that helped grow Linux in that area. They even released a special WRT54GL edition to facilitate custom firmware. But they could just as easily have Tivoised it (something that the Linux licence does not forbid) and that would've been the end of the story.
What have you done?!
hexagonal-sun•2mo ago
For the past 8 months, or so, I've been working on a project to create a Linux-compatible kernel in nothing but Rust and assembly. I finally feel as though I have enough written that I'd like to share it with the community!
I'm currently targeting the ARM64 arch, as that's what I know best. It runs on qemu as well as various dev boards that I've got lying around (pi4, jetson nano, AMD Kria, imx8, etc). It has enough implemented to run most BusyBox commands on the console.
Major things that are missing at the moment: decent FS driver (only fat32 RO at the moment), and no networking support.
More info is on the github readme.
https://github.com/hexagonal-sun/moss
Comments & contributions welcome!
bramadityaw•2mo ago
Rochus•2mo ago
kaoD•2mo ago
An executor (I think this is what you meant by runtime) is nothing special and doesn't need to be tied to OS features at all. You can poll and run futures in a single thread. It's just something that holds and runs futures to completion.
Not very different from an OS scheduler, except it is cooperative instead of preemptive. It's a drop in the ocean of kernel complexities.
rcxdude•2mo ago
Rochus•2mo ago
boguscoder•2mo ago
rcxdude•2mo ago
Rochus•2mo ago
EDIT: just found this source which explains in detail how it works: https://os.phil-opp.com/async-await/
vlovich123•2mo ago
kaoD•2mo ago
To reiterate: an executor is just something that runs Futures to completion, and Futures are just things that you can poll for a value.
See sibling comments for additional details.
vlovich123•2mo ago
Anyway - as I said. Implementing even a basic executor within the kernel (at least for something more involved than a single CPU machine) is more involved, especially if you care about getting good performance (and threading 100% comes up here as an OS concept so claiming it doesn’t belies a certain amount of unawareness of how kernels work internally and how they handle syscalls).
kaoD•2mo ago
There's no work stealing. Async-await is cooperative multitasking. There is no suspending or resuming a calling thread. There is no saving register state. There is not even a thread.
I will re-reiterate: async-await is just a state machine and Futures are just async values you can poll.
I'm sure moss has an actual preemptive scheduler for processes, but it's completely unrelated to its internal usage of async-await.
See embassy in sibling comments.
vlovich123•2mo ago
You’re arguing about the technical definition of async/await while completely ignoring what it means to write a kernel.
netbsdusers•2mo ago
> I decided, with regret, that each processing module could not act as an independent process with its own call record. The numbers seemed against it: on large systems it is necessary to allow for as many as 1000 queues, and I saw no good way to run this many processes without consuming inordinate amounts of storage. As a result, stream server procedures are not allowed to block awaiting data, but instead must return after saving necessary status information explicitly. The contortions required in the code are seldom serious in practice, but the beauty of the scheme would increase if servers could be written as a simple read-write loop in the true coroutine style.
The power of that framework was exactly that it didn't need independent processes. It avoided considerable overhead that way. The cost was that you had to write coroutines by hand, and at a certain point that becomes very difficult to code. With a language that facilitates stackless coroutines, you can get much of the strengths of an architecture like STREAMS while not having to write contorted code.
hexagonal-sun•2mo ago
Regarding the async code, sibling posts have addressed this. However, if you want to get a taste of how this is implemented in Moss look at src/sched/waker.rs, src/sched/mod.rs, src/sched/uspc_ret.rs. These files cover the majority of the executor implementation.
IshKebab•2mo ago
Also how does it's design compare with Redox and Asterinas?
cies•2mo ago
F3nd0•2mo ago
dymk•2mo ago
tingletech•2mo ago
WD-42•2mo ago
nmz•2mo ago
SAI_Peregrinus•2mo ago
cryptonector•2mo ago
SAI_Peregrinus•2mo ago
tingletech•2mo ago
SAI_Peregrinus•2mo ago
Personally I dislike them because they don't preserve end-user freedom, I prefer the MPL. But if someone wants to donate their work to for-profit companies that's their choice.
F3nd0•2mo ago
Blikkentrekker•2mo ago
If one library be GPLv2 and the other GPLv3 they couldn't be used together in one project. LGPL solves nothing because it's all statically linked anyway. And yes, one could licence under both under the user's choice but then GPLv4 comes out and the process repeats itself, and yes one could use GPLv2+ but people aren't exactly willing to licence under a licence that doesn't yet exist and put blind faith into whoever writes it.
Using anything but a permissive licence is a good way to ensure no one will lose your library and someone will just re-implement it under a permissive licence.
C is a completely different landscape. Libraries are larger and the wheel is re-invented more often and most of all dynamic linking is used a lot so the LGPL solves a lot.
F3nd0•2mo ago
LGPL should only pose a problem if you explicitly want your program to be used with non-free software. And then only if said non-free software doesn't give you a way to rebuild it yourself, should you want to modify the LGPL program. (So not a problem for open-core or public-source projects, either.)
If, for some reason, you insist on allowing static linking for all the projects, I think the MPL allows this. (People often seem to think of the LGPL, but it's not the only weak-copyleft licence around.)
Otherwise, when releasing your project under GPLv3+, you don't have to put blind faith into the FSF; you can designate a proxy which will decide whether the new version should be allowed for your project or not. This proxy can be yourself, or it can be a different organisation you choose to trust. Plus, I'm pretty sure the GPL allows you to make linking exceptions of your liking.
Blikkentrekker•2mo ago
No, just if you want it to be used with anything that isn't that exact same GPL licence.
> Otherwise, when releasing your project under GPLv3+, you don't have to put blind faith into the FSF; you can designate a proxy which will decide whether the new version should be allowed for your project or not. This proxy can be yourself, or it can be a different organisation you choose to trust. Plus, I'm pretty sure the GPL allows you to make linking exceptions of your liking.
That's the same as just licencing under the GPLv3 and later retroactively deciding to also give the GPLv4 option when liking that licence. The issue is, what if you don't? Then your code can't be combined with any GPLv4 library.
The simple reality is that crates that have incompatible licences, and GPLv2 and GPLv3 are incompatible, cannot be used together in one distributed project without committing copyright infringement. The thing with MIT is that it's compatible with about every single licence out there.
F3nd0•2mo ago
How so? The LGPL only demands the four freedoms for the program it covers, not for the entire project. As long as the user is free to use their own modified version of the LGPL program (by dynamic linking or being able to recompile) and share it with others, the licence should be satisfied, so even if your project as a whole is read-only or has a pushover licence, no?
> That's the same as just licencing under the GPLv3 and later retroactively deciding to also give the GPLv4 option when liking that licence.
It's practically the same if you own all of the code. Which, if you happen to run a public project which ends up accepting a lot of contributions, you won't.
> The issue is, what if you don't? Then your code can't be combined with any GPLv4 library.
Fair enough, but I don't think this problem can be solved. If you want any licensing changes to happen without explicit consent from every single contributor, you have to put a bit of blind trust in someone. My point was that in the case of the GPL, it doesn't have to be only the FSF.
andrewl-hn•2mo ago
Would something like Smoltcp be of help here? https://github.com/smoltcp-rs/smoltcp
Great project either way!
How do you decide which sys calls to work on? Is is based on what the user space binaries demand?
hexagonal-sun•2mo ago
Yeah, I was thinking of integrating that at some point. They've done a really nice job of keeping it no_std-friendly.
whitequark_•2mo ago
phkahler•2mo ago
bfrog•2mo ago
imiric•2mo ago
To the author: kudos for the interesting project, but please strongly consider a copyleft license moving forward.
cryptonector•2mo ago
533474•2mo ago
surajrmal•2mo ago
mikelpr•2mo ago
surajrmal•2mo ago
Blikkentrekker•2mo ago
I think a big issue is also that it's hard to show actual damages with this kind of copyright violation. It's obviously copyright violation but what damages are there really? Also, there are so many dubious cases where it's not clear whether it is a violation or not.
pabs3•2mo ago
https://sfconservancy.org/copyleft-compliance/ https://sfconservancy.org/copyleft-compliance/vizio.html
woodruffw•2mo ago
Can you provide examples of these? I'm aware of temporary forks for things like Xtensa, but these typically get merged back upstream.
RealityVoid•2mo ago
woodruffw•2mo ago
nickpsecurity•2mo ago
A "gift" requiring GPL-like conditions isn't really a gift in the common sense. It's more like a contractual agreement with something provided and specific, non-negotiable obligations. They're giving while also asserting control over others' lives, hoping for a specific outcome. That's not just a gift.
People doing MIT license are often generous enough where the code is a gift to everyone. They don't try to control their lives or societal outcomes with extra obligations. They're just giving. So, I'm grateful to them for both OSS and business adaptations of their gifts.
imiric•2mo ago
This is the paradox of tolerance, essentially.
Also, seeing F/LOSS as a "gift" is an awful way of looking at it.
nickpsecurity•2mo ago
So, we have a variety of licensing styles that meet various goals. People can pick what suits their needs and wants. That's a good thing.
imiric•2mo ago
Who is "they" in this context?
A permissive license allows anyone to take someone else's work, profit from it, and never contribute back to the original project. For someone advocating for fairness, it's remarkable how you ignore this very real and common scenario.
> Many people think they're owed more software, including fixes to software, without compensating the laborer. That worldview is the real problem.
Compensation is orthogonal to F/LOSS. Authors are free to choose whatever income streams they like, and many successful businesses have been built around F/LOSS. Whoever is expecting people to work without compensation is being unreasonable, of course.
But F/LOSS as a social movement goes beyond a mere financial transaction. It works on the basis of mutual trust, where if I share something you find valuable, then the acceptable "payment" for that work is for you to do the same. This collaborative effort is how the highest quality products are produced.
The irony of your point is that a permissive license allows precisely the scenario you're arguing against. We've seen corporations profit from the work of others without compensating them for it. So much so, that OSS projects are forced to roll back their permissive licenses, often going too far in the other direction, to where they can no longer be labeled as "Open Source". E.g. Elastic: Apache -> SSPL -> AGPL; Redis: BSD -> SSPL; HashiCorp: MPL -> BSL; etc.
That is the actual problem which copyleft licenses prevent.
nickpsecurity•2mo ago
Not giving anything back is fair because the author's license specifically allows them to do that. A gift has no expectation of anything in return. God blesses such generosity because it's a a truly, selfless act.
re compensation
Compensation is not orthogonal to FLOSS. Copyright was mainly designed to ensure work couldn't be shared without paying the author. Anything given for free dramatically decreases the chance of getting paid. OSS and FLOSS almost guarantee no money is made on standalone software but GPL with CLA's allows dual licensing to recover some.
If anyone uses permissive licenses, it's a gift where they're not (in legal terms) expecting money. Some try to sell it or ask for donations, too, which is incompatible with the license. The free license usually undermines that. It works for some people to some degree, though.
Re roll backs
I didn't argue against any scenario. The original person I replied to appeared to be arguing that it was evil to give software away with no obligations. I had to explain what a gift is and why it's morally good to give. I believe the reason is years of people promoting FOSS politics which I now see are rooted in ideas similar to socialism or communism. It wouldn't surprise me if Stallman was a closet communist and just repackaged those ideas into software licensing.
(Note: I feel like I'm going to have to think more on that political angle given I've been influenced by such people for years on these sites. I'll do a fresh take at some point.)
On companies being unsustainable, I've already explained what happened. Their goal included selfish gain (money/contributions) from selfish entities who normally take but don't give. Their goal was also to build, individually or collectively, a shared work. They used a license that said it's a one-time gift with no obligations. So, entities took the gift and felt no obligations to return anything. Surprise!
Now, they've changed to licenses that suit their commercial and/or property goals. That may or may not work for them. Whereas, the companies successfully marketing proprietary software are able to build it up to their hearts' content. Some companies give out the source or dual license under GPL/AGPL. They should probably do Parity License to close remaining gaps and see if FOSS people are really about the free commons.
License Zero and Polyform have new licenses to help. I conceptualized some in the past that allow modifications, forks, etc so long as the customer keeps paying. Then, redistribution among paying customers. I'd like to see more models for people aiming for sustainability with software freedoms baked in.
phkahler•2mo ago
Many people (corporations) think they're owed more money beyond the labor. This is why SaaS is a major business model these days. The marginal cost of software is zero, and yet people expect to keep getting paid for it over and over.
naasking•2mo ago
cryptonector•2mo ago
Here, I'll make a substantive contribution. I hope this succeeds and causes a lowest-common denominator Linux ABI to exist that user-land can target, thus freeing us all from the Linux kernel as the only viable option. Solaris/Illumos, the BSDs, and even Windows have all gone through one or two phases of attempting Linux ABI compatibility, ultimately giving up because the Linux ABI is such a fast-moving and underdocumented target.
nickpsecurity•2mo ago
So, I defended the author and the concept of generosity. I also tried to help FOSS people reframe what their doing as collective property or work so everyone understands the tradeoffs better. They confuse people by advocating for "free" or "freedom" with licenses that take away freedoms from authors. It's like they're redefining words to have non-standard meanings but get angry when people act on standard morals or word usages.
I'm also starting to think the confusion was intentional because many of their arguments look like socialism or communism disguised as software advice. We also see the same failure modes across most projects and products. Like communist nations (eg Shenzhen), we see the GPL projects succeed best when they relied on capitalists instead of communist principles for code contributions. So, I'll eventually look to see if people like Stallman were communist and if this was sneaky, ideological warfare or subversion. Like we see with critical theory ("woke") proponents constantly repacking their ideas (eg DEI, Codes of Conduct) to snesk them in where they'd be rejected after peer review. I feel like so much fighting online started with people doing something evil built on a conflict-oriented philosophy (Marxism/Communism) that causes the same destructive effects everywhere people promoted it.
phkahler•2mo ago
1) the marginal cost of software is zero.
2) some software is becoming more like infrastructure that everyone uses.
In the physical world, some infrastructure is privatized, some is regulated, and some is provided by the government. But going back to point 1 we see that privatization makes even less sense (to society) with software.
vacuity•2mo ago
pessimizer•2mo ago
The obligation is not to the author of the code, it is to the public. MIT-style licenses are gifts to people and companies who produce code and software, copyleft licenses are gifts to the public.
I don't give a shit about the happiness of programmers any more than the happiness of garbage collectors, sorry. I don't care more that you have access to the library you want to use at your job writing software for phones than I care that somebody has access to the code on their own phone. You're free to care about what you want, but the pretense at moral superiority is incoherent.
It is non-negotiable. GPL is basically proprietary software. It's owned by the public, and all of the work that you do using it belongs to the public. If you steal it, you should be sued into the ground.
pstoll•2mo ago
Are parks “proprietary”? I can’t run my car dealership from one, so it’s …proprietary? No. So using the terminology of “proprietary” doesn’t do justice to what it actually is.
wredcoll•2mo ago
mcdonje•2mo ago
nickpsecurity•2mo ago
If I use GPL'd code, I have to keep releasing my modifications for free because it's mandated. I have to do that even if I do 1000 hours of labor but they gave me 30 min of it. So, it's also near-infinite work required in return for finite work they did. And I have to bind others to this with my own work.
That's not someone giving me a gift. I'm not sure what to call that except a collective work with permanent obligations for all parties. It's more like a job or corporate charter or something. I like another person's claim that it's creating property with requirements for those using it (which copyright certainly does).
fragmede•2mo ago
Pedantically, only recipients of your updated binary are owed updated source, so if you're not distributing that binary to the whole world, you're not required to release updated source to the whole world. Kind of a nitpick, but maybe not.
procaryote•2mo ago
The point of copyleft is that the author wants the code to remain available to the public, not to give it as a gift to whoever wants to build their own closed source system
phkahler•2mo ago
You're right. GPL code is not a gift to you its a gift to the public.
Dont try to build your house or business in a national park.
eggy•2mo ago
phkahler•2mo ago
I'm done with proprietary operating systems and IMHO everyone should be. There's no reason to support that.
phkahler•2mo ago
GPL is a gift that keeps giving.
nickpsecurity•2mo ago
Would you want people controling your property based on their current and future desires? And dictating what you do with your property enhancements? Would you call that giving you more freedom? Or denying you freedom to force you to support their goals for your property?
fragmede•2mo ago
surajrmal•2mo ago
imiric•2mo ago
F/LOSS is not a charity or a gift, so your analogy is not appropriate. It is a social movement and philosophy with the goal of sharing knowledge and building software for the benefit of everyone. It invites collaboration, and fosters a community of like-minded people. Trust is an implicit requirement for this to succeed, and individuals and corporations who abuse it by taking the work of others and not giving anything back are harmful to these goals. Copyleft licenses exist precisely to prevent this from happening.
MIT is a fine license for many projects, but not for an operating system kernel.
surajrmal•2mo ago
vacuity•2mo ago
surajrmal•2mo ago
vacuity•2mo ago
knowitnone3•2mo ago
cryptonector•2mo ago
phkahler•2mo ago
Thank you for reading it correctly. I originally had a </sarcasm> to make sure nobody thought I liked the license choice. What's it to me? Well someone posted it to HN here so we could comment on it, so I did.
I think the MIT license has its place, but IMHO it does not belong on an OS like that. Reason is indicated in my original comment.
cryptonector•2mo ago
0x457•2mo ago
Onavo•2mo ago
sheepscreek•2mo ago
After you got the busybox shell running, how long did it take to add vim support? What challenges did you face? Did you cross-compile it?
fortran77•2mo ago
scottlamb•2mo ago
loeg•2mo ago
kennykartman•2mo ago