mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 09:07:45 +00:00
Kernel+Userland: Replace the beep syscall with the new /dev/beep device
There's no need to have separate syscall for this kind of functionality, as we can just have a device node in /dev, called "beep", that allows writing tone generation packets to emulate the same behavior. In addition to that, we remove LibC sysbeep function, as this function was never being used by any C program nor it was standardized in any way. Instead, we move the userspace implementation to LibCore.
This commit is contained in:
parent
ac70abcb73
commit
1b00618fd9
16 changed files with 128 additions and 58 deletions
63
Kernel/Devices/Generic/PCSpeakerDevice.cpp
Normal file
63
Kernel/Devices/Generic/PCSpeakerDevice.cpp
Normal file
|
@ -0,0 +1,63 @@
|
|||
/*
|
||||
* Copyright (c) 2023, Liav A. <liavalb@hotmail.co.il>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*/
|
||||
|
||||
#include <Kernel/API/BeepInstruction.h>
|
||||
#if ARCH(X86_64)
|
||||
# include <Kernel/Arch/x86_64/PCSpeaker.h>
|
||||
#endif
|
||||
#include <Kernel/Boot/CommandLine.h>
|
||||
#include <Kernel/Devices/DeviceManagement.h>
|
||||
#include <Kernel/Devices/Generic/PCSpeakerDevice.h>
|
||||
#include <Kernel/Sections.h>
|
||||
|
||||
namespace Kernel {
|
||||
|
||||
UNMAP_AFTER_INIT NonnullRefPtr<PCSpeakerDevice> PCSpeakerDevice::must_create()
|
||||
{
|
||||
auto device = MUST(DeviceManagement::try_create_device<PCSpeakerDevice>());
|
||||
return *device;
|
||||
}
|
||||
|
||||
UNMAP_AFTER_INIT PCSpeakerDevice::PCSpeakerDevice()
|
||||
: CharacterDevice(1, 10)
|
||||
{
|
||||
}
|
||||
|
||||
UNMAP_AFTER_INIT PCSpeakerDevice::~PCSpeakerDevice() = default;
|
||||
|
||||
bool PCSpeakerDevice::can_read(OpenFileDescription const&, u64) const
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
ErrorOr<size_t> PCSpeakerDevice::read(OpenFileDescription&, u64, UserOrKernelBuffer&, size_t)
|
||||
{
|
||||
return Error::from_errno(ENOTIMPL);
|
||||
}
|
||||
|
||||
ErrorOr<size_t> PCSpeakerDevice::write(OpenFileDescription&, u64, UserOrKernelBuffer const& buffer, size_t buffer_size)
|
||||
{
|
||||
if (!kernel_command_line().is_pc_speaker_enabled())
|
||||
return Error::from_errno(ENOTSUP);
|
||||
if (buffer_size % sizeof(BeepInstruction) != 0)
|
||||
return Error::from_errno(EINVAL);
|
||||
BeepInstruction instruction {};
|
||||
TRY(buffer.read(&instruction, sizeof(BeepInstruction)));
|
||||
if (instruction.tone < 20 || instruction.tone > 20000)
|
||||
return Error::from_errno(EINVAL);
|
||||
#if ARCH(X86_64)
|
||||
PCSpeaker::tone_on(instruction.tone);
|
||||
auto result = Thread::current()->sleep(Duration::from_nanoseconds(200'000'000));
|
||||
PCSpeaker::tone_off();
|
||||
if (result.was_interrupted())
|
||||
return Error::from_errno(EINTR);
|
||||
return sizeof(BeepInstruction);
|
||||
#else
|
||||
return Error::from_errno(ENOTIMPL);
|
||||
#endif
|
||||
}
|
||||
|
||||
}
|
36
Kernel/Devices/Generic/PCSpeakerDevice.h
Normal file
36
Kernel/Devices/Generic/PCSpeakerDevice.h
Normal file
|
@ -0,0 +1,36 @@
|
|||
/*
|
||||
* Copyright (c) 2023, Liav A. <liavalb@hotmail.co.il>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <Kernel/Devices/CharacterDevice.h>
|
||||
|
||||
namespace Kernel {
|
||||
|
||||
class PCSpeakerDevice final : public CharacterDevice {
|
||||
friend class DeviceManagement;
|
||||
|
||||
public:
|
||||
virtual ~PCSpeakerDevice() override;
|
||||
|
||||
static NonnullRefPtr<PCSpeakerDevice> must_create();
|
||||
|
||||
private:
|
||||
PCSpeakerDevice();
|
||||
|
||||
// ^Device
|
||||
virtual bool is_openable_by_jailed_processes() const override { return true; }
|
||||
|
||||
// ^CharacterDevice
|
||||
virtual ErrorOr<size_t> read(OpenFileDescription&, u64, UserOrKernelBuffer&, size_t) override;
|
||||
virtual ErrorOr<size_t> write(OpenFileDescription&, u64, UserOrKernelBuffer const&, size_t) override;
|
||||
virtual bool can_write(OpenFileDescription const&, u64) const override { return true; }
|
||||
virtual bool can_read(OpenFileDescription const&, u64) const override;
|
||||
virtual StringView class_name() const override { return "PCSpeakerDevice"sv; }
|
||||
virtual bool is_seekable() const override { return true; }
|
||||
};
|
||||
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue