mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 13:17:35 +00:00
Add some simple write buffering to LibC's stdio.
Plumb it all the way to the VirtualConsole. Also fix /bin/cat to write() the whole chunks we get from read() directly to stdout.
This commit is contained in:
parent
e287f8ef3a
commit
da3857b0c2
10 changed files with 42 additions and 22 deletions
|
@ -29,15 +29,19 @@
|
|||
#define VALIDATE_USER_READ(b, s) \
|
||||
do { \
|
||||
LinearAddress laddr((dword)(b)); \
|
||||
if (!validate_user_read(laddr) || !validate_user_read(laddr.offset((s) - 1))) \
|
||||
if (!validate_user_read(laddr) || !validate_user_read(laddr.offset((s) - 1))) { \
|
||||
dbgprintf("Bad read address passed to syscall: %p +%u\n", laddr.get(), (s)); \
|
||||
return -EFAULT; \
|
||||
} \
|
||||
} while(0)
|
||||
|
||||
#define VALIDATE_USER_WRITE(b, s) \
|
||||
do { \
|
||||
LinearAddress laddr((dword)(b)); \
|
||||
if (!validate_user_write(laddr) || !validate_user_write(laddr.offset((s) - 1))) \
|
||||
if (!validate_user_write(laddr) || !validate_user_write(laddr.offset((s) - 1))) { \
|
||||
dbgprintf("Bad write address passed to syscall: %p +%u\n", laddr.get(), (s)); \
|
||||
return -EFAULT; \
|
||||
} \
|
||||
} while(0)
|
||||
|
||||
static const DWORD defaultStackSize = 16384;
|
||||
|
|
|
@ -26,8 +26,7 @@ ssize_t TTY::read(byte* buffer, size_t size)
|
|||
|
||||
ssize_t TTY::write(const byte* buffer, size_t size)
|
||||
{
|
||||
for (size_t i = 0; i < size; ++i)
|
||||
onTTYWrite(buffer[i]);
|
||||
onTTYWrite(buffer, size);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -21,7 +21,7 @@ protected:
|
|||
TTY(unsigned major, unsigned minor);
|
||||
void emit(byte);
|
||||
|
||||
virtual void onTTYWrite(byte) = 0;
|
||||
virtual void onTTYWrite(const byte*, size_t) = 0;
|
||||
|
||||
void interrupt();
|
||||
|
||||
|
|
|
@ -320,7 +320,6 @@ void VirtualConsole::put_character_at(unsigned row, unsigned column, byte ch)
|
|||
|
||||
void VirtualConsole::on_char(byte ch, bool shouldEmit)
|
||||
{
|
||||
InterruptDisabler disabler;
|
||||
if (shouldEmit)
|
||||
emit(ch);
|
||||
|
||||
|
@ -397,15 +396,18 @@ void VirtualConsole::onKeyPress(Keyboard::Key key)
|
|||
|
||||
void VirtualConsole::onConsoleReceive(byte ch)
|
||||
{
|
||||
InterruptDisabler disabler;
|
||||
auto old_attribute = m_current_attribute;
|
||||
m_current_attribute = 0x03;
|
||||
on_char(ch, false);
|
||||
m_current_attribute = old_attribute;
|
||||
}
|
||||
|
||||
void VirtualConsole::onTTYWrite(byte ch)
|
||||
void VirtualConsole::onTTYWrite(const byte* data, size_t size)
|
||||
{
|
||||
on_char(ch, false);
|
||||
InterruptDisabler disabler;
|
||||
for (size_t i = 0; i < size; ++i)
|
||||
on_char(data[i], false);
|
||||
}
|
||||
|
||||
String VirtualConsole::ttyName() const
|
||||
|
|
|
@ -23,7 +23,7 @@ private:
|
|||
virtual void onConsoleReceive(byte) override;
|
||||
|
||||
// ^TTY
|
||||
virtual void onTTYWrite(byte) override;
|
||||
virtual void onTTYWrite(const byte*, size_t) override;
|
||||
virtual String ttyName() const override;
|
||||
|
||||
void set_active(bool);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue