limine: Fix framebuffer pointer in terminal struct being invalid without a framebuffer request

This commit is contained in:
mintsuki 2023-03-29 11:04:53 +02:00
parent 366e8c488a
commit e132b5dfa5

View File

@ -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: