forked from luck/tmp_suning_uos_patched
595a251c07
sparc64 systems have a restriction in that passing in buffer addressses above 4GB to prom calls is not reliable. We end up violating this when we do prom console writes, because we use an on-stack buffer to translate '\n' into '\r\n'. So instead, do this translation into an intermediate buffer, which is in the kernel image and thus below 4GB, then pass that to the PROM console write calls. On the 32-bit side we don't have to deal with any of these issues, so the new prom_console_write_buf() uses the existing prom_nbputchar() implementation. However we can now mark those routines static. Since the 64-bit side completely uses new code we can delete the putchar bits as they are now completely unused. Signed-off-by: David S. Miller <davem@davemloft.net>
57 lines
1.2 KiB
C
57 lines
1.2 KiB
C
/*
|
|
* console.c: Routines that deal with sending and receiving IO
|
|
* to/from the current console device using the PROM.
|
|
*
|
|
* Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
|
|
* Copyright (C) 1998 Pete Zaitcev <zaitcev@yahoo.com>
|
|
*/
|
|
|
|
#include <linux/types.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/sched.h>
|
|
#include <asm/openprom.h>
|
|
#include <asm/oplib.h>
|
|
#include <asm/system.h>
|
|
#include <linux/string.h>
|
|
|
|
extern void restore_current(void);
|
|
|
|
/* Non blocking put character to console device, returns -1 if
|
|
* unsuccessful.
|
|
*/
|
|
static int prom_nbputchar(const char *buf)
|
|
{
|
|
unsigned long flags;
|
|
int i = -1;
|
|
|
|
spin_lock_irqsave(&prom_lock, flags);
|
|
switch(prom_vers) {
|
|
case PROM_V0:
|
|
i = (*(romvec->pv_nbputchar))(*buf);
|
|
break;
|
|
case PROM_V2:
|
|
case PROM_V3:
|
|
if ((*(romvec->pv_v2devops).v2_dev_write)(*romvec->pv_v2bootargs.fd_stdout,
|
|
buf, 0x1) == 1)
|
|
i = 0;
|
|
break;
|
|
default:
|
|
break;
|
|
};
|
|
restore_current();
|
|
spin_unlock_irqrestore(&prom_lock, flags);
|
|
return i; /* Ugh, we could spin forever on unsupported proms ;( */
|
|
}
|
|
|
|
void prom_console_write_buf(const char *buf, int len)
|
|
{
|
|
while (len) {
|
|
int n = prom_nbputchar(buf);
|
|
if (n)
|
|
continue;
|
|
len--;
|
|
buf++;
|
|
}
|
|
}
|
|
|