Compare commits
79 Commits
b97c123764
...
f2eaab6e43
Author | SHA1 | Date |
---|---|---|
|
f2eaab6e43 | |
|
a847823411 | |
|
fe9a8b542a | |
|
cd101b6844 | |
|
69229102c4 | |
|
4bc3630d19 | |
|
ab00686ac9 | |
|
c3004a038f | |
|
9cf9d8847b | |
|
0a3c10566b | |
|
c94243e107 | |
|
505388b9fa | |
|
7314cf708c | |
|
3e6a4f2b16 | |
|
c7c3dd7662 | |
|
e4f025edd6 | |
|
96f3efbf86 | |
|
2b2130ff42 | |
|
463ce05da0 | |
|
fa4095ba95 | |
|
db571b4859 | |
|
e8491b34b8 | |
|
521457eb92 | |
|
f26a445ce6 | |
|
f73bb242f3 | |
|
9e895e5286 | |
|
5b0e5512a8 | |
|
850b3284ac | |
|
05a727979a | |
|
d68c88c3f9 | |
|
5f07d53034 | |
|
fe62ce4bae | |
|
fb09aa4d06 | |
|
4d080b30ab | |
|
2d314e72fe | |
|
cf07b747fe | |
|
273e9bbc92 | |
|
7dcf1797e9 | |
|
7aa24b6157 | |
|
d73a667437 | |
|
4695fa061d | |
|
7bf7bfbe13 | |
|
397219c22e | |
|
83c0ef3514 | |
|
4fa40de557 | |
|
bc06926702 | |
|
9de27110e2 | |
|
93e5d09a63 | |
|
0cbc39698c | |
|
83069e433f | |
|
bbb490b24f | |
|
85f200bd86 | |
|
0f2c02fb04 | |
|
6d3d41abe2 | |
|
6fa7fe26dc | |
|
fe804c123d | |
|
dba32fb95d | |
|
7dc187fdb1 | |
|
ee5a627952 | |
|
3b83561309 | |
|
6fb0b5203a | |
|
4677d7a1c6 | |
|
3283359ac8 | |
|
fff16f6b8c | |
|
a347ceba74 | |
|
05836fab4c | |
|
15e84f28ed | |
|
32c35a822b | |
|
9c86e5e54d | |
|
87f348b48e | |
|
ff289b25b6 | |
|
a9f58e96d2 | |
|
c61ded8a1e | |
|
7651ca747d | |
|
7ff7a4aa87 | |
|
cdcd226b1a | |
|
f9451915b9 | |
|
5e4e174d61 | |
|
4a00cb7d55 |
|
@ -7,9 +7,6 @@
|
||||||
|
|
||||||
.global signal_trampoline
|
.global signal_trampoline
|
||||||
signal_trampoline:
|
signal_trampoline:
|
||||||
pushl %ebp
|
|
||||||
movl %esp, %ebp
|
|
||||||
|
|
||||||
pusha
|
pusha
|
||||||
|
|
||||||
movl 40(%esp), %edi
|
movl 40(%esp), %edi
|
||||||
|
@ -19,16 +16,22 @@ signal_trampoline:
|
||||||
movl %esp, %ebp
|
movl %esp, %ebp
|
||||||
andl $-16, %esp
|
andl $-16, %esp
|
||||||
|
|
||||||
|
subl $512, %esp
|
||||||
|
fxsave (%esp)
|
||||||
|
|
||||||
subl $12, %esp
|
subl $12, %esp
|
||||||
pushl %edi
|
pushl %edi
|
||||||
call *%eax
|
call *%eax
|
||||||
addl $16, %esp
|
addl $16, %esp
|
||||||
|
|
||||||
|
fxrstor (%esp)
|
||||||
|
addl $512, %esp
|
||||||
|
|
||||||
// restore stack
|
// restore stack
|
||||||
movl %ebp, %esp
|
movl %ebp, %esp
|
||||||
popa
|
popa
|
||||||
|
|
||||||
leave
|
|
||||||
addl $8, %esp
|
addl $8, %esp
|
||||||
|
popf
|
||||||
|
|
||||||
ret
|
ret
|
||||||
|
|
|
@ -30,8 +30,14 @@ signal_trampoline:
|
||||||
movq %rsp, %rbp
|
movq %rsp, %rbp
|
||||||
andq $-16, %rsp
|
andq $-16, %rsp
|
||||||
|
|
||||||
|
subq $512, %rsp
|
||||||
|
fxsave64 (%rsp)
|
||||||
|
|
||||||
call *%rax
|
call *%rax
|
||||||
|
|
||||||
|
fxrstor64 (%rsp)
|
||||||
|
addq $512, %rsp
|
||||||
|
|
||||||
// restore stack
|
// restore stack
|
||||||
movq %rbp, %rsp
|
movq %rbp, %rsp
|
||||||
popq %r15
|
popq %r15
|
||||||
|
@ -51,6 +57,7 @@ signal_trampoline:
|
||||||
popq %rax
|
popq %rax
|
||||||
|
|
||||||
addq $16, %rsp
|
addq $16, %rsp
|
||||||
|
popfq
|
||||||
|
|
||||||
// return over red-zone
|
// return over red-zone
|
||||||
ret $128
|
ret $128
|
||||||
|
|
|
@ -68,7 +68,9 @@ namespace Kernel
|
||||||
|
|
||||||
bool has_fd(int fd) const
|
bool has_fd(int fd) const
|
||||||
{
|
{
|
||||||
if (fd < 0 || static_cast<size_t>(fd) >= events.size())
|
// For some reason having (fd < 0 || ...) makes GCC 15.1.0
|
||||||
|
// think bitmap access can be out of bounds...
|
||||||
|
if (static_cast<size_t>(fd) >= events.size())
|
||||||
return false;
|
return false;
|
||||||
return bitmap[fd / 32] & (1u << (fd % 32));
|
return bitmap[fd / 32] & (1u << (fd % 32));
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,11 +32,11 @@ namespace Kernel
|
||||||
void lock() override
|
void lock() override
|
||||||
{
|
{
|
||||||
const auto tid = Thread::current_tid();
|
const auto tid = Thread::current_tid();
|
||||||
ASSERT(!tid || !Thread::current().has_spinlock());
|
|
||||||
if (tid == m_locker)
|
if (tid == m_locker)
|
||||||
ASSERT(m_lock_depth > 0);
|
ASSERT(m_lock_depth > 0);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
ASSERT(!tid || !Thread::current().has_spinlock());
|
||||||
pid_t expected = -1;
|
pid_t expected = -1;
|
||||||
while (!m_locker.compare_exchange(expected, tid))
|
while (!m_locker.compare_exchange(expected, tid))
|
||||||
{
|
{
|
||||||
|
@ -53,7 +53,6 @@ namespace Kernel
|
||||||
bool try_lock() override
|
bool try_lock() override
|
||||||
{
|
{
|
||||||
const auto tid = Thread::current_tid();
|
const auto tid = Thread::current_tid();
|
||||||
ASSERT(!tid || !Thread::current().has_spinlock());
|
|
||||||
if (tid == m_locker)
|
if (tid == m_locker)
|
||||||
ASSERT(m_lock_depth > 0);
|
ASSERT(m_lock_depth > 0);
|
||||||
else
|
else
|
||||||
|
@ -102,12 +101,12 @@ namespace Kernel
|
||||||
void lock() override
|
void lock() override
|
||||||
{
|
{
|
||||||
const auto tid = Thread::current_tid();
|
const auto tid = Thread::current_tid();
|
||||||
ASSERT(!tid || !Thread::current().has_spinlock());
|
|
||||||
|
|
||||||
if (tid == m_locker)
|
if (tid == m_locker)
|
||||||
ASSERT(m_lock_depth > 0);
|
ASSERT(m_lock_depth > 0);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
ASSERT(!tid || !Thread::current().has_spinlock());
|
||||||
bool has_priority = tid ? !Thread::current().is_userspace() : true;
|
bool has_priority = tid ? !Thread::current().is_userspace() : true;
|
||||||
if (has_priority)
|
if (has_priority)
|
||||||
m_queue_length++;
|
m_queue_length++;
|
||||||
|
@ -127,7 +126,6 @@ namespace Kernel
|
||||||
bool try_lock() override
|
bool try_lock() override
|
||||||
{
|
{
|
||||||
const auto tid = Thread::current_tid();
|
const auto tid = Thread::current_tid();
|
||||||
ASSERT(!tid || !Thread::current().has_spinlock());
|
|
||||||
|
|
||||||
if (tid == m_locker)
|
if (tid == m_locker)
|
||||||
ASSERT(m_lock_depth > 0);
|
ASSERT(m_lock_depth > 0);
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <BAN/Array.h>
|
#include <BAN/Array.h>
|
||||||
|
#include <BAN/HashSet.h>
|
||||||
#include <kernel/FS/Inode.h>
|
#include <kernel/FS/Inode.h>
|
||||||
#include <kernel/FS/VirtualFileSystem.h>
|
#include <kernel/FS/VirtualFileSystem.h>
|
||||||
|
|
||||||
|
@ -43,6 +44,8 @@ namespace Kernel
|
||||||
void close_all();
|
void close_all();
|
||||||
void close_cloexec();
|
void close_cloexec();
|
||||||
|
|
||||||
|
BAN::ErrorOr<void> flock(int fd, int op);
|
||||||
|
|
||||||
BAN::ErrorOr<size_t> read(int fd, BAN::ByteSpan);
|
BAN::ErrorOr<size_t> read(int fd, BAN::ByteSpan);
|
||||||
BAN::ErrorOr<size_t> write(int fd, BAN::ConstByteSpan);
|
BAN::ErrorOr<size_t> write(int fd, BAN::ConstByteSpan);
|
||||||
|
|
||||||
|
@ -69,6 +72,15 @@ namespace Kernel
|
||||||
off_t offset { 0 };
|
off_t offset { 0 };
|
||||||
int status_flags;
|
int status_flags;
|
||||||
|
|
||||||
|
struct flock_t
|
||||||
|
{
|
||||||
|
bool locked;
|
||||||
|
bool shared;
|
||||||
|
ThreadBlocker thread_blocker;
|
||||||
|
BAN::HashSet<pid_t> lockers;
|
||||||
|
};
|
||||||
|
flock_t flock;
|
||||||
|
|
||||||
friend class BAN::RefPtr<OpenFileDescription>;
|
friend class BAN::RefPtr<OpenFileDescription>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -112,6 +112,8 @@ namespace Kernel
|
||||||
|
|
||||||
BAN::ErrorOr<long> sys_symlinkat(const char* path1, int fd, const char* path2);
|
BAN::ErrorOr<long> sys_symlinkat(const char* path1, int fd, const char* path2);
|
||||||
|
|
||||||
|
BAN::ErrorOr<long> sys_flock(int fd, int op);
|
||||||
|
|
||||||
BAN::ErrorOr<long> sys_pread(int fd, void* buffer, size_t count, off_t offset);
|
BAN::ErrorOr<long> sys_pread(int fd, void* buffer, size_t count, off_t offset);
|
||||||
BAN::ErrorOr<long> sys_pwrite(int fd, const void* buffer, size_t count, off_t offset);
|
BAN::ErrorOr<long> sys_pwrite(int fd, const void* buffer, size_t count, off_t offset);
|
||||||
|
|
||||||
|
|
|
@ -179,7 +179,7 @@ namespace Kernel
|
||||||
BAN::Atomic<bool> m_smp_free_lock { false };
|
BAN::Atomic<bool> m_smp_free_lock { false };
|
||||||
SMPMessage* m_smp_free { nullptr };
|
SMPMessage* m_smp_free { nullptr };
|
||||||
|
|
||||||
SMPMessage* m_smp_message_storage;
|
SMPMessage* m_smp_message_storage { nullptr };
|
||||||
|
|
||||||
void* m_current_page_table { nullptr };
|
void* m_current_page_table { nullptr };
|
||||||
|
|
||||||
|
|
|
@ -13,7 +13,7 @@ namespace Kernel
|
||||||
long ret;
|
long ret;
|
||||||
asm volatile("int %[irq]"
|
asm volatile("int %[irq]"
|
||||||
: "=a"(ret)
|
: "=a"(ret)
|
||||||
: [irq]"i"(IRQ_SYSCALL)
|
: [irq]"i"(static_cast<int>(IRQ_SYSCALL)) // WTF GCC 15
|
||||||
, "a"(syscall)
|
, "a"(syscall)
|
||||||
, "b"((uintptr_t)arg1)
|
, "b"((uintptr_t)arg1)
|
||||||
, "c"((uintptr_t)arg2)
|
, "c"((uintptr_t)arg2)
|
||||||
|
|
|
@ -59,9 +59,6 @@ namespace Kernel
|
||||||
public:
|
public:
|
||||||
BAN::StringView name() const override { return m_name; }
|
BAN::StringView name() const override { return m_name; }
|
||||||
|
|
||||||
uint32_t height() const override { return m_height; }
|
|
||||||
uint32_t width() const override { return m_width; }
|
|
||||||
|
|
||||||
void clear() override;
|
void clear() override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
@ -72,8 +69,6 @@ namespace Kernel
|
||||||
bool can_write_impl() const override;
|
bool can_write_impl() const override;
|
||||||
bool has_hungup_impl() const override { return !m_master.valid(); }
|
bool has_hungup_impl() const override { return !m_master.valid(); }
|
||||||
|
|
||||||
BAN::ErrorOr<long> ioctl_impl(int, void*) override;
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
PseudoTerminalSlave(BAN::String&& name, uint32_t number, mode_t, uid_t, gid_t);
|
PseudoTerminalSlave(BAN::String&& name, uint32_t number, mode_t, uid_t, gid_t);
|
||||||
~PseudoTerminalSlave();
|
~PseudoTerminalSlave();
|
||||||
|
@ -83,8 +78,6 @@ namespace Kernel
|
||||||
const uint32_t m_number;
|
const uint32_t m_number;
|
||||||
|
|
||||||
BAN::WeakPtr<PseudoTerminalMaster> m_master;
|
BAN::WeakPtr<PseudoTerminalMaster> m_master;
|
||||||
uint32_t m_width { 0 };
|
|
||||||
uint32_t m_height { 0 };
|
|
||||||
|
|
||||||
friend class PseudoTerminalMaster;
|
friend class PseudoTerminalMaster;
|
||||||
friend class BAN::RefPtr<PseudoTerminalSlave>;
|
friend class BAN::RefPtr<PseudoTerminalSlave>;
|
||||||
|
|
|
@ -42,9 +42,6 @@ namespace Kernel
|
||||||
public:
|
public:
|
||||||
static BAN::ErrorOr<BAN::RefPtr<SerialTTY>> create(Serial);
|
static BAN::ErrorOr<BAN::RefPtr<SerialTTY>> create(Serial);
|
||||||
|
|
||||||
uint32_t width() const override;
|
|
||||||
uint32_t height() const override;
|
|
||||||
|
|
||||||
void clear() override { putchar_impl('\e'); putchar_impl('['); putchar_impl('2'); putchar_impl('J'); }
|
void clear() override { putchar_impl('\e'); putchar_impl('['); putchar_impl('2'); putchar_impl('J'); }
|
||||||
|
|
||||||
void update() override;
|
void update() override;
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
#include <LibInput/KeyEvent.h>
|
#include <LibInput/KeyEvent.h>
|
||||||
|
|
||||||
#include <termios.h>
|
#include <termios.h>
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
|
||||||
namespace Kernel
|
namespace Kernel
|
||||||
{
|
{
|
||||||
|
@ -53,9 +54,6 @@ namespace Kernel
|
||||||
|
|
||||||
virtual bool is_tty() const override { return true; }
|
virtual bool is_tty() const override { return true; }
|
||||||
|
|
||||||
virtual uint32_t height() const = 0;
|
|
||||||
virtual uint32_t width() const = 0;
|
|
||||||
|
|
||||||
virtual dev_t rdev() const final override { return m_rdev; }
|
virtual dev_t rdev() const final override { return m_rdev; }
|
||||||
|
|
||||||
virtual void clear() = 0;
|
virtual void clear() = 0;
|
||||||
|
@ -80,6 +78,8 @@ namespace Kernel
|
||||||
virtual BAN::ErrorOr<size_t> read_impl(off_t, BAN::ByteSpan) final override;
|
virtual BAN::ErrorOr<size_t> read_impl(off_t, BAN::ByteSpan) final override;
|
||||||
virtual BAN::ErrorOr<size_t> write_impl(off_t, BAN::ConstByteSpan) final override;
|
virtual BAN::ErrorOr<size_t> write_impl(off_t, BAN::ConstByteSpan) final override;
|
||||||
|
|
||||||
|
void update_winsize(unsigned short cols, unsigned short rows);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool putchar(uint8_t ch);
|
bool putchar(uint8_t ch);
|
||||||
void do_backspace();
|
void do_backspace();
|
||||||
|
@ -109,6 +109,8 @@ namespace Kernel
|
||||||
};
|
};
|
||||||
Buffer m_output;
|
Buffer m_output;
|
||||||
|
|
||||||
|
winsize m_winsize {};
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
RecursiveSpinLock m_write_lock;
|
RecursiveSpinLock m_write_lock;
|
||||||
ThreadBlocker m_write_blocker;
|
ThreadBlocker m_write_blocker;
|
||||||
|
|
|
@ -35,6 +35,7 @@ namespace Kernel
|
||||||
: m_palette(palette)
|
: m_palette(palette)
|
||||||
{}
|
{}
|
||||||
virtual ~TerminalDriver() {}
|
virtual ~TerminalDriver() {}
|
||||||
|
|
||||||
virtual uint32_t width() const = 0;
|
virtual uint32_t width() const = 0;
|
||||||
virtual uint32_t height() const = 0;
|
virtual uint32_t height() const = 0;
|
||||||
|
|
||||||
|
|
|
@ -19,9 +19,6 @@ namespace Kernel
|
||||||
|
|
||||||
BAN::ErrorOr<void> set_font(LibFont::Font&&) override;
|
BAN::ErrorOr<void> set_font(LibFont::Font&&) override;
|
||||||
|
|
||||||
uint32_t height() const override { return m_height; }
|
|
||||||
uint32_t width() const override { return m_width; }
|
|
||||||
|
|
||||||
void clear() override;
|
void clear() override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
|
@ -103,6 +103,10 @@ namespace Kernel
|
||||||
|
|
||||||
bool is_userspace() const { return m_is_userspace; }
|
bool is_userspace() const { return m_is_userspace; }
|
||||||
|
|
||||||
|
uint64_t cpu_time_ns() const;
|
||||||
|
void set_cpu_time_start();
|
||||||
|
void set_cpu_time_stop();
|
||||||
|
|
||||||
void set_tls(vaddr_t tls) { m_tls = tls; }
|
void set_tls(vaddr_t tls) { m_tls = tls; }
|
||||||
vaddr_t get_tls() const { return m_tls; }
|
vaddr_t get_tls() const { return m_tls; }
|
||||||
|
|
||||||
|
@ -155,6 +159,10 @@ namespace Kernel
|
||||||
SpinLock m_signal_lock;
|
SpinLock m_signal_lock;
|
||||||
static_assert(_SIGMAX < 64);
|
static_assert(_SIGMAX < 64);
|
||||||
|
|
||||||
|
mutable SpinLock m_cpu_time_lock;
|
||||||
|
uint64_t m_cpu_time_ns { 0 };
|
||||||
|
uint64_t m_cpu_time_start_ns { UINT64_MAX };
|
||||||
|
|
||||||
BAN::Atomic<uint32_t> m_spinlock_count { 0 };
|
BAN::Atomic<uint32_t> m_spinlock_count { 0 };
|
||||||
BAN::Atomic<uint32_t> m_mutex_count { 0 };
|
BAN::Atomic<uint32_t> m_mutex_count { 0 };
|
||||||
|
|
||||||
|
|
|
@ -746,6 +746,8 @@ namespace Kernel::ACPI::AML
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#pragma GCC diagnostic push
|
||||||
|
#pragma GCC diagnostic ignored "-Wstack-usage="
|
||||||
static BAN::ErrorOr<void> perform_store(const Node& source, Reference* target, TargetType target_type)
|
static BAN::ErrorOr<void> perform_store(const Node& source, Reference* target, TargetType target_type)
|
||||||
{
|
{
|
||||||
dprintln_if(AML_DUMP_FUNCTION_CALLS, "perform_store");
|
dprintln_if(AML_DUMP_FUNCTION_CALLS, "perform_store");
|
||||||
|
@ -826,6 +828,7 @@ namespace Kernel::ACPI::AML
|
||||||
|
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
#pragma GCC diagnostic pop
|
||||||
|
|
||||||
static BAN::ErrorOr<void> store_into_target(ParseContext& context, const Node& node)
|
static BAN::ErrorOr<void> store_into_target(ParseContext& context, const Node& node)
|
||||||
{
|
{
|
||||||
|
|
|
@ -176,19 +176,20 @@ namespace Kernel
|
||||||
switch (entry->type)
|
switch (entry->type)
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
Processor processor;
|
MUST(apic->m_processors.emplace_back(Processor {
|
||||||
processor.processor_id = entry->entry0.acpi_processor_id;
|
.processor_id = entry->entry0.acpi_processor_id,
|
||||||
processor.apic_id = entry->entry0.apic_id;
|
.apic_id = entry->entry0.apic_id,
|
||||||
processor.flags = entry->entry0.flags & 0x03;
|
.flags = static_cast<uint8_t>(entry->entry0.flags & 0x03),
|
||||||
MUST(apic->m_processors.push_back(processor));
|
}));
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
IOAPIC ioapic;
|
MUST(apic->m_io_apics.emplace_back(IOAPIC {
|
||||||
ioapic.id = entry->entry1.ioapic_id;
|
.id = entry->entry1.ioapic_id,
|
||||||
ioapic.paddr = entry->entry1.ioapic_address;
|
.paddr = entry->entry1.ioapic_address,
|
||||||
ioapic.gsi_base = entry->entry1.gsi_base;
|
.vaddr = 0,
|
||||||
ioapic.max_redirs = 0;
|
.gsi_base = entry->entry1.gsi_base,
|
||||||
MUST(apic->m_io_apics.push_back(ioapic));
|
.max_redirs = 0,
|
||||||
|
}));
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
apic->m_irq_overrides[entry->entry2.irq_source] = entry->entry2.gsi;
|
apic->m_irq_overrides[entry->entry2.irq_source] = entry->entry2.gsi;
|
||||||
|
|
|
@ -251,7 +251,8 @@ namespace Kernel
|
||||||
));
|
));
|
||||||
|
|
||||||
SpinLockGuard _(s_bound_socket_lock);
|
SpinLockGuard _(s_bound_socket_lock);
|
||||||
ASSERT(!s_bound_sockets.contains(file.canonical_path));
|
if (s_bound_sockets.contains(file.canonical_path))
|
||||||
|
return BAN::Error::from_errno(EADDRINUSE);
|
||||||
TRY(s_bound_sockets.emplace(file.canonical_path, TRY(get_weak_ptr())));
|
TRY(s_bound_sockets.emplace(file.canonical_path, TRY(get_weak_ptr())));
|
||||||
m_bound_path = BAN::move(file.canonical_path);
|
m_bound_path = BAN::move(file.canonical_path);
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
#include <kernel/OpenFileDescriptorSet.h>
|
#include <kernel/OpenFileDescriptorSet.h>
|
||||||
|
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
|
#include <sys/file.h>
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
|
|
||||||
namespace Kernel
|
namespace Kernel
|
||||||
|
@ -310,6 +311,17 @@ namespace Kernel
|
||||||
TRY(validate_fd(fd));
|
TRY(validate_fd(fd));
|
||||||
|
|
||||||
auto& open_file = m_open_files[fd];
|
auto& open_file = m_open_files[fd];
|
||||||
|
|
||||||
|
if (auto& flock = open_file.description->flock; Thread::current().has_process() && flock.lockers.contains(Process::current().pid()))
|
||||||
|
{
|
||||||
|
flock.lockers.remove(Process::current().pid());
|
||||||
|
if (flock.lockers.empty())
|
||||||
|
{
|
||||||
|
flock.locked = false;
|
||||||
|
flock.thread_blocker.unblock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
open_file.inode()->on_close(open_file.status_flags());
|
open_file.inode()->on_close(open_file.status_flags());
|
||||||
open_file.description.clear();
|
open_file.description.clear();
|
||||||
open_file.descriptor_flags = 0;
|
open_file.descriptor_flags = 0;
|
||||||
|
@ -336,6 +348,63 @@ namespace Kernel
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BAN::ErrorOr<void> OpenFileDescriptorSet::flock(int fd, int op)
|
||||||
|
{
|
||||||
|
const auto pid = Process::current().pid();
|
||||||
|
|
||||||
|
LockGuard _(m_mutex);
|
||||||
|
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
TRY(validate_fd(fd));
|
||||||
|
|
||||||
|
auto& flock = m_open_files[fd].description->flock;
|
||||||
|
switch (op & ~LOCK_NB)
|
||||||
|
{
|
||||||
|
case LOCK_UN:
|
||||||
|
flock.lockers.remove(pid);
|
||||||
|
if (flock.lockers.empty())
|
||||||
|
{
|
||||||
|
flock.locked = false;
|
||||||
|
flock.thread_blocker.unblock();
|
||||||
|
}
|
||||||
|
return {};
|
||||||
|
case LOCK_SH:
|
||||||
|
if (!flock.locked)
|
||||||
|
{
|
||||||
|
TRY(flock.lockers.insert(pid));
|
||||||
|
flock.locked = true;
|
||||||
|
flock.shared = true;
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
if (flock.shared)
|
||||||
|
{
|
||||||
|
TRY(flock.lockers.insert(pid));
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case LOCK_EX:
|
||||||
|
if (!flock.locked)
|
||||||
|
{
|
||||||
|
TRY(flock.lockers.insert(pid));
|
||||||
|
flock.locked = true;
|
||||||
|
flock.shared = false;
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
if (flock.lockers.contains(pid))
|
||||||
|
return {};
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return BAN::Error::from_errno(EINVAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (op & LOCK_NB)
|
||||||
|
return BAN::Error::from_errno(EWOULDBLOCK);
|
||||||
|
|
||||||
|
TRY(Thread::current().block_or_eintr_indefinite(flock.thread_blocker, &m_mutex));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
BAN::ErrorOr<size_t> OpenFileDescriptorSet::read(int fd, BAN::ByteSpan buffer)
|
BAN::ErrorOr<size_t> OpenFileDescriptorSet::read(int fd, BAN::ByteSpan buffer)
|
||||||
{
|
{
|
||||||
BAN::RefPtr<Inode> inode;
|
BAN::RefPtr<Inode> inode;
|
||||||
|
@ -475,33 +544,14 @@ namespace Kernel
|
||||||
}
|
}
|
||||||
|
|
||||||
LockGuard _(inode->m_mutex);
|
LockGuard _(inode->m_mutex);
|
||||||
|
if (inode->has_hungup())
|
||||||
const auto check_errors =
|
|
||||||
[&inode, is_nonblock]() -> BAN::ErrorOr<void>
|
|
||||||
{
|
|
||||||
if (inode->has_hungup())
|
|
||||||
{
|
|
||||||
Thread::current().add_signal(SIGPIPE);
|
|
||||||
return BAN::Error::from_errno(EPIPE);
|
|
||||||
}
|
|
||||||
if (is_nonblock && !inode->can_write())
|
|
||||||
return BAN::Error::from_errno(EWOULDBLOCK);
|
|
||||||
return {};
|
|
||||||
};
|
|
||||||
|
|
||||||
TRY(check_errors());
|
|
||||||
|
|
||||||
size_t total_sent = 0;
|
|
||||||
while (total_sent < buffer.size())
|
|
||||||
{
|
{
|
||||||
TRY(check_errors());
|
Thread::current().add_signal(SIGPIPE);
|
||||||
const size_t nsend = TRY(inode->sendto(buffer.slice(total_sent), address, address_len));
|
return BAN::Error::from_errno(EPIPE);
|
||||||
if (nsend == 0)
|
|
||||||
return 0;
|
|
||||||
total_sent += nsend;
|
|
||||||
}
|
}
|
||||||
|
if (is_nonblock && !inode->can_write())
|
||||||
return total_sent;
|
return BAN::Error::from_errno(EWOULDBLOCK);
|
||||||
|
return inode->sendto(buffer, address, address_len);
|
||||||
}
|
}
|
||||||
|
|
||||||
BAN::ErrorOr<VirtualFileSystem::File> OpenFileDescriptorSet::file_of(int fd) const
|
BAN::ErrorOr<VirtualFileSystem::File> OpenFileDescriptorSet::file_of(int fd) const
|
||||||
|
|
|
@ -514,10 +514,6 @@ namespace Kernel
|
||||||
if (fd == AT_FDCWD)
|
if (fd == AT_FDCWD)
|
||||||
return TRY(m_working_directory.clone());
|
return TRY(m_working_directory.clone());
|
||||||
|
|
||||||
const auto status_flags = TRY(m_open_file_descriptors.status_flags_of(fd));
|
|
||||||
if (!(status_flags & O_RDONLY) && !(status_flags & O_SEARCH))
|
|
||||||
return BAN::Error::from_errno(EBADF);
|
|
||||||
|
|
||||||
return TRY(m_open_file_descriptors.file_of(fd));
|
return TRY(m_open_file_descriptors.file_of(fd));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -810,13 +806,10 @@ namespace Kernel
|
||||||
return exited_pid;
|
return exited_pid;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Thread::current().is_interrupted_by_signal())
|
|
||||||
return BAN::Error::from_errno(EINTR);
|
|
||||||
|
|
||||||
if (options & WNOHANG)
|
if (options & WNOHANG)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
m_child_exit_blocker.block_indefinite(&m_process_lock);
|
TRY(Thread::current().block_or_eintr_indefinite(m_child_exit_blocker, &m_process_lock));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -826,12 +819,18 @@ namespace Kernel
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
const uint64_t wake_time_ms = SystemTimer::get().ms_since_boot() + (seconds * 1000);
|
const uint64_t wake_time_ms = SystemTimer::get().ms_since_boot() + (seconds * 1000);
|
||||||
SystemTimer::get().sleep_ms(seconds * 1000);
|
|
||||||
|
while (!Thread::current().is_interrupted_by_signal())
|
||||||
|
{
|
||||||
|
const uint64_t current_ms = SystemTimer::get().ms_since_boot();
|
||||||
|
if (current_ms >= wake_time_ms)
|
||||||
|
break;
|
||||||
|
SystemTimer::get().sleep_ms(wake_time_ms - current_ms);
|
||||||
|
}
|
||||||
|
|
||||||
const uint64_t current_ms = SystemTimer::get().ms_since_boot();
|
const uint64_t current_ms = SystemTimer::get().ms_since_boot();
|
||||||
if (current_ms < wake_time_ms)
|
if (current_ms < wake_time_ms)
|
||||||
return BAN::Math::div_round_up<long>(wake_time_ms - current_ms, 1000);
|
return BAN::Math::div_round_up<long>(wake_time_ms - current_ms, 1000);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1215,6 +1214,16 @@ namespace Kernel
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BAN::ErrorOr<long> Process::sys_flock(int fd, int op)
|
||||||
|
{
|
||||||
|
auto maybe_error = m_open_file_descriptors.flock(fd, op);
|
||||||
|
if (maybe_error.is_error() && maybe_error.error().get_error_code() == ENOMEM)
|
||||||
|
return BAN::Error::from_errno(ENOLCK);
|
||||||
|
if (maybe_error.is_error())
|
||||||
|
return maybe_error.error();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
BAN::ErrorOr<long> Process::sys_pread(int fd, void* buffer, size_t count, off_t offset)
|
BAN::ErrorOr<long> Process::sys_pread(int fd, void* buffer, size_t count, off_t offset)
|
||||||
{
|
{
|
||||||
auto inode = TRY(m_open_file_descriptors.inode_of(fd));
|
auto inode = TRY(m_open_file_descriptors.inode_of(fd));
|
||||||
|
@ -2084,26 +2093,28 @@ namespace Kernel
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
BAN::ErrorOr<long> Process::sys_mmap(const sys_mmap_t* args)
|
BAN::ErrorOr<long> Process::sys_mmap(const sys_mmap_t* user_args)
|
||||||
{
|
{
|
||||||
|
sys_mmap_t args;
|
||||||
{
|
{
|
||||||
LockGuard _(m_process_lock);
|
LockGuard _(m_process_lock);
|
||||||
TRY(validate_pointer_access(args, sizeof(sys_mmap_t), true));
|
TRY(validate_pointer_access(user_args, sizeof(sys_mmap_t), false));
|
||||||
|
args = *user_args;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (args->prot != PROT_NONE && (args->prot & ~(PROT_READ | PROT_WRITE | PROT_EXEC)))
|
if (args.prot != PROT_NONE && (args.prot & ~(PROT_READ | PROT_WRITE | PROT_EXEC)))
|
||||||
return BAN::Error::from_errno(EINVAL);
|
return BAN::Error::from_errno(EINVAL);
|
||||||
|
|
||||||
if (!(args->flags & MAP_PRIVATE) == !(args->flags & MAP_SHARED))
|
if (!(args.flags & MAP_PRIVATE) == !(args.flags & MAP_SHARED))
|
||||||
return BAN::Error::from_errno(EINVAL);
|
return BAN::Error::from_errno(EINVAL);
|
||||||
auto region_type = (args->flags & MAP_PRIVATE) ? MemoryRegion::Type::PRIVATE : MemoryRegion::Type::SHARED;
|
auto region_type = (args.flags & MAP_PRIVATE) ? MemoryRegion::Type::PRIVATE : MemoryRegion::Type::SHARED;
|
||||||
|
|
||||||
PageTable::flags_t page_flags = 0;
|
PageTable::flags_t page_flags = 0;
|
||||||
if (args->prot & PROT_READ)
|
if (args.prot & PROT_READ)
|
||||||
page_flags |= PageTable::Flags::Present;
|
page_flags |= PageTable::Flags::Present;
|
||||||
if (args->prot & PROT_WRITE)
|
if (args.prot & PROT_WRITE)
|
||||||
page_flags |= PageTable::Flags::ReadWrite | PageTable::Flags::Present;
|
page_flags |= PageTable::Flags::ReadWrite | PageTable::Flags::Present;
|
||||||
if (args->prot & PROT_EXEC)
|
if (args.prot & PROT_EXEC)
|
||||||
page_flags |= PageTable::Flags::Execute | PageTable::Flags::Present;
|
page_flags |= PageTable::Flags::Execute | PageTable::Flags::Present;
|
||||||
|
|
||||||
if (page_flags == 0)
|
if (page_flags == 0)
|
||||||
|
@ -2112,21 +2123,21 @@ namespace Kernel
|
||||||
page_flags |= PageTable::Flags::UserSupervisor;
|
page_flags |= PageTable::Flags::UserSupervisor;
|
||||||
|
|
||||||
AddressRange address_range { .start = 0x400000, .end = USERSPACE_END };
|
AddressRange address_range { .start = 0x400000, .end = USERSPACE_END };
|
||||||
if (args->flags & MAP_FIXED)
|
if (args.flags & MAP_FIXED)
|
||||||
{
|
{
|
||||||
vaddr_t base_addr = reinterpret_cast<vaddr_t>(args->addr);
|
vaddr_t base_addr = reinterpret_cast<vaddr_t>(args.addr);
|
||||||
address_range.start = BAN::Math::div_round_up<vaddr_t>(base_addr, PAGE_SIZE) * PAGE_SIZE;
|
address_range.start = BAN::Math::div_round_up<vaddr_t>(base_addr, PAGE_SIZE) * PAGE_SIZE;
|
||||||
address_range.end = BAN::Math::div_round_up<vaddr_t>(base_addr + args->len, PAGE_SIZE) * PAGE_SIZE;
|
address_range.end = BAN::Math::div_round_up<vaddr_t>(base_addr + args.len, PAGE_SIZE) * PAGE_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (args->flags & MAP_ANONYMOUS)
|
if (args.flags & MAP_ANONYMOUS)
|
||||||
{
|
{
|
||||||
if (args->off != 0)
|
if (args.off != 0)
|
||||||
return BAN::Error::from_errno(EINVAL);
|
return BAN::Error::from_errno(EINVAL);
|
||||||
|
|
||||||
auto region = TRY(MemoryBackedRegion::create(
|
auto region = TRY(MemoryBackedRegion::create(
|
||||||
page_table(),
|
page_table(),
|
||||||
args->len,
|
args.len,
|
||||||
address_range,
|
address_range,
|
||||||
region_type, page_flags
|
region_type, page_flags
|
||||||
));
|
));
|
||||||
|
@ -2138,13 +2149,13 @@ namespace Kernel
|
||||||
|
|
||||||
LockGuard _(m_process_lock);
|
LockGuard _(m_process_lock);
|
||||||
|
|
||||||
auto inode = TRY(m_open_file_descriptors.inode_of(args->fildes));
|
auto inode = TRY(m_open_file_descriptors.inode_of(args.fildes));
|
||||||
|
|
||||||
const auto status_flags = TRY(m_open_file_descriptors.status_flags_of(args->fildes));
|
const auto status_flags = TRY(m_open_file_descriptors.status_flags_of(args.fildes));
|
||||||
if (!(status_flags & O_RDONLY))
|
if (!(status_flags & O_RDONLY))
|
||||||
return BAN::Error::from_errno(EACCES);
|
return BAN::Error::from_errno(EACCES);
|
||||||
if (region_type == MemoryRegion::Type::SHARED)
|
if (region_type == MemoryRegion::Type::SHARED)
|
||||||
if ((args->prot & PROT_WRITE) && !(status_flags & O_WRONLY))
|
if ((args.prot & PROT_WRITE) && !(status_flags & O_WRONLY))
|
||||||
return BAN::Error::from_errno(EACCES);
|
return BAN::Error::from_errno(EACCES);
|
||||||
|
|
||||||
BAN::UniqPtr<MemoryRegion> memory_region;
|
BAN::UniqPtr<MemoryRegion> memory_region;
|
||||||
|
@ -2153,7 +2164,7 @@ namespace Kernel
|
||||||
memory_region = TRY(FileBackedRegion::create(
|
memory_region = TRY(FileBackedRegion::create(
|
||||||
inode,
|
inode,
|
||||||
page_table(),
|
page_table(),
|
||||||
args->off, args->len,
|
args.off, args.len,
|
||||||
address_range,
|
address_range,
|
||||||
region_type, page_flags
|
region_type, page_flags
|
||||||
));
|
));
|
||||||
|
@ -2162,7 +2173,7 @@ namespace Kernel
|
||||||
{
|
{
|
||||||
memory_region = TRY(static_cast<Device&>(*inode).mmap_region(
|
memory_region = TRY(static_cast<Device&>(*inode).mmap_region(
|
||||||
page_table(),
|
page_table(),
|
||||||
args->off, args->len,
|
args.off, args.len,
|
||||||
address_range,
|
address_range,
|
||||||
region_type, page_flags
|
region_type, page_flags
|
||||||
));
|
));
|
||||||
|
@ -2368,10 +2379,8 @@ namespace Kernel
|
||||||
|
|
||||||
BAN::ErrorOr<long> Process::sys_clock_gettime(clockid_t clock_id, timespec* tp)
|
BAN::ErrorOr<long> Process::sys_clock_gettime(clockid_t clock_id, timespec* tp)
|
||||||
{
|
{
|
||||||
{
|
LockGuard _(m_process_lock);
|
||||||
LockGuard _(m_process_lock);
|
TRY(validate_pointer_access(tp, sizeof(timespec), true));
|
||||||
TRY(validate_pointer_access(tp, sizeof(timespec), true));
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (clock_id)
|
switch (clock_id)
|
||||||
{
|
{
|
||||||
|
@ -2381,10 +2390,31 @@ namespace Kernel
|
||||||
case CLOCK_REALTIME:
|
case CLOCK_REALTIME:
|
||||||
*tp = SystemTimer::get().real_time();
|
*tp = SystemTimer::get().real_time();
|
||||||
break;
|
break;
|
||||||
|
case CLOCK_PROCESS_CPUTIME_ID:
|
||||||
|
{
|
||||||
|
uint64_t cpu_time_ns { 0 };
|
||||||
|
for (auto* thread : m_threads)
|
||||||
|
cpu_time_ns += thread->cpu_time_ns();
|
||||||
|
*tp = {
|
||||||
|
.tv_sec = static_cast<time_t>(cpu_time_ns / 1'000'000'000),
|
||||||
|
.tv_nsec = static_cast<long>(cpu_time_ns % 1'000'000'000),
|
||||||
|
};
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case CLOCK_THREAD_CPUTIME_ID:
|
||||||
|
{
|
||||||
|
const auto cpu_time_ns = Thread::current().cpu_time_ns();
|
||||||
|
*tp = {
|
||||||
|
.tv_sec = static_cast<time_t>(cpu_time_ns / 1'000'000'000),
|
||||||
|
.tv_nsec = static_cast<long>(cpu_time_ns % 1'000'000'000),
|
||||||
|
};
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
dwarnln("TODO: clock_gettime({})", clock_id);
|
dwarnln("TODO: clock_gettime({})", clock_id);
|
||||||
return BAN::Error::from_errno(ENOTSUP);
|
return BAN::Error::from_errno(ENOTSUP);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -382,6 +382,9 @@ namespace Kernel
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!scheduler().is_idle())
|
||||||
|
Thread::current().set_cpu_time_stop();
|
||||||
|
|
||||||
#if ARCH(x86_64)
|
#if ARCH(x86_64)
|
||||||
asm volatile(
|
asm volatile(
|
||||||
"movq %%rsp, %%rcx;"
|
"movq %%rsp, %%rcx;"
|
||||||
|
@ -391,7 +394,7 @@ namespace Kernel
|
||||||
// NOTE: This is offset by 2 pointers since interrupt without PL change
|
// NOTE: This is offset by 2 pointers since interrupt without PL change
|
||||||
// does not push SP and SS. This allows accessing "whole" interrupt stack.
|
// does not push SP and SS. This allows accessing "whole" interrupt stack.
|
||||||
:: [load_sp]"r"(Processor::current_stack_top() - 2 * sizeof(uintptr_t)),
|
:: [load_sp]"r"(Processor::current_stack_top() - 2 * sizeof(uintptr_t)),
|
||||||
[yield]"i"(IRQ_YIELD)
|
[yield]"i"(static_cast<int>(IRQ_YIELD)) // WTF GCC 15
|
||||||
: "memory", "rcx"
|
: "memory", "rcx"
|
||||||
);
|
);
|
||||||
#elif ARCH(i686)
|
#elif ARCH(i686)
|
||||||
|
@ -403,7 +406,7 @@ namespace Kernel
|
||||||
// NOTE: This is offset by 2 pointers since interrupt without PL change
|
// NOTE: This is offset by 2 pointers since interrupt without PL change
|
||||||
// does not push SP and SS. This allows accessing "whole" interrupt stack.
|
// does not push SP and SS. This allows accessing "whole" interrupt stack.
|
||||||
:: [load_sp]"r"(Processor::current_stack_top() - 2 * sizeof(uintptr_t)),
|
:: [load_sp]"r"(Processor::current_stack_top() - 2 * sizeof(uintptr_t)),
|
||||||
[yield]"i"(IRQ_YIELD)
|
[yield]"i"(static_cast<int>(IRQ_YIELD)) // WTF GCC 15
|
||||||
: "memory", "ecx"
|
: "memory", "ecx"
|
||||||
);
|
);
|
||||||
#else
|
#else
|
||||||
|
@ -412,6 +415,9 @@ namespace Kernel
|
||||||
|
|
||||||
processor_info.m_start_ns = SystemTimer::get().ns_since_boot();
|
processor_info.m_start_ns = SystemTimer::get().ns_since_boot();
|
||||||
|
|
||||||
|
if (!scheduler().is_idle())
|
||||||
|
Thread::current().set_cpu_time_start();
|
||||||
|
|
||||||
Processor::set_interrupt_state(state);
|
Processor::set_interrupt_state(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -275,7 +275,10 @@ namespace Kernel
|
||||||
page_table.load();
|
page_table.load();
|
||||||
|
|
||||||
if (thread->state() == Thread::State::NotStarted)
|
if (thread->state() == Thread::State::NotStarted)
|
||||||
|
{
|
||||||
thread->m_state = Thread::State::Executing;
|
thread->m_state = Thread::State::Executing;
|
||||||
|
thread->set_cpu_time_start();
|
||||||
|
}
|
||||||
|
|
||||||
Processor::gdt().set_tss_stack(thread->kernel_stack_top());
|
Processor::gdt().set_tss_stack(thread->kernel_stack_top());
|
||||||
Processor::load_tls();
|
Processor::load_tls();
|
||||||
|
@ -458,9 +461,14 @@ namespace Kernel
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
const uint64_t duration_ns = current_ns - m_last_load_balance_ns;
|
const uint64_t duration_ns = current_ns - m_last_load_balance_ns;
|
||||||
const uint64_t max_thread_load_x1000 = 1000 * m_most_loaded_threads.front().node->time_used_ns / duration_ns;
|
const uint64_t max_thread_load_x1000 = 1000 * most_loaded_thread.node->time_used_ns / duration_ns;
|
||||||
const uint64_t max_load_thread_count = ((2000 / max_thread_load_x1000) + 1) / 2;
|
if (max_thread_load_x1000 == 0)
|
||||||
s_processor_infos[Processor::current_id().as_u32()].max_load_threads = max_load_thread_count;
|
s_processor_infos[Processor::current_id().as_u32()].max_load_threads = 0;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
const uint64_t max_load_thread_count = ((2000 / max_thread_load_x1000) + 1) / 2;
|
||||||
|
s_processor_infos[Processor::current_id().as_u32()].max_load_threads = max_load_thread_count;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -38,6 +38,8 @@ namespace Kernel
|
||||||
#undef O
|
#undef O
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static bool is_restartable_syscall(int syscall);
|
||||||
|
|
||||||
extern "C" long cpp_syscall_handler(int syscall, uintptr_t arg1, uintptr_t arg2, uintptr_t arg3, uintptr_t arg4, uintptr_t arg5, InterruptStack* interrupt_stack)
|
extern "C" long cpp_syscall_handler(int syscall, uintptr_t arg1, uintptr_t arg2, uintptr_t arg3, uintptr_t arg4, uintptr_t arg5, InterruptStack* interrupt_stack)
|
||||||
{
|
{
|
||||||
ASSERT(GDT::is_user_segment(interrupt_stack->cs));
|
ASSERT(GDT::is_user_segment(interrupt_stack->cs));
|
||||||
|
@ -93,7 +95,7 @@ namespace Kernel
|
||||||
auto& current_thread = Thread::current();
|
auto& current_thread = Thread::current();
|
||||||
if (current_thread.can_add_signal_to_execute())
|
if (current_thread.can_add_signal_to_execute())
|
||||||
if (current_thread.handle_signal())
|
if (current_thread.handle_signal())
|
||||||
if (ret.is_error() && ret.error().get_error_code() == EINTR)
|
if (ret.is_error() && ret.error().get_error_code() == EINTR && is_restartable_syscall(syscall))
|
||||||
ret = BAN::Error::from_errno(ERESTART);
|
ret = BAN::Error::from_errno(ERESTART);
|
||||||
|
|
||||||
Processor::set_interrupt_state(InterruptState::Disabled);
|
Processor::set_interrupt_state(InterruptState::Disabled);
|
||||||
|
@ -105,4 +107,26 @@ namespace Kernel
|
||||||
return ret.value();
|
return ret.value();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool is_restartable_syscall(int syscall)
|
||||||
|
{
|
||||||
|
// https://www.man7.org/linux/man-pages/man7/signal.7.html
|
||||||
|
// Interruption of system calls and library functions by signal handlers
|
||||||
|
switch (syscall)
|
||||||
|
{
|
||||||
|
case SYS_READ:
|
||||||
|
case SYS_WRITE:
|
||||||
|
case SYS_IOCTL:
|
||||||
|
case SYS_OPENAT:
|
||||||
|
case SYS_WAIT:
|
||||||
|
case SYS_ACCEPT:
|
||||||
|
case SYS_CONNECT:
|
||||||
|
case SYS_RECVFROM:
|
||||||
|
case SYS_SENDTO:
|
||||||
|
case SYS_FLOCK:
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -204,20 +204,4 @@ namespace Kernel
|
||||||
return master->m_buffer_size < master->m_buffer->size();
|
return master->m_buffer_size < master->m_buffer->size();
|
||||||
}
|
}
|
||||||
|
|
||||||
BAN::ErrorOr<long> PseudoTerminalSlave::ioctl_impl(int request, void* argument)
|
|
||||||
{
|
|
||||||
switch (request)
|
|
||||||
{
|
|
||||||
case TIOCSWINSZ:
|
|
||||||
{
|
|
||||||
const auto* winsize = static_cast<struct winsize*>(argument);
|
|
||||||
m_width = winsize->ws_col;
|
|
||||||
m_height = winsize->ws_row;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return TTY::ioctl_impl(request, argument);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -181,7 +181,9 @@ namespace Kernel
|
||||||
}, 0600, 0, 0)
|
}, 0600, 0, 0)
|
||||||
, m_name(MUST(BAN::String::formatted("ttyS{}", s_next_tty_number++)))
|
, m_name(MUST(BAN::String::formatted("ttyS{}", s_next_tty_number++)))
|
||||||
, m_serial(serial)
|
, m_serial(serial)
|
||||||
{}
|
{
|
||||||
|
update_winsize(m_serial.width(), m_serial.height());
|
||||||
|
}
|
||||||
|
|
||||||
BAN::ErrorOr<BAN::RefPtr<SerialTTY>> SerialTTY::create(Serial serial)
|
BAN::ErrorOr<BAN::RefPtr<SerialTTY>> SerialTTY::create(Serial serial)
|
||||||
{
|
{
|
||||||
|
@ -254,16 +256,6 @@ namespace Kernel
|
||||||
handle_input_byte(*ptr++);
|
handle_input_byte(*ptr++);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t SerialTTY::width() const
|
|
||||||
{
|
|
||||||
return m_serial.width();
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t SerialTTY::height() const
|
|
||||||
{
|
|
||||||
return m_serial.height();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool SerialTTY::putchar_impl(uint8_t ch)
|
bool SerialTTY::putchar_impl(uint8_t ch)
|
||||||
{
|
{
|
||||||
m_serial.putchar(ch);
|
m_serial.putchar(ch);
|
||||||
|
|
|
@ -184,6 +184,13 @@ namespace Kernel
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TTY::update_winsize(unsigned short cols, unsigned short rows)
|
||||||
|
{
|
||||||
|
m_winsize.ws_col = cols;
|
||||||
|
m_winsize.ws_row = rows;
|
||||||
|
(void)Process::kill(-m_foreground_pgrp, SIGWINCH);
|
||||||
|
}
|
||||||
|
|
||||||
BAN::ErrorOr<long> TTY::ioctl_impl(int request, void* argument)
|
BAN::ErrorOr<long> TTY::ioctl_impl(int request, void* argument)
|
||||||
{
|
{
|
||||||
switch (request)
|
switch (request)
|
||||||
|
@ -198,8 +205,14 @@ namespace Kernel
|
||||||
case TIOCGWINSZ:
|
case TIOCGWINSZ:
|
||||||
{
|
{
|
||||||
auto* winsize = static_cast<struct winsize*>(argument);
|
auto* winsize = static_cast<struct winsize*>(argument);
|
||||||
winsize->ws_col = width();
|
*winsize = m_winsize;
|
||||||
winsize->ws_row = height();
|
return 0;
|
||||||
|
}
|
||||||
|
case TIOCSWINSZ:
|
||||||
|
{
|
||||||
|
const auto* winsize = static_cast<const struct winsize*>(argument);
|
||||||
|
m_winsize = *winsize;
|
||||||
|
(void)Process::kill(-m_foreground_pgrp, SIGWINCH);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -53,6 +53,7 @@ namespace Kernel
|
||||||
{
|
{
|
||||||
m_width = m_terminal_driver->width();
|
m_width = m_terminal_driver->width();
|
||||||
m_height = m_terminal_driver->height();
|
m_height = m_terminal_driver->height();
|
||||||
|
update_winsize(m_width, m_height);
|
||||||
|
|
||||||
m_buffer = new Cell[m_width * m_height];
|
m_buffer = new Cell[m_width * m_height];
|
||||||
ASSERT(m_buffer);
|
ASSERT(m_buffer);
|
||||||
|
@ -71,34 +72,38 @@ namespace Kernel
|
||||||
if (!m_terminal_driver->has_font())
|
if (!m_terminal_driver->has_font())
|
||||||
return BAN::Error::from_errno(EINVAL);
|
return BAN::Error::from_errno(EINVAL);
|
||||||
|
|
||||||
SpinLockGuard _(m_write_lock);
|
|
||||||
|
|
||||||
TRY(m_terminal_driver->set_font(BAN::move(font)));
|
|
||||||
|
|
||||||
uint32_t new_width = m_terminal_driver->width();
|
|
||||||
uint32_t new_height = m_terminal_driver->height();
|
|
||||||
|
|
||||||
if (m_width != new_width || m_height != new_height)
|
|
||||||
{
|
{
|
||||||
Cell* new_buffer = new Cell[new_width * new_height];
|
SpinLockGuard _(m_write_lock);
|
||||||
ASSERT(new_buffer);
|
|
||||||
|
|
||||||
for (uint32_t i = 0; i < new_width * m_height; i++)
|
TRY(m_terminal_driver->set_font(BAN::move(font)));
|
||||||
new_buffer[i] = { .foreground = m_foreground, .background = m_background, .codepoint = ' ' };
|
|
||||||
|
|
||||||
for (uint32_t y = 0; y < BAN::Math::min<uint32_t>(m_height, new_height); y++)
|
uint32_t new_width = m_terminal_driver->width();
|
||||||
for (uint32_t x = 0; x < BAN::Math::min<uint32_t>(m_width, new_width); x++)
|
uint32_t new_height = m_terminal_driver->height();
|
||||||
new_buffer[y * new_width + x] = m_buffer[y * m_width + x];
|
|
||||||
|
|
||||||
delete[] m_buffer;
|
if (m_width != new_width || m_height != new_height)
|
||||||
m_buffer = new_buffer;
|
{
|
||||||
m_width = new_width;
|
Cell* new_buffer = new Cell[new_width * new_height];
|
||||||
m_height = new_height;
|
ASSERT(new_buffer);
|
||||||
|
|
||||||
|
for (uint32_t i = 0; i < new_width * m_height; i++)
|
||||||
|
new_buffer[i] = { .foreground = m_foreground, .background = m_background, .codepoint = ' ' };
|
||||||
|
|
||||||
|
for (uint32_t y = 0; y < BAN::Math::min<uint32_t>(m_height, new_height); y++)
|
||||||
|
for (uint32_t x = 0; x < BAN::Math::min<uint32_t>(m_width, new_width); x++)
|
||||||
|
new_buffer[y * new_width + x] = m_buffer[y * m_width + x];
|
||||||
|
|
||||||
|
delete[] m_buffer;
|
||||||
|
m_buffer = new_buffer;
|
||||||
|
m_width = new_width;
|
||||||
|
m_height = new_height;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (uint32_t y = 0; y < m_height; y++)
|
||||||
|
for (uint32_t x = 0; x < m_width; x++)
|
||||||
|
render_from_buffer(x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (uint32_t y = 0; y < m_height; y++)
|
update_winsize(m_width, m_height);
|
||||||
for (uint32_t x = 0; x < m_width; x++)
|
|
||||||
render_from_buffer(x, y);
|
|
||||||
|
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
@ -114,10 +119,10 @@ namespace Kernel
|
||||||
m_state = State::Normal;
|
m_state = State::Normal;
|
||||||
}
|
}
|
||||||
|
|
||||||
void VirtualTTY::handle_ansi_csi_color(uint8_t ch)
|
void VirtualTTY::handle_ansi_csi_color(uint8_t value)
|
||||||
{
|
{
|
||||||
ASSERT(m_write_lock.current_processor_has_lock());
|
ASSERT(m_write_lock.current_processor_has_lock());
|
||||||
switch (ch)
|
switch (value)
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
m_foreground = m_palette[15];
|
m_foreground = m_palette[15];
|
||||||
|
@ -125,23 +130,37 @@ namespace Kernel
|
||||||
m_colors_inverted = false;
|
m_colors_inverted = false;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
// TODO: bold
|
||||||
|
case 1: break;
|
||||||
|
case 22: break;
|
||||||
|
|
||||||
case 7: m_colors_inverted = true; break;
|
case 7: m_colors_inverted = true; break;
|
||||||
case 27: m_colors_inverted = false; break;
|
case 27: m_colors_inverted = false; break;
|
||||||
|
|
||||||
case 30: case 31: case 32: case 33: case 34: case 35: case 36: case 37:
|
case 30: case 31: case 32: case 33: case 34: case 35: case 36: case 37:
|
||||||
m_foreground = m_palette[ch - 30];
|
m_foreground = m_palette[value - 30];
|
||||||
|
break;
|
||||||
|
case 39:
|
||||||
|
m_foreground = m_palette[15];
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 40: case 41: case 42: case 43: case 44: case 45: case 46: case 47:
|
case 40: case 41: case 42: case 43: case 44: case 45: case 46: case 47:
|
||||||
m_background = m_palette[ch - 40];
|
m_background = m_palette[value - 40];
|
||||||
|
break;
|
||||||
|
case 49:
|
||||||
|
m_background = m_palette[0];
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 90: case 91: case 92: case 93: case 94: case 95: case 96: case 97:
|
case 90: case 91: case 92: case 93: case 94: case 95: case 96: case 97:
|
||||||
m_foreground = m_palette[ch - 90 + 8];
|
m_foreground = m_palette[value - 90 + 8];
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 100: case 101: case 102: case 103: case 104: case 105: case 106: case 107:
|
case 100: case 101: case 102: case 103: case 104: case 105: case 106: case 107:
|
||||||
m_background = m_palette[ch - 100 + 8];
|
m_background = m_palette[value - 100 + 8];
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
dprintln_if(DEBUG_VTTY, "unhandled ANSI SGR {}", value);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -389,7 +408,7 @@ namespace Kernel
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
reset_ansi();
|
reset_ansi();
|
||||||
dprintln_if(DEBUG_VTTY, "invalid ANSI CSI ?");
|
dprintln_if(DEBUG_VTTY, "Invalid ANSI CSI ?");
|
||||||
return;
|
return;
|
||||||
case 'h':
|
case 'h':
|
||||||
case 'l':
|
case 'l':
|
||||||
|
@ -399,16 +418,15 @@ namespace Kernel
|
||||||
return reset_ansi();
|
return reset_ansi();
|
||||||
}
|
}
|
||||||
reset_ansi();
|
reset_ansi();
|
||||||
dprintln_if(DEBUG_VTTY, "invalid ANSI CSI character {}", static_cast<char>(ch));
|
dprintln_if(DEBUG_VTTY, "Unsupported ANSI CSI character {}", static_cast<char>(ch));
|
||||||
return;
|
return;
|
||||||
case 'n':
|
case 'n':
|
||||||
if (m_ansi_state.nums[0] == 6)
|
if (m_ansi_state.nums[0] == 6)
|
||||||
{
|
{
|
||||||
char buffer[2 + 10 + 1 + 10 + 1];
|
BAN::Formatter::print(
|
||||||
size_t len = 0;
|
[this](char ch) { handle_input_byte(ch); },
|
||||||
BAN::Formatter::print([&](char ch) { buffer[len++] = ch; }, "\e[{};{}R", m_row + 1, m_column + 1);
|
"\e[{};{}R", m_row + 1, m_column + 1
|
||||||
for (size_t i = 0; i < len; i++)
|
);
|
||||||
handle_input_byte(buffer[i]);
|
|
||||||
return reset_ansi();
|
return reset_ansi();
|
||||||
};
|
};
|
||||||
reset_ansi();
|
reset_ansi();
|
||||||
|
|
|
@ -37,18 +37,36 @@ namespace Kernel
|
||||||
static pid_t s_next_tid = 1;
|
static pid_t s_next_tid = 1;
|
||||||
|
|
||||||
alignas(16) static uint8_t s_default_sse_storage[512];
|
alignas(16) static uint8_t s_default_sse_storage[512];
|
||||||
static bool s_default_sse_storage_initialized = false;
|
static BAN::Atomic<bool> s_default_sse_storage_initialized = false;
|
||||||
|
|
||||||
static void initialize_default_sse_storage()
|
static void initialize_default_sse_storage()
|
||||||
{
|
{
|
||||||
|
static BAN::Atomic<bool> is_initializing { false };
|
||||||
|
bool expected { false };
|
||||||
|
if (!is_initializing.compare_exchange(expected, true))
|
||||||
|
{
|
||||||
|
while (!s_default_sse_storage_initialized)
|
||||||
|
__builtin_ia32_pause();
|
||||||
|
asm volatile("" ::: "memory");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
const uint32_t mxcsr = 0x1F80;
|
const uint32_t mxcsr = 0x1F80;
|
||||||
asm volatile(
|
asm volatile(
|
||||||
"finit;"
|
"finit;"
|
||||||
"ldmxcsr %[mxcsr];"
|
"ldmxcsr %[mxcsr];"
|
||||||
|
#if ARCH(x86_64)
|
||||||
|
"fxsave64 %[storage];"
|
||||||
|
#elif ARCH(i686)
|
||||||
"fxsave %[storage];"
|
"fxsave %[storage];"
|
||||||
|
#else
|
||||||
|
#error
|
||||||
|
#endif
|
||||||
: [storage]"=m"(s_default_sse_storage)
|
: [storage]"=m"(s_default_sse_storage)
|
||||||
: [mxcsr]"m"(mxcsr)
|
: [mxcsr]"m"(mxcsr)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
s_default_sse_storage_initialized = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
BAN::ErrorOr<Thread*> Thread::create_kernel(entry_t entry, void* data, Process* process)
|
BAN::ErrorOr<Thread*> Thread::create_kernel(entry_t entry, void* data, Process* process)
|
||||||
|
@ -126,10 +144,7 @@ namespace Kernel
|
||||||
: m_tid(tid), m_process(process)
|
: m_tid(tid), m_process(process)
|
||||||
{
|
{
|
||||||
if (!s_default_sse_storage_initialized)
|
if (!s_default_sse_storage_initialized)
|
||||||
{
|
|
||||||
initialize_default_sse_storage();
|
initialize_default_sse_storage();
|
||||||
s_default_sse_storage_initialized = true;
|
|
||||||
}
|
|
||||||
memcpy(m_sse_storage, s_default_sse_storage, sizeof(m_sse_storage));
|
memcpy(m_sse_storage, s_default_sse_storage, sizeof(m_sse_storage));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -166,6 +181,29 @@ namespace Kernel
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint64_t Thread::cpu_time_ns() const
|
||||||
|
{
|
||||||
|
SpinLockGuard _(m_cpu_time_lock);
|
||||||
|
if (m_cpu_time_start_ns == UINT64_MAX)
|
||||||
|
return m_cpu_time_ns;
|
||||||
|
return m_cpu_time_ns + (SystemTimer::get().ns_since_boot() - m_cpu_time_start_ns);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Thread::set_cpu_time_start()
|
||||||
|
{
|
||||||
|
SpinLockGuard _(m_cpu_time_lock);
|
||||||
|
ASSERT(m_cpu_time_start_ns == UINT64_MAX);
|
||||||
|
m_cpu_time_start_ns = SystemTimer::get().ns_since_boot();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Thread::set_cpu_time_stop()
|
||||||
|
{
|
||||||
|
SpinLockGuard _(m_cpu_time_lock);
|
||||||
|
ASSERT(m_cpu_time_start_ns != UINT64_MAX);
|
||||||
|
m_cpu_time_ns += SystemTimer::get().ns_since_boot() - m_cpu_time_start_ns;
|
||||||
|
m_cpu_time_start_ns = UINT64_MAX;
|
||||||
|
}
|
||||||
|
|
||||||
BAN::ErrorOr<Thread*> Thread::pthread_create(entry_t entry, void* arg)
|
BAN::ErrorOr<Thread*> Thread::pthread_create(entry_t entry, void* arg)
|
||||||
{
|
{
|
||||||
auto* thread = TRY(create_userspace(m_process, m_process->page_table()));
|
auto* thread = TRY(create_userspace(m_process, m_process->page_table()));
|
||||||
|
@ -485,6 +523,7 @@ namespace Kernel
|
||||||
interrupt_stack.sp -= 128; // skip possible red-zone
|
interrupt_stack.sp -= 128; // skip possible red-zone
|
||||||
#endif
|
#endif
|
||||||
write_to_stack(interrupt_stack.sp, interrupt_stack.ip);
|
write_to_stack(interrupt_stack.sp, interrupt_stack.ip);
|
||||||
|
write_to_stack(interrupt_stack.sp, interrupt_stack.flags);
|
||||||
write_to_stack(interrupt_stack.sp, signal);
|
write_to_stack(interrupt_stack.sp, signal);
|
||||||
write_to_stack(interrupt_stack.sp, signal_handler);
|
write_to_stack(interrupt_stack.sp, signal_handler);
|
||||||
interrupt_stack.ip = (uintptr_t)signal_trampoline;
|
interrupt_stack.ip = (uintptr_t)signal_trampoline;
|
||||||
|
@ -638,12 +677,24 @@ namespace Kernel
|
||||||
|
|
||||||
void Thread::save_sse()
|
void Thread::save_sse()
|
||||||
{
|
{
|
||||||
|
#if ARCH(x86_64)
|
||||||
|
asm volatile("fxsave64 %0" :: "m"(m_sse_storage));
|
||||||
|
#elif ARCH(i686)
|
||||||
asm volatile("fxsave %0" :: "m"(m_sse_storage));
|
asm volatile("fxsave %0" :: "m"(m_sse_storage));
|
||||||
|
#else
|
||||||
|
#error
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void Thread::load_sse()
|
void Thread::load_sse()
|
||||||
{
|
{
|
||||||
|
#if ARCH(x86_64)
|
||||||
|
asm volatile("fxrstor64 %0" :: "m"(m_sse_storage));
|
||||||
|
#elif ARCH(i686)
|
||||||
asm volatile("fxrstor %0" :: "m"(m_sse_storage));
|
asm volatile("fxrstor %0" :: "m"(m_sse_storage));
|
||||||
|
#else
|
||||||
|
#error
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,27 @@
|
||||||
|
#!/bin/bash ../install.sh
|
||||||
|
|
||||||
|
NAME='SDL2'
|
||||||
|
VERSION='2.30.11'
|
||||||
|
DOWNLOAD_URL="https://github.com/libsdl-org/SDL/archive/refs/tags/release-$VERSION.tar.gz#cc6136dd964854e8846c679703322f3e2a341d27a06a53f8b3f642c26f1b0cfd"
|
||||||
|
TAR_CONTENT="SDL-release-$VERSION"
|
||||||
|
DEPENDENCIES=('mesa')
|
||||||
|
|
||||||
|
configure() {
|
||||||
|
$BANAN_CMAKE \
|
||||||
|
--toolchain="$CMAKE_TOOLCHAIN_FILE" \
|
||||||
|
--fresh -GNinja -S . -B build \
|
||||||
|
-DCMAKE_INSTALL_PREFIX='/usr' \
|
||||||
|
-DCMAKE_BUILD_TYPE=Release \
|
||||||
|
-DBANAN_OS=true \
|
||||||
|
-DUNIX=true \
|
||||||
|
-DSDL_LIBSAMPLERATE=OFF \
|
||||||
|
-DSDL_PTHREADS_SEM=OFF
|
||||||
|
}
|
||||||
|
|
||||||
|
build() {
|
||||||
|
$BANAN_CMAKE --build build --config Release || exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
install() {
|
||||||
|
$BANAN_CMAKE --install build || exit 1
|
||||||
|
}
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,21 @@
|
||||||
|
#!/bin/bash ../install.sh
|
||||||
|
|
||||||
|
NAME='bash'
|
||||||
|
VERSION='5.2.37'
|
||||||
|
DOWNLOAD_URL="https://ftp.gnu.org/gnu/bash/bash-$VERSION.tar.gz#9599b22ecd1d5787ad7d3b7bf0c59f312b3396d1e281175dd1f8a4014da621ff"
|
||||||
|
DEPENDENCIES=('ncurses')
|
||||||
|
CONFIGURE_OPTIONS=(
|
||||||
|
'--disable-nls'
|
||||||
|
'--without-bash-malloc'
|
||||||
|
'--with-curses'
|
||||||
|
'bash_cv_unusable_rtsigs=no'
|
||||||
|
'bash_cv_signal_vintage=posix'
|
||||||
|
'CFLAGS=-std=c17'
|
||||||
|
'CFLAGS_FOR_BUILD=-std=c17'
|
||||||
|
)
|
||||||
|
|
||||||
|
post_install() {
|
||||||
|
if [ ! -L $BANAN_SYSROOT/usr/bin/sh ]; then
|
||||||
|
ln -s bash $BANAN_SYSROOT/usr/bin/sh
|
||||||
|
fi
|
||||||
|
}
|
|
@ -0,0 +1,12 @@
|
||||||
|
diff -ruN bash-5.2.37/support/config.sub bash-5.2.37-banan_os/support/config.sub
|
||||||
|
--- bash-5.2.37/support/config.sub 2022-01-11 21:38:29.000000000 +0200
|
||||||
|
+++ bash-5.2.37-banan_os/support/config.sub 2024-12-07 05:43:54.697086738 +0200
|
||||||
|
@@ -1754,7 +1754,7 @@
|
||||||
|
| onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \
|
||||||
|
| midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \
|
||||||
|
| nsk* | powerunix* | genode* | zvmoe* | qnx* | emx* | zephyr* \
|
||||||
|
- | fiwix* )
|
||||||
|
+ | fiwix* | banan_os* )
|
||||||
|
;;
|
||||||
|
# This one is extra strict with allowed versions
|
||||||
|
sco3.2v2 | sco3.2v[4-9]* | sco5v6*)
|
|
@ -0,0 +1,19 @@
|
||||||
|
diff -ruN bash-5.2.37/parse.y bash-5.2.37-banan_os/parse.y
|
||||||
|
--- bash-5.2.37/parse.y 2024-09-24 00:24:01.000000000 +0300
|
||||||
|
+++ bash-5.2.37-banan_os/parse.y 2024-12-07 06:49:40.322734826 +0200
|
||||||
|
@@ -2640,6 +2640,7 @@
|
||||||
|
parser_state |= PST_ENDALIAS;
|
||||||
|
/* We need to do this to make sure last_shell_getc_is_singlebyte returns
|
||||||
|
true, since we are returning a single-byte space. */
|
||||||
|
+#if defined (HANDLE_MULTIBYTE)
|
||||||
|
if (shell_input_line_index == shell_input_line_len && last_shell_getc_is_singlebyte == 0)
|
||||||
|
{
|
||||||
|
#if 0
|
||||||
|
@@ -2653,6 +2654,7 @@
|
||||||
|
shell_input_line_property[shell_input_line_index - 1] = 1;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
+#endif /* HANDLE_MULTIBYTE */
|
||||||
|
return ' '; /* END_ALIAS */
|
||||||
|
}
|
||||||
|
#endif
|
|
@ -0,0 +1,12 @@
|
||||||
|
diff -ruN bash-5.2.37/examples/loadables/Makefile.in bash-5.2.37-banan_os/examples/loadables/Makefile.in
|
||||||
|
--- bash-5.2.37/examples/loadables/Makefile.in 2022-08-19 23:33:30.000000000 +0300
|
||||||
|
+++ bash-5.2.37-banan_os/examples/loadables/Makefile.in 2025-01-26 02:43:36.121801845 +0200
|
||||||
|
@@ -104,7 +104,7 @@
|
||||||
|
ALLPROG = print truefalse sleep finfo logname basename dirname fdflags \
|
||||||
|
tty pathchk tee head mkdir rmdir mkfifo mktemp printenv id whoami \
|
||||||
|
uname sync push ln unlink realpath strftime mypid setpgid seq rm \
|
||||||
|
- accept csv dsv cut stat getconf
|
||||||
|
+ accept csv dsv stat
|
||||||
|
OTHERPROG = necho hello cat pushd asort
|
||||||
|
|
||||||
|
all: $(SHOBJ_STATUS)
|
|
@ -1,9 +1,10 @@
|
||||||
#!/bin/bash ../install.sh
|
#!/bin/bash ../install.sh
|
||||||
|
|
||||||
NAME='binutils'
|
NAME='binutils'
|
||||||
VERSION='2.39'
|
VERSION='2.44'
|
||||||
DOWNLOAD_URL="https://ftp.gnu.org/gnu/binutils/binutils-$VERSION.tar.gz#d12ea6f239f1ffe3533ea11ad6e224ffcb89eb5d01bbea589e9158780fa11f10"
|
DOWNLOAD_URL="https://ftp.gnu.org/gnu/binutils/binutils-$VERSION.tar.gz#0cdd76777a0dfd3dd3a63f215f030208ddb91c2361d2bcc02acec0f1c16b6a2e"
|
||||||
DEPENDENCIES=('zlib')
|
DEPENDENCIES=('zlib')
|
||||||
|
MAKE_INSTALL_TARGETS=('install-strip')
|
||||||
CONFIGURE_OPTIONS=(
|
CONFIGURE_OPTIONS=(
|
||||||
"--target=$BANAN_TOOLCHAIN_TRIPLE"
|
"--target=$BANAN_TOOLCHAIN_TRIPLE"
|
||||||
'--with-sysroot=/'
|
'--with-sysroot=/'
|
||||||
|
@ -14,11 +15,3 @@ CONFIGURE_OPTIONS=(
|
||||||
'--disable-nls'
|
'--disable-nls'
|
||||||
'--disable-werror'
|
'--disable-werror'
|
||||||
)
|
)
|
||||||
|
|
||||||
build() {
|
|
||||||
# This file is not even used. binutils just requires it to exist
|
|
||||||
touch "$BANAN_SYSROOT/usr/include/memory.h"
|
|
||||||
|
|
||||||
make -j$(nproc) || exit 1
|
|
||||||
find . -type f -executable -exec strip --strip-unneeded {} + 2>/dev/null
|
|
||||||
}
|
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
../../../toolchain/binutils-2.39.patch
|
|
|
@ -0,0 +1 @@
|
||||||
|
../../../toolchain/binutils-2.44.patch
|
|
@ -0,0 +1,10 @@
|
||||||
|
#!/bin/bash ../install.sh
|
||||||
|
|
||||||
|
NAME='bochs'
|
||||||
|
VERSION='3.0'
|
||||||
|
DOWNLOAD_URL="https://sourceforge.net/projects/bochs/files/bochs/$VERSION/bochs-$VERSION.tar.gz#cb6f542b51f35a2cc9206b2a980db5602b7cd1b7cf2e4ed4f116acd5507781aa"
|
||||||
|
DEPENDENCIES=('SDL2')
|
||||||
|
CONFIGURE_OPTIONS=(
|
||||||
|
'--with-sdl2'
|
||||||
|
'--enable-x86-64'
|
||||||
|
)
|
|
@ -0,0 +1,12 @@
|
||||||
|
diff -ruN bochs-2.8/config.sub bochs-2.8-banan_os/config.sub
|
||||||
|
--- bochs-2.8/config.sub 2024-03-10 08:59:37.000000000 +0200
|
||||||
|
+++ bochs-2.8-banan_os/config.sub 2024-12-07 05:15:32.948901314 +0200
|
||||||
|
@@ -1368,7 +1368,7 @@
|
||||||
|
| powermax* | dnix* | nx6 | nx7 | sei* | dragonfly* \
|
||||||
|
| skyos* | haiku* | rdos* | toppers* | drops* | es* \
|
||||||
|
| onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \
|
||||||
|
- | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi*)
|
||||||
|
+ | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* | banan_os*)
|
||||||
|
# Remember, each alternative MUST END IN *, to match a version number.
|
||||||
|
;;
|
||||||
|
qnx*)
|
|
@ -0,0 +1,38 @@
|
||||||
|
diff -ruN bochs-3.0/bochs.h bochs-3.0-banan_os/bochs.h
|
||||||
|
--- bochs-3.0/bochs.h 2024-03-10 08:59:37.000000000 +0200
|
||||||
|
+++ bochs-3.0-banan_os/bochs.h 2025-04-15 20:46:58.442339461 +0300
|
||||||
|
@@ -91,6 +91,9 @@
|
||||||
|
#endif
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <string.h>
|
||||||
|
+#if defined(__banan_os__)
|
||||||
|
+# include <strings.h>
|
||||||
|
+#endif
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <limits.h>
|
||||||
|
#ifdef macintosh
|
||||||
|
diff -ruN bochs-3.0/iodev/serial.cc bochs-3.0-banan_os/iodev/serial.cc
|
||||||
|
--- bochs-3.0/iodev/serial.cc 2024-03-10 08:59:37.000000000 +0200
|
||||||
|
+++ bochs-3.0-banan_os/iodev/serial.cc 2025-04-15 20:49:42.493314963 +0300
|
||||||
|
@@ -37,6 +37,7 @@
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#include <netdb.h>
|
||||||
|
+#include <arpa/inet.h>
|
||||||
|
#define closesocket(s) close(s)
|
||||||
|
typedef int SOCKET;
|
||||||
|
#else
|
||||||
|
diff -ruN bochs-3.0/gui/keymap.cc bochs-3.0-banan_os/gui/keymap.cc
|
||||||
|
--- bochs-3.0/gui/keymap.cc 2025-02-16 11:15:29.000000000 +0200
|
||||||
|
+++ bochs-3.0-banan_os/gui/keymap.cc 2025-06-25 19:17:34.077048625 +0300
|
||||||
|
@@ -30,6 +30,10 @@
|
||||||
|
#include "gui.h"
|
||||||
|
#include "keymap.h"
|
||||||
|
|
||||||
|
+#ifdef __banan_os__
|
||||||
|
+# include <libgen.h>
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
// Table of bochs "BX_KEY_*" symbols
|
||||||
|
// the table must be in BX_KEY_* order
|
||||||
|
const char *bx_key_symbol[BX_KEY_NBKEYS] = {
|
|
@ -0,0 +1,39 @@
|
||||||
|
diff -ruN bochs-2.8/configure bochs-2.8-banan_os/configure
|
||||||
|
--- bochs-2.8/configure 2024-03-10 08:59:37.000000000 +0200
|
||||||
|
+++ bochs-2.8-banan_os/configure 2025-06-25 16:18:01.081403116 +0300
|
||||||
|
@@ -25286,7 +25286,7 @@
|
||||||
|
elif test "$with_sdl2" = yes; then
|
||||||
|
SOUNDLOW_OBJS="$SOUNDLOW_OBJS soundsdl.o"
|
||||||
|
if test "$bx_plugins" = 1; then
|
||||||
|
- SDL_SOUND_LINK_OPTS="$SDL_SOUND_LINK_OPTS `sdl2-config --libs`"
|
||||||
|
+ SDL_SOUND_LINK_OPTS="$SDL_SOUND_LINK_OPTS `pkg-config sdl2 --libs`"
|
||||||
|
fi
|
||||||
|
soundlow_drivers="$soundlow_drivers sdl"
|
||||||
|
if test "$soundlow_default" = "dummy"; then
|
||||||
|
@@ -25294,7 +25294,7 @@
|
||||||
|
fi
|
||||||
|
printf "%s\n" "#define BX_HAVE_SOUND_SDL 1" >>confdefs.h
|
||||||
|
|
||||||
|
- SDL2_VERSION=`sdl2-config --version`
|
||||||
|
+ SDL2_VERSION=`pkg-config sdl2 --version`
|
||||||
|
# SDL version >= 2.0.5 supports audio capture
|
||||||
|
sdl2_audio_capture=0
|
||||||
|
|
||||||
|
@@ -25967,14 +25967,14 @@
|
||||||
|
SPECIFIC_GUI_OBJS="$SPECIFIC_GUI_OBJS \$(GUI_OBJS_SDL2)"
|
||||||
|
# GUI_*FLAGS are added to the compilation of every bochs file, not just
|
||||||
|
# the files in gui/*.cc.
|
||||||
|
- SDL2_CFLAGS=`sdl2-config --cflags`
|
||||||
|
+ SDL2_CFLAGS=`pkg-config sdl2 --cflags`
|
||||||
|
GUI_CFLAGS="$GUI_CFLAGS $SDL2_CFLAGS"
|
||||||
|
GUI_CXXFLAGS="$GUI_CXXFLAGS $SDL2_CFLAGS"
|
||||||
|
- GUI_LINK_OPTS_SDL2="`sdl2-config --libs`"
|
||||||
|
+ GUI_LINK_OPTS_SDL2="`pkg-config sdl2 --libs`"
|
||||||
|
GUI_LINK_OPTS="$GUI_LINK_OPTS \$(GUI_LINK_OPTS_SDL2)"
|
||||||
|
# The plugin version uses multi-threading support in Bochs core
|
||||||
|
if test "$bx_plugins" = 1; then
|
||||||
|
- NONPLUGIN_GUI_LINK_OPTS="`sdl2-config --libs`"
|
||||||
|
+ NONPLUGIN_GUI_LINK_OPTS="`pkg-config sdl2 --libs`"
|
||||||
|
fi
|
||||||
|
# The enhanced X debugger depends on GTK2
|
||||||
|
if test "$gui_debugger" = 1 -a "$DEFAULT_GUI" != win32; then
|
|
@ -18,9 +18,7 @@ CONFIGURE_OPTIONS=(
|
||||||
'--without-ca-path'
|
'--without-ca-path'
|
||||||
)
|
)
|
||||||
|
|
||||||
install() {
|
post_install() {
|
||||||
make install DESTDIR="$BANAN_SYSROOT" || exit 1
|
|
||||||
|
|
||||||
# remove libtool file
|
# remove libtool file
|
||||||
rm -f $BANAN_SYSROOT/usr/lib/libcurl.la
|
rm -f $BANAN_SYSROOT/usr/lib/libcurl.la
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
#!/bin/bash ../install.sh
|
||||||
|
|
||||||
|
NAME='expat'
|
||||||
|
VERSION='2.7.1'
|
||||||
|
DOWNLOAD_URL="https://github.com/libexpat/libexpat/releases/download/R_2_7_1/expat-$VERSION.tar.gz#0cce2e6e69b327fc607b8ff264f4b66bdf71ead55a87ffd5f3143f535f15cfa2"
|
|
@ -0,0 +1,12 @@
|
||||||
|
diff -ruN expat-2.7.1/conftools/config.sub expat-2.7.1-banan_os/conftools/config.sub
|
||||||
|
--- expat-2.7.1/conftools/config.sub 2022-07-27 15:26:54.000000000 +0300
|
||||||
|
+++ expat-2.7.1-banan_os/conftools/config.sub 2025-06-17 11:51:49.876848002 +0300
|
||||||
|
@@ -1775,7 +1775,7 @@
|
||||||
|
| onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \
|
||||||
|
| midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \
|
||||||
|
| nsk* | powerunix* | genode* | zvmoe* | qnx* | emx* | zephyr* \
|
||||||
|
- | fiwix* )
|
||||||
|
+ | fiwix* | banan_os* )
|
||||||
|
;;
|
||||||
|
# This one is extra strict with allowed versions
|
||||||
|
sco3.2v2 | sco3.2v[4-9]* | sco5v6*)
|
|
@ -1,29 +1,19 @@
|
||||||
#!/bin/bash ../install.sh
|
#!/bin/bash ../install.sh
|
||||||
|
|
||||||
NAME='gcc'
|
NAME='gcc'
|
||||||
VERSION='12.2.0'
|
VERSION='15.1.0'
|
||||||
DOWNLOAD_URL="https://ftp.gnu.org/gnu/gcc/gcc-$VERSION/gcc-$VERSION.tar.gz#ac6b317eb4d25444d87cf29c0d141dedc1323a1833ec9995211b13e1a851261c"
|
DOWNLOAD_URL="https://ftp.gnu.org/gnu/gcc/gcc-$VERSION/gcc-$VERSION.tar.gz#51b9919ea69c980d7a381db95d4be27edf73b21254eb13d752a08003b4d013b1"
|
||||||
DEPENDENCIES=('binutils' 'gmp' 'mpfr' 'mpc')
|
DEPENDENCIES=('binutils' 'gmp' 'mpfr' 'mpc')
|
||||||
|
MAKE_BUILD_TARGETS=('all-gcc' 'all-target-libgcc' 'all-target-libstdc++-v3')
|
||||||
|
MAKE_INSTALL_TARGETS=('install-strip-gcc' 'install-strip-target-libgcc' 'install-strip-target-libstdc++-v3')
|
||||||
CONFIGURE_OPTIONS=(
|
CONFIGURE_OPTIONS=(
|
||||||
"--target=$BANAN_TOOLCHAIN_TRIPLE"
|
"--target=$BANAN_TOOLCHAIN_TRIPLE"
|
||||||
'--with-sysroot=/'
|
'--with-sysroot=/'
|
||||||
"--with-build-sysroot=$BANAN_SYSROOT"
|
"--with-build-sysroot=$BANAN_SYSROOT"
|
||||||
'--enable-initfini-array'
|
'--enable-initfini-array'
|
||||||
|
'--enable-threads=posix'
|
||||||
'--enable-shared'
|
'--enable-shared'
|
||||||
'--enable-lto'
|
'--enable-lto'
|
||||||
'--disable-nls'
|
'--disable-nls'
|
||||||
'--enable-languages=c,c++'
|
'--enable-languages=c,c++'
|
||||||
)
|
)
|
||||||
|
|
||||||
build() {
|
|
||||||
make -j$(nproc) all-gcc || exit 1
|
|
||||||
make -j$(nproc) all-target-libgcc || exit 1
|
|
||||||
make -j$(nproc) all-target-libstdc++-v3 || exit 1
|
|
||||||
find . -type f -executable -exec strip --strip-unneeded {} + 2>/dev/null
|
|
||||||
}
|
|
||||||
|
|
||||||
install() {
|
|
||||||
make install-gcc DESTDIR="$BANAN_SYSROOT" || exit 1
|
|
||||||
make install-target-libgcc DESTDIR="$BANAN_SYSROOT" || exit 1
|
|
||||||
make install-target-libstdc++-v3 DESTDIR="$BANAN_SYSROOT" || exit 1
|
|
||||||
}
|
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
../../../toolchain/gcc-12.2.0.patch
|
|
|
@ -0,0 +1 @@
|
||||||
|
../../../toolchain/gcc-15.1.0.patch
|
|
@ -0,0 +1,21 @@
|
||||||
|
#!/bin/bash ../install.sh
|
||||||
|
|
||||||
|
NAME='glu'
|
||||||
|
VERSION='9.0.3'
|
||||||
|
DOWNLOAD_URL="https://archive.mesa3d.org/glu/glu-$VERSION.tar.xz#bd43fe12f374b1192eb15fe20e45ff456b9bc26ab57f0eee919f96ca0f8a330f"
|
||||||
|
DEPENDENCIES=('mesa')
|
||||||
|
CONFIGURE_OPTIONS=(
|
||||||
|
'-Dprefix=/usr'
|
||||||
|
)
|
||||||
|
|
||||||
|
configure() {
|
||||||
|
meson setup --reconfigure --cross-file "$MESON_CROSS_FILE" "${CONFIGURE_OPTIONS[@]}" build || exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
build() {
|
||||||
|
meson compile -C build || exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
install() {
|
||||||
|
meson install --destdir="$BANAN_SYSROOT" -C build || exit 1
|
||||||
|
}
|
|
@ -3,3 +3,6 @@
|
||||||
NAME='gmp'
|
NAME='gmp'
|
||||||
VERSION='6.3.0'
|
VERSION='6.3.0'
|
||||||
DOWNLOAD_URL="https://ftp.gnu.org/gnu/gmp/gmp-$VERSION.tar.xz#a3c2b80201b89e68616f4ad30bc66aee4927c3ce50e33929ca819d5c43538898"
|
DOWNLOAD_URL="https://ftp.gnu.org/gnu/gmp/gmp-$VERSION.tar.xz#a3c2b80201b89e68616f4ad30bc66aee4927c3ce50e33929ca819d5c43538898"
|
||||||
|
|
||||||
|
# configure does not work with (default) c23
|
||||||
|
export CFLAGS="--std=c17 $CFLAGS"
|
||||||
|
|
|
@ -39,15 +39,31 @@ if [ "$BANAN_ARCH" = "i686" ]; then
|
||||||
export LDFLAGS="-shared-libgcc"
|
export LDFLAGS="-shared-libgcc"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
export MESON_CROSS_FILE="$BANAN_PORT_DIR/$BANAN_ARCH-banan_os-meson.txt"
|
||||||
|
if [ ! -f "$MESON_CROSS_FILE" ] || [ "$MESON_CROSS_FILE" -ot "$BANAN_TOOLCHAIN_DIR/meson-cross-file.in" ]; then
|
||||||
|
cp "$BANAN_TOOLCHAIN_DIR/meson-cross-file.in" "$MESON_CROSS_FILE"
|
||||||
|
sed -i "s/ARCH/$BANAN_ARCH/" "$MESON_CROSS_FILE"
|
||||||
|
sed -i "s/SYSROOT/$BANAN_SYSROOT/" "$MESON_CROSS_FILE"
|
||||||
|
fi
|
||||||
|
|
||||||
|
MAKE_BUILD_TARGETS=('all')
|
||||||
|
MAKE_INSTALL_TARGETS=('install')
|
||||||
|
|
||||||
clean() {
|
clean() {
|
||||||
find . -mindepth 1 -maxdepth 1 -not -name 'patches' -not -name 'build.sh' -exec rm -rf {} +
|
find . -mindepth 1 -maxdepth 1 -not -name 'patches' -not -name 'build.sh' -exec rm -rf {} +
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pre_configure() {
|
||||||
|
:
|
||||||
|
}
|
||||||
|
|
||||||
post_configure() {
|
post_configure() {
|
||||||
:
|
:
|
||||||
}
|
}
|
||||||
|
|
||||||
configure() {
|
configure() {
|
||||||
|
pre_configure
|
||||||
|
|
||||||
configure_options=("--host=$BANAN_ARCH-pc-banan_os" '--prefix=/usr')
|
configure_options=("--host=$BANAN_ARCH-pc-banan_os" '--prefix=/usr')
|
||||||
configure_options+=("${CONFIGURE_OPTIONS[@]}")
|
configure_options+=("${CONFIGURE_OPTIONS[@]}")
|
||||||
./configure "${configure_options[@]}" || exit 1
|
./configure "${configure_options[@]}" || exit 1
|
||||||
|
@ -56,11 +72,27 @@ configure() {
|
||||||
}
|
}
|
||||||
|
|
||||||
build() {
|
build() {
|
||||||
make -j$(nproc) || exit 1
|
for target in "${MAKE_BUILD_TARGETS[@]}"; do
|
||||||
|
make -j$(nproc) $target || exit 1
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
pre_install() {
|
||||||
|
:
|
||||||
|
}
|
||||||
|
|
||||||
|
post_install() {
|
||||||
|
:
|
||||||
}
|
}
|
||||||
|
|
||||||
install() {
|
install() {
|
||||||
make install "DESTDIR=$BANAN_SYSROOT" || exit 1
|
pre_install
|
||||||
|
|
||||||
|
for target in "${MAKE_INSTALL_TARGETS[@]}"; do
|
||||||
|
make $target "DESTDIR=$BANAN_SYSROOT" || exit 1
|
||||||
|
done
|
||||||
|
|
||||||
|
post_install
|
||||||
}
|
}
|
||||||
|
|
||||||
source $1
|
source $1
|
||||||
|
|
|
@ -5,9 +5,7 @@ VERSION='9f'
|
||||||
DOWNLOAD_URL="https://www.ijg.org/files/jpegsrc.v9f.tar.gz#04705c110cb2469caa79fb71fba3d7bf834914706e9641a4589485c1f832565b"
|
DOWNLOAD_URL="https://www.ijg.org/files/jpegsrc.v9f.tar.gz#04705c110cb2469caa79fb71fba3d7bf834914706e9641a4589485c1f832565b"
|
||||||
TAR_CONTENT="jpeg-$VERSION"
|
TAR_CONTENT="jpeg-$VERSION"
|
||||||
|
|
||||||
install() {
|
post_install() {
|
||||||
make install DESTDIR="$BANAN_SYSROOT" || exit 1
|
|
||||||
|
|
||||||
# remove libtool files
|
# remove libtool files
|
||||||
rm -f $BANAN_SYSROOT/usr/lib/libjpeg.la
|
rm -f $BANAN_SYSROOT/usr/lib/libjpeg.la
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,9 +5,7 @@ VERSION='1.6.48'
|
||||||
DOWNLOAD_URL="https://download.sourceforge.net/libpng/libpng-$VERSION.tar.gz#68f3d83a79d81dfcb0a439d62b411aa257bb4973d7c67cd1ff8bdf8d011538cd"
|
DOWNLOAD_URL="https://download.sourceforge.net/libpng/libpng-$VERSION.tar.gz#68f3d83a79d81dfcb0a439d62b411aa257bb4973d7c67cd1ff8bdf8d011538cd"
|
||||||
DEPENDENCIES=('zlib')
|
DEPENDENCIES=('zlib')
|
||||||
|
|
||||||
install() {
|
post_install() {
|
||||||
make install DESTDIR="$BANAN_SYSROOT" || exit 1
|
|
||||||
|
|
||||||
# remove libtool files
|
# remove libtool files
|
||||||
rm -f $BANAN_SYSROOT/usr/lib/libpng.la
|
rm -f $BANAN_SYSROOT/usr/lib/libpng.la
|
||||||
rm -f $BANAN_SYSROOT/usr/lib/libpng16.la
|
rm -f $BANAN_SYSROOT/usr/lib/libpng16.la
|
||||||
|
|
|
@ -6,9 +6,7 @@ DOWNLOAD_URL="https://download.osgeo.org/libtiff/tiff-$VERSION.tar.gz#67160e3457
|
||||||
TAR_CONTENT="tiff-$VERSION"
|
TAR_CONTENT="tiff-$VERSION"
|
||||||
DEPENDENCIES=('zlib' 'zstd' 'libjpeg')
|
DEPENDENCIES=('zlib' 'zstd' 'libjpeg')
|
||||||
|
|
||||||
install() {
|
post_install() {
|
||||||
make install "DESTDIR=$BANAN_SYSROOT" || exit 1
|
|
||||||
|
|
||||||
# remove libtool files
|
# remove libtool files
|
||||||
rm -f $BANAN_SYSROOT/usr/lib/libtiff.la
|
rm -f $BANAN_SYSROOT/usr/lib/libtiff.la
|
||||||
rm -f $BANAN_SYSROOT/usr/lib/libtiffxx.la
|
rm -f $BANAN_SYSROOT/usr/lib/libtiffxx.la
|
||||||
|
|
|
@ -9,9 +9,7 @@ CONFIGURE_OPTIONS=(
|
||||||
"--with-pnglibdir=$BANAN_SYSROOT/usr/lib"
|
"--with-pnglibdir=$BANAN_SYSROOT/usr/lib"
|
||||||
)
|
)
|
||||||
|
|
||||||
install() {
|
post_install() {
|
||||||
make install DESTDIR="$BANAN_SYSROOT" || exit 1
|
|
||||||
|
|
||||||
# remove libtool files
|
# remove libtool files
|
||||||
rm -f $BANAN_SYSROOT/usr/lib/libwebp.la
|
rm -f $BANAN_SYSROOT/usr/lib/libwebp.la
|
||||||
rm -f $BANAN_SYSROOT/usr/lib/libwebpdemux.la
|
rm -f $BANAN_SYSROOT/usr/lib/libwebpdemux.la
|
||||||
|
|
|
@ -0,0 +1,17 @@
|
||||||
|
#!/bin/bash ../install.sh
|
||||||
|
|
||||||
|
NAME='lua'
|
||||||
|
VERSION='5.4.7'
|
||||||
|
DOWNLOAD_URL="https://www.lua.org/ftp/lua-$VERSION.tar.gz#9fbf5e28ef86c69858f6d3d34eccc32e911c1a28b4120ff3e84aaa70cfbf1e30"
|
||||||
|
|
||||||
|
configure() {
|
||||||
|
make clean
|
||||||
|
}
|
||||||
|
|
||||||
|
build() {
|
||||||
|
make -j$(nproc) PLAT=posix CC="$CC" LIBS='$(SYSLIBS) $(MYLIBS)' || exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
install() {
|
||||||
|
make install PLAT=posix INSTALL_TOP="$BANAN_SYSROOT/usr" || exit 1
|
||||||
|
}
|
|
@ -0,0 +1,30 @@
|
||||||
|
#!/bin/bash ../install.sh
|
||||||
|
|
||||||
|
NAME='mesa'
|
||||||
|
VERSION='25.0.7'
|
||||||
|
DOWNLOAD_URL="https://archive.mesa3d.org/mesa-$VERSION.tar.xz#592272df3cf01e85e7db300c449df5061092574d099da275d19e97ef0510f8a6"
|
||||||
|
DEPENDENCIES=('zlib' 'zstd' 'expat')
|
||||||
|
CONFIGURE_OPTIONS=(
|
||||||
|
'-Dprefix=/usr'
|
||||||
|
'-Dosmesa=true'
|
||||||
|
'-Dgallium-drivers=softpipe'
|
||||||
|
'-Dvulkan-drivers=[]'
|
||||||
|
'-Dplatforms=[]'
|
||||||
|
'-Dglx=disabled'
|
||||||
|
'-Dbuildtype=release'
|
||||||
|
)
|
||||||
|
|
||||||
|
configure() {
|
||||||
|
meson setup --reconfigure --cross-file "$MESON_CROSS_FILE" "${CONFIGURE_OPTIONS[@]}" build || exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
build() {
|
||||||
|
meson compile -C build || exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
install() {
|
||||||
|
meson install --destdir="$BANAN_SYSROOT" -C build || exit 1
|
||||||
|
|
||||||
|
ln -sf osmesa.pc $BANAN_SYSROOT/usr/lib/pkgconfig/opengl.pc
|
||||||
|
ln -sf libOSMesa.so $BANAN_SYSROOT/usr/lib/libGL.so
|
||||||
|
}
|
|
@ -0,0 +1,12 @@
|
||||||
|
diff -ruN mesa-25.0.7/src/util/macros.h mesa-25.0.7-banan_os/src/util/macros.h
|
||||||
|
--- mesa-25.0.7/src/util/macros.h 2025-05-28 18:20:23.000000000 +0300
|
||||||
|
+++ mesa-25.0.7-banan_os/src/util/macros.h 2025-06-17 13:59:03.341231717 +0300
|
||||||
|
@@ -25,7 +25,7 @@
|
||||||
|
#define UTIL_MACROS_H
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
-#if defined(__HAIKU__) && !defined(__cplusplus)
|
||||||
|
+#if (defined(__HAIKU__) || defined(__banan_os__)) && !defined(__cplusplus)
|
||||||
|
#define static_assert _Static_assert
|
||||||
|
#endif
|
||||||
|
#include <stddef.h>
|
|
@ -0,0 +1,25 @@
|
||||||
|
diff -ruN mesa-25.0.7/src/util/detect_os.h mesa-25.0.7-banan_os/src/util/detect_os.h
|
||||||
|
--- mesa-25.0.7/src/util/detect_os.h 2025-05-28 18:20:23.000000000 +0300
|
||||||
|
+++ mesa-25.0.7-banan_os/src/util/detect_os.h 2025-06-17 14:04:20.625567958 +0300
|
||||||
|
@@ -76,6 +76,11 @@
|
||||||
|
#define DETECT_OS_WINDOWS 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
+#if defined(__banan_os__)
|
||||||
|
+#define DETECT_OS_BANAN_OS 1
|
||||||
|
+#define DETECT_OS_POSIX 1
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
#if defined(__HAIKU__)
|
||||||
|
#define DETECT_OS_HAIKU 1
|
||||||
|
#define DETECT_OS_POSIX 1
|
||||||
|
@@ -113,6 +118,9 @@
|
||||||
|
#ifndef DETECT_OS_FREEBSD
|
||||||
|
#define DETECT_OS_FREEBSD 0
|
||||||
|
#endif
|
||||||
|
+#ifndef DETECT_OS_BANAN_OS
|
||||||
|
+#define DETECT_OS_BANAN_OS 0
|
||||||
|
+#endif
|
||||||
|
#ifndef DETECT_OS_HAIKU
|
||||||
|
#define DETECT_OS_HAIKU 0
|
||||||
|
#endif
|
|
@ -0,0 +1,34 @@
|
||||||
|
diff -ruN mesa-25.0.7/src/util/os_misc.c mesa-25.0.7-banan_os/src/util/os_misc.c
|
||||||
|
--- mesa-25.0.7/src/util/os_misc.c 2025-05-28 18:20:23.000000000 +0300
|
||||||
|
+++ mesa-25.0.7-banan_os/src/util/os_misc.c 2025-06-17 14:14:54.254785327 +0300
|
||||||
|
@@ -69,6 +69,9 @@
|
||||||
|
# include <mach/vm_param.h>
|
||||||
|
# include <mach/vm_statistics.h>
|
||||||
|
# endif
|
||||||
|
+#elif DETECT_OS_BANAN_OS
|
||||||
|
+# include <fcntl.h>
|
||||||
|
+# include <sys/banan-os.h>
|
||||||
|
#elif DETECT_OS_HAIKU
|
||||||
|
# include <kernel/OS.h>
|
||||||
|
#elif DETECT_OS_WINDOWS
|
||||||
|
@@ -311,6 +314,20 @@
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return (sysctl(mib, 2, size, &len, NULL, 0) == 0);
|
||||||
|
+#elif DETECT_OS_BANAN_OS
|
||||||
|
+ int meminfo_fd = open("/proc/meminfo", O_RDONLY);
|
||||||
|
+ if (meminfo_fd == -1)
|
||||||
|
+ return false;
|
||||||
|
+
|
||||||
|
+ struct full_meminfo_t meminfo;
|
||||||
|
+ ssize_t nread = read(meminfo_fd, &meminfo, sizeof(meminfo));
|
||||||
|
+ close(meminfo_fd);
|
||||||
|
+
|
||||||
|
+ if (nread != sizeof(meminfo))
|
||||||
|
+ return false;
|
||||||
|
+
|
||||||
|
+ *size = (meminfo.free_pages + meminfo.used_pages) * meminfo.page_size;
|
||||||
|
+ return true;
|
||||||
|
#elif DETECT_OS_HAIKU
|
||||||
|
system_info info;
|
||||||
|
status_t ret;
|
|
@ -0,0 +1,14 @@
|
||||||
|
diff -ruN mesa-25.0.7/include/c99_alloca.h mesa-25.0.7-banan_os/include/c99_alloca.h
|
||||||
|
--- mesa-25.0.7/include/c99_alloca.h 2025-05-28 18:20:23.000000000 +0300
|
||||||
|
+++ mesa-25.0.7-banan_os/include/c99_alloca.h 2025-06-17 14:29:11.535095878 +0300
|
||||||
|
@@ -39,6 +39,10 @@
|
||||||
|
|
||||||
|
# include <alloca.h>
|
||||||
|
|
||||||
|
+#elif defined(__banan_os__)
|
||||||
|
+
|
||||||
|
+# define alloca __builtin_alloca
|
||||||
|
+
|
||||||
|
#else /* !defined(_MSC_VER) */
|
||||||
|
|
||||||
|
# include <stdlib.h>
|
|
@ -1,8 +1,8 @@
|
||||||
#!/bin/bash ../install.sh
|
#!/bin/bash ../install.sh
|
||||||
|
|
||||||
NAME='mpfr'
|
NAME='mpfr'
|
||||||
VERSION='4.2.1'
|
VERSION='4.2.2'
|
||||||
DOWNLOAD_URL="https://ftp.gnu.org/gnu/mpfr/mpfr-$VERSION.tar.gz#116715552bd966c85b417c424db1bbdf639f53836eb361549d1f8d6ded5cb4c6"
|
DOWNLOAD_URL="https://ftp.gnu.org/gnu/mpfr/mpfr-$VERSION.tar.gz#826cbb24610bd193f36fde172233fb8c009f3f5c2ad99f644d0dea2e16a20e42"
|
||||||
DEPENDENCIES=('gmp')
|
DEPENDENCIES=('gmp')
|
||||||
CONFIGURE_OPTIONS=(
|
CONFIGURE_OPTIONS=(
|
||||||
"--target=$BANAN_TOOLCHAIN_TRIPLE"
|
"--target=$BANAN_TOOLCHAIN_TRIPLE"
|
||||||
|
|
|
@ -16,10 +16,7 @@ CONFIGURE_OPTIONS=(
|
||||||
'--without-cxx-binding'
|
'--without-cxx-binding'
|
||||||
)
|
)
|
||||||
|
|
||||||
install() {
|
post_install() {
|
||||||
make install "DESTDIR=$BANAN_SYSROOT" || exit 1
|
|
||||||
|
|
||||||
shellrc="$BANAN_SYSROOT/home/user/.shellrc"
|
shellrc="$BANAN_SYSROOT/home/user/.shellrc"
|
||||||
grep -q 'export TERM=' "$shellrc" || echo 'export TERM=ansi' >> "$shellrc"
|
|
||||||
grep -q 'export NCURSES_NO_UTF8_ACS=' "$shellrc" || echo 'export NCURSES_NO_UTF8_ACS=1' >> "$shellrc"
|
grep -q 'export NCURSES_NO_UTF8_ACS=' "$shellrc" || echo 'export NCURSES_NO_UTF8_ACS=1' >> "$shellrc"
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,12 +4,8 @@ NAME='openssl'
|
||||||
VERSION='3.3.1'
|
VERSION='3.3.1'
|
||||||
DOWNLOAD_URL="https://github.com/openssl/openssl/releases/download/openssl-$VERSION/openssl-$VERSION.tar.gz#777cd596284c883375a2a7a11bf5d2786fc5413255efab20c50d6ffe6d020b7e"
|
DOWNLOAD_URL="https://github.com/openssl/openssl/releases/download/openssl-$VERSION/openssl-$VERSION.tar.gz#777cd596284c883375a2a7a11bf5d2786fc5413255efab20c50d6ffe6d020b7e"
|
||||||
DEPENDENCIES=('zlib')
|
DEPENDENCIES=('zlib')
|
||||||
|
MAKE_INSTALL_TARGETS=('install_sw' 'install_ssldirs')
|
||||||
|
|
||||||
configure() {
|
configure() {
|
||||||
./Configure --prefix=/usr --openssldir=/etc/ssl -DOPENSSL_USE_IPV6=0 no-asm no-tests banan_os-generic threads zlib
|
./Configure --prefix=/usr --openssldir=/etc/ssl -DOPENSSL_USE_IPV6=0 no-asm no-tests banan_os-generic threads zlib
|
||||||
}
|
}
|
||||||
|
|
||||||
install() {
|
|
||||||
make install_sw "DESTDIR=$BANAN_SYSROOT" || exit 1
|
|
||||||
make install_ssldirs "DESTDIR=$BANAN_SYSROOT" || exit 1
|
|
||||||
}
|
|
||||||
|
|
|
@ -0,0 +1,25 @@
|
||||||
|
#!/bin/bash ../install.sh
|
||||||
|
|
||||||
|
NAME='sdl12-compat'
|
||||||
|
VERSION='1.2.68'
|
||||||
|
DOWNLOAD_URL="https://github.com/libsdl-org/sdl12-compat/archive/refs/tags/release-$VERSION.tar.gz#63c6e4dcc1154299e6f363c872900be7f3dcb3e42b9f8f57e05442ec3d89d02d"
|
||||||
|
TAR_CONTENT="sdl12-compat-release-$VERSION"
|
||||||
|
DEPENDENCIES=('SDL2' 'glu')
|
||||||
|
|
||||||
|
configure() {
|
||||||
|
sed -i 's/CMAKE_INSTALL_FULL_DATAROOTDIR/CMAKE_INSTALL_FULL_DATADIR/' CMakeLists.txt
|
||||||
|
|
||||||
|
$BANAN_CMAKE \
|
||||||
|
--toolchain="$CMAKE_TOOLCHAIN_FILE" \
|
||||||
|
--fresh -GNinja -S . -B build \
|
||||||
|
-DCMAKE_INSTALL_PREFIX="$BANAN_SYSROOT/usr" \
|
||||||
|
-DSDL2_INCLUDE_DIR="$BANAN_SYSROOT/usr/include/SDL2"
|
||||||
|
}
|
||||||
|
|
||||||
|
build() {
|
||||||
|
$BANAN_CMAKE --build build || exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
install() {
|
||||||
|
$BANAN_CMAKE --install build || exit 1
|
||||||
|
}
|
|
@ -0,0 +1,15 @@
|
||||||
|
diff -ruN sdl12-compat-release-1.2.68/src/SDL12_compat.c sdl12-compat-release-1.2.68-banan_os/src/SDL12_compat.c
|
||||||
|
--- sdl12-compat-release-1.2.68/src/SDL12_compat.c 2023-09-26 20:43:48.000000000 +0300
|
||||||
|
+++ sdl12-compat-release-1.2.68-banan_os/src/SDL12_compat.c 2025-06-26 03:40:42.751597384 +0300
|
||||||
|
@@ -1201,7 +1201,11 @@
|
||||||
|
}
|
||||||
|
#elif defined(__unix__)
|
||||||
|
#include <dlfcn.h>
|
||||||
|
+# if defined(__banan_os__)
|
||||||
|
+ #define SDL20_LIBNAME "libSDL2.so"
|
||||||
|
+# else
|
||||||
|
#define SDL20_LIBNAME "libSDL2-2.0.so.0"
|
||||||
|
+# endif
|
||||||
|
#define SDL20_REQUIRED_VER SDL_VERSIONNUM(2,0,7)
|
||||||
|
static void *Loaded_SDL20 = NULL;
|
||||||
|
#define LoadSDL20Library() ((Loaded_SDL20 = dlopen(SDL20_LIBNAME, RTLD_LOCAL|RTLD_NOW)) != NULL)
|
|
@ -9,6 +9,9 @@ if [ $tcc_arch = 'i686' ]; then
|
||||||
tcc_arch='i386'
|
tcc_arch='i386'
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
MAKE_BUILD_TARGETS=("cross-$tcc_arch $tcc_arch-libtcc1-usegcc=yes")
|
||||||
|
MAKE_INSTALL_TARGETS=("install-unx")
|
||||||
|
|
||||||
configure() {
|
configure() {
|
||||||
./configure \
|
./configure \
|
||||||
--prefix=/usr \
|
--prefix=/usr \
|
||||||
|
@ -22,12 +25,6 @@ configure() {
|
||||||
--elfinterp=/usr/lib/DynamicLoader.so
|
--elfinterp=/usr/lib/DynamicLoader.so
|
||||||
}
|
}
|
||||||
|
|
||||||
build() {
|
post_install() {
|
||||||
touch $BANAN_SYSROOT/usr/include/sys/ucontext.h
|
|
||||||
make -j$(nproc) cross-$tcc_arch $tcc_arch-libtcc1-usegcc=yes || exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
install() {
|
|
||||||
make install-unx DESTDIR=$BANAN_SYSROOT || exit 1
|
|
||||||
ln -sf $tcc_arch-tcc $BANAN_SYSROOT/usr/bin/tcc
|
ln -sf $tcc_arch-tcc $BANAN_SYSROOT/usr/bin/tcc
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
diff -ruN tcc-0.9.27/tccrun.c tcc-0.9.27-banan_os/tccrun.c
|
||||||
|
--- tcc-0.9.27/tccrun.c 2017-12-17 10:27:05.000000000 +0200
|
||||||
|
+++ tcc-0.9.27-banan_os/tccrun.c 2025-06-28 20:30:00.914206003 +0300
|
||||||
|
@@ -30,7 +30,7 @@
|
||||||
|
#ifdef CONFIG_TCC_BACKTRACE
|
||||||
|
# ifndef _WIN32
|
||||||
|
# include <signal.h>
|
||||||
|
-# ifndef __OpenBSD__
|
||||||
|
+# if !defined(__OpenBSD__) && !defined(__banan_os__)
|
||||||
|
# include <sys/ucontext.h>
|
||||||
|
# endif
|
||||||
|
# else
|
|
@ -0,0 +1,22 @@
|
||||||
|
#!/bin/bash ../install.sh
|
||||||
|
|
||||||
|
NAME='tcl'
|
||||||
|
VERSION='8.6.12'
|
||||||
|
DOWNLOAD_URL="http://prdownloads.sourceforge.net/tcl/tcl$VERSION-src.tar.gz#26c995dd0f167e48b11961d891ee555f680c175f7173ff8cb829f4ebcde4c1a6"
|
||||||
|
TAR_CONTENT="tcl$VERSION"
|
||||||
|
|
||||||
|
pre_configure() {
|
||||||
|
pushd unix || exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
post_configure() {
|
||||||
|
popd
|
||||||
|
}
|
||||||
|
|
||||||
|
build() {
|
||||||
|
make -C unix -j$(nproc) all || exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
install() {
|
||||||
|
make -C unix install "DESTDIR=$BANAN_SYSROOT" || exit 1
|
||||||
|
}
|
|
@ -0,0 +1,21 @@
|
||||||
|
diff -ruN tcl8.6.12/unix/tclUnixSock.c tcl8.6.12-banan_os/unix/tclUnixSock.c
|
||||||
|
--- tcl8.6.12/unix/tclUnixSock.c 2021-10-29 20:08:08.000000000 +0300
|
||||||
|
+++ tcl8.6.12-banan_os/unix/tclUnixSock.c 2025-06-26 01:23:59.649074073 +0300
|
||||||
|
@@ -706,6 +706,7 @@
|
||||||
|
IPv6AddressNeedsNumericRendering(
|
||||||
|
struct in6_addr addr)
|
||||||
|
{
|
||||||
|
+#ifndef __banan_os__
|
||||||
|
if (IN6_ARE_ADDR_EQUAL(&addr, &in6addr_any)) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
@@ -721,6 +722,9 @@
|
||||||
|
|
||||||
|
return (addr.s6_addr[12] == 0 && addr.s6_addr[13] == 0
|
||||||
|
&& addr.s6_addr[14] == 0 && addr.s6_addr[15] == 0);
|
||||||
|
+#else
|
||||||
|
+ return 0;
|
||||||
|
+#endif
|
||||||
|
}
|
||||||
|
#if defined (__clang__) || ((__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))))
|
||||||
|
#pragma GCC diagnostic pop
|
|
@ -0,0 +1,19 @@
|
||||||
|
diff -ruN tcl8.6.12/unix/tclUnixCompat.c tcl8.6.12-banan_os/unix/tclUnixCompat.c
|
||||||
|
--- tcl8.6.12/unix/tclUnixCompat.c 2021-10-29 20:08:08.000000000 +0300
|
||||||
|
+++ tcl8.6.12-banan_os/unix/tclUnixCompat.c 2025-06-26 01:26:39.033530792 +0300
|
||||||
|
@@ -702,6 +702,7 @@
|
||||||
|
len += copied;
|
||||||
|
p = buf + len;
|
||||||
|
|
||||||
|
+#ifndef __banan_os__
|
||||||
|
/*
|
||||||
|
* Copy password.
|
||||||
|
*/
|
||||||
|
@@ -713,6 +714,7 @@
|
||||||
|
tgtPtr->gr_passwd = (copied > 0) ? p : NULL;
|
||||||
|
len += copied;
|
||||||
|
p = buf + len;
|
||||||
|
+#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copy group members.
|
|
@ -0,0 +1,13 @@
|
||||||
|
diff -ruN tcl8.6.12/pkgs/sqlite3.36.0/compat/sqlite3/sqlite3.c tcl8.6.12-banan_os/pkgs/sqlite3.36.0/compat/sqlite3/sqlite3.c
|
||||||
|
--- tcl8.6.12/pkgs/sqlite3.36.0/compat/sqlite3/sqlite3.c 2021-09-13 01:15:31.000000000 +0300
|
||||||
|
+++ tcl8.6.12-banan_os/pkgs/sqlite3.36.0/compat/sqlite3/sqlite3.c 2025-06-28 02:27:43.042768624 +0300
|
||||||
|
@@ -19854,6 +19854,9 @@
|
||||||
|
#if !defined(alloca) && defined(_WIN32)
|
||||||
|
# define alloca _alloca
|
||||||
|
#endif
|
||||||
|
+#if !defined(alloca) && defined(__banan_os__)
|
||||||
|
+# include <alloca.h>
|
||||||
|
+#endif
|
||||||
|
# define sqlite3StackAllocRaw(D,N) alloca(N)
|
||||||
|
# define sqlite3StackAllocZero(D,N) memset(alloca(N), 0, N)
|
||||||
|
# define sqlite3StackFree(D,P)
|
|
@ -0,0 +1,34 @@
|
||||||
|
#!/bin/bash ../install.sh
|
||||||
|
|
||||||
|
NAME='tuxracer'
|
||||||
|
VERSION='0.61'
|
||||||
|
DOWNLOAD_URL="http://download.sourceforge.net/tuxracer/tuxracer-$VERSION.tar.gz#a311d09080598fe556134d4b9faed7dc0c2ed956ebb10d062e5d4df022f91eff"
|
||||||
|
DEPENDENCIES=('tcl' 'mesa' 'glu' 'sdl12-compat')
|
||||||
|
CONFIGURE_OPTIONS=(
|
||||||
|
'--with-data-dir=/usr/share/tuxracer'
|
||||||
|
"--with-sdl-prefix=$BANAN_SYSROOT/usr"
|
||||||
|
'--without-gl-libs'
|
||||||
|
'--with-tcl-lib-name=tcl8.6'
|
||||||
|
'--without-x'
|
||||||
|
)
|
||||||
|
|
||||||
|
post_install() {
|
||||||
|
pushd ..
|
||||||
|
|
||||||
|
if [ ! -f "tuxracer-data-$VERSION.tar.gz" ]; then
|
||||||
|
wget "http://download.sourceforge.net/tuxracer/tuxracer-data-$VERSION.tar.gz" || exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -d "tuxracer-data-$VERSION" ]; then
|
||||||
|
tar xf "tuxracer-data-$VERSION.tar.gz" || exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
mkdir -p "$BANAN_SYSROOT/usr/share/tuxracer" || exit 1
|
||||||
|
cp -r "tuxracer-data-$VERSION"/* "$BANAN_SYSROOT/usr/share/tuxracer/" || exit 1
|
||||||
|
find "$BANAN_SYSROOT/usr/share/tuxracer" -type f -exec chmod 644 {} +
|
||||||
|
|
||||||
|
popd
|
||||||
|
}
|
||||||
|
|
||||||
|
export CFLAGS="-std=c99 -Wno-implicit-int -Wno-incompatible-pointer-types $CFLAGS"
|
||||||
|
export ac_cv_func_isnan=yes
|
|
@ -0,0 +1,56 @@
|
||||||
|
diff -ruN tuxracer-0.61/src/game_config.c tuxracer-0.61-banan_os/src/game_config.c
|
||||||
|
--- tuxracer-0.61/src/game_config.c 2001-01-30 22:04:43.000000000 +0200
|
||||||
|
+++ tuxracer-0.61-banan_os/src/game_config.c 2025-06-26 03:13:06.859798526 +0300
|
||||||
|
@@ -114,26 +114,26 @@
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define INIT_PARAM( nam, val, typename, commnt ) \
|
||||||
|
- Params. ## nam ## .loaded = False; \
|
||||||
|
- Params. ## nam ## .name = #nam; \
|
||||||
|
- Params. ## nam ## .deflt. ## typename ## _val = val; \
|
||||||
|
- Params. ## nam ## .comment = commnt;
|
||||||
|
+ Params.nam.loaded = False; \
|
||||||
|
+ Params.nam.name = #nam; \
|
||||||
|
+ Params.nam.deflt.typename ## _val = val; \
|
||||||
|
+ Params.nam.comment = commnt;
|
||||||
|
|
||||||
|
#define INIT_PARAM_STRING( nam, val, commnt ) \
|
||||||
|
INIT_PARAM( nam, val, string, commnt ); \
|
||||||
|
- Params. ## nam ## .type = PARAM_STRING;
|
||||||
|
+ Params.nam.type = PARAM_STRING;
|
||||||
|
|
||||||
|
#define INIT_PARAM_CHAR( nam, val, commnt ) \
|
||||||
|
INIT_PARAM( nam, val, char, commnt ); \
|
||||||
|
- Params. ## nam ## .type = PARAM_CHAR;
|
||||||
|
+ Params.nam.type = PARAM_CHAR;
|
||||||
|
|
||||||
|
#define INIT_PARAM_INT( nam, val, commnt ) \
|
||||||
|
INIT_PARAM( nam, val, int, commnt ); \
|
||||||
|
- Params. ## nam ## .type = PARAM_INT;
|
||||||
|
+ Params.nam.type = PARAM_INT;
|
||||||
|
|
||||||
|
#define INIT_PARAM_BOOL( nam, val, commnt ) \
|
||||||
|
INIT_PARAM( nam, val, bool, commnt ); \
|
||||||
|
- Params. ## nam ## .type = PARAM_BOOL;
|
||||||
|
+ Params.nam.type = PARAM_BOOL;
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
@@ -310,13 +310,13 @@
|
||||||
|
*/
|
||||||
|
#define FN_PARAM( name, typename, type ) \
|
||||||
|
type getparam_ ## name() { \
|
||||||
|
- if ( !Params. ## name ## .loaded ) { \
|
||||||
|
- fetch_param_ ## typename( &( Params. ## name ) ); \
|
||||||
|
+ if ( !Params.name.loaded ) { \
|
||||||
|
+ fetch_param_ ## typename( &( Params.name ) ); \
|
||||||
|
} \
|
||||||
|
- return Params. ## name ## .val. ## typename ## _val; \
|
||||||
|
+ return Params.name.val.typename ## _val; \
|
||||||
|
} \
|
||||||
|
void setparam_ ## name( type val) { \
|
||||||
|
- set_param_ ## typename( &( Params. ## name ), val ); }
|
||||||
|
+ set_param_ ## typename( &( Params.name ), val ); }
|
||||||
|
|
||||||
|
#define FN_PARAM_STRING( name ) \
|
||||||
|
FN_PARAM( name, string, char* )
|
|
@ -0,0 +1,19 @@
|
||||||
|
diff -ruN tuxracer-0.61/src/debug.c tuxracer-0.61-banan_os/src/debug.c
|
||||||
|
--- tuxracer-0.61/src/debug.c 2001-01-14 00:09:50.000000000 +0200
|
||||||
|
+++ tuxracer-0.61-banan_os/src/debug.c 2025-06-26 03:18:02.090898960 +0300
|
||||||
|
@@ -165,6 +165,7 @@
|
||||||
|
/* Redirect stderr to file; taken from SDL_main.c, which is in the
|
||||||
|
public domain */
|
||||||
|
newfp = freopen(BUGREPORT_FILE, "w", stderr);
|
||||||
|
+#if !defined(__banan_os__)
|
||||||
|
if ( newfp == NULL ) { /* This happens on NT */
|
||||||
|
#if !defined(stderr)
|
||||||
|
stderr = fopen(BUGREPORT_FILE, "w");
|
||||||
|
@@ -175,6 +176,7 @@
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
+#endif
|
||||||
|
|
||||||
|
/* Write bug report header */
|
||||||
|
fprintf( stderr, "Tux Racer Diagnostic Log\n\n" );
|
|
@ -0,0 +1,12 @@
|
||||||
|
diff -ruN tuxracer-0.61/src/game_config.c tuxracer-0.61-banan_os/src/game_config.c
|
||||||
|
--- tuxracer-0.61/src/game_config.c 2001-01-30 22:04:43.000000000 +0200
|
||||||
|
+++ tuxracer-0.61-banan_os/src/game_config.c 2025-06-26 04:03:28.015311092 +0300
|
||||||
|
@@ -505,7 +505,7 @@
|
||||||
|
"# decreasing this number, at the cost of lower image quality." );
|
||||||
|
|
||||||
|
INIT_PARAM_BOOL(
|
||||||
|
- fullscreen, True,
|
||||||
|
+ fullscreen, False,
|
||||||
|
"# If true then the game will run in full-screen mode." );
|
||||||
|
|
||||||
|
INIT_PARAM_INT(
|
|
@ -0,0 +1,15 @@
|
||||||
|
diff -ruN tuxracer-0.61/src/winsys.c tuxracer-0.61-banan_os/src/winsys.c
|
||||||
|
--- tuxracer-0.61/src/winsys.c 2001-01-14 00:09:51.000000000 +0200
|
||||||
|
+++ tuxracer-0.61-banan_os/src/winsys.c 2025-06-26 04:05:10.894824478 +0300
|
||||||
|
@@ -392,6 +392,11 @@
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
+
|
||||||
|
+ case SDL_QUIT:
|
||||||
|
+ winsys_exit(0);
|
||||||
|
+
|
||||||
|
+ break;
|
||||||
|
}
|
||||||
|
|
||||||
|
SDL_LockAudio();
|
|
@ -1,9 +1,8 @@
|
||||||
#!/bin/bash ../install.sh
|
#!/bin/bash ../install.sh
|
||||||
|
|
||||||
NAME='vim'
|
NAME='vim'
|
||||||
VERSION='9.0'
|
VERSION='9.1.1485'
|
||||||
DOWNLOAD_URL="ftp://ftp.vim.org/pub/vim/unix/vim-$VERSION.tar.bz2#a6456bc154999d83d0c20d968ac7ba6e7df0d02f3cb6427fb248660bacfb336e"
|
DOWNLOAD_URL="https://github.com/vim/vim/archive/refs/tags/v$VERSION.tar.gz#89b48e30c9e97bb819ffed752c8a1727b70bed79890bffe9da5f7c2170487dd2"
|
||||||
TAR_CONTENT='vim90'
|
|
||||||
DEPENDENCIES=('ncurses')
|
DEPENDENCIES=('ncurses')
|
||||||
CONFIGURE_OPTIONS=(
|
CONFIGURE_OPTIONS=(
|
||||||
'--with-tlib=ncurses'
|
'--with-tlib=ncurses'
|
||||||
|
@ -18,9 +17,19 @@ CONFIGURE_OPTIONS=(
|
||||||
'vim_cv_memmove_handles_overlap=yes'
|
'vim_cv_memmove_handles_overlap=yes'
|
||||||
)
|
)
|
||||||
|
|
||||||
install() {
|
post_configure() {
|
||||||
make install "DESTDIR=$BANAN_SYSROOT" || exit 1
|
# vim doesn't do link tests, so it thinks these exists
|
||||||
|
config_undefines=(
|
||||||
|
'HAVE_SHM_OPEN'
|
||||||
|
'HAVE_TIMER_CREATE'
|
||||||
|
)
|
||||||
|
|
||||||
|
for undefine in "${config_undefines[@]}"; do
|
||||||
|
sed -i "s|^#define $undefine 1$|/\* #undef $undefine \*/|" src/auto/config.h
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
post_install() {
|
||||||
shellrc="$BANAN_SYSROOT/home/user/.shellrc"
|
shellrc="$BANAN_SYSROOT/home/user/.shellrc"
|
||||||
grep -q 'export EDITOR=' "$shellrc" || echo 'export EDITOR=vim' >> "$shellrc"
|
grep -q 'export EDITOR=' "$shellrc" || echo 'export EDITOR=vim' >> "$shellrc"
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
diff -ruN zlib-1.3.1/configure zlib-1.3.1-banan_os/configure
|
||||||
|
--- zlib-1.3.1/configure 2024-01-21 04:29:31.000000000 +0200
|
||||||
|
+++ zlib-1.3.1-banan_os/configure 2025-06-27 23:48:53.039461360 +0300
|
||||||
|
@@ -236,6 +236,8 @@
|
||||||
|
*BSD | *bsd* | DragonFly)
|
||||||
|
LDSHARED=${LDSHARED-"$cc -shared -Wl,-soname,libz.so.1,--version-script,${SRCDIR}zlib.map"}
|
||||||
|
LDCONFIG="ldconfig -m" ;;
|
||||||
|
+ *banan_os)
|
||||||
|
+ LDSHARED=${LDSHARED-"$cc -shared -Wl,-soname,libz.so.1"} ;;
|
||||||
|
CYGWIN* | Cygwin* | cygwin* | *-cygwin* | OS/2*)
|
||||||
|
EXE='.exe' ;;
|
||||||
|
MINGW* | mingw* | *-mingw*)
|
|
@ -1,7 +1,7 @@
|
||||||
diff -ruN binutils-2.39/bfd/config.bfd binutils-2.39-banan_os/bfd/config.bfd
|
diff -ruN binutils-2.44/bfd/config.bfd binutils-2.44-banan_os/bfd/config.bfd
|
||||||
--- binutils-2.39/bfd/config.bfd 2022-07-08 12:46:47.000000000 +0300
|
--- binutils-2.44/bfd/config.bfd 2025-02-02 02:00:00.000000000 +0200
|
||||||
+++ binutils-2.39-banan_os/bfd/config.bfd 2024-08-26 15:25:08.612615228 +0300
|
+++ binutils-2.44-banan_os/bfd/config.bfd 2025-06-19 11:04:48.871180511 +0300
|
||||||
@@ -602,6 +602,11 @@
|
@@ -612,6 +612,11 @@
|
||||||
targ_defvec=i386_elf32_vec
|
targ_defvec=i386_elf32_vec
|
||||||
targ_selvecs=iamcu_elf32_vec
|
targ_selvecs=iamcu_elf32_vec
|
||||||
;;
|
;;
|
||||||
|
@ -13,7 +13,7 @@ diff -ruN binutils-2.39/bfd/config.bfd binutils-2.39-banan_os/bfd/config.bfd
|
||||||
i[3-7]86-*-dicos*)
|
i[3-7]86-*-dicos*)
|
||||||
targ_defvec=i386_elf32_vec
|
targ_defvec=i386_elf32_vec
|
||||||
targ_selvecs=iamcu_elf32_vec
|
targ_selvecs=iamcu_elf32_vec
|
||||||
@@ -656,6 +661,11 @@
|
@@ -666,6 +671,11 @@
|
||||||
targ64_selvecs=x86_64_elf64_vec
|
targ64_selvecs=x86_64_elf64_vec
|
||||||
;;
|
;;
|
||||||
#ifdef BFD64
|
#ifdef BFD64
|
||||||
|
@ -25,22 +25,21 @@ diff -ruN binutils-2.39/bfd/config.bfd binutils-2.39-banan_os/bfd/config.bfd
|
||||||
x86_64-*-cloudabi*)
|
x86_64-*-cloudabi*)
|
||||||
targ_defvec=x86_64_elf64_cloudabi_vec
|
targ_defvec=x86_64_elf64_cloudabi_vec
|
||||||
want64=true
|
want64=true
|
||||||
diff -ruN binutils-2.39/config.sub binutils-2.39-banan_os/config.sub
|
diff -ruN binutils-2.44/config.sub binutils-2.44-banan_os/config.sub
|
||||||
--- binutils-2.39/config.sub 2022-07-08 12:46:47.000000000 +0300
|
--- binutils-2.44/config.sub 2025-02-02 02:00:00.000000000 +0200
|
||||||
+++ binutils-2.39-banan_os/config.sub 2024-08-26 16:01:54.868646232 +0300
|
+++ binutils-2.44-banan_os/config.sub 2025-06-19 11:05:16.922967546 +0300
|
||||||
@@ -1754,7 +1754,7 @@
|
@@ -1976,6 +1976,7 @@
|
||||||
| onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \
|
| atheos* \
|
||||||
| midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \
|
| auroraux* \
|
||||||
| nsk* | powerunix* | genode* | zvmoe* | qnx* | emx* | zephyr* \
|
| aux* \
|
||||||
- | fiwix* )
|
+ | banan_os* \
|
||||||
+ | fiwix* | banan_os* )
|
| beos* \
|
||||||
;;
|
| bitrig* \
|
||||||
# This one is extra strict with allowed versions
|
| bme* \
|
||||||
sco3.2v2 | sco3.2v[4-9]* | sco5v6*)
|
diff -ruN binutils-2.44/gas/configure.tgt binutils-2.44-banan_os/gas/configure.tgt
|
||||||
diff -ruN binutils-2.39/gas/configure.tgt binutils-2.39-banan_os/gas/configure.tgt
|
--- binutils-2.44/gas/configure.tgt 2025-02-02 02:00:00.000000000 +0200
|
||||||
--- binutils-2.39/gas/configure.tgt 2022-07-08 12:46:47.000000000 +0300
|
+++ binutils-2.44-banan_os/gas/configure.tgt 2025-06-19 11:06:43.781629742 +0300
|
||||||
+++ binutils-2.39-banan_os/gas/configure.tgt 2024-08-26 15:29:24.317178187 +0300
|
@@ -225,6 +225,7 @@
|
||||||
@@ -221,6 +221,7 @@
|
|
||||||
h8300-*-elf) fmt=elf ;;
|
h8300-*-elf) fmt=elf ;;
|
||||||
h8300-*-linux*) fmt=elf em=linux ;;
|
h8300-*-linux*) fmt=elf em=linux ;;
|
||||||
|
|
||||||
|
@ -48,10 +47,10 @@ diff -ruN binutils-2.39/gas/configure.tgt binutils-2.39-banan_os/gas/configure.t
|
||||||
i386-*-beospe*) fmt=coff em=pe ;;
|
i386-*-beospe*) fmt=coff em=pe ;;
|
||||||
i386-*-beos*) fmt=elf ;;
|
i386-*-beos*) fmt=elf ;;
|
||||||
i386-*-elfiamcu) fmt=elf arch=iamcu ;;
|
i386-*-elfiamcu) fmt=elf arch=iamcu ;;
|
||||||
diff -ruN binutils-2.39/ld/configure.tgt binutils-2.39-banan_os/ld/configure.tgt
|
diff -ruN binutils-2.44/ld/configure.tgt binutils-2.44-banan_os/ld/configure.tgt
|
||||||
--- binutils-2.39/ld/configure.tgt 2022-07-29 10:37:48.000000000 +0300
|
--- binutils-2.44/ld/configure.tgt 2025-02-02 02:00:00.000000000 +0200
|
||||||
+++ binutils-2.39-banan_os/ld/configure.tgt 2024-08-26 15:43:54.040175458 +0300
|
+++ binutils-2.44-banan_os/ld/configure.tgt 2025-06-19 11:08:48.725342089 +0300
|
||||||
@@ -352,6 +352,10 @@
|
@@ -367,6 +367,10 @@
|
||||||
i[3-7]86-*-rdos*) targ_emul=elf_i386
|
i[3-7]86-*-rdos*) targ_emul=elf_i386
|
||||||
targ_extra_emuls=elf_iamcu
|
targ_extra_emuls=elf_iamcu
|
||||||
;;
|
;;
|
||||||
|
@ -62,7 +61,7 @@ diff -ruN binutils-2.39/ld/configure.tgt binutils-2.39-banan_os/ld/configure.tgt
|
||||||
i[3-7]86-*-bsd) targ_emul=i386bsd
|
i[3-7]86-*-bsd) targ_emul=i386bsd
|
||||||
targ_extra_ofiles=
|
targ_extra_ofiles=
|
||||||
;;
|
;;
|
||||||
@@ -988,6 +992,9 @@
|
@@ -1000,6 +1004,9 @@
|
||||||
;;
|
;;
|
||||||
x86_64-*-rdos*) targ_emul=elf64rdos
|
x86_64-*-rdos*) targ_emul=elf64rdos
|
||||||
;;
|
;;
|
||||||
|
@ -72,27 +71,27 @@ diff -ruN binutils-2.39/ld/configure.tgt binutils-2.39-banan_os/ld/configure.tgt
|
||||||
x86_64-*-cloudabi*) targ_emul=elf_x86_64_cloudabi
|
x86_64-*-cloudabi*) targ_emul=elf_x86_64_cloudabi
|
||||||
;;
|
;;
|
||||||
x86_64-*-haiku*) targ_emul=elf_x86_64_haiku
|
x86_64-*-haiku*) targ_emul=elf_x86_64_haiku
|
||||||
diff -ruN binutils-2.39/ld/emulparams/elf_banan_os.sh binutils-2.39-banan_os/ld/emulparams/elf_banan_os.sh
|
diff -ruN binutils-2.44/ld/emulparams/elf_banan_os.sh binutils-2.44-banan_os/ld/emulparams/elf_banan_os.sh
|
||||||
--- binutils-2.39/ld/emulparams/elf_banan_os.sh 1970-01-01 02:00:00.000000000 +0200
|
--- binutils-2.44/ld/emulparams/elf_banan_os.sh 1970-01-01 02:00:00.000000000 +0200
|
||||||
+++ binutils-2.39-banan_os/ld/emulparams/elf_banan_os.sh 2024-08-26 15:51:32.242246455 +0300
|
+++ binutils-2.44-banan_os/ld/emulparams/elf_banan_os.sh 2025-06-19 11:10:25.877588187 +0300
|
||||||
@@ -0,0 +1 @@
|
@@ -0,0 +1 @@
|
||||||
+ELF_INTERPRETER_NAME=\"/usr/lib/DynamicLoader.so\"
|
+ELF_INTERPRETER_NAME=\"/usr/lib/DynamicLoader.so\"
|
||||||
diff -ruN binutils-2.39/ld/emulparams/elf_i386_banan_os.sh binutils-2.39-banan_os/ld/emulparams/elf_i386_banan_os.sh
|
diff -ruN binutils-2.44/ld/emulparams/elf_i386_banan_os.sh binutils-2.44-banan_os/ld/emulparams/elf_i386_banan_os.sh
|
||||||
--- binutils-2.39/ld/emulparams/elf_i386_banan_os.sh 1970-01-01 02:00:00.000000000 +0200
|
--- binutils-2.44/ld/emulparams/elf_i386_banan_os.sh 1970-01-01 02:00:00.000000000 +0200
|
||||||
+++ binutils-2.39-banan_os/ld/emulparams/elf_i386_banan_os.sh 2024-08-26 15:51:26.431570961 +0300
|
+++ binutils-2.44-banan_os/ld/emulparams/elf_i386_banan_os.sh 2025-06-19 11:10:51.233390738 +0300
|
||||||
@@ -0,0 +1,2 @@
|
@@ -0,0 +1,2 @@
|
||||||
+source_sh ${srcdir}/emulparams/elf_i386.sh
|
+source_sh ${srcdir}/emulparams/elf_i386.sh
|
||||||
+source_sh ${srcdir}/emulparams/elf_banan_os.sh
|
+source_sh ${srcdir}/emulparams/elf_banan_os.sh
|
||||||
diff -ruN binutils-2.39/ld/emulparams/elf_x86_64_banan_os.sh binutils-2.39-banan_os/ld/emulparams/elf_x86_64_banan_os.sh
|
diff -ruN binutils-2.44/ld/emulparams/elf_x86_64_banan_os.sh binutils-2.44-banan_os/ld/emulparams/elf_x86_64_banan_os.sh
|
||||||
--- binutils-2.39/ld/emulparams/elf_x86_64_banan_os.sh 1970-01-01 02:00:00.000000000 +0200
|
--- binutils-2.44/ld/emulparams/elf_x86_64_banan_os.sh 1970-01-01 02:00:00.000000000 +0200
|
||||||
+++ binutils-2.39-banan_os/ld/emulparams/elf_x86_64_banan_os.sh 2024-08-26 15:51:21.591003274 +0300
|
+++ binutils-2.44-banan_os/ld/emulparams/elf_x86_64_banan_os.sh 2025-06-19 11:11:11.664231452 +0300
|
||||||
@@ -0,0 +1,2 @@
|
@@ -0,0 +1,2 @@
|
||||||
+source_sh ${srcdir}/emulparams/elf_x86_64.sh
|
+source_sh ${srcdir}/emulparams/elf_x86_64.sh
|
||||||
+source_sh ${srcdir}/emulparams/elf_banan_os.sh
|
+source_sh ${srcdir}/emulparams/elf_banan_os.sh
|
||||||
diff -ruN binutils-2.39/ld/Makefile.am binutils-2.39-banan_os/ld/Makefile.am
|
diff -ruN binutils-2.44/ld/Makefile.am binutils-2.44-banan_os/ld/Makefile.am
|
||||||
--- binutils-2.39/ld/Makefile.am 2022-07-08 12:46:48.000000000 +0300
|
--- binutils-2.44/ld/Makefile.am 2025-02-02 02:00:00.000000000 +0200
|
||||||
+++ binutils-2.39-banan_os/ld/Makefile.am 2024-08-26 15:46:27.818947949 +0300
|
+++ binutils-2.44-banan_os/ld/Makefile.am 2025-06-19 11:12:13.666857368 +0300
|
||||||
@@ -275,6 +275,7 @@
|
@@ -277,6 +277,7 @@
|
||||||
eelf32xtensa.c \
|
eelf32xtensa.c \
|
||||||
eelf32z80.c \
|
eelf32z80.c \
|
||||||
eelf_i386.c \
|
eelf_i386.c \
|
||||||
|
@ -100,7 +99,7 @@ diff -ruN binutils-2.39/ld/Makefile.am binutils-2.39-banan_os/ld/Makefile.am
|
||||||
eelf_i386_be.c \
|
eelf_i386_be.c \
|
||||||
eelf_i386_fbsd.c \
|
eelf_i386_fbsd.c \
|
||||||
eelf_i386_haiku.c \
|
eelf_i386_haiku.c \
|
||||||
@@ -453,6 +454,7 @@
|
@@ -459,6 +460,7 @@
|
||||||
eelf64tilegx_be.c \
|
eelf64tilegx_be.c \
|
||||||
eelf_mipsel_haiku.c \
|
eelf_mipsel_haiku.c \
|
||||||
eelf_x86_64.c \
|
eelf_x86_64.c \
|
||||||
|
@ -108,10 +107,10 @@ diff -ruN binutils-2.39/ld/Makefile.am binutils-2.39-banan_os/ld/Makefile.am
|
||||||
eelf_x86_64_cloudabi.c \
|
eelf_x86_64_cloudabi.c \
|
||||||
eelf_x86_64_fbsd.c \
|
eelf_x86_64_fbsd.c \
|
||||||
eelf_x86_64_haiku.c \
|
eelf_x86_64_haiku.c \
|
||||||
diff -ruN binutils-2.39/ld/Makefile.in binutils-2.39-banan_os/ld/Makefile.in
|
diff -ruN binutils-2.44/ld/Makefile.in binutils-2.44-banan_os/ld/Makefile.in
|
||||||
--- binutils-2.39/ld/Makefile.in 2022-08-05 12:56:53.000000000 +0300
|
--- binutils-2.44/ld/Makefile.in 2025-02-02 02:00:00.000000000 +0200
|
||||||
+++ binutils-2.39-banan_os/ld/Makefile.in 2024-08-26 15:52:12.046704200 +0300
|
+++ binutils-2.44-banan_os/ld/Makefile.in 2025-06-19 11:14:27.198888034 +0300
|
||||||
@@ -772,6 +772,7 @@
|
@@ -788,6 +788,7 @@
|
||||||
eelf32xtensa.c \
|
eelf32xtensa.c \
|
||||||
eelf32z80.c \
|
eelf32z80.c \
|
||||||
eelf_i386.c \
|
eelf_i386.c \
|
||||||
|
@ -119,7 +118,7 @@ diff -ruN binutils-2.39/ld/Makefile.in binutils-2.39-banan_os/ld/Makefile.in
|
||||||
eelf_i386_be.c \
|
eelf_i386_be.c \
|
||||||
eelf_i386_fbsd.c \
|
eelf_i386_fbsd.c \
|
||||||
eelf_i386_haiku.c \
|
eelf_i386_haiku.c \
|
||||||
@@ -949,6 +950,7 @@
|
@@ -969,6 +970,7 @@
|
||||||
eelf64tilegx_be.c \
|
eelf64tilegx_be.c \
|
||||||
eelf_mipsel_haiku.c \
|
eelf_mipsel_haiku.c \
|
||||||
eelf_x86_64.c \
|
eelf_x86_64.c \
|
||||||
|
@ -127,7 +126,7 @@ diff -ruN binutils-2.39/ld/Makefile.in binutils-2.39-banan_os/ld/Makefile.in
|
||||||
eelf_x86_64_cloudabi.c \
|
eelf_x86_64_cloudabi.c \
|
||||||
eelf_x86_64_fbsd.c \
|
eelf_x86_64_fbsd.c \
|
||||||
eelf_x86_64_haiku.c \
|
eelf_x86_64_haiku.c \
|
||||||
@@ -1441,6 +1443,7 @@
|
@@ -1476,6 +1478,7 @@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf64tilegx.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf64tilegx.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf64tilegx_be.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf64tilegx_be.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf_i386.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf_i386.Po@am__quote@
|
||||||
|
@ -135,7 +134,7 @@ diff -ruN binutils-2.39/ld/Makefile.in binutils-2.39-banan_os/ld/Makefile.in
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf_i386_be.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf_i386_be.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf_i386_fbsd.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf_i386_fbsd.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf_i386_haiku.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf_i386_haiku.Po@am__quote@
|
||||||
@@ -1451,6 +1454,7 @@
|
@@ -1486,6 +1489,7 @@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf_mipsel_haiku.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf_mipsel_haiku.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf_s390.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf_s390.Po@am__quote@
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf_x86_64.Po@am__quote@
|
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf_x86_64.Po@am__quote@
|
|
@ -1,11 +1,11 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
BINUTILS_VERSION="binutils-2.39"
|
BINUTILS_VERSION="binutils-2.44"
|
||||||
BINUTILS_TAR="$BINUTILS_VERSION.tar.gz"
|
BINUTILS_TAR="$BINUTILS_VERSION.tar.gz"
|
||||||
BINUTILS_URL="https://ftp.gnu.org/gnu/binutils/$BINUTILS_TAR"
|
BINUTILS_URL="https://ftp.gnu.org/gnu/binutils/$BINUTILS_TAR"
|
||||||
|
|
||||||
GCC_VERSION="gcc-12.2.0"
|
GCC_VERSION="gcc-15.1.0"
|
||||||
GCC_TAR="$GCC_VERSION.tar.gz"
|
GCC_TAR="$GCC_VERSION.tar.gz"
|
||||||
GCC_URL="https://ftp.gnu.org/gnu/gcc/$GCC_VERSION/$GCC_TAR"
|
GCC_URL="https://ftp.gnu.org/gnu/gcc/$GCC_VERSION/$GCC_TAR"
|
||||||
|
|
||||||
|
@ -94,7 +94,7 @@ build_binutils () {
|
||||||
--disable-werror
|
--disable-werror
|
||||||
|
|
||||||
make $MAKE_JOBS
|
make $MAKE_JOBS
|
||||||
make install
|
make install-strip
|
||||||
}
|
}
|
||||||
|
|
||||||
build_gcc () {
|
build_gcc () {
|
||||||
|
@ -131,8 +131,8 @@ build_gcc () {
|
||||||
|
|
||||||
make $MAKE_JOBS all-gcc
|
make $MAKE_JOBS all-gcc
|
||||||
make $MAKE_JOBS all-target-libgcc CFLAGS_FOR_TARGET="$XCFLAGS"
|
make $MAKE_JOBS all-target-libgcc CFLAGS_FOR_TARGET="$XCFLAGS"
|
||||||
make install-gcc
|
make install-strip-gcc
|
||||||
make install-target-libgcc
|
make install-strip-target-libgcc
|
||||||
}
|
}
|
||||||
|
|
||||||
build_libstdcpp () {
|
build_libstdcpp () {
|
||||||
|
@ -143,7 +143,7 @@ build_libstdcpp () {
|
||||||
|
|
||||||
cd $BANAN_BUILD_DIR/toolchain/$GCC_VERSION/build-$BANAN_ARCH
|
cd $BANAN_BUILD_DIR/toolchain/$GCC_VERSION/build-$BANAN_ARCH
|
||||||
make $MAKE_JOBS all-target-libstdc++-v3
|
make $MAKE_JOBS all-target-libstdc++-v3
|
||||||
make install-target-libstdc++-v3
|
make install-strip-target-libstdc++-v3
|
||||||
}
|
}
|
||||||
|
|
||||||
build_grub () {
|
build_grub () {
|
||||||
|
@ -275,5 +275,3 @@ if (($BUILD_LIBSTDCPP)); then
|
||||||
|
|
||||||
build_libstdcpp
|
build_libstdcpp
|
||||||
fi
|
fi
|
||||||
|
|
||||||
find "$BANAN_TOOLCHAIN_PREFIX" -type f -executable -exec strip --strip-unneeded {} + 2>/dev/null
|
|
||||||
|
|
|
@ -1,189 +0,0 @@
|
||||||
diff -ruN gcc-12.2.0/config.sub gcc-12.2.0-banan_os/config.sub
|
|
||||||
--- gcc-12.2.0/config.sub 2022-08-19 11:09:52.128656687 +0300
|
|
||||||
+++ gcc-12.2.0-banan_os/config.sub 2024-09-03 23:09:34.347772496 +0300
|
|
||||||
@@ -1749,7 +1749,7 @@
|
|
||||||
| onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \
|
|
||||||
| midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \
|
|
||||||
| nsk* | powerunix* | genode* | zvmoe* | qnx* | emx* | zephyr* \
|
|
||||||
- | fiwix* )
|
|
||||||
+ | fiwix* | banan_os* )
|
|
||||||
;;
|
|
||||||
# This one is extra strict with allowed versions
|
|
||||||
sco3.2v2 | sco3.2v[4-9]* | sco5v6*)
|
|
||||||
diff -ruN gcc-12.2.0/fixincludes/mkfixinc.sh gcc-12.2.0-banan_os/fixincludes/mkfixinc.sh
|
|
||||||
--- gcc-12.2.0/fixincludes/mkfixinc.sh 2022-08-19 11:09:52.160657095 +0300
|
|
||||||
+++ gcc-12.2.0-banan_os/fixincludes/mkfixinc.sh 2025-06-03 18:08:13.366965577 +0300
|
|
||||||
@@ -11,6 +11,7 @@
|
|
||||||
|
|
||||||
# Check for special fix rules for particular targets
|
|
||||||
case $machine in
|
|
||||||
+ *-*-banan_os* | \
|
|
||||||
i?86-*-cygwin* | \
|
|
||||||
i?86-*-mingw32* | \
|
|
||||||
x86_64-*-mingw32* | \
|
|
||||||
diff -ruN gcc-12.2.0/gcc/config/banan_os.h gcc-12.2.0-banan_os/gcc/config/banan_os.h
|
|
||||||
--- gcc-12.2.0/gcc/config/banan_os.h 1970-01-01 02:00:00.000000000 +0200
|
|
||||||
+++ gcc-12.2.0-banan_os/gcc/config/banan_os.h 2024-09-03 23:09:34.461106020 +0300
|
|
||||||
@@ -0,0 +1,35 @@
|
|
||||||
+/* Useful if you wish to make target-specific GCC changes. */
|
|
||||||
+#undef TARGET_BANAN_OS
|
|
||||||
+#define TARGET_BANAN_OS 1
|
|
||||||
+
|
|
||||||
+/* Default arguments you want when running your
|
|
||||||
+ *-banan_os-gcc toolchain */
|
|
||||||
+#undef LIB_SPEC
|
|
||||||
+#define LIB_SPEC "-lc" /* link against C standard library */
|
|
||||||
+
|
|
||||||
+/* Files that are linked before user code.
|
|
||||||
+ The %s tells GCC to look for these files in the library directory. */
|
|
||||||
+#undef STARTFILE_SPEC
|
|
||||||
+#define STARTFILE_SPEC "%{!shared:crt0.o%s} crti.o%s %{shared|static-pie|!no-pie:crtbeginS.o%s; :crtbegin.o%s}"
|
|
||||||
+
|
|
||||||
+/* Files that are linked after user code. */
|
|
||||||
+#undef ENDFILE_SPEC
|
|
||||||
+#define ENDFILE_SPEC "%{shared|static-pie|!no-pie:crtendS.o%s; :crtend.o%s} crtn.o%s"
|
|
||||||
+
|
|
||||||
+#undef LINK_SPEC
|
|
||||||
+#define LINK_SPEC "%{shared:-shared} %{static:-static} %{!shared: %{!static: %{rdynamic:-export-dynamic}}}"
|
|
||||||
+
|
|
||||||
+/* We don't have separate math library so don't link it. */
|
|
||||||
+#undef MATH_LIBRARY
|
|
||||||
+#define MATH_LIBRARY ""
|
|
||||||
+
|
|
||||||
+/* Additional predefined macros. */
|
|
||||||
+#undef TARGET_OS_CPP_BUILTINS
|
|
||||||
+#define TARGET_OS_CPP_BUILTINS() \
|
|
||||||
+ do { \
|
|
||||||
+ builtin_define ("__banan_os__"); \
|
|
||||||
+ builtin_define ("__unix__"); \
|
|
||||||
+ builtin_assert ("system=banan_os"); \
|
|
||||||
+ builtin_assert ("system=unix"); \
|
|
||||||
+ builtin_assert ("system=posix"); \
|
|
||||||
+ } while(0);
|
|
||||||
diff -ruN gcc-12.2.0/gcc/config.gcc gcc-12.2.0-banan_os/gcc/config.gcc
|
|
||||||
--- gcc-12.2.0/gcc/config.gcc 2022-08-19 11:09:52.552662114 +0300
|
|
||||||
+++ gcc-12.2.0-banan_os/gcc/config.gcc 2024-09-03 23:09:34.461106020 +0300
|
|
||||||
@@ -673,6 +673,13 @@
|
|
||||||
|
|
||||||
# Common parts for widely ported systems.
|
|
||||||
case ${target} in
|
|
||||||
+*-*-banan_os*)
|
|
||||||
+ gas=yes
|
|
||||||
+ gnu_ld=yes
|
|
||||||
+ default_use_cxa_atexit=yes
|
|
||||||
+ use_gcc_stdint=provide
|
|
||||||
+ tmake_file="t-slibgcc"
|
|
||||||
+ ;;
|
|
||||||
*-*-darwin*)
|
|
||||||
tmake_file="t-darwin "
|
|
||||||
tm_file="${tm_file} darwin.h"
|
|
||||||
@@ -1870,6 +1876,12 @@
|
|
||||||
dwarf2=no
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
+i[34567]86-*-banan_os*)
|
|
||||||
+ tm_file="${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h glibc-stdint.h i386/i386elf.h banan_os.h"
|
|
||||||
+ ;;
|
|
||||||
+x86_64-*-banan_os*)
|
|
||||||
+ tm_file="${tm_file} i386/unix.h i386/att.h dbxelf.h elfos.h glibc-stdint.h i386/i386elf.h i386/x86-64.h banan_os.h"
|
|
||||||
+ ;;
|
|
||||||
i[34567]86-*-darwin1[89]* | i[34567]86-*-darwin2*)
|
|
||||||
echo "Error: 32bit target is not supported after Darwin17" 1>&2
|
|
||||||
;;
|
|
||||||
diff -ruN gcc-12.2.0/libgcc/config.host gcc-12.2.0-banan_os/libgcc/config.host
|
|
||||||
--- gcc-12.2.0/libgcc/config.host 2022-08-19 11:09:54.664689148 +0300
|
|
||||||
+++ gcc-12.2.0-banan_os/libgcc/config.host 2024-09-03 23:09:34.474439376 +0300
|
|
||||||
@@ -698,6 +698,14 @@
|
|
||||||
hppa*-*-netbsd*)
|
|
||||||
tmake_file="$tmake_file pa/t-netbsd"
|
|
||||||
;;
|
|
||||||
+i[34567]86-*-banan_os*)
|
|
||||||
+ extra_parts="$extra_parts crti.o crtbegin.o crtbeginS.o crtend.o crtendS.o crtn.o"
|
|
||||||
+ tmake_file="$tmake_file i386/t-crtstuff t-crtstuff-pic t-libgcc-pic t-slibgcc"
|
|
||||||
+ ;;
|
|
||||||
+x86_64-*-banan_os*)
|
|
||||||
+ extra_parts="$extra_parts crti.o crtbegin.o crtbeginS.o crtend.o crtendS.o crtn.o"
|
|
||||||
+ tmake_file="$tmake_file i386/t-crtstuff t-crtstuff-pic t-libgcc-pic t-slibgcc"
|
|
||||||
+ ;;
|
|
||||||
i[34567]86-*-darwin*)
|
|
||||||
tmake_file="$tmake_file i386/t-crtpc t-crtfm i386/t-msabi"
|
|
||||||
tm_file="$tm_file i386/darwin-lib.h"
|
|
||||||
diff -ruN gcc-12.2.0/libgcc/config/t-slibgcc gcc-12.2.0-banan_os/libgcc/config/t-slibgcc
|
|
||||||
--- gcc-12.2.0/libgcc/config/t-slibgcc 2022-08-19 11:09:54.724689916 +0300
|
|
||||||
+++ gcc-12.2.0-banan_os/libgcc/config/t-slibgcc 2024-09-04 23:06:14.275389818 +0300
|
|
||||||
@@ -26,7 +26,6 @@
|
|
||||||
SHLIB_OBJS = @shlib_objs@
|
|
||||||
SHLIB_DIR = @multilib_dir@
|
|
||||||
SHLIB_SLIBDIR_QUAL = @shlib_slibdir_qual@
|
|
||||||
-SHLIB_LC = -lc
|
|
||||||
SHLIB_MAKE_SOLINK = $(LN_S) $(SHLIB_SONAME) $(SHLIB_DIR)/$(SHLIB_SOLINK)
|
|
||||||
SHLIB_INSTALL_SOLINK = $(LN_S) $(SHLIB_SONAME) \
|
|
||||||
$(DESTDIR)$(slibdir)$(SHLIB_SLIBDIR_QUAL)/$(SHLIB_SOLINK)
|
|
||||||
diff -ruN gcc-12.2.0/libstdc++-v3/acinclude.m4 gcc-12.2.0-banan_os/libstdc++-v3/acinclude.m4
|
|
||||||
--- gcc-12.2.0/libstdc++-v3/acinclude.m4 2022-08-19 11:09:55.380698313 +0300
|
|
||||||
+++ gcc-12.2.0-banan_os/libstdc++-v3/acinclude.m4 2024-09-03 23:09:34.477772715 +0300
|
|
||||||
@@ -1380,7 +1380,7 @@
|
|
||||||
ac_has_nanosleep=yes
|
|
||||||
ac_has_sched_yield=yes
|
|
||||||
;;
|
|
||||||
- openbsd*)
|
|
||||||
+ openbsd*|banan_os*)
|
|
||||||
ac_has_clock_monotonic=yes
|
|
||||||
ac_has_clock_realtime=yes
|
|
||||||
ac_has_nanosleep=yes
|
|
||||||
diff -ruN gcc-12.2.0/libstdc++-v3/configure gcc-12.2.0-banan_os/libstdc++-v3/configure
|
|
||||||
--- gcc-12.2.0/libstdc++-v3/configure 2022-08-19 11:09:55.416698774 +0300
|
|
||||||
+++ gcc-12.2.0-banan_os/libstdc++-v3/configure 2024-09-03 23:09:34.487772732 +0300
|
|
||||||
@@ -11904,6 +11904,11 @@
|
|
||||||
lt_cv_dlopen_self=yes
|
|
||||||
;;
|
|
||||||
|
|
||||||
+ banan_os*)
|
|
||||||
+ lt_cv_dlopen="dlopen"
|
|
||||||
+ lt_cv_dlopen_libs=
|
|
||||||
+ ;;
|
|
||||||
+
|
|
||||||
mingw* | pw32* | cegcc*)
|
|
||||||
lt_cv_dlopen="LoadLibrary"
|
|
||||||
lt_cv_dlopen_libs=
|
|
||||||
@@ -15603,8 +15608,8 @@
|
|
||||||
glibcxx_compiler_shared_flag="-D_GLIBCXX_SHARED"
|
|
||||||
|
|
||||||
else
|
|
||||||
- glibcxx_lt_pic_flag=
|
|
||||||
- glibcxx_compiler_pic_flag=
|
|
||||||
+ glibcxx_lt_pic_flag="-prefer-pic"
|
|
||||||
+ glibcxx_compiler_pic_flag="$lt_prog_compiler_pic_CXX"
|
|
||||||
glibcxx_compiler_shared_flag=
|
|
||||||
fi
|
|
||||||
|
|
||||||
@@ -20575,7 +20580,7 @@
|
|
||||||
ac_has_nanosleep=yes
|
|
||||||
ac_has_sched_yield=yes
|
|
||||||
;;
|
|
||||||
- openbsd*)
|
|
||||||
+ openbsd*|banan_os*)
|
|
||||||
ac_has_clock_monotonic=yes
|
|
||||||
ac_has_clock_realtime=yes
|
|
||||||
ac_has_nanosleep=yes
|
|
||||||
@@ -29245,7 +29250,7 @@
|
|
||||||
# This is a freestanding configuration; there is nothing to do here.
|
|
||||||
;;
|
|
||||||
|
|
||||||
- avr*-*-*)
|
|
||||||
+ avr*-*-* | *banan_os* )
|
|
||||||
$as_echo "#define HAVE_ACOSF 1" >>confdefs.h
|
|
||||||
|
|
||||||
$as_echo "#define HAVE_ASINF 1" >>confdefs.h
|
|
||||||
diff -ruN gcc-12.2.0/libstdc++-v3/crossconfig.m4 gcc-12.2.0-banan_os/libstdc++-v3/crossconfig.m4
|
|
||||||
--- gcc-12.2.0/libstdc++-v3/crossconfig.m4 2022-08-19 11:09:55.420698825 +0300
|
|
||||||
+++ gcc-12.2.0-banan_os/libstdc++-v3/crossconfig.m4 2024-09-03 23:09:34.531106138 +0300
|
|
||||||
@@ -9,7 +9,7 @@
|
|
||||||
# This is a freestanding configuration; there is nothing to do here.
|
|
||||||
;;
|
|
||||||
|
|
||||||
- avr*-*-*)
|
|
||||||
+ avr*-*-* | *banan_os* )
|
|
||||||
AC_DEFINE(HAVE_ACOSF)
|
|
||||||
AC_DEFINE(HAVE_ASINF)
|
|
||||||
AC_DEFINE(HAVE_ATAN2F)
|
|
|
@ -0,0 +1,219 @@
|
||||||
|
diff -ruN gcc-15.1.0/config.sub gcc-15.1.0-banan_os/config.sub
|
||||||
|
--- gcc-15.1.0/config.sub 2025-04-25 11:17:59.000000000 +0300
|
||||||
|
+++ gcc-15.1.0-banan_os/config.sub 2025-06-19 11:29:44.368548733 +0300
|
||||||
|
@@ -1749,7 +1749,7 @@
|
||||||
|
| onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \
|
||||||
|
| midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \
|
||||||
|
| nsk* | powerunix* | genode* | zvmoe* | qnx* | emx* | zephyr* \
|
||||||
|
- | fiwix* )
|
||||||
|
+ | fiwix* | banan_os* )
|
||||||
|
;;
|
||||||
|
# This one is extra strict with allowed versions
|
||||||
|
sco3.2v2 | sco3.2v[4-9]* | sco5v6*)
|
||||||
|
diff -ruN gcc-15.1.0/fixincludes/mkfixinc.sh gcc-15.1.0-banan_os/fixincludes/mkfixinc.sh
|
||||||
|
--- gcc-15.1.0/fixincludes/mkfixinc.sh 2025-04-25 11:17:59.000000000 +0300
|
||||||
|
+++ gcc-15.1.0-banan_os/fixincludes/mkfixinc.sh 2025-06-19 11:30:13.427343038 +0300
|
||||||
|
@@ -11,6 +11,7 @@
|
||||||
|
|
||||||
|
# Check for special fix rules for particular targets
|
||||||
|
case $machine in
|
||||||
|
+ *-*-banan_os* | \
|
||||||
|
i?86-*-cygwin* | \
|
||||||
|
*-mingw32* | \
|
||||||
|
powerpc-*-eabisim* | \
|
||||||
|
diff -ruN gcc-15.1.0/gcc/config/banan_os.h gcc-15.1.0-banan_os/gcc/config/banan_os.h
|
||||||
|
--- gcc-15.1.0/gcc/config/banan_os.h 1970-01-01 02:00:00.000000000 +0200
|
||||||
|
+++ gcc-15.1.0-banan_os/gcc/config/banan_os.h 2025-06-19 11:30:53.316059523 +0300
|
||||||
|
@@ -0,0 +1,35 @@
|
||||||
|
+/* Useful if you wish to make target-specific GCC changes. */
|
||||||
|
+#undef TARGET_BANAN_OS
|
||||||
|
+#define TARGET_BANAN_OS 1
|
||||||
|
+
|
||||||
|
+/* Default arguments you want when running your
|
||||||
|
+ *-banan_os-gcc toolchain */
|
||||||
|
+#undef LIB_SPEC
|
||||||
|
+#define LIB_SPEC "-lc" /* link against C standard library */
|
||||||
|
+
|
||||||
|
+/* Files that are linked before user code.
|
||||||
|
+ The %s tells GCC to look for these files in the library directory. */
|
||||||
|
+#undef STARTFILE_SPEC
|
||||||
|
+#define STARTFILE_SPEC "%{!shared:crt0.o%s} crti.o%s %{shared|static-pie|!no-pie:crtbeginS.o%s; :crtbegin.o%s}"
|
||||||
|
+
|
||||||
|
+/* Files that are linked after user code. */
|
||||||
|
+#undef ENDFILE_SPEC
|
||||||
|
+#define ENDFILE_SPEC "%{shared|static-pie|!no-pie:crtendS.o%s; :crtend.o%s} crtn.o%s"
|
||||||
|
+
|
||||||
|
+#undef LINK_SPEC
|
||||||
|
+#define LINK_SPEC "%{shared:-shared} %{static:-static} %{!shared: %{!static: %{rdynamic:-export-dynamic}}}"
|
||||||
|
+
|
||||||
|
+/* We don't have separate math library so don't link it. */
|
||||||
|
+#undef MATH_LIBRARY
|
||||||
|
+#define MATH_LIBRARY ""
|
||||||
|
+
|
||||||
|
+/* Additional predefined macros. */
|
||||||
|
+#undef TARGET_OS_CPP_BUILTINS
|
||||||
|
+#define TARGET_OS_CPP_BUILTINS() \
|
||||||
|
+ do { \
|
||||||
|
+ builtin_define ("__banan_os__"); \
|
||||||
|
+ builtin_define ("__unix__"); \
|
||||||
|
+ builtin_assert ("system=banan_os"); \
|
||||||
|
+ builtin_assert ("system=unix"); \
|
||||||
|
+ builtin_assert ("system=posix"); \
|
||||||
|
+ } while(0);
|
||||||
|
diff -ruN gcc-15.1.0/gcc/config/banan_os.opt gcc-15.1.0-banan_os/gcc/config/banan_os.opt
|
||||||
|
--- gcc-15.1.0/gcc/config/banan_os.opt 1970-01-01 02:00:00.000000000 +0200
|
||||||
|
+++ gcc-15.1.0-banan_os/gcc/config/banan_os.opt 2025-06-19 11:31:29.325802503 +0300
|
||||||
|
@@ -0,0 +1,32 @@
|
||||||
|
+; banan_os options.
|
||||||
|
+
|
||||||
|
+; Copyright (C) 2025 Oskari Alaranta <oskari.alaranta@bananymous.com>
|
||||||
|
+;
|
||||||
|
+; This file is part of GCC.
|
||||||
|
+;
|
||||||
|
+; GCC is free software; you can redistribute it and/or modify it under
|
||||||
|
+; the terms of the GNU General Public License as published by the Free
|
||||||
|
+; Software Foundation; either version 3, or (at your option) any later
|
||||||
|
+; version.
|
||||||
|
+;
|
||||||
|
+; GCC is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||||
|
+; WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
+; FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
+; for more details.
|
||||||
|
+;
|
||||||
|
+; You should have received a copy of the GNU General Public License
|
||||||
|
+; along with GCC; see the file COPYING3. If not see
|
||||||
|
+; <http://www.gnu.org/licenses/>.
|
||||||
|
+
|
||||||
|
+; See the GCC internals manual (options.texi) for a description of
|
||||||
|
+; this file's format.
|
||||||
|
+
|
||||||
|
+; Please try to keep this file in ASCII collating order.
|
||||||
|
+
|
||||||
|
+posix
|
||||||
|
+Driver
|
||||||
|
+
|
||||||
|
+pthread
|
||||||
|
+Driver
|
||||||
|
+
|
||||||
|
+; This comment is to ensure we retain the blank line above.
|
||||||
|
diff -ruN gcc-15.1.0/gcc/config/banan_os.opt.urls gcc-15.1.0-banan_os/gcc/config/banan_os.opt.urls
|
||||||
|
--- gcc-15.1.0/gcc/config/banan_os.opt.urls 1970-01-01 02:00:00.000000000 +0200
|
||||||
|
+++ gcc-15.1.0-banan_os/gcc/config/banan_os.opt.urls 2025-06-19 11:31:29.325802503 +0300
|
||||||
|
@@ -0,0 +1 @@
|
||||||
|
+; Not sure what to put here but this works
|
||||||
|
diff -ruN gcc-15.1.0/gcc/config.gcc gcc-15.1.0-banan_os/gcc/config.gcc
|
||||||
|
--- gcc-15.1.0/gcc/config.gcc 2025-04-25 11:18:00.000000000 +0300
|
||||||
|
+++ gcc-15.1.0-banan_os/gcc/config.gcc 2025-06-19 11:32:50.391220522 +0300
|
||||||
|
@@ -723,6 +723,14 @@
|
||||||
|
|
||||||
|
# Common parts for widely ported systems.
|
||||||
|
case ${target} in
|
||||||
|
+*-*-banan_os*)
|
||||||
|
+ gas=yes
|
||||||
|
+ gnu_ld=yes
|
||||||
|
+ default_use_cxa_atexit=yes
|
||||||
|
+ extra_options="${extra_options} banan_os.opt"
|
||||||
|
+ use_gcc_stdint=provide
|
||||||
|
+ tmake_file="t-slibgcc"
|
||||||
|
+ ;;
|
||||||
|
*-*-darwin*)
|
||||||
|
tmake_file="t-darwin "
|
||||||
|
tm_file="${tm_file} darwin.h"
|
||||||
|
@@ -1972,6 +1980,12 @@
|
||||||
|
tm_file="${tm_file} i386/unix.h i386/att.h elfos.h newlib-stdint.h i386/i386elf.h i386/x86-64.h i386/rdos.h i386/rdos64.h"
|
||||||
|
tmake_file="i386/t-i386elf t-svr4"
|
||||||
|
;;
|
||||||
|
+i[34567]86-*-banan_os*)
|
||||||
|
+ tm_file="${tm_file} i386/unix.h i386/att.h elfos.h glibc-stdint.h i386/i386elf.h banan_os.h"
|
||||||
|
+ ;;
|
||||||
|
+x86_64-*-banan_os*)
|
||||||
|
+ tm_file="${tm_file} i386/unix.h i386/att.h elfos.h glibc-stdint.h i386/i386elf.h i386/x86-64.h banan_os.h"
|
||||||
|
+ ;;
|
||||||
|
i[34567]86-*-dragonfly*)
|
||||||
|
tm_file="${tm_file} i386/unix.h i386/att.h elfos.h dragonfly.h dragonfly-stdint.h i386/dragonfly.h"
|
||||||
|
tmake_file="${tmake_file} i386/t-crtstuff"
|
||||||
|
diff -ruN gcc-15.1.0/libgcc/config/t-slibgcc gcc-15.1.0-banan_os/libgcc/config/t-slibgcc
|
||||||
|
--- gcc-15.1.0/libgcc/config/t-slibgcc 2025-04-25 11:18:04.000000000 +0300
|
||||||
|
+++ gcc-15.1.0-banan_os/libgcc/config/t-slibgcc 2025-06-19 11:34:04.674683603 +0300
|
||||||
|
@@ -26,7 +26,6 @@
|
||||||
|
SHLIB_OBJS = @shlib_objs@
|
||||||
|
SHLIB_DIR = @multilib_dir@
|
||||||
|
SHLIB_SLIBDIR_QUAL = @shlib_slibdir_qual@
|
||||||
|
-SHLIB_LC = -lc
|
||||||
|
SHLIB_MAKE_SOLINK = $(LN_S) $(SHLIB_SONAME) $(SHLIB_DIR)/$(SHLIB_SOLINK)
|
||||||
|
SHLIB_INSTALL_SOLINK = $(LN_S) $(SHLIB_SONAME) \
|
||||||
|
$(DESTDIR)$(slibdir)$(SHLIB_SLIBDIR_QUAL)/$(SHLIB_SOLINK)
|
||||||
|
diff -ruN gcc-15.1.0/libgcc/config.host gcc-15.1.0-banan_os/libgcc/config.host
|
||||||
|
--- gcc-15.1.0/libgcc/config.host 2025-04-25 11:18:04.000000000 +0300
|
||||||
|
+++ gcc-15.1.0-banan_os/libgcc/config.host 2025-06-19 11:33:42.354845264 +0300
|
||||||
|
@@ -627,6 +627,14 @@
|
||||||
|
fixed_point=no
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
+i[34567]86-*-banan_os*)
|
||||||
|
+ extra_parts="$extra_parts crti.o crtbegin.o crtbeginS.o crtend.o crtendS.o crtn.o"
|
||||||
|
+ tmake_file="$tmake_file i386/t-crtstuff t-crtstuff-pic t-libgcc-pic t-slibgcc"
|
||||||
|
+ ;;
|
||||||
|
+x86_64-*-banan_os*)
|
||||||
|
+ extra_parts="$extra_parts crti.o crtbegin.o crtbeginS.o crtend.o crtendS.o crtn.o"
|
||||||
|
+ tmake_file="$tmake_file i386/t-crtstuff t-crtstuff-pic t-libgcc-pic t-slibgcc"
|
||||||
|
+ ;;
|
||||||
|
bfin*-elf*)
|
||||||
|
tmake_file="bfin/t-bfin bfin/t-crtlibid bfin/t-crtstuff t-libgcc-pic t-fdpbit"
|
||||||
|
extra_parts="$extra_parts crtbeginS.o crtendS.o crti.o crtn.o crtlibid.o"
|
||||||
|
diff -ruN gcc-15.1.0/libstdc++-v3/acinclude.m4 gcc-15.1.0-banan_os/libstdc++-v3/acinclude.m4
|
||||||
|
--- gcc-15.1.0/libstdc++-v3/acinclude.m4 2025-04-25 11:18:05.000000000 +0300
|
||||||
|
+++ gcc-15.1.0-banan_os/libstdc++-v3/acinclude.m4 2025-06-19 11:34:58.939289470 +0300
|
||||||
|
@@ -1792,7 +1792,7 @@
|
||||||
|
ac_has_nanosleep=yes
|
||||||
|
ac_has_sched_yield=yes
|
||||||
|
;;
|
||||||
|
- freebsd*|netbsd*|dragonfly*|rtems*)
|
||||||
|
+ freebsd*|netbsd*|dragonfly*|rtems*|banan_os*)
|
||||||
|
ac_has_clock_monotonic=yes
|
||||||
|
ac_has_clock_realtime=yes
|
||||||
|
ac_has_nanosleep=yes
|
||||||
|
diff -ruN gcc-15.1.0/libstdc++-v3/configure gcc-15.1.0-banan_os/libstdc++-v3/configure
|
||||||
|
--- gcc-15.1.0/libstdc++-v3/configure 2025-04-25 11:18:05.000000000 +0300
|
||||||
|
+++ gcc-15.1.0-banan_os/libstdc++-v3/configure 2025-06-19 11:37:41.265102481 +0300
|
||||||
|
@@ -15789,8 +15789,8 @@ if test "$enable_shared" = yes; then
|
||||||
|
glibcxx_compiler_shared_flag="-D_GLIBCXX_SHARED"
|
||||||
|
|
||||||
|
else
|
||||||
|
- glibcxx_lt_pic_flag=
|
||||||
|
- glibcxx_compiler_pic_flag=
|
||||||
|
+ glibcxx_lt_pic_flag="-prefer-pic"
|
||||||
|
+ glibcxx_compiler_pic_flag="$lt_prog_compiler_pic_CXX"
|
||||||
|
glibcxx_compiler_shared_flag=
|
||||||
|
fi
|
||||||
|
|
||||||
|
@@ -21377,7 +21377,7 @@
|
||||||
|
ac_has_nanosleep=yes
|
||||||
|
ac_has_sched_yield=yes
|
||||||
|
;;
|
||||||
|
- freebsd*|netbsd*|dragonfly*|rtems*)
|
||||||
|
+ freebsd*|netbsd*|dragonfly*|rtems*|banan_os*)
|
||||||
|
ac_has_clock_monotonic=yes
|
||||||
|
ac_has_clock_realtime=yes
|
||||||
|
ac_has_nanosleep=yes
|
||||||
|
@@ -28654,7 +28654,7 @@
|
||||||
|
# This is a freestanding configuration; there is nothing to do here.
|
||||||
|
;;
|
||||||
|
|
||||||
|
- avr*-*-*)
|
||||||
|
+ avr*-*-* | *banan_os*)
|
||||||
|
$as_echo "#define HAVE_ACOSF 1" >>confdefs.h
|
||||||
|
|
||||||
|
$as_echo "#define HAVE_ASINF 1" >>confdefs.h
|
||||||
|
diff -ruN gcc-15.1.0/libstdc++-v3/crossconfig.m4 gcc-15.1.0-banan_os/libstdc++-v3/crossconfig.m4
|
||||||
|
--- gcc-15.1.0/libstdc++-v3/crossconfig.m4 2025-04-25 11:18:05.000000000 +0300
|
||||||
|
+++ gcc-15.1.0-banan_os/libstdc++-v3/crossconfig.m4 2025-06-19 11:36:53.954449540 +0300
|
||||||
|
@@ -9,7 +9,7 @@
|
||||||
|
# This is a freestanding configuration; there is nothing to do here.
|
||||||
|
;;
|
||||||
|
|
||||||
|
- avr*-*-*)
|
||||||
|
+ avr*-*-* | *banan_os*)
|
||||||
|
AC_DEFINE(HAVE_ACOSF)
|
||||||
|
AC_DEFINE(HAVE_ASINF)
|
||||||
|
AC_DEFINE(HAVE_ATAN2F)
|
|
@ -0,0 +1,17 @@
|
||||||
|
[host_machine]
|
||||||
|
system = 'banan_os'
|
||||||
|
cpu_family = 'ARCH'
|
||||||
|
cpu = 'ARCH'
|
||||||
|
endian = 'little'
|
||||||
|
|
||||||
|
[binaries]
|
||||||
|
c = 'ARCH-pc-banan_os-gcc'
|
||||||
|
cpp = 'ARCH-pc-banan_os-g++'
|
||||||
|
ar = 'ARCH-pc-banan_os-ar'
|
||||||
|
ld = 'ARCH-pc-banan_os-ld'
|
||||||
|
objcopy = 'ARCH-pc-banan_os-objcopy'
|
||||||
|
strip = 'ARCH-pc-banan_os-strip'
|
||||||
|
pkgconfig = 'pkg-config'
|
||||||
|
|
||||||
|
[properties]
|
||||||
|
sys_root='SYSROOT'
|
|
@ -5,6 +5,7 @@ set(LIBC_SOURCES
|
||||||
ctype.cpp
|
ctype.cpp
|
||||||
dirent.cpp
|
dirent.cpp
|
||||||
dlfcn.cpp
|
dlfcn.cpp
|
||||||
|
endian.cpp
|
||||||
environ.cpp
|
environ.cpp
|
||||||
errno.cpp
|
errno.cpp
|
||||||
fcntl.cpp
|
fcntl.cpp
|
||||||
|
@ -32,6 +33,7 @@ set(LIBC_SOURCES
|
||||||
strings.cpp
|
strings.cpp
|
||||||
sys/banan-os.cpp
|
sys/banan-os.cpp
|
||||||
sys/epoll.cpp
|
sys/epoll.cpp
|
||||||
|
sys/file.cpp
|
||||||
sys/ioctl.cpp
|
sys/ioctl.cpp
|
||||||
sys/mman.cpp
|
sys/mman.cpp
|
||||||
sys/resource.cpp
|
sys/resource.cpp
|
||||||
|
|
|
@ -102,3 +102,10 @@ readdir_do_syscall:
|
||||||
|
|
||||||
return &dirp->entries[0];
|
return &dirp->entries[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void rewinddir(DIR* dirp)
|
||||||
|
{
|
||||||
|
dirp->entry_count = 0;
|
||||||
|
dirp->entry_index = 0;
|
||||||
|
lseek(dirp->fd, 0, SEEK_SET);
|
||||||
|
}
|
||||||
|
|
|
@ -1,23 +1,33 @@
|
||||||
#include <BAN/Assert.h>
|
|
||||||
|
|
||||||
#include <dlfcn.h>
|
#include <dlfcn.h>
|
||||||
|
|
||||||
int dlclose(void*)
|
extern "C" int __dlclose(void*) __attribute__((weak));
|
||||||
|
int dlclose(void* handle)
|
||||||
{
|
{
|
||||||
ASSERT_NOT_REACHED();
|
if (&__dlclose == nullptr) [[unlikely]]
|
||||||
|
return -1;
|
||||||
|
return __dlclose(handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern "C" char* __dlerror() __attribute__((weak));
|
||||||
char* dlerror(void)
|
char* dlerror(void)
|
||||||
{
|
{
|
||||||
ASSERT_NOT_REACHED();
|
if (&__dlerror == nullptr) [[unlikely]]
|
||||||
|
return const_cast<char*>("TODO: dlfcn functions with static linking");
|
||||||
|
return __dlerror();
|
||||||
}
|
}
|
||||||
|
|
||||||
void* dlopen(const char*, int)
|
extern "C" void* __dlopen(const char*, int) __attribute__((weak));
|
||||||
|
void* dlopen(const char* file, int mode)
|
||||||
{
|
{
|
||||||
ASSERT_NOT_REACHED();
|
if (&__dlopen == nullptr) [[unlikely]]
|
||||||
|
return nullptr;
|
||||||
|
return __dlopen(file, mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
void* dlsym(void* __restrict, const char* __restrict)
|
extern "C" void* __dlsym(void*, const char*) __attribute__((weak));
|
||||||
|
void* dlsym(void* __restrict handle, const char* __restrict name)
|
||||||
{
|
{
|
||||||
ASSERT_NOT_REACHED();
|
if (&__dlsym == nullptr) [[unlikely]]
|
||||||
|
return nullptr;
|
||||||
|
return __dlsym(handle, name);
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,31 @@
|
||||||
|
#include <BAN/Endianness.h>
|
||||||
|
|
||||||
|
#include <endian.h>
|
||||||
|
|
||||||
|
#define BE_TO_H(size) \
|
||||||
|
uint##size##_t be##size##toh(uint##size##_t x) { return BAN::big_endian_to_host(x); }
|
||||||
|
BE_TO_H(16)
|
||||||
|
BE_TO_H(32)
|
||||||
|
BE_TO_H(64)
|
||||||
|
#undef BE_TO_H
|
||||||
|
|
||||||
|
#define H_TO_BE(size) \
|
||||||
|
uint##size##_t htobe##size(uint##size##_t x) { return BAN::host_to_big_endian(x); }
|
||||||
|
H_TO_BE(16)
|
||||||
|
H_TO_BE(32)
|
||||||
|
H_TO_BE(64)
|
||||||
|
#undef H_TO_BE
|
||||||
|
|
||||||
|
#define LE_TO_H(size) \
|
||||||
|
uint##size##_t le##size##toh(uint##size##_t x) { return BAN::little_endian_to_host(x); }
|
||||||
|
LE_TO_H(16)
|
||||||
|
LE_TO_H(32)
|
||||||
|
LE_TO_H(64)
|
||||||
|
#undef LE_TO_H
|
||||||
|
|
||||||
|
#define H_TO_LE(size) \
|
||||||
|
uint##size##_t htole##size(uint##size##_t x) { return BAN::host_to_little_endian(x); }
|
||||||
|
H_TO_LE(16)
|
||||||
|
H_TO_LE(32)
|
||||||
|
H_TO_LE(64)
|
||||||
|
#undef H_TO_LE
|
|
@ -71,18 +71,18 @@ static int putenv_impl(char* string, bool malloced)
|
||||||
free(environ[i]);
|
free(environ[i]);
|
||||||
|
|
||||||
if (malloced)
|
if (malloced)
|
||||||
s_environ_bitmap[i / 8] |= mask;
|
s_environ_bitmap[byte] |= mask;
|
||||||
else
|
else
|
||||||
s_environ_bitmap[i / 8] &= ~mask;
|
s_environ_bitmap[byte] &= ~mask;
|
||||||
|
|
||||||
environ[i] = string;
|
environ[i] = string;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((s_environ_count + 1) % 8 == 0)
|
if (s_environ_count % 8 == 0)
|
||||||
{
|
{
|
||||||
const size_t bytes = (s_environ_count + 1) / 8;
|
const size_t bytes = s_environ_count / 8 + 1;
|
||||||
|
|
||||||
void* new_bitmap = realloc(s_environ_bitmap, bytes);
|
void* new_bitmap = realloc(s_environ_bitmap, bytes);
|
||||||
if (new_bitmap == nullptr)
|
if (new_bitmap == nullptr)
|
||||||
|
|
|
@ -0,0 +1,14 @@
|
||||||
|
#ifndef _ALLOCA_H
|
||||||
|
#define _ALLOCA_H 1
|
||||||
|
|
||||||
|
// https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/stdio.h.html
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
|
||||||
|
__BEGIN_DECLS
|
||||||
|
|
||||||
|
#define alloca __builtin_alloca
|
||||||
|
|
||||||
|
__END_DECLS
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,41 @@
|
||||||
|
#ifndef _ENDIAN_H
|
||||||
|
#define _ENDIAN_H 1
|
||||||
|
|
||||||
|
// https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/endian.h.html
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#define LITTLE_ENDIAN 0
|
||||||
|
#define BIG_ENDIAN 1
|
||||||
|
|
||||||
|
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
|
||||||
|
#define BYTE_ORDER LITTLE_ENDIAN
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
|
||||||
|
#define BYTE_ORDER BIG_ENDIAN
|
||||||
|
#endif
|
||||||
|
|
||||||
|
__BEGIN_DECLS
|
||||||
|
|
||||||
|
uint16_t be16toh(uint16_t);
|
||||||
|
uint32_t be32toh(uint32_t);
|
||||||
|
uint64_t be64toh(uint64_t);
|
||||||
|
|
||||||
|
uint16_t htobe16(uint16_t);
|
||||||
|
uint32_t htobe32(uint32_t);
|
||||||
|
uint64_t htobe64(uint64_t);
|
||||||
|
|
||||||
|
uint16_t htole16(uint16_t);
|
||||||
|
uint32_t htole32(uint32_t);
|
||||||
|
uint64_t htole64(uint64_t);
|
||||||
|
|
||||||
|
uint16_t le16toh(uint16_t);
|
||||||
|
uint32_t le32toh(uint32_t);
|
||||||
|
uint64_t le64toh(uint64_t);
|
||||||
|
|
||||||
|
__END_DECLS
|
||||||
|
|
||||||
|
#endif
|
|
@ -99,6 +99,7 @@ void endservent(void);
|
||||||
void freeaddrinfo(struct addrinfo* ai);
|
void freeaddrinfo(struct addrinfo* ai);
|
||||||
const char* gai_strerror(int ecode);
|
const char* gai_strerror(int ecode);
|
||||||
int getaddrinfo(const char* __restrict nodename, const char* __restrict servname, const struct addrinfo* __restrict hints, struct addrinfo** __restrict res);
|
int getaddrinfo(const char* __restrict nodename, const char* __restrict servname, const struct addrinfo* __restrict hints, struct addrinfo** __restrict res);
|
||||||
|
struct hostent* gethostbyaddr(const void* addr, socklen_t size, int type);
|
||||||
struct hostent* gethostbyname(const char* name);
|
struct hostent* gethostbyname(const char* name);
|
||||||
struct hostent* gethostent(void);
|
struct hostent* gethostent(void);
|
||||||
int getnameinfo(const struct sockaddr* __restrict sa, socklen_t salen, char* __restrict node, socklen_t nodelen, char* __restrict service, socklen_t servicelen, int flags);
|
int getnameinfo(const struct sockaddr* __restrict sa, socklen_t salen, char* __restrict node, socklen_t nodelen, char* __restrict service, socklen_t servicelen, int flags);
|
||||||
|
|
|
@ -56,6 +56,7 @@ extern FILE* __stderr;
|
||||||
extern FILE* __stddbg;
|
extern FILE* __stddbg;
|
||||||
#define stddbg __stddbg
|
#define stddbg __stddbg
|
||||||
|
|
||||||
|
int asprintf(char** __restrict ptr, const char* __restrict format, ...);
|
||||||
void clearerr(FILE* stream);
|
void clearerr(FILE* stream);
|
||||||
char* ctermid(char* s);
|
char* ctermid(char* s);
|
||||||
int dprintf(int fildes, const char* __restrict format, ...);
|
int dprintf(int fildes, const char* __restrict format, ...);
|
||||||
|
@ -116,6 +117,7 @@ char* tempnam(const char* dir, const char* pfx);
|
||||||
FILE* tmpfile(void);
|
FILE* tmpfile(void);
|
||||||
char* tmpnam(char* s);
|
char* tmpnam(char* s);
|
||||||
int ungetc(int c, FILE* stream);
|
int ungetc(int c, FILE* stream);
|
||||||
|
int vasprintf(char** __restrict ptr, const char* __restrict format, va_list ap);
|
||||||
int vdprintf(int fildes, const char* __restrict format, va_list ap);
|
int vdprintf(int fildes, const char* __restrict format, va_list ap);
|
||||||
int vfprintf(FILE* __restrict stream, const char* __restrict format, va_list ap);
|
int vfprintf(FILE* __restrict stream, const char* __restrict format, va_list ap);
|
||||||
int vfscanf(FILE* __restrict stream, const char* __restrict format, va_list arg);
|
int vfscanf(FILE* __restrict stream, const char* __restrict format, va_list arg);
|
||||||
|
|
|
@ -18,7 +18,7 @@ __BEGIN_DECLS
|
||||||
#define EXIT_FAILURE 1
|
#define EXIT_FAILURE 1
|
||||||
#define EXIT_SUCCESS 0
|
#define EXIT_SUCCESS 0
|
||||||
|
|
||||||
#define RAND_MAX INT32_MAX
|
#define RAND_MAX INT_MAX
|
||||||
|
|
||||||
#define MB_CUR_MAX ((size_t)4)
|
#define MB_CUR_MAX ((size_t)4)
|
||||||
|
|
||||||
|
|
|
@ -10,6 +10,10 @@ __BEGIN_DECLS
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <bits/types/locale_t.h>
|
#include <bits/types/locale_t.h>
|
||||||
|
|
||||||
|
// NOTE: A lot of software seems to assume strcasecmp is defined here,
|
||||||
|
// so let's just include it
|
||||||
|
#include <strings.h>
|
||||||
|
|
||||||
void* memccpy(void* __restrict s1, const void* __restrict s2, int c, size_t n);
|
void* memccpy(void* __restrict s1, const void* __restrict s2, int c, size_t n);
|
||||||
void* memchr(const void* s, int c, size_t n);
|
void* memchr(const void* s, int c, size_t n);
|
||||||
int memcmp(const void* s1, const void* s2, size_t n);
|
int memcmp(const void* s1, const void* s2, size_t n);
|
||||||
|
|
|
@ -18,6 +18,11 @@ int strcasecmp_l(const char* s1, const char* s2, locale_t locale);
|
||||||
int strncasecmp(const char* s1, const char* s2, size_t n);
|
int strncasecmp(const char* s1, const char* s2, size_t n);
|
||||||
int strncasecmp_l(const char* s1, const char* s2, size_t n, locale_t locale);
|
int strncasecmp_l(const char* s1, const char* s2, size_t n, locale_t locale);
|
||||||
|
|
||||||
|
// deprecated
|
||||||
|
int bcmp(const void* s1, const void* s2, size_t n);
|
||||||
|
void bcopy(const void* src, void* dest, size_t n);
|
||||||
|
void bzero(void* s, size_t n);
|
||||||
|
|
||||||
__END_DECLS
|
__END_DECLS
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -0,0 +1,17 @@
|
||||||
|
#ifndef _SYS_FILE_H
|
||||||
|
#define _SYS_FILE_H 1
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
|
||||||
|
__BEGIN_DECLS
|
||||||
|
|
||||||
|
#define LOCK_UN 0
|
||||||
|
#define LOCK_EX 1
|
||||||
|
#define LOCK_SH 2
|
||||||
|
#define LOCK_NB 4
|
||||||
|
|
||||||
|
int flock(int fd, int op);
|
||||||
|
|
||||||
|
__END_DECLS
|
||||||
|
|
||||||
|
#endif
|
|
@ -41,6 +41,8 @@ struct winsize
|
||||||
{
|
{
|
||||||
unsigned short ws_row;
|
unsigned short ws_row;
|
||||||
unsigned short ws_col;
|
unsigned short ws_col;
|
||||||
|
unsigned short ws_xpixel; /* unused by kernel */
|
||||||
|
unsigned short ws_ypixel; /* unused by kernel */
|
||||||
};
|
};
|
||||||
#define TIOCGWINSZ 50
|
#define TIOCGWINSZ 50
|
||||||
#define TIOCSWINSZ 51
|
#define TIOCSWINSZ 51
|
||||||
|
|
|
@ -107,6 +107,7 @@ __BEGIN_DECLS
|
||||||
O(SYS_EPOLL_CREATE1, epoll_create1) \
|
O(SYS_EPOLL_CREATE1, epoll_create1) \
|
||||||
O(SYS_EPOLL_CTL, epoll_ctl) \
|
O(SYS_EPOLL_CTL, epoll_ctl) \
|
||||||
O(SYS_EPOLL_PWAIT2, epoll_pwait2) \
|
O(SYS_EPOLL_PWAIT2, epoll_pwait2) \
|
||||||
|
O(SYS_FLOCK, flock) \
|
||||||
|
|
||||||
enum Syscall
|
enum Syscall
|
||||||
{
|
{
|
||||||
|
|
|
@ -96,12 +96,6 @@ static bool allocate_pool(size_t pool_index)
|
||||||
node->prev_free = nullptr;
|
node->prev_free = nullptr;
|
||||||
node->next_free = nullptr;
|
node->next_free = nullptr;
|
||||||
|
|
||||||
#pragma GCC diagnostic push
|
|
||||||
#pragma GCC diagnostic ignored "-Warray-bounds"
|
|
||||||
#pragma GCC diagnostic ignored "-Wstringop-overflow"
|
|
||||||
node->data[-1] = 0;
|
|
||||||
#pragma GCC diagnostic pop
|
|
||||||
|
|
||||||
pool.free_list = node;
|
pool.free_list = node;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@ -144,18 +138,14 @@ static void shrink_node_if_needed(malloc_pool_t& pool, malloc_node_t* node, size
|
||||||
uint8_t* node_end = (uint8_t*)node->next();
|
uint8_t* node_end = (uint8_t*)node->next();
|
||||||
|
|
||||||
node->size = sizeof(malloc_node_t) + size;
|
node->size = sizeof(malloc_node_t) + size;
|
||||||
|
if (auto rem = (node->size + sizeof(malloc_node_t)) % s_malloc_default_align)
|
||||||
|
node->size += s_malloc_default_align - rem;
|
||||||
|
|
||||||
auto* next = node->next();
|
auto* next = node->next();
|
||||||
next->allocated = false;
|
next->allocated = false;
|
||||||
next->size = node_end - (uint8_t*)next;
|
next->size = node_end - (uint8_t*)next;
|
||||||
next->last = node->last;
|
next->last = node->last;
|
||||||
|
|
||||||
#pragma GCC diagnostic push
|
|
||||||
#pragma GCC diagnostic ignored "-Warray-bounds"
|
|
||||||
#pragma GCC diagnostic ignored "-Wstringop-overflow"
|
|
||||||
next->data[-1] = 0;
|
|
||||||
#pragma GCC diagnostic pop
|
|
||||||
|
|
||||||
node->last = false;
|
node->last = false;
|
||||||
|
|
||||||
// insert excess node to free list
|
// insert excess node to free list
|
||||||
|
@ -188,6 +178,8 @@ static void* allocate_from_pool(size_t pool_index, size_t size)
|
||||||
remove_node_from_pool_free_list(pool, node);
|
remove_node_from_pool_free_list(pool, node);
|
||||||
|
|
||||||
shrink_node_if_needed(pool, node, size);
|
shrink_node_if_needed(pool, node, size);
|
||||||
|
|
||||||
|
assert(((uintptr_t)node->data & (s_malloc_default_align - 1)) == 0);
|
||||||
return node->data;
|
return node->data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -196,29 +188,6 @@ static void* allocate_from_pool(size_t pool_index, size_t size)
|
||||||
|
|
||||||
static malloc_node_t* node_from_data_pointer(void* data_pointer)
|
static malloc_node_t* node_from_data_pointer(void* data_pointer)
|
||||||
{
|
{
|
||||||
if (((uint8_t*)data_pointer)[-1])
|
|
||||||
{
|
|
||||||
malloc_pool_t* pool = nullptr;
|
|
||||||
for (size_t i = 0; i < s_malloc_pool_count; i++)
|
|
||||||
{
|
|
||||||
if (!s_malloc_pools[i].start)
|
|
||||||
continue;
|
|
||||||
if (data_pointer < s_malloc_pools[i].start)
|
|
||||||
continue;
|
|
||||||
if (data_pointer > s_malloc_pools[i].end())
|
|
||||||
continue;
|
|
||||||
pool = &s_malloc_pools[i];
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
assert(pool);
|
|
||||||
|
|
||||||
auto* node = (malloc_node_t*)pool->start;
|
|
||||||
for (; (uint8_t*)node < pool->end(); node = node->next())
|
|
||||||
if (node->data < data_pointer && data_pointer < node->next())
|
|
||||||
return node;
|
|
||||||
assert(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (malloc_node_t*)((uint8_t*)data_pointer - sizeof(malloc_node_t));
|
return (malloc_node_t*)((uint8_t*)data_pointer - sizeof(malloc_node_t));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -379,16 +348,53 @@ int posix_memalign(void** memptr, size_t alignment, size_t size)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t* unaligned = (uint8_t*)malloc(size + alignment);
|
if (alignment < s_malloc_default_align)
|
||||||
|
alignment = s_malloc_default_align;
|
||||||
|
|
||||||
|
void* unaligned = malloc(size + alignment + sizeof(malloc_node_t));
|
||||||
if (unaligned == nullptr)
|
if (unaligned == nullptr)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (auto rem = (uintptr_t)unaligned % alignment)
|
pthread_mutex_lock(&s_malloc_mutex);
|
||||||
{
|
|
||||||
unaligned += alignment - rem;
|
|
||||||
unaligned[-1] = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
*memptr = unaligned;
|
auto* node = node_from_data_pointer(unaligned);
|
||||||
|
auto& pool = pool_from_node(node);
|
||||||
|
|
||||||
|
// NOTE: gcc does not like accessing the node from pointer returned by malloc
|
||||||
|
#pragma GCC diagnostic push
|
||||||
|
#pragma GCC diagnostic ignored "-Warray-bounds"
|
||||||
|
if (reinterpret_cast<uintptr_t>(unaligned) % alignment)
|
||||||
|
{
|
||||||
|
uintptr_t curr_data_address = reinterpret_cast<uintptr_t>(unaligned);
|
||||||
|
|
||||||
|
uintptr_t next_data_address = curr_data_address + sizeof(malloc_node_t);
|
||||||
|
if (auto rem = next_data_address % alignment)
|
||||||
|
next_data_address += alignment - rem;
|
||||||
|
|
||||||
|
auto* next = node_from_data_pointer(reinterpret_cast<void*>(next_data_address));
|
||||||
|
next->size = reinterpret_cast<uintptr_t>(node->next()) - reinterpret_cast<uintptr_t>(next);
|
||||||
|
next->allocated = true;
|
||||||
|
assert(next->data_size() >= size);
|
||||||
|
|
||||||
|
node->size = reinterpret_cast<uintptr_t>(next) - reinterpret_cast<uintptr_t>(node);
|
||||||
|
node->allocated = false;
|
||||||
|
|
||||||
|
// add node to free list
|
||||||
|
if (pool.free_list)
|
||||||
|
pool.free_list->prev_free = node;
|
||||||
|
node->prev_free = nullptr;
|
||||||
|
node->next_free = pool.free_list;
|
||||||
|
pool.free_list = node;
|
||||||
|
|
||||||
|
node = next;
|
||||||
|
}
|
||||||
|
#pragma GCC diagnostic pop
|
||||||
|
|
||||||
|
shrink_node_if_needed(pool, node, size);
|
||||||
|
|
||||||
|
pthread_mutex_unlock(&s_malloc_mutex);
|
||||||
|
|
||||||
|
assert(((uintptr_t)node->data & (alignment - 1)) == 0);
|
||||||
|
*memptr = node->data;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -182,6 +182,77 @@ int getnameinfo(const struct sockaddr* __restrict sa, socklen_t salen, char* __r
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct hostent* gethostbyaddr(const void* addr, socklen_t size, int type)
|
||||||
|
{
|
||||||
|
static char* addr_ptrs[2];
|
||||||
|
static struct hostent hostent;
|
||||||
|
|
||||||
|
if (hostent.h_name != nullptr)
|
||||||
|
free(hostent.h_name);
|
||||||
|
|
||||||
|
switch (type)
|
||||||
|
{
|
||||||
|
case AF_INET:
|
||||||
|
{
|
||||||
|
if (size < static_cast<socklen_t>(sizeof(in_addr)))
|
||||||
|
return nullptr;
|
||||||
|
|
||||||
|
hostent.h_name = static_cast<char*>(malloc(INET_ADDRSTRLEN));
|
||||||
|
if (hostent.h_name == nullptr)
|
||||||
|
return nullptr;
|
||||||
|
|
||||||
|
const auto* in_addr = static_cast<const ::in_addr*>(addr);
|
||||||
|
if (!inet_ntop(AF_INET, &in_addr->s_addr, hostent.h_name, INET_ADDRSTRLEN))
|
||||||
|
return nullptr;
|
||||||
|
|
||||||
|
hostent.h_aliases = nullptr;
|
||||||
|
|
||||||
|
hostent.h_addrtype = AF_INET;
|
||||||
|
hostent.h_length = sizeof(::in_addr);
|
||||||
|
|
||||||
|
static char in_addr_buffer[sizeof(::in_addr::s_addr)];
|
||||||
|
memcpy(in_addr_buffer, &in_addr->s_addr, sizeof(::in_addr::s_addr));
|
||||||
|
|
||||||
|
addr_ptrs[0] = in_addr_buffer;
|
||||||
|
addr_ptrs[1] = nullptr;
|
||||||
|
hostent.h_addr_list = addr_ptrs;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case AF_INET6:
|
||||||
|
{
|
||||||
|
if (size < static_cast<socklen_t>(sizeof(in6_addr)))
|
||||||
|
return nullptr;
|
||||||
|
|
||||||
|
hostent.h_name = static_cast<char*>(malloc(INET6_ADDRSTRLEN));
|
||||||
|
if (hostent.h_name == nullptr)
|
||||||
|
return nullptr;
|
||||||
|
|
||||||
|
const auto* in6_addr = static_cast<const ::in6_addr*>(addr);
|
||||||
|
if (!inet_ntop(AF_INET6, &in6_addr->s6_addr, hostent.h_name, INET6_ADDRSTRLEN))
|
||||||
|
return nullptr;
|
||||||
|
|
||||||
|
hostent.h_aliases = nullptr;
|
||||||
|
|
||||||
|
hostent.h_addrtype = AF_INET6;
|
||||||
|
hostent.h_length = sizeof(::in6_addr::s6_addr);
|
||||||
|
|
||||||
|
static char in6_addr_buffer[sizeof(::in6_addr::s6_addr)];
|
||||||
|
memcpy(in6_addr_buffer, &in6_addr->s6_addr, sizeof(::in6_addr::s6_addr));
|
||||||
|
|
||||||
|
addr_ptrs[0] = in6_addr_buffer;
|
||||||
|
addr_ptrs[1] = nullptr;
|
||||||
|
hostent.h_addr_list = addr_ptrs;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
return &hostent;
|
||||||
|
}
|
||||||
|
|
||||||
struct hostent* gethostbyname(const char* name)
|
struct hostent* gethostbyname(const char* name)
|
||||||
{
|
{
|
||||||
static char name_buffer[HOST_NAME_MAX + 1];
|
static char name_buffer[HOST_NAME_MAX + 1];
|
||||||
|
|
|
@ -628,6 +628,24 @@ void pthread_testcancel(void)
|
||||||
pthread_exit(PTHREAD_CANCELED);
|
pthread_exit(PTHREAD_CANCELED);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int pthread_getschedparam(pthread_t thread, int* __restrict policy, struct sched_param* __restrict param)
|
||||||
|
{
|
||||||
|
(void)thread;
|
||||||
|
(void)policy;
|
||||||
|
(void)param;
|
||||||
|
dwarnln("TODO: pthread_getschedparam");
|
||||||
|
return ENOTSUP;
|
||||||
|
}
|
||||||
|
|
||||||
|
int pthread_setschedparam(pthread_t thread, int policy, const struct sched_param* param)
|
||||||
|
{
|
||||||
|
(void)thread;
|
||||||
|
(void)policy;
|
||||||
|
(void)param;
|
||||||
|
dwarnln("TODO: pthread_setschedparam");
|
||||||
|
return ENOTSUP;
|
||||||
|
}
|
||||||
|
|
||||||
int pthread_spin_destroy(pthread_spinlock_t* lock)
|
int pthread_spin_destroy(pthread_spinlock_t* lock)
|
||||||
{
|
{
|
||||||
(void)lock;
|
(void)lock;
|
||||||
|
@ -648,7 +666,11 @@ int pthread_spin_lock(pthread_spinlock_t* lock)
|
||||||
|
|
||||||
pthread_t expected = 0;
|
pthread_t expected = 0;
|
||||||
while (!BAN::atomic_compare_exchange(*lock, expected, tid, BAN::MemoryOrder::memory_order_acquire))
|
while (!BAN::atomic_compare_exchange(*lock, expected, tid, BAN::MemoryOrder::memory_order_acquire))
|
||||||
|
{
|
||||||
|
__builtin_ia32_pause();
|
||||||
expected = 0;
|
expected = 0;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue