linux/drivers/tty/vt/consolemap.c

// SPDX-License-Identifier: GPL-2.0
/*
 * consolemap.c
 *
 * Mapping from internal code (such as Latin-1 or Unicode or IBM PC code)
 * to font positions.
 *
 * aeb, 950210
 *
 * Support for multiple unimaps by Jakub Jelinek <[email protected]>, July 1998
 *
 * Fix bug in inverse translation. Stanislav Voronyi <[email protected]>, Dec 1998
 *
 * In order to prevent the following circular lock dependency:
 *   &mm->mmap_lock --> cpu_hotplug.lock --> console_lock --> &mm->mmap_lock
 *
 * We cannot allow page fault to happen while holding the console_lock.
 * Therefore, all the userspace copy operations have to be done outside
 * the console_lock critical sections.
 *
 * As all the affected functions are all called directly from vt_ioctl(), we
 * can allocate some small buffers directly on stack without worrying about
 * stack overflow.
 */

#include <linux/bitfield.h>
#include <linux/bits.h>
#include <linux/module.h>
#include <linux/kd.h>
#include <linux/errno.h>
#include <linux/mm.h>
#include <linux/slab.h>
#include <linux/init.h>
#include <linux/tty.h>
#include <linux/uaccess.h>
#include <linux/console.h>
#include <linux/consolemap.h>
#include <linux/vt_kern.h>
#include <linux/string.h>

static unsigned short translations[][E_TABSZ] =;

/* The standard kernel character-to-font mappings are not invertible
   -- this is just a best effort. */

#define MAX_GLYPH

static enum translation_map inv_translate[MAX_NR_CONSOLES];

#define UNI_DIRS
#define UNI_DIR_ROWS
#define UNI_ROW_GLYPHS

#define UNI_DIR_BITS
#define UNI_ROW_BITS
#define UNI_GLYPH_BITS

#define UNI_DIR(uni)
#define UNI_ROW(uni)
#define UNI_GLYPH(uni)

#define UNI(dir, row, glyph)

/**
 * struct uni_pagedict - unicode directory
 *
 * @uni_pgdir: 32*32*64 table with glyphs
 * @refcount: reference count of this structure
 * @sum: checksum
 * @inverse_translations: best-effort inverse mapping
 * @inverse_trans_unicode: best-effort inverse mapping to unicode
 */
struct uni_pagedict {};

static struct uni_pagedict *dflt;

static void set_inverse_transl(struct vc_data *conp, struct uni_pagedict *dict,
	       enum translation_map m)
{}

static void set_inverse_trans_unicode(struct uni_pagedict *dict)
{}

unsigned short *set_translate(enum translation_map m, struct vc_data *vc)
{}

/*
 * Inverse translation is impossible for several reasons:
 * 1. The font<->character maps are not 1-1.
 * 2. The text may have been written while a different translation map
 *    was active.
 * Still, it is now possible to a certain extent to cut and paste non-ASCII.
 */
u16 inverse_translate(const struct vc_data *conp, u16 glyph, bool use_unicode)
{}
EXPORT_SYMBOL_GPL();

static void update_user_maps(void)
{}

/*
 * Load customizable translation table
 * arg points to a 256 byte translation table.
 *
 * The "old" variants are for translation directly to font (using the
 * 0xf000-0xf0ff "transparent" Unicodes) whereas the "new" variants set
 * Unicodes explicitly.
 */
int con_set_trans_old(unsigned char __user * arg)
{}

int con_get_trans_old(unsigned char __user * arg)
{}

int con_set_trans_new(ushort __user * arg)
{}

int con_get_trans_new(ushort __user * arg)
{}

/*
 * Unicode -> current font conversion
 *
 * A font has at most 512 chars, usually 256.
 * But one font position may represent several Unicode chars.
 * A hashtable is somewhat of a pain to deal with, so use a
 * "paged table" instead.  Simulation has shown the memory cost of
 * this 3-level paged table scheme to be comparable to a hash table.
 */

extern u8 dfont_unicount[];	/* Defined in console_defmap.c */
extern u16 dfont_unitable[];

static void con_release_unimap(struct uni_pagedict *dict)
{}

/* Caller must hold the console lock */
void con_free_unimap(struct vc_data *vc)
{}

static int con_unify_unimap(struct vc_data *conp, struct uni_pagedict *dict1)
{}

static int
con_insert_unipair(struct uni_pagedict *p, u_short unicode, u_short fontpos)
{}

static int con_allocate_new(struct vc_data *vc)
{}

/* Caller must hold the lock */
static int con_do_clear_unimap(struct vc_data *vc)
{}

int con_clear_unimap(struct vc_data *vc)
{}

static struct uni_pagedict *con_unshare_unimap(struct vc_data *vc,
		struct uni_pagedict *old)
{}

int con_set_unimap(struct vc_data *vc, ushort ct, struct unipair __user *list)
{}

/**
 *	con_set_default_unimap	-	set default unicode map
 *	@vc: the console we are updating
 *
 *	Loads the unimap for the hardware font, as defined in uni_hash.tbl.
 *	The representation used was the most compact I could come up
 *	with.  This routine is executed at video setup, and when the
 *	PIO_FONTRESET ioctl is called.
 *
 *	The caller must hold the console lock
 */
int con_set_default_unimap(struct vc_data *vc)
{}
EXPORT_SYMBOL();

/**
 *	con_copy_unimap		-	copy unimap between two vts
 *	@dst_vc: target
 *	@src_vc: source
 *
 *	The caller must hold the console lock when invoking this method
 */
int con_copy_unimap(struct vc_data *dst_vc, struct vc_data *src_vc)
{}
EXPORT_SYMBOL();

/*
 *	con_get_unimap		-	get the unicode map
 *
 *	Read the console unicode data for this console. Called from the ioctl
 *	handlers.
 */
int con_get_unimap(struct vc_data *vc, ushort ct, ushort __user *uct,
		struct unipair __user *list)
{}

/*
 * Always use USER_MAP. These functions are used by the keyboard,
 * which shouldn't be affected by G0/G1 switching, etc.
 * If the user map still contains default values, i.e. the
 * direct-to-font mapping, then assume user is using Latin1.
 *
 * FIXME: at some point we need to decide if we want to lock the table
 * update element itself via the keyboard_event_lock for consistency with the
 * keyboard driver as well as the consoles
 */
/* may be called during an interrupt */
u32 conv_8bit_to_uni(unsigned char c)
{}

int conv_uni_to_8bit(u32 uni)
{}

int conv_uni_to_pc(struct vc_data *conp, long ucs)
{}

/*
 * This is called at sys_setup time, after memory and the console are
 * initialized.  It must be possible to call kmalloc(..., GFP_KERNEL)
 * from this function, hence the call from sys_setup.
 */
void __init
console_map_init(void)
{}