From nobody Sun Sep 14 16:46:48 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8E591C00A5A for ; Thu, 19 Jan 2023 15:20:05 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230476AbjASPUE (ORCPT ); Thu, 19 Jan 2023 10:20:04 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57056 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230178AbjASPT5 (ORCPT ); Thu, 19 Jan 2023 10:19:57 -0500 Received: from sonata.ens-lyon.org (sonata.ens-lyon.org [140.77.166.138]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 607278102C for ; Thu, 19 Jan 2023 07:19:55 -0800 (PST) Received: from localhost (localhost [127.0.0.1]) by sonata.ens-lyon.org (Postfix) with ESMTP id 9ECA52010A; Thu, 19 Jan 2023 16:19:53 +0100 (CET) Received: from sonata.ens-lyon.org ([127.0.0.1]) by localhost (sonata.ens-lyon.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id WYkChXdJS0qk; Thu, 19 Jan 2023 16:19:53 +0100 (CET) Received: from begin (nat-inria-interne-52-gw-01-bso.bordeaux.inria.fr [194.199.1.52]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (P-256) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by sonata.ens-lyon.org (Postfix) with ESMTPSA id 071C3200FB; Thu, 19 Jan 2023 16:19:53 +0100 (CET) Received: from samy by begin with local (Exim 4.96) (envelope-from ) id 1pIWhk-008cHp-29; Thu, 19 Jan 2023 16:19:52 +0100 Message-ID: <20230119151934.932642243@ens-lyon.org> User-Agent: quilt/0.66 Date: Thu, 19 Jan 2023 16:19:15 +0100 From: Samuel Thibault To: Greg Kroah-Hartman , Jiri Slaby , kbd@lists.altlinux.org Cc: linux-kernel@vger.kernel.org, "linux-kernel@vger.kernel.org, Samuel Thibault" Subject: [PATCHv3 1/3] VT: Add height parameter to con_font_get/set consw operations References: <20230119151914.931619963@ens-lyon.org> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The current con_font_get/set API currently hardcodes a 32-pixel-tall limitation, which only dates from the old VGA hardware which could not handle taller fonts than that. This change just adds a vpitch parameter to release this constraint. Drivers which do not support vpitch !=3D 32 can just return EINVAL when it is not 32, font loading tools will revert to trying 32 and succeed. This change makes the fbcon driver consider vpitch appropriately, thus making it able to load large fonts. Signed-off-by: Samuel Thibault --- V1 -> V3: Drop (bogus) sisusb_con.c change, it was phased out Index: linux-6.0/drivers/tty/vt/vt.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- linux-6.0.orig/drivers/tty/vt/vt.c +++ linux-6.0/drivers/tty/vt/vt.c @@ -4604,7 +4604,7 @@ static int con_font_get(struct vc_data * if (vc->vc_mode !=3D KD_TEXT) rc =3D -EINVAL; else if (vc->vc_sw->con_font_get) - rc =3D vc->vc_sw->con_font_get(vc, &font); + rc =3D vc->vc_sw->con_font_get(vc, &font, 32); else rc =3D -ENOSYS; console_unlock(); @@ -4665,7 +4665,7 @@ static int con_font_set(struct vc_data * else if (vc->vc_sw->con_font_set) { if (vc_is_sel(vc)) clear_selection(); - rc =3D vc->vc_sw->con_font_set(vc, &font, op->flags); + rc =3D vc->vc_sw->con_font_set(vc, &font, 32, op->flags); } else rc =3D -ENOSYS; console_unlock(); Index: linux-6.0/drivers/video/console/vgacon.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- linux-6.0.orig/drivers/video/console/vgacon.c +++ linux-6.0/drivers/video/console/vgacon.c @@ -1029,7 +1029,7 @@ static int vgacon_adjust_height(struct v } =20 static int vgacon_font_set(struct vc_data *c, struct console_font *font, - unsigned int flags) + unsigned int vpitch, unsigned int flags) { unsigned charcount =3D font->charcount; int rc; @@ -1037,7 +1037,7 @@ static int vgacon_font_set(struct vc_dat if (vga_video_type < VIDEO_TYPE_EGAM) return -EINVAL; =20 - if (font->width !=3D VGA_FONTWIDTH || + if (font->width !=3D VGA_FONTWIDTH || vpitch !=3D 32 || (charcount !=3D 256 && charcount !=3D 512)) return -EINVAL; =20 @@ -1050,9 +1050,9 @@ static int vgacon_font_set(struct vc_dat return rc; } =20 -static int vgacon_font_get(struct vc_data *c, struct console_font *font) +static int vgacon_font_get(struct vc_data *c, struct console_font *font, u= nsigned int vpitch) { - if (vga_video_type < VIDEO_TYPE_EGAM) + if (vga_video_type < VIDEO_TYPE_EGAM || vpitch !=3D 32) return -EINVAL; =20 font->width =3D VGA_FONTWIDTH; Index: linux-6.0/drivers/video/fbdev/core/fbcon.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- linux-6.0.orig/drivers/video/fbdev/core/fbcon.c +++ linux-6.0/drivers/video/fbdev/core/fbcon.c @@ -2271,7 +2271,7 @@ static int fbcon_debug_leave(struct vc_d return 0; } =20 -static int fbcon_get_font(struct vc_data *vc, struct console_font *font) +static int fbcon_get_font(struct vc_data *vc, struct console_font *font, u= nsigned int vpitch) { u8 *fontdata =3D vc->vc_font.data; u8 *data =3D font->data; @@ -2290,8 +2290,8 @@ static int fbcon_get_font(struct vc_data =20 for (i =3D 0; i < font->charcount; i++) { memcpy(data, fontdata, j); - memset(data + j, 0, 32 - j); - data +=3D 32; + memset(data + j, 0, vpitch - j); + data +=3D vpitch; fontdata +=3D j; } } else if (font->width <=3D 16) { @@ -2301,8 +2301,8 @@ static int fbcon_get_font(struct vc_data =20 for (i =3D 0; i < font->charcount; i++) { memcpy(data, fontdata, j); - memset(data + j, 0, 64 - j); - data +=3D 64; + memset(data + j, 0, 2*vpitch - j); + data +=3D 2*vpitch; fontdata +=3D j; } } else if (font->width <=3D 24) { @@ -2316,8 +2316,8 @@ static int fbcon_get_font(struct vc_data *data++ =3D fontdata[2]; fontdata +=3D sizeof(u32); } - memset(data, 0, 3 * (32 - j)); - data +=3D 3 * (32 - j); + memset(data, 0, 3 * (vpitch - j)); + data +=3D 3 * (vpitch - j); } } else { j =3D vc->vc_font.height * 4; @@ -2326,8 +2326,8 @@ static int fbcon_get_font(struct vc_data =20 for (i =3D 0; i < font->charcount; i++) { memcpy(data, fontdata, j); - memset(data + j, 0, 128 - j); - data +=3D 128; + memset(data + j, 0, 4 * vpitch - j); + data +=3D 4 * vpitch; fontdata +=3D j; } } @@ -2461,19 +2461,12 @@ err_out: } =20 /* - * User asked to set font; we are guaranteed that - * a) width and height are in range 1..32 - * b) charcount does not exceed 512 - * but lets not assume that, since someone might someday want to use larg= er - * fonts. And charcount of 512 is small for unicode support. - * - * However, user space gives the font in 32 rows , regardless of - * actual font height. So a new API is needed if support for larger fonts - * is ever implemented. + * User asked to set font; we are guaranteed that charcount does not exce= ed 512 + * but lets not assume that, since charcount of 512 is small for unicode = support. */ =20 static int fbcon_set_font(struct vc_data *vc, struct console_font *font, - unsigned int flags) + unsigned int vpitch, unsigned int flags) { struct fb_info *info =3D fbcon_info_from_console(vc->vc_num); unsigned charcount =3D font->charcount; @@ -2516,7 +2509,7 @@ static int fbcon_set_font(struct vc_data FNTSIZE(new_data) =3D size; REFCOUNT(new_data) =3D 0; /* usage counter */ for (i=3D0; i< charcount; i++) { - memcpy(new_data + i*h*pitch, data + i*32*pitch, h*pitch); + memcpy(new_data + i*h*pitch, data + i*vpitch*pitch, h*pitch); } =20 /* Since linux has a nice crc32 function use it for counting font Index: linux-6.0/include/linux/console.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- linux-6.0.orig/include/linux/console.h +++ linux-6.0/include/linux/console.h @@ -58,8 +58,9 @@ struct consw { int (*con_switch)(struct vc_data *vc); int (*con_blank)(struct vc_data *vc, int blank, int mode_switch); int (*con_font_set)(struct vc_data *vc, struct console_font *font, - unsigned int flags); - int (*con_font_get)(struct vc_data *vc, struct console_font *font); + unsigned int vpitch, unsigned int flags); + int (*con_font_get)(struct vc_data *vc, struct console_font *font, + unsigned int vpitch); int (*con_font_default)(struct vc_data *vc, struct console_font *font, char *name); int (*con_resize)(struct vc_data *vc, unsigned int width, Index: linux-6.0/drivers/video/console/newport_con.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- linux-6.0.orig/drivers/video/console/newport_con.c +++ linux-6.0/drivers/video/console/newport_con.c @@ -497,7 +497,7 @@ static int newport_blank(struct vc_data return 1; } =20 -static int newport_set_font(int unit, struct console_font *op) +static int newport_set_font(int unit, struct console_font *op, unsigned in= t vpitch) { int w =3D op->width; int h =3D op->height; @@ -507,7 +507,7 @@ static int newport_set_font(int unit, st =20 /* ladis: when I grow up, there will be a day... and more sizes will * be supported ;-) */ - if ((w !=3D 8) || (h !=3D 16) + if ((w !=3D 8) || (h !=3D 16) || (vpitch !=3D 32) || (op->charcount !=3D 256 && op->charcount !=3D 512)) return -EINVAL; =20 @@ -569,9 +569,10 @@ static int newport_font_default(struct v return newport_set_def_font(vc->vc_num, op); } =20 -static int newport_font_set(struct vc_data *vc, struct console_font *font,= unsigned flags) +static int newport_font_set(struct vc_data *vc, struct console_font *font, + unsigned int vpitch, unsigned int flags) { - return newport_set_font(vc->vc_num, font); + return newport_set_font(vc->vc_num, font, vpitch); } =20 static bool newport_scroll(struct vc_data *vc, unsigned int t, unsigned in= t b, Index: linux-6.0/drivers/video/console/sticon.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- linux-6.0.orig/drivers/video/console/sticon.c +++ linux-6.0/drivers/video/console/sticon.c @@ -169,7 +169,8 @@ static int sticon_set_def_font(int unit, return 0; } =20 -static int sticon_set_font(struct vc_data *vc, struct console_font *op) +static int sticon_set_font(struct vc_data *vc, struct console_font *op, + unsigned int vpitch) { struct sti_struct *sti =3D sticon_sti; int vc_cols, vc_rows, vc_old_cols, vc_old_rows; @@ -181,7 +182,7 @@ static int sticon_set_font(struct vc_dat struct sti_cooked_font *cooked_font; unsigned char *data =3D op->data, *p; =20 - if ((w < 6) || (h < 6) || (w > 32) || (h > 32) + if ((w < 6) || (h < 6) || (w > 32) || (h > 32) || (vpitch !=3D 32) || (op->charcount !=3D 256 && op->charcount !=3D 512)) return -EINVAL; pitch =3D ALIGN(w, 8) / 8; @@ -267,9 +268,9 @@ static int sticon_font_default(struct vc } =20 static int sticon_font_set(struct vc_data *vc, struct console_font *font, - unsigned int flags) + unsigned int vpitch, unsigned int flags) { - return sticon_set_font(vc, font); + return sticon_set_font(vc, font, vpitch); } =20 static void sticon_init(struct vc_data *c, int init) From nobody Sun Sep 14 16:46:48 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 999FFC004D4 for ; Thu, 19 Jan 2023 15:20:09 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230506AbjASPUH (ORCPT ); Thu, 19 Jan 2023 10:20:07 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57060 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230050AbjASPT5 (ORCPT ); Thu, 19 Jan 2023 10:19:57 -0500 Received: from sonata.ens-lyon.org (sonata.ens-lyon.org [140.77.166.138]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A126B82D58 for ; Thu, 19 Jan 2023 07:19:55 -0800 (PST) Received: from localhost (localhost [127.0.0.1]) by sonata.ens-lyon.org (Postfix) with ESMTP id E71C6200FB; Thu, 19 Jan 2023 16:19:53 +0100 (CET) Received: from sonata.ens-lyon.org ([127.0.0.1]) by localhost (sonata.ens-lyon.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id YvQta9sPITvO; Thu, 19 Jan 2023 16:19:53 +0100 (CET) Received: from begin (nat-inria-interne-52-gw-01-bso.bordeaux.inria.fr [194.199.1.52]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (P-256) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by sonata.ens-lyon.org (Postfix) with ESMTPSA id 6CCF820105; Thu, 19 Jan 2023 16:19:53 +0100 (CET) Received: from samy by begin with local (Exim 4.96) (envelope-from ) id 1pIWhl-008cHt-0T; Thu, 19 Jan 2023 16:19:53 +0100 Message-ID: <20230119151935.013597162@ens-lyon.org> User-Agent: quilt/0.66 Date: Thu, 19 Jan 2023 16:19:16 +0100 From: Samuel Thibault To: Greg Kroah-Hartman , Jiri Slaby , kbd@lists.altlinux.org Cc: linux-kernel@vger.kernel.org, "linux-kernel@vger.kernel.org, Samuel Thibault" Subject: [PATCHv3 2/3] VT: Add KD_FONT_OP_SET/GET_TALL operations References: <20230119151914.931619963@ens-lyon.org> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The KD_FONT_OP_SET/GET operations hardcode vpitch to be 32 pixels, which only dates from the old VGA hardware which as asserting this. Drivers such as fbcon however do not have such limitation, so this introduces KD_FONT_OP_SET/GET_TALL operations, which userland can try to use to avoid this limitation, thus opening the patch to >32 pixels font height. Signed-off-by: Samuel Thibault Index: linux-6.0/drivers/tty/vt/vt.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- linux-6.0.orig/drivers/tty/vt/vt.c +++ linux-6.0/drivers/tty/vt/vt.c @@ -4592,6 +4592,7 @@ static int con_font_get(struct vc_data * struct console_font font; int rc =3D -EINVAL; int c; + unsigned int vpitch =3D op->op =3D=3D KD_FONT_OP_GET_TALL ? op->height : = 32; =20 if (op->data) { font.data =3D kmalloc(max_font_size, GFP_KERNEL); @@ -4604,7 +4605,7 @@ static int con_font_get(struct vc_data * if (vc->vc_mode !=3D KD_TEXT) rc =3D -EINVAL; else if (vc->vc_sw->con_font_get) - rc =3D vc->vc_sw->con_font_get(vc, &font, 32); + rc =3D vc->vc_sw->con_font_get(vc, &font, vpitch); else rc =3D -ENOSYS; console_unlock(); @@ -4612,7 +4613,7 @@ static int con_font_get(struct vc_data * if (rc) goto out; =20 - c =3D (font.width+7)/8 * 32 * font.charcount; + c =3D (font.width+7)/8 * vpitch * font.charcount; =20 if (op->data && font.charcount > op->charcount) rc =3D -ENOSPC; @@ -4638,6 +4639,7 @@ static int con_font_set(struct vc_data * struct console_font font; int rc =3D -EINVAL; int size; + unsigned int vpitch =3D op->op =3D=3D KD_FONT_OP_SET_TALL ? op->height : = 32; =20 if (vc->vc_mode !=3D KD_TEXT) return -EINVAL; @@ -4647,7 +4649,9 @@ static int con_font_set(struct vc_data * return -EINVAL; if (op->width <=3D 0 || op->width > 32 || !op->height || op->height > 32) return -EINVAL; - size =3D (op->width+7)/8 * 32 * op->charcount; + if (vpitch < op->height) + return -EINVAL; + size =3D (op->width+7)/8 * vpitch * op->charcount; if (size > max_font_size) return -ENOSPC; =20 @@ -4665,7 +4669,7 @@ static int con_font_set(struct vc_data * else if (vc->vc_sw->con_font_set) { if (vc_is_sel(vc)) clear_selection(); - rc =3D vc->vc_sw->con_font_set(vc, &font, 32, op->flags); + rc =3D vc->vc_sw->con_font_set(vc, &font, vpitch, op->flags); } else rc =3D -ENOSYS; console_unlock(); @@ -4711,8 +4715,10 @@ int con_font_op(struct vc_data *vc, stru { switch (op->op) { case KD_FONT_OP_SET: + case KD_FONT_OP_SET_TALL: return con_font_set(vc, op); case KD_FONT_OP_GET: + case KD_FONT_OP_GET_TALL: return con_font_get(vc, op); case KD_FONT_OP_SET_DEFAULT: return con_font_default(vc, op); Index: linux-6.0/include/uapi/linux/kd.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- linux-6.0.orig/include/uapi/linux/kd.h +++ linux-6.0/include/uapi/linux/kd.h @@ -161,19 +161,25 @@ struct console_font_op { unsigned int flags; /* KD_FONT_FLAG_* */ unsigned int width, height; /* font size */ unsigned int charcount; - unsigned char __user *data; /* font data with height fixed to 32 */ + unsigned char __user *data; /* font data with vpitch fixed to 32 for + * KD_FONT_OP_SET/GET + */ }; =20 struct console_font { unsigned int width, height; /* font size */ unsigned int charcount; - unsigned char *data; /* font data with height fixed to 32 */ + unsigned char *data; /* font data with vpitch fixed to 32 for + * KD_FONT_OP_SET/GET + */ }; =20 #define KD_FONT_OP_SET 0 /* Set font */ #define KD_FONT_OP_GET 1 /* Get font */ #define KD_FONT_OP_SET_DEFAULT 2 /* Set font to default, data points to na= me / NULL */ #define KD_FONT_OP_COPY 3 /* Obsolete, do not use */ +#define KD_FONT_OP_SET_TALL 4 /* Set font with vpitch =3D height */ +#define KD_FONT_OP_GET_TALL 5 /* Get font with vpitch =3D height */ =20 #define KD_FONT_FLAG_DONT_RECALC 1 /* Don't recalculate hw charcell size = [compat] */ From nobody Sun Sep 14 16:46:48 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id B000EC004D4 for ; Thu, 19 Jan 2023 15:20:12 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230116AbjASPUL (ORCPT ); Thu, 19 Jan 2023 10:20:11 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57036 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230349AbjASPT6 (ORCPT ); Thu, 19 Jan 2023 10:19:58 -0500 Received: from sonata.ens-lyon.org (domu-toccata.ens-lyon.fr [140.77.166.138]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D960382D7A for ; Thu, 19 Jan 2023 07:19:55 -0800 (PST) Received: from localhost (localhost [127.0.0.1]) by sonata.ens-lyon.org (Postfix) with ESMTP id 1506920105; Thu, 19 Jan 2023 16:19:54 +0100 (CET) Received: from sonata.ens-lyon.org ([127.0.0.1]) by localhost (sonata.ens-lyon.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id hkaeCxei9PJZ; Thu, 19 Jan 2023 16:19:53 +0100 (CET) Received: from begin (nat-inria-interne-52-gw-01-bso.bordeaux.inria.fr [194.199.1.52]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (P-256) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by sonata.ens-lyon.org (Postfix) with ESMTPSA id D4DCE200F4; Thu, 19 Jan 2023 16:19:53 +0100 (CET) Received: from samy by begin with local (Exim 4.96) (envelope-from ) id 1pIWhl-008cHx-1h; Thu, 19 Jan 2023 16:19:53 +0100 Message-ID: <20230119151935.112415738@ens-lyon.org> User-Agent: quilt/0.66 Date: Thu, 19 Jan 2023 16:19:17 +0100 From: Samuel Thibault To: Greg Kroah-Hartman , Jiri Slaby , kbd@lists.altlinux.org Cc: linux-kernel@vger.kernel.org, "linux-kernel@vger.kernel.org, Samuel Thibault" Subject: [PATCHv3 3/3] VT: Bump font size limitation to 64x128 pixels References: <20230119151914.931619963@ens-lyon.org> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This moves 32x32 font size limitation checking down to drivers, so that fbcon can allow large fonts. We still keep a limitation to 64x128 pixels so as to have a simple bounded allocation for con_font_get and in the userland kbd tool. That glyph size will however be enough to have 128x36 characters on a "16/9 8K display". Signed-off-by: Samuel Thibault --- V1 -> V2: Switch con_font_get to kvmalloc/kvfree instead of kmalloc/kfree V1 -> V3: Drop sisusb_con.c change, it was phased out Index: linux-6.0/drivers/tty/vt/vt.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- linux-6.0.orig/drivers/tty/vt/vt.c +++ linux-6.0/drivers/tty/vt/vt.c @@ -4575,17 +4575,20 @@ void reset_palette(struct vc_data *vc) /* * Font switching * - * Currently we only support fonts up to 32 pixels wide, at a maximum hei= ght - * of 32 pixels. Userspace fontdata is stored with 32 bytes (shorts/ints,=20 - * depending on width) reserved for each character which is kinda wasty, = but=20 - * this is done in order to maintain compatibility with the EGA/VGA fonts= . It=20 - * is up to the actual low-level console-driver convert data into its fav= orite - * format (maybe we should add a `fontoffset' field to the `display' - * structure so we won't have to convert the fontdata all the time. + * Currently we only support fonts up to 128 pixels wide, at a maximum he= ight + * of 128 pixels. Userspace fontdata may have to be stored with 32 bytes + * (shorts/ints, depending on width) reserved for each character which is + * kinda wasty, but this is done in order to maintain compatibility with = the + * EGA/VGA fonts. It is up to the actual low-level console-driver convert= data + * into its favorite format (maybe we should add a `fontoffset' field to = the + * `display' structure so we won't have to convert the fontdata all the t= ime. * /Jes */ =20 -#define max_font_size 65536 +#define max_font_width 64 +#define max_font_height 128 +#define max_font_glyphs 512 +#define max_font_size (max_font_glyphs*max_font_width*max_font_height) =20 static int con_font_get(struct vc_data *vc, struct console_font_op *op) { @@ -4595,7 +4598,7 @@ static int con_font_get(struct vc_data * unsigned int vpitch =3D op->op =3D=3D KD_FONT_OP_GET_TALL ? op->height : = 32; =20 if (op->data) { - font.data =3D kmalloc(max_font_size, GFP_KERNEL); + font.data =3D kvmalloc(max_font_size, GFP_KERNEL); if (!font.data) return -ENOMEM; } else @@ -4630,7 +4633,7 @@ static int con_font_get(struct vc_data * rc =3D -EFAULT; =20 out: - kfree(font.data); + kvfree(font.data); return rc; } =20 @@ -4645,9 +4648,10 @@ static int con_font_set(struct vc_data * return -EINVAL; if (!op->data) return -EINVAL; - if (op->charcount > 512) + if (op->charcount > max_font_glyphs) return -EINVAL; - if (op->width <=3D 0 || op->width > 32 || !op->height || op->height > 32) + if (op->width <=3D 0 || op->width > max_font_width || !op->height || + op->height > max_font_height) return -EINVAL; if (vpitch < op->height) return -EINVAL; Index: linux-6.0/drivers/video/console/vgacon.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- linux-6.0.orig/drivers/video/console/vgacon.c +++ linux-6.0/drivers/video/console/vgacon.c @@ -1037,7 +1037,7 @@ static int vgacon_font_set(struct vc_dat if (vga_video_type < VIDEO_TYPE_EGAM) return -EINVAL; =20 - if (font->width !=3D VGA_FONTWIDTH || vpitch !=3D 32 || + if (font->width !=3D VGA_FONTWIDTH || font->height > 32 || vpitch !=3D 32= || (charcount !=3D 256 && charcount !=3D 512)) return -EINVAL; =20 Index: linux-6.0/drivers/video/fbdev/core/fbcon.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- linux-6.0.orig/drivers/video/fbdev/core/fbcon.c +++ linux-6.0/drivers/video/fbdev/core/fbcon.c @@ -2279,6 +2279,8 @@ static int fbcon_get_font(struct vc_data =20 font->width =3D vc->vc_font.width; font->height =3D vc->vc_font.height; + if (font->height > vpitch) + return -ENOSPC; font->charcount =3D vc->vc_hi_font_mask ? 512 : 256; if (!font->data) return 0;