mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 04:58:13 +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());
|
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)
|
void BochsVGADevice::set_register(word index, word data)
|
||||||
{
|
{
|
||||||
IO::out16(VBE_DISPI_IOPORT_INDEX, index);
|
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)
|
void BochsVGADevice::set_resolution(int width, int height)
|
||||||
{
|
{
|
||||||
set_register(VBE_DISPI_INDEX_ENABLE, VBE_DISPI_DISABLED);
|
set_register(VBE_DISPI_INDEX_ENABLE, VBE_DISPI_DISABLED);
|
||||||
set_register(VBE_DISPI_INDEX_XRES, width);
|
set_register(VBE_DISPI_INDEX_XRES, (word)width);
|
||||||
set_register(VBE_DISPI_INDEX_YRES, height);
|
set_register(VBE_DISPI_INDEX_YRES, (word)height);
|
||||||
set_register(VBE_DISPI_INDEX_VIRT_WIDTH, width);
|
set_register(VBE_DISPI_INDEX_VIRT_WIDTH, (word)width);
|
||||||
set_register(VBE_DISPI_INDEX_VIRT_HEIGHT, height * 2);
|
set_register(VBE_DISPI_INDEX_VIRT_HEIGHT, (word)height * 2);
|
||||||
set_register(VBE_DISPI_INDEX_BPP, 32);
|
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_ENABLE, VBE_DISPI_ENABLED | VBE_DISPI_LFB_ENABLED);
|
||||||
set_register(VBE_DISPI_INDEX_BANK, 0);
|
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)
|
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()
|
dword BochsVGADevice::find_framebuffer_address()
|
||||||
|
@ -95,11 +83,32 @@ dword BochsVGADevice::find_framebuffer_address()
|
||||||
return 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) {
|
switch (request) {
|
||||||
case BXVGA_DEV_IOCTL_SET_Y_OFFSET:
|
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;
|
return 0;
|
||||||
case BXVGA_DEV_IOCTL_SET_RESOLUTION: {
|
case BXVGA_DEV_IOCTL_SET_RESOLUTION: {
|
||||||
auto* resolution = (const BXVGAResolution*)arg;
|
auto* resolution = (const BXVGAResolution*)arg;
|
||||||
|
|
|
@ -683,7 +683,7 @@ RetainPtr<VMObject> VMObject::create_anonymous(size_t size)
|
||||||
return adopt(*new VMObject(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;
|
size = ceil_div(size, PAGE_SIZE) * PAGE_SIZE;
|
||||||
auto vmo = adopt(*new VMObject(paddr, size));
|
auto vmo = adopt(*new VMObject(paddr, size));
|
||||||
|
|
|
@ -83,7 +83,7 @@ class VMObject : public Retainable<VMObject>, public Weakable<VMObject> {
|
||||||
public:
|
public:
|
||||||
static RetainPtr<VMObject> create_file_backed(RetainPtr<Inode>&&);
|
static RetainPtr<VMObject> create_file_backed(RetainPtr<Inode>&&);
|
||||||
static RetainPtr<VMObject> create_anonymous(size_t);
|
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();
|
RetainPtr<VMObject> clone();
|
||||||
|
|
||||||
~VMObject();
|
~VMObject();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue