cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

uncompress.h (4239B)


      1/* SPDX-License-Identifier: GPL-2.0-only */
      2/*
      3 *  arch/arm/mach-rpc/include/mach/uncompress.h
      4 *
      5 *  Copyright (C) 1996 Russell King
      6 */
      7#define VIDMEM ((char *)SCREEN_START)
      8 
      9#include <linux/io.h>
     10#include <mach/hardware.h>
     11#include <asm/setup.h>
     12#include <asm/page.h>
     13
     14int video_size_row;
     15unsigned char bytes_per_char_h;
     16extern unsigned long con_charconvtable[256];
     17
     18struct param_struct {
     19	unsigned long page_size;
     20	unsigned long nr_pages;
     21	unsigned long ramdisk_size;
     22	unsigned long mountrootrdonly;
     23	unsigned long rootdev;
     24	unsigned long video_num_cols;
     25	unsigned long video_num_rows;
     26	unsigned long video_x;
     27	unsigned long video_y;
     28	unsigned long memc_control_reg;
     29	unsigned char sounddefault;
     30	unsigned char adfsdrives;
     31	unsigned char bytes_per_char_h;
     32	unsigned char bytes_per_char_v;
     33	unsigned long unused[256/4-11];
     34};
     35
     36static const unsigned long palette_4[16] = {
     37	0x00000000,
     38	0x000000cc,
     39	0x0000cc00,             /* Green   */
     40	0x0000cccc,             /* Yellow  */
     41	0x00cc0000,             /* Blue    */
     42	0x00cc00cc,             /* Magenta */
     43	0x00cccc00,             /* Cyan    */
     44	0x00cccccc,             /* White   */
     45	0x00000000,
     46	0x000000ff,
     47	0x0000ff00,
     48	0x0000ffff,
     49	0x00ff0000,
     50	0x00ff00ff,
     51	0x00ffff00,
     52	0x00ffffff
     53};
     54
     55#define palette_setpixel(p)	*(unsigned long *)(IO_START+0x00400000) = 0x10000000|((p) & 255)
     56#define palette_write(v)	*(unsigned long *)(IO_START+0x00400000) = 0x00000000|((v) & 0x00ffffff)
     57
     58/*
     59 * params_phys is a linker defined symbol - see
     60 * arch/arm/boot/compressed/Makefile
     61 */
     62extern __attribute__((pure)) struct param_struct *params(void);
     63#define params (params())
     64
     65#ifndef STANDALONE_DEBUG 
     66unsigned long video_num_cols;
     67unsigned long video_num_rows;
     68unsigned long video_x;
     69unsigned long video_y;
     70unsigned char bytes_per_char_v;
     71int white;
     72
     73/*
     74 * This does not append a newline
     75 */
     76static inline void putc(int c)
     77{
     78	extern void ll_write_char(char *, char c, char white);
     79	int x,y;
     80	char *ptr;
     81
     82	x = video_x;
     83	y = video_y;
     84
     85	if (c == '\n') {
     86		if (++y >= video_num_rows)
     87			y--;
     88	} else if (c == '\r') {
     89		x = 0;
     90	} else {
     91		ptr = VIDMEM + ((y*video_num_cols*bytes_per_char_v+x)*bytes_per_char_h);
     92		ll_write_char(ptr, c, white);
     93		if (++x >= video_num_cols) {
     94			x = 0;
     95			if ( ++y >= video_num_rows ) {
     96				y--;
     97			}
     98		}
     99	}
    100
    101	video_x = x;
    102	video_y = y;
    103}
    104
    105static inline void flush(void)
    106{
    107}
    108
    109/*
    110 * Setup for decompression
    111 */
    112static void arch_decomp_setup(void)
    113{
    114	int i;
    115	struct tag *t = (struct tag *)params;
    116	unsigned int nr_pages = 0, page_size = PAGE_SIZE;
    117
    118	if (t->hdr.tag == ATAG_CORE) {
    119		for (; t->hdr.size; t = tag_next(t)) {
    120			if (t->hdr.tag == ATAG_VIDEOTEXT) {
    121				video_num_rows = t->u.videotext.video_lines;
    122				video_num_cols = t->u.videotext.video_cols;
    123				video_x = t->u.videotext.x;
    124				video_y = t->u.videotext.y;
    125			} else if (t->hdr.tag == ATAG_VIDEOLFB) {
    126				bytes_per_char_h = t->u.videolfb.lfb_depth;
    127				bytes_per_char_v = 8;
    128			} else if (t->hdr.tag == ATAG_MEM) {
    129				page_size = PAGE_SIZE;
    130				nr_pages += (t->u.mem.size / PAGE_SIZE);
    131			}
    132		}
    133	} else {
    134		nr_pages = params->nr_pages;
    135		page_size = params->page_size;
    136		video_num_rows = params->video_num_rows;
    137		video_num_cols = params->video_num_cols;
    138		video_x = params->video_x;
    139		video_y = params->video_y;
    140		bytes_per_char_h = params->bytes_per_char_h;
    141		bytes_per_char_v = params->bytes_per_char_v;
    142	}
    143
    144	video_size_row = video_num_cols * bytes_per_char_h;
    145	
    146	if (bytes_per_char_h == 4)
    147		for (i = 0; i < 256; i++)
    148			con_charconvtable[i] =
    149				(i & 128 ? 1 << 0  : 0) |
    150				(i & 64  ? 1 << 4  : 0) |
    151				(i & 32  ? 1 << 8  : 0) |
    152				(i & 16  ? 1 << 12 : 0) |
    153				(i & 8   ? 1 << 16 : 0) |
    154				(i & 4   ? 1 << 20 : 0) |
    155				(i & 2   ? 1 << 24 : 0) |
    156				(i & 1   ? 1 << 28 : 0);
    157	else
    158		for (i = 0; i < 16; i++)
    159			con_charconvtable[i] =
    160				(i & 8   ? 1 << 0  : 0) |
    161				(i & 4   ? 1 << 8  : 0) |
    162				(i & 2   ? 1 << 16 : 0) |
    163				(i & 1   ? 1 << 24 : 0);
    164
    165
    166	palette_setpixel(0);
    167	if (bytes_per_char_h == 1) {
    168		palette_write (0);
    169		palette_write (0x00ffffff);
    170		for (i = 2; i < 256; i++)
    171			palette_write (0);
    172		white = 1;
    173	} else {
    174		for (i = 0; i < 256; i++)
    175			palette_write (i < 16 ? palette_4[i] : 0);
    176		white = 7;
    177	}
    178
    179	if (nr_pages * page_size < 4096*1024) error("<4M of mem\n");
    180}
    181#endif