mcklogd support
This commit is contained in:
@@ -18,6 +18,42 @@ SBINDIR="@SBINDIR@"
|
|||||||
KMODDIR="@KMODDIR@"
|
KMODDIR="@KMODDIR@"
|
||||||
KERNDIR="@KERNDIR@"
|
KERNDIR="@KERNDIR@"
|
||||||
|
|
||||||
|
INTERVAL=1
|
||||||
|
LOGMODE=0
|
||||||
|
while getopts :i:k: OPT
|
||||||
|
do
|
||||||
|
case ${OPT} in
|
||||||
|
i) INTERVAL=${OPTARG}
|
||||||
|
expr "${INTERVAL}" + 1 > /dev/null 2>&1
|
||||||
|
if [ $? -ge 2 ]
|
||||||
|
then
|
||||||
|
echo "invalid -i value"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
if [ ${INTERVAL} -le 0 ]
|
||||||
|
then
|
||||||
|
echo "invalid -i value"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
k) LOGMODE=${OPTARG}
|
||||||
|
expr "${LOGMODE}" + 1 > /dev/null 2>&1
|
||||||
|
if [ $? -ge 2 ]
|
||||||
|
then
|
||||||
|
echo "invalid -k value"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
if [ ${LOGMODE} -lt 0 -o ${LOGMODE} -gt 2 ]
|
||||||
|
then
|
||||||
|
echo "invalid -k value"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
*) echo "invalid option -${OPT}"
|
||||||
|
exit 1
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
mem="512M@0"
|
mem="512M@0"
|
||||||
cpus=""
|
cpus=""
|
||||||
ihk_ikc_irq_core=0
|
ihk_ikc_irq_core=0
|
||||||
@@ -105,7 +141,7 @@ if ! ${SBINDIR}/ihkconfig 0 create; then echo "error: create"; exit; fi
|
|||||||
if ! ${SBINDIR}/ihkosctl 0 assign cpu ${cpus}; then echo "error: assign CPUs"; exit; fi
|
if ! ${SBINDIR}/ihkosctl 0 assign cpu ${cpus}; then echo "error: assign CPUs"; exit; fi
|
||||||
if ! ${SBINDIR}/ihkosctl 0 assign mem ${mem}; then echo "error: assign memory"; exit; fi
|
if ! ${SBINDIR}/ihkosctl 0 assign mem ${mem}; then echo "error: assign memory"; exit; fi
|
||||||
if ! ${SBINDIR}/ihkosctl 0 load ${KERNDIR}/mckernel.img; then echo "error: loading kernel image"; exit; fi
|
if ! ${SBINDIR}/ihkosctl 0 load ${KERNDIR}/mckernel.img; then echo "error: loading kernel image"; exit; fi
|
||||||
if ! ${SBINDIR}/ihkosctl 0 kargs hidos; then echo "error: setting kernel arguments"; exit; fi
|
if ! ${SBINDIR}/ihkosctl 0 kargs "hidos ksyslogd=${LOGMODE}"; then echo "error: setting kernel arguments"; exit; fi
|
||||||
if ! ${SBINDIR}/ihkosctl 0 boot; then echo "error: booting"; exit; fi
|
if ! ${SBINDIR}/ihkosctl 0 boot; then echo "error: booting"; exit; fi
|
||||||
if ! insmod ${KMODDIR}/mcctrl.ko; then echo "error: inserting mcctrl.ko"; exit; fi
|
if ! insmod ${KMODDIR}/mcctrl.ko; then echo "error: inserting mcctrl.ko"; exit; fi
|
||||||
if ! chown `logname` /dev/mcd* /dev/mcos*; then echo "error: chowning device files"; exit; fi
|
if ! chown `logname` /dev/mcd* /dev/mcos*; then echo "error: chowning device files"; exit; fi
|
||||||
@@ -124,4 +160,7 @@ if [ "$enable_mcoverlay" != "" ]; then
|
|||||||
if ! mount -t mcoverlay mcoverlay -o lowerdir=/proc/mcos0:/proc,upperdir=/tmp/mcos/mcos0_proc_upper,workdir=/tmp/mcos/mcos0_proc_work,nocopyupw,nofscheck /tmp/mcos/mcos0_proc; then echo "error: mount /tmp/mcos/mcos0_proc"; exit; fi
|
if ! mount -t mcoverlay mcoverlay -o lowerdir=/proc/mcos0:/proc,upperdir=/tmp/mcos/mcos0_proc_upper,workdir=/tmp/mcos/mcos0_proc_work,nocopyupw,nofscheck /tmp/mcos/mcos0_proc; then echo "error: mount /tmp/mcos/mcos0_proc"; exit; fi
|
||||||
mount --make-rprivate /proc
|
mount --make-rprivate /proc
|
||||||
fi
|
fi
|
||||||
|
if [ ${LOGMODE} -ne 0 ]
|
||||||
|
then
|
||||||
|
SBINDIR=${SBINDIR} ${SBINDIR}/mcklogd -i ${INTERVAL}
|
||||||
|
fi
|
||||||
|
|||||||
@@ -22,13 +22,44 @@ extern int vsnprintf(char *buf, size_t size, const char *fmt, va_list args);
|
|||||||
extern int sprintf(char * buf, const char *fmt, ...);
|
extern int sprintf(char * buf, const char *fmt, ...);
|
||||||
static ihk_spinlock_t kmsg_lock;
|
static ihk_spinlock_t kmsg_lock;
|
||||||
|
|
||||||
|
static unsigned long kprintf_lock_head(void);
|
||||||
|
static void kprintf_unlock_head(unsigned long irqflags);
|
||||||
|
|
||||||
|
static void kprintf_wait(int len, unsigned long *flags_head, int *slide) {
|
||||||
|
int head, tail, buf_len, mode, adj;
|
||||||
|
|
||||||
|
mode = kmsg_buf.mode;
|
||||||
|
while (1) {
|
||||||
|
adj = 0;
|
||||||
|
tail = kmsg_buf.tail;
|
||||||
|
buf_len = kmsg_buf.len;
|
||||||
|
head = kmsg_buf.head;
|
||||||
|
if (head < tail) head += buf_len;
|
||||||
|
if (tail + len > buf_len) adj = buf_len - tail;
|
||||||
|
if (head > tail && head <= tail + len + adj) {
|
||||||
|
if (mode != 1) {
|
||||||
|
*slide = 1;
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
kprintf_unlock_head(*flags_head);
|
||||||
|
*flags_head = kprintf_lock_head();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* TODO: lock */
|
/* TODO: lock */
|
||||||
void kputs(char *buf)
|
void kputs(char *buf)
|
||||||
{
|
{
|
||||||
int len = strlen(buf);
|
int len = strlen(buf);
|
||||||
unsigned long flags;
|
int slide = 0;
|
||||||
|
unsigned long flags_tail, flags_head;
|
||||||
|
|
||||||
flags = __ihk_mc_spinlock_lock(&kmsg_lock);
|
flags_tail = kprintf_lock();
|
||||||
|
flags_head = kprintf_lock_head();
|
||||||
|
kprintf_wait(len, &flags_head, &slide);
|
||||||
|
|
||||||
if (len + kmsg_buf.tail > kmsg_buf.len) {
|
if (len + kmsg_buf.tail > kmsg_buf.len) {
|
||||||
kmsg_buf.tail = 0;
|
kmsg_buf.tail = 0;
|
||||||
@@ -39,8 +70,12 @@ void kputs(char *buf)
|
|||||||
|
|
||||||
memcpy(kmsg_buf.str + kmsg_buf.tail, buf, len);
|
memcpy(kmsg_buf.str + kmsg_buf.tail, buf, len);
|
||||||
kmsg_buf.tail += len;
|
kmsg_buf.tail += len;
|
||||||
|
if (slide == 1) {
|
||||||
__ihk_mc_spinlock_unlock(&kmsg_lock, flags);
|
kmsg_buf.head = kmsg_buf.tail + 1;
|
||||||
|
if (kmsg_buf.head >= kmsg_buf.len) kmsg_buf.head = 0;
|
||||||
|
}
|
||||||
|
kprintf_unlock_head(flags_head);
|
||||||
|
kprintf_unlock(flags_tail);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define KPRINTF_LOCAL_BUF_LEN 1024
|
#define KPRINTF_LOCAL_BUF_LEN 1024
|
||||||
@@ -55,11 +90,23 @@ void kprintf_unlock(unsigned long irqflags)
|
|||||||
__ihk_mc_spinlock_unlock(&kmsg_lock, irqflags);
|
__ihk_mc_spinlock_unlock(&kmsg_lock, irqflags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static unsigned long kprintf_lock_head(void)
|
||||||
|
{
|
||||||
|
return __ihk_mc_spinlock_lock(&kmsg_buf.lock);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void kprintf_unlock_head(unsigned long irqflags)
|
||||||
|
{
|
||||||
|
__ihk_mc_spinlock_unlock(&kmsg_buf.lock, irqflags);
|
||||||
|
}
|
||||||
|
|
||||||
/* Caller must hold kmsg_lock! */
|
/* Caller must hold kmsg_lock! */
|
||||||
int __kprintf(const char *format, ...)
|
int __kprintf(const char *format, ...)
|
||||||
{
|
{
|
||||||
int len = 0;
|
int len = 0;
|
||||||
|
int slide = 0;
|
||||||
va_list va;
|
va_list va;
|
||||||
|
unsigned long flags_head;
|
||||||
char buf[KPRINTF_LOCAL_BUF_LEN];
|
char buf[KPRINTF_LOCAL_BUF_LEN];
|
||||||
|
|
||||||
/* Copy into the local buf */
|
/* Copy into the local buf */
|
||||||
@@ -67,6 +114,9 @@ int __kprintf(const char *format, ...)
|
|||||||
len += vsnprintf(buf + len, KPRINTF_LOCAL_BUF_LEN - len - 2, format, va);
|
len += vsnprintf(buf + len, KPRINTF_LOCAL_BUF_LEN - len - 2, format, va);
|
||||||
va_end(va);
|
va_end(va);
|
||||||
|
|
||||||
|
flags_head = kprintf_lock_head();
|
||||||
|
kprintf_wait(len, &flags_head, &slide);
|
||||||
|
|
||||||
/* Append to kmsg buffer */
|
/* Append to kmsg buffer */
|
||||||
if (kmsg_buf.tail + len > kmsg_buf.len) {
|
if (kmsg_buf.tail + len > kmsg_buf.len) {
|
||||||
kmsg_buf.tail = 0;
|
kmsg_buf.tail = 0;
|
||||||
@@ -74,25 +124,33 @@ int __kprintf(const char *format, ...)
|
|||||||
|
|
||||||
memcpy(kmsg_buf.str + kmsg_buf.tail, buf, len);
|
memcpy(kmsg_buf.str + kmsg_buf.tail, buf, len);
|
||||||
kmsg_buf.tail += len;
|
kmsg_buf.tail += len;
|
||||||
|
if (slide == 1) {
|
||||||
|
kmsg_buf.head = kmsg_buf.tail + 1;
|
||||||
|
if (kmsg_buf.head >= kmsg_buf.len) kmsg_buf.head = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
kprintf_unlock_head(flags_head);
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
int kprintf(const char *format, ...)
|
int kprintf(const char *format, ...)
|
||||||
{
|
{
|
||||||
int len = 0;
|
int len = 0;
|
||||||
|
int slide = 0;
|
||||||
va_list va;
|
va_list va;
|
||||||
unsigned long flags;
|
unsigned long flags_tail, flags_head;
|
||||||
char buf[KPRINTF_LOCAL_BUF_LEN];
|
char buf[KPRINTF_LOCAL_BUF_LEN];
|
||||||
|
|
||||||
flags = __ihk_mc_spinlock_lock(&kmsg_lock);
|
|
||||||
|
|
||||||
/* Copy into the local buf */
|
/* Copy into the local buf */
|
||||||
len = sprintf(buf, "[%3d]: ", ihk_mc_get_processor_id());
|
len = sprintf(buf, "[%3d]: ", ihk_mc_get_processor_id());
|
||||||
va_start(va, format);
|
va_start(va, format);
|
||||||
len += vsnprintf(buf + len, KPRINTF_LOCAL_BUF_LEN - len - 2, format, va);
|
len += vsnprintf(buf + len, KPRINTF_LOCAL_BUF_LEN - len - 2, format, va);
|
||||||
va_end(va);
|
va_end(va);
|
||||||
|
|
||||||
|
flags_tail = kprintf_lock();
|
||||||
|
flags_head = kprintf_lock_head();
|
||||||
|
kprintf_wait(len, &flags_head, &slide);
|
||||||
|
|
||||||
/* Append to kmsg buffer */
|
/* Append to kmsg buffer */
|
||||||
if (kmsg_buf.tail + len > kmsg_buf.len) {
|
if (kmsg_buf.tail + len > kmsg_buf.len) {
|
||||||
kmsg_buf.tail = 0;
|
kmsg_buf.tail = 0;
|
||||||
@@ -100,16 +158,24 @@ int kprintf(const char *format, ...)
|
|||||||
|
|
||||||
memcpy(kmsg_buf.str + kmsg_buf.tail, buf, len);
|
memcpy(kmsg_buf.str + kmsg_buf.tail, buf, len);
|
||||||
kmsg_buf.tail += len;
|
kmsg_buf.tail += len;
|
||||||
|
if (slide == 1) {
|
||||||
|
kmsg_buf.head = kmsg_buf.tail + 1;
|
||||||
|
if (kmsg_buf.head >= kmsg_buf.len) kmsg_buf.head = 0;
|
||||||
|
}
|
||||||
|
|
||||||
__ihk_mc_spinlock_unlock(&kmsg_lock, flags);
|
kprintf_unlock_head(flags_head);
|
||||||
|
kprintf_unlock(flags_tail);
|
||||||
|
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
void kmsg_init(void)
|
void kmsg_init(int mode)
|
||||||
{
|
{
|
||||||
ihk_mc_spinlock_init(&kmsg_lock);
|
ihk_mc_spinlock_init(&kmsg_lock);
|
||||||
kmsg_buf.tail = 0;
|
kmsg_buf.tail = 0;
|
||||||
kmsg_buf.len = sizeof(kmsg_buf.str);
|
kmsg_buf.len = sizeof(kmsg_buf.str);
|
||||||
|
kmsg_buf.head = 0;
|
||||||
|
kmsg_buf.mode = mode;
|
||||||
|
ihk_mc_spinlock_init(&kmsg_buf.lock);
|
||||||
memset(kmsg_buf.str, 0, kmsg_buf.len);
|
memset(kmsg_buf.str, 0, kmsg_buf.len);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
#define INIT_H
|
#define INIT_H
|
||||||
|
|
||||||
extern void arch_init(void);
|
extern void arch_init(void);
|
||||||
extern void kmsg_init(void);
|
extern void kmsg_init(int);
|
||||||
extern void mem_init(void);
|
extern void mem_init(void);
|
||||||
extern void ikc_master_init(void);
|
extern void ikc_master_init(void);
|
||||||
extern void ap_init(void);
|
extern void ap_init(void);
|
||||||
|
|||||||
@@ -16,6 +16,6 @@
|
|||||||
void kputs(char *buf);
|
void kputs(char *buf);
|
||||||
int kprintf(const char *format, ...);
|
int kprintf(const char *format, ...);
|
||||||
|
|
||||||
void kmsg_init(void);
|
void kmsg_init(int);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -298,7 +298,15 @@ extern void ibmic_cmd_init(void);
|
|||||||
|
|
||||||
int main(void)
|
int main(void)
|
||||||
{
|
{
|
||||||
kmsg_init();
|
char *ptr;
|
||||||
|
int mode = 0;
|
||||||
|
|
||||||
|
ptr = find_command_line("ksyslogd=");
|
||||||
|
if (ptr) {
|
||||||
|
mode = ptr[9] - 0x30;
|
||||||
|
if (mode < 0 || mode > 2) mode = 0;
|
||||||
|
}
|
||||||
|
kmsg_init(mode);
|
||||||
|
|
||||||
kputs("MCK started.\n");
|
kputs("MCK started.\n");
|
||||||
|
|
||||||
|
|||||||
@@ -13,12 +13,16 @@
|
|||||||
#ifndef IHK_DEBUG_H
|
#ifndef IHK_DEBUG_H
|
||||||
#define IHK_DEBUG_H
|
#define IHK_DEBUG_H
|
||||||
|
|
||||||
|
#include <arch-lock.h>
|
||||||
#include <ihk/memconst.h>
|
#include <ihk/memconst.h>
|
||||||
|
|
||||||
struct ihk_kmsg_buf {
|
struct ihk_kmsg_buf {
|
||||||
int tail;
|
int tail;
|
||||||
int len;
|
int len;
|
||||||
char str[IHK_KMSG_SIZE - sizeof(int) * 2];
|
int head;
|
||||||
|
int mode;
|
||||||
|
ihk_spinlock_t lock;
|
||||||
|
char str[IHK_KMSG_SIZE - sizeof(int) * 4 - sizeof(ihk_spinlock_t)];
|
||||||
};
|
};
|
||||||
|
|
||||||
extern int kprintf(const char *format, ...);
|
extern int kprintf(const char *format, ...);
|
||||||
|
|||||||
Reference in New Issue
Block a user