Revert r321969

My change had good intentions, but the implementation was incorrect:
- printf was returning the number of characters in the format string
  plus the NUL, but failed in two regards implementation wise:
-- the pathological case, printf(""), wasn't being handled properly since
   the pointer is always incremented, so the value returned would be
   off-by-one.
-- printf(3) reports the number of characters printed post-conversion via
   vfprintf, etc.
- putchar(3) should return the character printed or EOF, not the number
  of characters output to the screen.

My goal in making the change (again) was to increase parity, but as bde
pointed out these are freestanding functions, so they don't have to
conform to libc/POSIX. I argued that the functions should be named
differently since the implementation is different enough to warrant it
and to allow boot2 code to be usable when linked against sys/boot and
libstand and other libraries in base. I have no interest in pushing
this change forward more though, as the original concern I had behind
the change with zfsboottest was resolved in r321849 and r321852. The
next person that updates the toolchain gets to deal with the
inconsistency if it's flagged by a newer compiler.

MFC after:	1 month
Reported by:	ed, markj
This commit is contained in:
ngie 2017-08-03 13:50:46 +00:00
parent 3cd6bd877a
commit 7d39d99ea1
6 changed files with 21 additions and 28 deletions

View File

@ -28,9 +28,9 @@
#define ARM_BOOT_LIB_H
int getc(int);
int putchar(int);
int xputchar(int);
int printf(const char *fmt,...);
void putchar(int);
void xputchar(int);
void printf(const char *fmt,...);
/* The following function write eeprom at ee_addr using data */
/* from data_add for size bytes. */

View File

@ -20,13 +20,12 @@
#include <stdarg.h>
#include "lib.h"
int
void
printf(const char *fmt,...)
{
va_list ap;
const char *hex = "0123456789abcdef";
char buf[10];
const char *fmt_orig = fmt;
char *s;
unsigned u;
int c;
@ -67,5 +66,5 @@ printf(const char *fmt,...)
}
va_end(ap);
return (int)(fmt - fmt_orig);
return;
}

View File

@ -39,11 +39,11 @@
#include "lib.h"
/*
* int putchar(int ch)
* void putchar(int ch)
* Writes a character to the DBGU port. It assumes that DBGU has
* already been initialized.
*/
int
void
putchar(int ch)
{
AT91PS_USART pUSART = (AT91PS_USART)AT91C_BASE_DBGU;
@ -51,14 +51,12 @@ putchar(int ch)
while (!(pUSART->US_CSR & AT91C_US_TXRDY))
continue;
pUSART->US_THR = (ch & 0xFF);
return (1);
}
int
void
xputchar(int ch)
{
if (ch == '\n')
putchar('\r');
putchar(ch);
return (ch == '\n' ? 2 : 1);
if (ch == '\n')
putchar('\r');
putchar(ch);
}

View File

@ -165,7 +165,7 @@ getc(int seconds)
return c;
}
int
void
putchar(int ch)
{
int delay, limit;
@ -179,16 +179,14 @@ putchar(int ch)
limit = 40;
while ((uart_getreg(ubase, REG_LSR) & LSR_TEMT) == 0 && --limit)
DELAY(delay);
return (1);
}
int
void
xputchar(int ch)
{
if (ch == '\n')
putchar('\r');
putchar(ch);
return (ch == '\n' ? 2 : 1);
}
void

View File

@ -35,12 +35,12 @@ int main(void);
void DELAY(int);
int getc(int);
int putchar(int);
int xputchar(int);
void putchar(int);
void xputchar(int);
void putstr(const char *);
void puthex8(u_int8_t);
void puthexlist(const u_int8_t *, int);
int printf(const char *fmt,...);
void printf(const char *fmt,...);
void bzero(void *, size_t);
char *strcpy(char *to, const char *from);

View File

@ -114,8 +114,8 @@ void exit(int);
static void load(void);
static int parse(void);
static int dskread(void *, unsigned, unsigned);
static int printf(const char *,...);
static int putchar(int);
static void printf(const char *,...);
static void putchar(int);
static int drvread(void *, unsigned, unsigned);
static int keyhit(unsigned);
static int xputc(int);
@ -521,12 +521,11 @@ dskread(void *buf, unsigned lba, unsigned nblk)
return -1;
}
static int
static void
printf(const char *fmt,...)
{
va_list ap;
static char buf[10];
const char *fmt_orig = fmt;
char *s;
unsigned u;
int c;
@ -557,16 +556,15 @@ printf(const char *fmt,...)
putchar(c);
}
va_end(ap);
return (int)(fmt - fmt_orig);
return;
}
static int
static void
putchar(int c)
{
if (c == '\n')
xputc('\r');
xputc(c);
return (c == '\n' ? 2 : 1);
}
static int