mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 11:08:11 +00:00
Kernel: Rename create_framebuffer_wrapper() to create_for_physical_range().
Maybe there will be other types of physical ranges to map in the future. This API doesn't seem at all specific to framebuffers. Also tidy up a bit in BochsVGADevice.
This commit is contained in:
parent
7210d2ade5
commit
4db78dabd3
3 changed files with 31 additions and 22 deletions
|
@ -43,19 +43,6 @@ BochsVGADevice::BochsVGADevice()
|
|||
m_framebuffer_address = PhysicalAddress(find_framebuffer_address());
|
||||
}
|
||||
|
||||
Region* BochsVGADevice::mmap(Process& process, LinearAddress preferred_laddr, size_t offset, size_t size)
|
||||
{
|
||||
ASSERT(offset == 0);
|
||||
ASSERT(size == framebuffer_size_in_bytes());
|
||||
auto framebuffer_vmo = VMObject::create_framebuffer_wrapper(framebuffer_address(), framebuffer_size_in_bytes());
|
||||
auto* region = process.allocate_region_with_vmo(preferred_laddr, framebuffer_size_in_bytes(), move(framebuffer_vmo), 0, "BochsVGADevice Framebuffer", true, true);
|
||||
kprintf("BochsVGADevice::mmap for %s(%u) mapped region %p for fb addr %p\n",
|
||||
process.name().characters(), process.pid(),
|
||||
region, framebuffer_address());
|
||||
ASSERT(region);
|
||||
return region;
|
||||
}
|
||||
|
||||
void BochsVGADevice::set_register(word index, word data)
|
||||
{
|
||||
IO::out16(VBE_DISPI_IOPORT_INDEX, index);
|
||||
|
@ -65,10 +52,10 @@ void BochsVGADevice::set_register(word index, word data)
|
|||
void BochsVGADevice::set_resolution(int width, int height)
|
||||
{
|
||||
set_register(VBE_DISPI_INDEX_ENABLE, VBE_DISPI_DISABLED);
|
||||
set_register(VBE_DISPI_INDEX_XRES, width);
|
||||
set_register(VBE_DISPI_INDEX_YRES, height);
|
||||
set_register(VBE_DISPI_INDEX_VIRT_WIDTH, width);
|
||||
set_register(VBE_DISPI_INDEX_VIRT_HEIGHT, height * 2);
|
||||
set_register(VBE_DISPI_INDEX_XRES, (word)width);
|
||||
set_register(VBE_DISPI_INDEX_YRES, (word)height);
|
||||
set_register(VBE_DISPI_INDEX_VIRT_WIDTH, (word)width);
|
||||
set_register(VBE_DISPI_INDEX_VIRT_HEIGHT, (word)height * 2);
|
||||
set_register(VBE_DISPI_INDEX_BPP, 32);
|
||||
set_register(VBE_DISPI_INDEX_ENABLE, VBE_DISPI_ENABLED | VBE_DISPI_LFB_ENABLED);
|
||||
set_register(VBE_DISPI_INDEX_BANK, 0);
|
||||
|
@ -78,7 +65,8 @@ void BochsVGADevice::set_resolution(int width, int height)
|
|||
|
||||
void BochsVGADevice::set_y_offset(int offset)
|
||||
{
|
||||
set_register(VBE_DISPI_INDEX_Y_OFFSET, offset);
|
||||
ASSERT(offset <= m_framebuffer_size.height());
|
||||
set_register(VBE_DISPI_INDEX_Y_OFFSET, (word)offset);
|
||||
}
|
||||
|
||||
dword BochsVGADevice::find_framebuffer_address()
|
||||
|
@ -95,11 +83,32 @@ dword BochsVGADevice::find_framebuffer_address()
|
|||
return framebuffer_address;
|
||||
}
|
||||
|
||||
int BochsVGADevice::ioctl(Process& process, unsigned int request, unsigned int arg)
|
||||
Region* BochsVGADevice::mmap(Process& process, LinearAddress preferred_laddr, size_t offset, size_t size)
|
||||
{
|
||||
ASSERT(offset == 0);
|
||||
ASSERT(size == framebuffer_size_in_bytes());
|
||||
auto vmo = VMObject::create_for_physical_range(framebuffer_address(), framebuffer_size_in_bytes());
|
||||
auto* region = process.allocate_region_with_vmo(
|
||||
preferred_laddr,
|
||||
framebuffer_size_in_bytes(),
|
||||
move(vmo),
|
||||
0,
|
||||
"BochsVGA Framebuffer",
|
||||
true, true);
|
||||
kprintf("BochsVGA: %s(%u) created Region{%p} for framebuffer P%x\n",
|
||||
process.name().characters(), process.pid(),
|
||||
region, framebuffer_address().as_ptr());
|
||||
ASSERT(region);
|
||||
return region;
|
||||
}
|
||||
|
||||
int BochsVGADevice::ioctl(Process& process, unsigned request, unsigned arg)
|
||||
{
|
||||
switch (request) {
|
||||
case BXVGA_DEV_IOCTL_SET_Y_OFFSET:
|
||||
set_y_offset(arg);
|
||||
if (arg > (unsigned)m_framebuffer_size.height() * 2)
|
||||
return -EINVAL;
|
||||
set_y_offset((int)arg);
|
||||
return 0;
|
||||
case BXVGA_DEV_IOCTL_SET_RESOLUTION: {
|
||||
auto* resolution = (const BXVGAResolution*)arg;
|
||||
|
|
|
@ -683,7 +683,7 @@ RetainPtr<VMObject> VMObject::create_anonymous(size_t size)
|
|||
return adopt(*new VMObject(size));
|
||||
}
|
||||
|
||||
RetainPtr<VMObject> VMObject::create_framebuffer_wrapper(PhysicalAddress paddr, size_t size)
|
||||
RetainPtr<VMObject> VMObject::create_for_physical_range(PhysicalAddress paddr, size_t size)
|
||||
{
|
||||
size = ceil_div(size, PAGE_SIZE) * PAGE_SIZE;
|
||||
auto vmo = adopt(*new VMObject(paddr, size));
|
||||
|
|
|
@ -83,7 +83,7 @@ class VMObject : public Retainable<VMObject>, public Weakable<VMObject> {
|
|||
public:
|
||||
static RetainPtr<VMObject> create_file_backed(RetainPtr<Inode>&&);
|
||||
static RetainPtr<VMObject> create_anonymous(size_t);
|
||||
static RetainPtr<VMObject> create_framebuffer_wrapper(PhysicalAddress, size_t);
|
||||
static RetainPtr<VMObject> create_for_physical_range(PhysicalAddress, size_t);
|
||||
RetainPtr<VMObject> clone();
|
||||
|
||||
~VMObject();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue