Merge branch 'xtensa-sim-params' into xtensa-fixes
authorMax Filippov <jcmvbkbc@gmail.com>
Sun, 7 May 2017 17:39:03 +0000 (10:39 -0700)
committerMax Filippov <jcmvbkbc@gmail.com>
Sun, 7 May 2017 17:39:03 +0000 (10:39 -0700)
arch/xtensa/kernel/setup.c
arch/xtensa/platforms/iss/include/platform/simcall.h
arch/xtensa/platforms/iss/setup.c

index fd33920e1a1972a670be26a8bd7cc2732b73eed8..394ef08300b6a3188b196155e0863bf2360fef93 100644 (file)
@@ -317,8 +317,9 @@ static inline int mem_reserve(unsigned long start, unsigned long end)
 
 void __init setup_arch(char **cmdline_p)
 {
-       strlcpy(boot_command_line, command_line, COMMAND_LINE_SIZE);
        *cmdline_p = command_line;
+       platform_setup(cmdline_p);
+       strlcpy(boot_command_line, *cmdline_p, COMMAND_LINE_SIZE);
 
        /* Reserve some memory regions */
 
@@ -382,8 +383,6 @@ void __init setup_arch(char **cmdline_p)
 
        unflatten_and_copy_device_tree();
 
-       platform_setup(cmdline_p);
-
 #ifdef CONFIG_SMP
        smp_init_cpus();
 #endif
index 27d7a528b41ae53d35c9ac24f0d75b4046a7de53..2ba45858e50a3db125b1e30b730739ffb667cb55 100644 (file)
@@ -6,6 +6,7 @@
  * for more details.
  *
  * Copyright (C) 2001 Tensilica Inc.
+ * Copyright (C) 2017 Cadence Design Systems Inc.
  */
 
 #ifndef _XTENSA_PLATFORM_ISS_SIMCALL_H
 #define SYS_bind        30
 #define SYS_ioctl      31
 
+#define SYS_iss_argc   1000    /* returns value of argc */
+#define SYS_iss_argv_size 1001 /* bytes needed for argv & arg strings */
+#define SYS_iss_set_argv 1002  /* saves argv & arg strings at given addr */
+
 /*
  * SYS_select_one specifiers
  */
@@ -118,5 +123,20 @@ static inline int simc_lseek(int fd, uint32_t off, int whence)
        return __simc(SYS_lseek, fd, off, whence);
 }
 
+static inline int simc_argc(void)
+{
+       return __simc(SYS_iss_argc, 0, 0, 0);
+}
+
+static inline int simc_argv_size(void)
+{
+       return __simc(SYS_iss_argv_size, 0, 0, 0);
+}
+
+static inline void simc_argv(void *buf)
+{
+       __simc(SYS_iss_set_argv, (int)buf, 0, 0);
+}
+
 #endif /* _XTENSA_PLATFORM_ISS_SIMCALL_H */
 
index 379aeddcc63886c9368bfab1d4189ef8f21837da..f4bbb28026f8be3006890fe236989db791c79e1d 100644 (file)
@@ -8,6 +8,7 @@
  *          Joe Taylor <joe@tensilica.com>
  *
  * Copyright 2001 - 2005 Tensilica Inc.
+ * Copyright 2017 Cadence Design Systems Inc.
  *
  * This program is free software; you can redistribute  it and/or modify it
  * under  the terms of  the GNU General  Public License as published by the
@@ -15,6 +16,7 @@
  * option) any later version.
  *
  */
+#include <linux/bootmem.h>
 #include <linux/stddef.h>
 #include <linux/kernel.h>
 #include <linux/init.h>
 
 #include <asm/platform.h>
 #include <asm/bootparam.h>
+#include <asm/setup.h>
 
 #include <platform/simcall.h>
 
 
 void __init platform_init(bp_tag_t* bootparam)
 {
-
 }
 
 void platform_halt(void)
@@ -59,26 +61,10 @@ void platform_restart(void)
        /* control never gets here */
 }
 
-extern void iss_net_poll(void);
-
-const char twirl[]="|/-\\|/-\\";
-
 void platform_heartbeat(void)
 {
-#if 0
-       static int i = 0, j = 0;
-
-       if (--i < 0) {
-               i = 99;
-               printk("\r%c\r", twirl[j++]);
-               if (j == 8)
-                       j = 0;
-       }
-#endif
 }
 
-
-
 static int
 iss_panic_event(struct notifier_block *this, unsigned long event, void *ptr)
 {
@@ -87,12 +73,29 @@ iss_panic_event(struct notifier_block *this, unsigned long event, void *ptr)
 }
 
 static struct notifier_block iss_panic_block = {
-       iss_panic_event,
-       NULL,
-       0
+       .notifier_call = iss_panic_event,
 };
 
 void __init platform_setup(char **p_cmdline)
 {
+       int argc = simc_argc();
+       int argv_size = simc_argv_size();
+
+       if (argc > 1) {
+               void **argv = alloc_bootmem(argv_size);
+               char *cmdline = alloc_bootmem(argv_size);
+               int i;
+
+               cmdline[0] = 0;
+               simc_argv((void *)argv);
+
+               for (i = 1; i < argc; ++i) {
+                       if (i > 1)
+                               strcat(cmdline, " ");
+                       strcat(cmdline, argv[i]);
+               }
+               *p_cmdline = cmdline;
+       }
+
        atomic_notifier_chain_register(&panic_notifier_list, &iss_panic_block);
 }