limine: Fix framebuffer pointer in terminal struct being invalid without a framebuffer request
This commit is contained in:
parent
366e8c488a
commit
e132b5dfa5
@ -18,6 +18,7 @@
|
|||||||
#include <sys/gdt.h>
|
#include <sys/gdt.h>
|
||||||
#include <lib/fb.h>
|
#include <lib/fb.h>
|
||||||
#include <lib/term.h>
|
#include <lib/term.h>
|
||||||
|
#include <term/backends/framebuffer.h>
|
||||||
#include <sys/pic.h>
|
#include <sys/pic.h>
|
||||||
#include <sys/lapic.h>
|
#include <sys/lapic.h>
|
||||||
#include <sys/idt.h>
|
#include <sys/idt.h>
|
||||||
@ -746,6 +747,7 @@ FEAT_END
|
|||||||
}
|
}
|
||||||
|
|
||||||
uint64_t *term_fb_ptr = NULL;
|
uint64_t *term_fb_ptr = NULL;
|
||||||
|
uint64_t term_fb_addr;
|
||||||
|
|
||||||
struct fb_info *fbs;
|
struct fb_info *fbs;
|
||||||
size_t fbs_count;
|
size_t fbs_count;
|
||||||
@ -814,6 +816,7 @@ term_fail:
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
term_fb_ptr = &terminal->framebuffer;
|
term_fb_ptr = &terminal->framebuffer;
|
||||||
|
term_fb_addr = reported_addr((void *)(((struct fbterm_context *)terms[0])->framebuffer));
|
||||||
|
|
||||||
terminal->columns = terms[0]->cols;
|
terminal->columns = terms[0]->cols;
|
||||||
terminal->rows = terms[0]->rows;
|
terminal->rows = terms[0]->rows;
|
||||||
@ -845,17 +848,13 @@ skip_fb_init:
|
|||||||
|
|
||||||
// Framebuffer feature
|
// Framebuffer feature
|
||||||
FEAT_START
|
FEAT_START
|
||||||
struct limine_framebuffer *fbp = ext_mem_alloc(fbs_count * sizeof(struct limine_framebuffer));
|
|
||||||
|
|
||||||
if (term_fb_ptr != NULL) {
|
|
||||||
*term_fb_ptr = reported_addr(&fbp[0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
struct limine_framebuffer_request *framebuffer_request = get_request(LIMINE_FRAMEBUFFER_REQUEST);
|
struct limine_framebuffer_request *framebuffer_request = get_request(LIMINE_FRAMEBUFFER_REQUEST);
|
||||||
if (framebuffer_request == NULL) {
|
if (framebuffer_request == NULL && term_fb_ptr == NULL) {
|
||||||
break; // next feature
|
break; // next feature
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct limine_framebuffer *fbp = ext_mem_alloc(fbs_count * sizeof(struct limine_framebuffer));
|
||||||
|
|
||||||
struct limine_framebuffer_response *framebuffer_response =
|
struct limine_framebuffer_response *framebuffer_response =
|
||||||
ext_mem_alloc(sizeof(struct limine_framebuffer_response));
|
ext_mem_alloc(sizeof(struct limine_framebuffer_response));
|
||||||
|
|
||||||
@ -896,7 +895,17 @@ FEAT_START
|
|||||||
framebuffer_response->framebuffer_count = fbs_count;
|
framebuffer_response->framebuffer_count = fbs_count;
|
||||||
framebuffer_response->framebuffers = reported_addr(fb_list);
|
framebuffer_response->framebuffers = reported_addr(fb_list);
|
||||||
|
|
||||||
framebuffer_request->response = reported_addr(framebuffer_response);
|
if (framebuffer_request != NULL) {
|
||||||
|
framebuffer_request->response = reported_addr(framebuffer_response);
|
||||||
|
}
|
||||||
|
if (term_fb_ptr != NULL) {
|
||||||
|
for (size_t i = 0; i < fbs_count; i++) {
|
||||||
|
if (fbp[i].address == term_fb_addr) {
|
||||||
|
*term_fb_ptr = reported_addr(&fbp[i]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
FEAT_END
|
FEAT_END
|
||||||
|
|
||||||
no_fb:
|
no_fb:
|
||||||
|
Loading…
Reference in New Issue
Block a user