]> Git Repo - J-linux.git/commitdiff
VT: Add KD_FONT_OP_SET/GET_TALL operations
authorSamuel Thibault <[email protected]>
Thu, 19 Jan 2023 15:19:16 +0000 (16:19 +0100)
committerGreg Kroah-Hartman <[email protected]>
Thu, 19 Jan 2023 15:28:57 +0000 (16:28 +0100)
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 <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Greg Kroah-Hartman <[email protected]>
drivers/tty/vt/vt.c
include/uapi/linux/kd.h

index 268d0f57fdd4d054f1fc9eb970c45fff3c97c89c..8da7ab34b8fdefacfb51e29c3321c3b832ab9836 100644 (file)
@@ -4540,6 +4540,7 @@ static int con_font_get(struct vc_data *vc, struct console_font_op *op)
        struct console_font font;
        int rc = -EINVAL;
        int c;
+       unsigned int vpitch = op->op == KD_FONT_OP_GET_TALL ? op->height : 32;
 
        if (op->data) {
                font.data = kmalloc(max_font_size, GFP_KERNEL);
@@ -4552,7 +4553,7 @@ static int con_font_get(struct vc_data *vc, struct console_font_op *op)
        if (vc->vc_mode != KD_TEXT)
                rc = -EINVAL;
        else if (vc->vc_sw->con_font_get)
-               rc = vc->vc_sw->con_font_get(vc, &font, 32);
+               rc = vc->vc_sw->con_font_get(vc, &font, vpitch);
        else
                rc = -ENOSYS;
        console_unlock();
@@ -4560,7 +4561,7 @@ static int con_font_get(struct vc_data *vc, struct console_font_op *op)
        if (rc)
                goto out;
 
-       c = (font.width+7)/8 * 32 * font.charcount;
+       c = (font.width+7)/8 * vpitch * font.charcount;
 
        if (op->data && font.charcount > op->charcount)
                rc = -ENOSPC;
@@ -4586,6 +4587,7 @@ static int con_font_set(struct vc_data *vc, struct console_font_op *op)
        struct console_font font;
        int rc = -EINVAL;
        int size;
+       unsigned int vpitch = op->op == KD_FONT_OP_SET_TALL ? op->height : 32;
 
        if (vc->vc_mode != KD_TEXT)
                return -EINVAL;
@@ -4595,7 +4597,9 @@ static int con_font_set(struct vc_data *vc, struct console_font_op *op)
                return -EINVAL;
        if (op->width <= 0 || op->width > 32 || !op->height || op->height > 32)
                return -EINVAL;
-       size = (op->width+7)/8 * 32 * op->charcount;
+       if (vpitch < op->height)
+               return -EINVAL;
+       size = (op->width+7)/8 * vpitch * op->charcount;
        if (size > max_font_size)
                return -ENOSPC;
 
@@ -4613,7 +4617,7 @@ static int con_font_set(struct vc_data *vc, struct console_font_op *op)
        else if (vc->vc_sw->con_font_set) {
                if (vc_is_sel(vc))
                        clear_selection();
-               rc = vc->vc_sw->con_font_set(vc, &font, 32, op->flags);
+               rc = vc->vc_sw->con_font_set(vc, &font, vpitch, op->flags);
        } else
                rc = -ENOSYS;
        console_unlock();
@@ -4659,8 +4663,10 @@ int con_font_op(struct vc_data *vc, struct console_font_op *op)
 {
        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 ee929ece411277cf320b3cc4b340f1971518d9de..6b384065c01356efbe8db490fd3f85c9cebbe6d3 100644 (file)
@@ -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
+                                        */
 };
 
 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
+                                */
 };
 
 #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 name / NULL */
 #define KD_FONT_OP_COPY                3       /* Obsolete, do not use */
+#define KD_FONT_OP_SET_TALL    4       /* Set font with vpitch = height */
+#define KD_FONT_OP_GET_TALL    5       /* Get font with vpitch = height */
 
 #define KD_FONT_FLAG_DONT_RECALC       1       /* Don't recalculate hw charcell size [compat] */
 
This page took 0.057905 seconds and 4 git commands to generate.