public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] LoongArch: Refactor the Features output in show_cpuinfo()
@ 2026-04-28  7:52 Qiang Ma
  2026-04-28  9:37 ` Huacai Chen
  0 siblings, 1 reply; 4+ messages in thread
From: Qiang Ma @ 2026-04-28  7:52 UTC (permalink / raw)
  To: chenhuacai, kernel; +Cc: loongarch, linux-kernel, Qiang Ma

1. Adds an hwcap_str[] mapping table, using KERNEL_HWCAP(x)
(i.e., const_ilog2(HWCAP_LOONGARCH_x)) to map HWCAP bits
to corresponding strings;
2. In show_cpuinfo(), iterates through hwcap_str in a loop,
checks the bitmap of elf_hwcap, and prints the corresponding
feature names;
3. Maintains the original output semantics (still printing
the same feature names) to facilitate adding new CPU features
in the future.

Signed-off-by: Qiang Ma <maqianga@uniontech.com>
---
 arch/loongarch/kernel/proc.c | 60 ++++++++++++++++--------------------
 1 file changed, 26 insertions(+), 34 deletions(-)

diff --git a/arch/loongarch/kernel/proc.c b/arch/loongarch/kernel/proc.c
index d4ce5b585453..1188bffd66b6 100644
--- a/arch/loongarch/kernel/proc.c
+++ b/arch/loongarch/kernel/proc.c
@@ -12,9 +12,32 @@
 #include <asm/idle.h>
 #include <asm/processor.h>
 #include <asm/time.h>
+#include <asm/cpufeature.h>
+
+#define KERNEL_HWCAP(x)  const_ilog2(HWCAP_LOONGARCH_ ## x)
+static const char *const hwcap_str[] = {
+	[KERNEL_HWCAP(CPUCFG)]		= "cpucfg",
+	[KERNEL_HWCAP(LAM)]		= "lam",
+	[KERNEL_HWCAP(LAM_BH)]		= "lam_bh",
+	[KERNEL_HWCAP(UAL)]		= "ual",
+	[KERNEL_HWCAP(FPU)]		= "fpu",
+	[KERNEL_HWCAP(LSX)]		= "lsx",
+	[KERNEL_HWCAP(LASX)]		= "lasx",
+	[KERNEL_HWCAP(CRC32)]		= "crc32",
+	[KERNEL_HWCAP(COMPLEX)]		= "complex",
+	[KERNEL_HWCAP(CRYPTO)]		= "crypto",
+	[KERNEL_HWCAP(LVZ)]		= "lvz",
+	[KERNEL_HWCAP(LBT_X86)]		= "lbt_x86",
+	[KERNEL_HWCAP(LBT_ARM)]		= "lbt_arm",
+	[KERNEL_HWCAP(LBT_MIPS)]	= "lbt_mips",
+	[KERNEL_HWCAP(PTW)]		= "ptw",
+	[KERNEL_HWCAP(LSPW)]		= "lspw",
+	[KERNEL_HWCAP(SCQ)]		= "scq",
+};
 
 static int show_cpuinfo(struct seq_file *m, void *v)
 {
+	unsigned int i;
 	unsigned long n = (unsigned long) v - 1;
 	unsigned int isa = cpu_data[n].isa_level;
 	unsigned int prid = cpu_data[n].processor_id;
@@ -60,40 +83,9 @@ static int show_cpuinfo(struct seq_file *m, void *v)
 	seq_puts(m, "\n");
 
 	seq_puts(m, "Features\t\t:");
-	if (cpu_has_cpucfg)
-		seq_puts(m, " cpucfg");
-	if (cpu_has_lam)
-		seq_puts(m, " lam");
-	if (cpu_has_lam_bh)
-		seq_puts(m, " lam_bh");
-	if (cpu_has_scq)
-		seq_puts(m, " scq");
-	if (cpu_has_ual)
-		seq_puts(m, " ual");
-	if (cpu_has_fpu)
-		seq_puts(m, " fpu");
-	if (cpu_has_lsx)
-		seq_puts(m, " lsx");
-	if (cpu_has_lasx)
-		seq_puts(m, " lasx");
-	if (cpu_has_crc32)
-		seq_puts(m, " crc32");
-	if (cpu_has_complex)
-		seq_puts(m, " complex");
-	if (cpu_has_crypto)
-		seq_puts(m, " crypto");
-	if (cpu_has_ptw)
-		seq_puts(m, " ptw");
-	if (cpu_has_lspw)
-		seq_puts(m, " lspw");
-	if (cpu_has_lvz)
-		seq_puts(m, " lvz");
-	if (cpu_has_lbt_x86)
-		seq_puts(m, " lbt_x86");
-	if (cpu_has_lbt_arm)
-		seq_puts(m, " lbt_arm");
-	if (cpu_has_lbt_mips)
-		seq_puts(m, " lbt_mips");
+	for (i = 0; i < ARRAY_SIZE(hwcap_str); i++)
+		if (elf_hwcap & (1 << i))
+			seq_printf(m, " %s", hwcap_str[i]);
 	seq_puts(m, "\n");
 
 	seq_printf(m, "Hardware Watchpoint\t: %s", str_yes_no(cpu_has_watch));
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH] LoongArch: Refactor the Features output in show_cpuinfo()
  2026-04-28  7:52 [PATCH] LoongArch: Refactor the Features output in show_cpuinfo() Qiang Ma
@ 2026-04-28  9:37 ` Huacai Chen
  2026-04-28 10:08   ` Qiang Ma
  0 siblings, 1 reply; 4+ messages in thread
From: Huacai Chen @ 2026-04-28  9:37 UTC (permalink / raw)
  To: Qiang Ma; +Cc: kernel, loongarch, linux-kernel

https://lore.kernel.org/loongarch/20260228102946.4045-1-dongtai.guo@linux.dev/
https://lore.kernel.org/loongarch/20260428075231.2283151-1-maqianga@uniontech.com/T/#u

What make you modify here again and again?
Is this function ugly?
Is this function has bugs?
Or for some other reasons?


Huacai

On Tue, Apr 28, 2026 at 3:53 PM Qiang Ma <maqianga@uniontech.com> wrote:
>
> 1. Adds an hwcap_str[] mapping table, using KERNEL_HWCAP(x)
> (i.e., const_ilog2(HWCAP_LOONGARCH_x)) to map HWCAP bits
> to corresponding strings;
> 2. In show_cpuinfo(), iterates through hwcap_str in a loop,
> checks the bitmap of elf_hwcap, and prints the corresponding
> feature names;
> 3. Maintains the original output semantics (still printing
> the same feature names) to facilitate adding new CPU features
> in the future.
>
> Signed-off-by: Qiang Ma <maqianga@uniontech.com>
> ---
>  arch/loongarch/kernel/proc.c | 60 ++++++++++++++++--------------------
>  1 file changed, 26 insertions(+), 34 deletions(-)
>
> diff --git a/arch/loongarch/kernel/proc.c b/arch/loongarch/kernel/proc.c
> index d4ce5b585453..1188bffd66b6 100644
> --- a/arch/loongarch/kernel/proc.c
> +++ b/arch/loongarch/kernel/proc.c
> @@ -12,9 +12,32 @@
>  #include <asm/idle.h>
>  #include <asm/processor.h>
>  #include <asm/time.h>
> +#include <asm/cpufeature.h>
> +
> +#define KERNEL_HWCAP(x)  const_ilog2(HWCAP_LOONGARCH_ ## x)
> +static const char *const hwcap_str[] = {
> +       [KERNEL_HWCAP(CPUCFG)]          = "cpucfg",
> +       [KERNEL_HWCAP(LAM)]             = "lam",
> +       [KERNEL_HWCAP(LAM_BH)]          = "lam_bh",
> +       [KERNEL_HWCAP(UAL)]             = "ual",
> +       [KERNEL_HWCAP(FPU)]             = "fpu",
> +       [KERNEL_HWCAP(LSX)]             = "lsx",
> +       [KERNEL_HWCAP(LASX)]            = "lasx",
> +       [KERNEL_HWCAP(CRC32)]           = "crc32",
> +       [KERNEL_HWCAP(COMPLEX)]         = "complex",
> +       [KERNEL_HWCAP(CRYPTO)]          = "crypto",
> +       [KERNEL_HWCAP(LVZ)]             = "lvz",
> +       [KERNEL_HWCAP(LBT_X86)]         = "lbt_x86",
> +       [KERNEL_HWCAP(LBT_ARM)]         = "lbt_arm",
> +       [KERNEL_HWCAP(LBT_MIPS)]        = "lbt_mips",
> +       [KERNEL_HWCAP(PTW)]             = "ptw",
> +       [KERNEL_HWCAP(LSPW)]            = "lspw",
> +       [KERNEL_HWCAP(SCQ)]             = "scq",
> +};
>
>  static int show_cpuinfo(struct seq_file *m, void *v)
>  {
> +       unsigned int i;
>         unsigned long n = (unsigned long) v - 1;
>         unsigned int isa = cpu_data[n].isa_level;
>         unsigned int prid = cpu_data[n].processor_id;
> @@ -60,40 +83,9 @@ static int show_cpuinfo(struct seq_file *m, void *v)
>         seq_puts(m, "\n");
>
>         seq_puts(m, "Features\t\t:");
> -       if (cpu_has_cpucfg)
> -               seq_puts(m, " cpucfg");
> -       if (cpu_has_lam)
> -               seq_puts(m, " lam");
> -       if (cpu_has_lam_bh)
> -               seq_puts(m, " lam_bh");
> -       if (cpu_has_scq)
> -               seq_puts(m, " scq");
> -       if (cpu_has_ual)
> -               seq_puts(m, " ual");
> -       if (cpu_has_fpu)
> -               seq_puts(m, " fpu");
> -       if (cpu_has_lsx)
> -               seq_puts(m, " lsx");
> -       if (cpu_has_lasx)
> -               seq_puts(m, " lasx");
> -       if (cpu_has_crc32)
> -               seq_puts(m, " crc32");
> -       if (cpu_has_complex)
> -               seq_puts(m, " complex");
> -       if (cpu_has_crypto)
> -               seq_puts(m, " crypto");
> -       if (cpu_has_ptw)
> -               seq_puts(m, " ptw");
> -       if (cpu_has_lspw)
> -               seq_puts(m, " lspw");
> -       if (cpu_has_lvz)
> -               seq_puts(m, " lvz");
> -       if (cpu_has_lbt_x86)
> -               seq_puts(m, " lbt_x86");
> -       if (cpu_has_lbt_arm)
> -               seq_puts(m, " lbt_arm");
> -       if (cpu_has_lbt_mips)
> -               seq_puts(m, " lbt_mips");
> +       for (i = 0; i < ARRAY_SIZE(hwcap_str); i++)
> +               if (elf_hwcap & (1 << i))
> +                       seq_printf(m, " %s", hwcap_str[i]);
>         seq_puts(m, "\n");
>
>         seq_printf(m, "Hardware Watchpoint\t: %s", str_yes_no(cpu_has_watch));
> --
> 2.20.1
>

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] LoongArch: Refactor the Features output in show_cpuinfo()
  2026-04-28  9:37 ` Huacai Chen
@ 2026-04-28 10:08   ` Qiang Ma
  2026-04-28 10:30     ` Huacai Chen
  0 siblings, 1 reply; 4+ messages in thread
From: Qiang Ma @ 2026-04-28 10:08 UTC (permalink / raw)
  To: Huacai Chen; +Cc: kernel, loongarch, linux-kernel


在 2026/4/28 17:37, Huacai Chen 写道:
> https://lore.kernel.org/loongarch/20260228102946.4045-1-dongtai.guo@linux.dev/
> https://lore.kernel.org/loongarch/20260428075231.2283151-1-maqianga@uniontech.com/T/#u
>
> What make you modify here again and again?
Sorry, I didn't notice that the relevant patch had already been submitted.
> Is this function ugly?
> Is this function has bugs?
No
> Or for some other reasons?

I noticed that with the addition of new features to the LoongArch 
architecture,

new features can be conveniently added without constantly needing to add 
if statements, keeping the code concise.

>
>
> Huacai
>
> On Tue, Apr 28, 2026 at 3:53 PM Qiang Ma <maqianga@uniontech.com> wrote:
>> 1. Adds an hwcap_str[] mapping table, using KERNEL_HWCAP(x)
>> (i.e., const_ilog2(HWCAP_LOONGARCH_x)) to map HWCAP bits
>> to corresponding strings;
>> 2. In show_cpuinfo(), iterates through hwcap_str in a loop,
>> checks the bitmap of elf_hwcap, and prints the corresponding
>> feature names;
>> 3. Maintains the original output semantics (still printing
>> the same feature names) to facilitate adding new CPU features
>> in the future.
>>
>> Signed-off-by: Qiang Ma <maqianga@uniontech.com>
>> ---
>>   arch/loongarch/kernel/proc.c | 60 ++++++++++++++++--------------------
>>   1 file changed, 26 insertions(+), 34 deletions(-)
>>
>> diff --git a/arch/loongarch/kernel/proc.c b/arch/loongarch/kernel/proc.c
>> index d4ce5b585453..1188bffd66b6 100644
>> --- a/arch/loongarch/kernel/proc.c
>> +++ b/arch/loongarch/kernel/proc.c
>> @@ -12,9 +12,32 @@
>>   #include <asm/idle.h>
>>   #include <asm/processor.h>
>>   #include <asm/time.h>
>> +#include <asm/cpufeature.h>
>> +
>> +#define KERNEL_HWCAP(x)  const_ilog2(HWCAP_LOONGARCH_ ## x)
>> +static const char *const hwcap_str[] = {
>> +       [KERNEL_HWCAP(CPUCFG)]          = "cpucfg",
>> +       [KERNEL_HWCAP(LAM)]             = "lam",
>> +       [KERNEL_HWCAP(LAM_BH)]          = "lam_bh",
>> +       [KERNEL_HWCAP(UAL)]             = "ual",
>> +       [KERNEL_HWCAP(FPU)]             = "fpu",
>> +       [KERNEL_HWCAP(LSX)]             = "lsx",
>> +       [KERNEL_HWCAP(LASX)]            = "lasx",
>> +       [KERNEL_HWCAP(CRC32)]           = "crc32",
>> +       [KERNEL_HWCAP(COMPLEX)]         = "complex",
>> +       [KERNEL_HWCAP(CRYPTO)]          = "crypto",
>> +       [KERNEL_HWCAP(LVZ)]             = "lvz",
>> +       [KERNEL_HWCAP(LBT_X86)]         = "lbt_x86",
>> +       [KERNEL_HWCAP(LBT_ARM)]         = "lbt_arm",
>> +       [KERNEL_HWCAP(LBT_MIPS)]        = "lbt_mips",
>> +       [KERNEL_HWCAP(PTW)]             = "ptw",
>> +       [KERNEL_HWCAP(LSPW)]            = "lspw",
>> +       [KERNEL_HWCAP(SCQ)]             = "scq",
>> +};
>>
>>   static int show_cpuinfo(struct seq_file *m, void *v)
>>   {
>> +       unsigned int i;
>>          unsigned long n = (unsigned long) v - 1;
>>          unsigned int isa = cpu_data[n].isa_level;
>>          unsigned int prid = cpu_data[n].processor_id;
>> @@ -60,40 +83,9 @@ static int show_cpuinfo(struct seq_file *m, void *v)
>>          seq_puts(m, "\n");
>>
>>          seq_puts(m, "Features\t\t:");
>> -       if (cpu_has_cpucfg)
>> -               seq_puts(m, " cpucfg");
>> -       if (cpu_has_lam)
>> -               seq_puts(m, " lam");
>> -       if (cpu_has_lam_bh)
>> -               seq_puts(m, " lam_bh");
>> -       if (cpu_has_scq)
>> -               seq_puts(m, " scq");
>> -       if (cpu_has_ual)
>> -               seq_puts(m, " ual");
>> -       if (cpu_has_fpu)
>> -               seq_puts(m, " fpu");
>> -       if (cpu_has_lsx)
>> -               seq_puts(m, " lsx");
>> -       if (cpu_has_lasx)
>> -               seq_puts(m, " lasx");
>> -       if (cpu_has_crc32)
>> -               seq_puts(m, " crc32");
>> -       if (cpu_has_complex)
>> -               seq_puts(m, " complex");
>> -       if (cpu_has_crypto)
>> -               seq_puts(m, " crypto");
>> -       if (cpu_has_ptw)
>> -               seq_puts(m, " ptw");
>> -       if (cpu_has_lspw)
>> -               seq_puts(m, " lspw");
>> -       if (cpu_has_lvz)
>> -               seq_puts(m, " lvz");
>> -       if (cpu_has_lbt_x86)
>> -               seq_puts(m, " lbt_x86");
>> -       if (cpu_has_lbt_arm)
>> -               seq_puts(m, " lbt_arm");
>> -       if (cpu_has_lbt_mips)
>> -               seq_puts(m, " lbt_mips");
>> +       for (i = 0; i < ARRAY_SIZE(hwcap_str); i++)
>> +               if (elf_hwcap & (1 << i))
>> +                       seq_printf(m, " %s", hwcap_str[i]);
>>          seq_puts(m, "\n");
>>
>>          seq_printf(m, "Hardware Watchpoint\t: %s", str_yes_no(cpu_has_watch));
>> --
>> 2.20.1
>>

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] LoongArch: Refactor the Features output in show_cpuinfo()
  2026-04-28 10:08   ` Qiang Ma
@ 2026-04-28 10:30     ` Huacai Chen
  0 siblings, 0 replies; 4+ messages in thread
From: Huacai Chen @ 2026-04-28 10:30 UTC (permalink / raw)
  To: Qiang Ma; +Cc: kernel, loongarch, linux-kernel

On Tue, Apr 28, 2026 at 6:08 PM Qiang Ma <maqianga@uniontech.com> wrote:
>
>
> 在 2026/4/28 17:37, Huacai Chen 写道:
> > https://lore.kernel.org/loongarch/20260228102946.4045-1-dongtai.guo@linux.dev/
> > https://lore.kernel.org/loongarch/20260428075231.2283151-1-maqianga@uniontech.com/T/#u
> >
> > What make you modify here again and again?
> Sorry, I didn't notice that the relevant patch had already been submitted.
> > Is this function ugly?
> > Is this function has bugs?
> No
> > Or for some other reasons?
>
> I noticed that with the addition of new features to the LoongArch
> architecture,
>
> new features can be conveniently added without constantly needing to add
> if statements, keeping the code concise.
cpuinfo are not always the same as hwcaps, stop please.

Huacai

>
> >
> >
> > Huacai
> >
> > On Tue, Apr 28, 2026 at 3:53 PM Qiang Ma <maqianga@uniontech.com> wrote:
> >> 1. Adds an hwcap_str[] mapping table, using KERNEL_HWCAP(x)
> >> (i.e., const_ilog2(HWCAP_LOONGARCH_x)) to map HWCAP bits
> >> to corresponding strings;
> >> 2. In show_cpuinfo(), iterates through hwcap_str in a loop,
> >> checks the bitmap of elf_hwcap, and prints the corresponding
> >> feature names;
> >> 3. Maintains the original output semantics (still printing
> >> the same feature names) to facilitate adding new CPU features
> >> in the future.
> >>
> >> Signed-off-by: Qiang Ma <maqianga@uniontech.com>
> >> ---
> >>   arch/loongarch/kernel/proc.c | 60 ++++++++++++++++--------------------
> >>   1 file changed, 26 insertions(+), 34 deletions(-)
> >>
> >> diff --git a/arch/loongarch/kernel/proc.c b/arch/loongarch/kernel/proc.c
> >> index d4ce5b585453..1188bffd66b6 100644
> >> --- a/arch/loongarch/kernel/proc.c
> >> +++ b/arch/loongarch/kernel/proc.c
> >> @@ -12,9 +12,32 @@
> >>   #include <asm/idle.h>
> >>   #include <asm/processor.h>
> >>   #include <asm/time.h>
> >> +#include <asm/cpufeature.h>
> >> +
> >> +#define KERNEL_HWCAP(x)  const_ilog2(HWCAP_LOONGARCH_ ## x)
> >> +static const char *const hwcap_str[] = {
> >> +       [KERNEL_HWCAP(CPUCFG)]          = "cpucfg",
> >> +       [KERNEL_HWCAP(LAM)]             = "lam",
> >> +       [KERNEL_HWCAP(LAM_BH)]          = "lam_bh",
> >> +       [KERNEL_HWCAP(UAL)]             = "ual",
> >> +       [KERNEL_HWCAP(FPU)]             = "fpu",
> >> +       [KERNEL_HWCAP(LSX)]             = "lsx",
> >> +       [KERNEL_HWCAP(LASX)]            = "lasx",
> >> +       [KERNEL_HWCAP(CRC32)]           = "crc32",
> >> +       [KERNEL_HWCAP(COMPLEX)]         = "complex",
> >> +       [KERNEL_HWCAP(CRYPTO)]          = "crypto",
> >> +       [KERNEL_HWCAP(LVZ)]             = "lvz",
> >> +       [KERNEL_HWCAP(LBT_X86)]         = "lbt_x86",
> >> +       [KERNEL_HWCAP(LBT_ARM)]         = "lbt_arm",
> >> +       [KERNEL_HWCAP(LBT_MIPS)]        = "lbt_mips",
> >> +       [KERNEL_HWCAP(PTW)]             = "ptw",
> >> +       [KERNEL_HWCAP(LSPW)]            = "lspw",
> >> +       [KERNEL_HWCAP(SCQ)]             = "scq",
> >> +};
> >>
> >>   static int show_cpuinfo(struct seq_file *m, void *v)
> >>   {
> >> +       unsigned int i;
> >>          unsigned long n = (unsigned long) v - 1;
> >>          unsigned int isa = cpu_data[n].isa_level;
> >>          unsigned int prid = cpu_data[n].processor_id;
> >> @@ -60,40 +83,9 @@ static int show_cpuinfo(struct seq_file *m, void *v)
> >>          seq_puts(m, "\n");
> >>
> >>          seq_puts(m, "Features\t\t:");
> >> -       if (cpu_has_cpucfg)
> >> -               seq_puts(m, " cpucfg");
> >> -       if (cpu_has_lam)
> >> -               seq_puts(m, " lam");
> >> -       if (cpu_has_lam_bh)
> >> -               seq_puts(m, " lam_bh");
> >> -       if (cpu_has_scq)
> >> -               seq_puts(m, " scq");
> >> -       if (cpu_has_ual)
> >> -               seq_puts(m, " ual");
> >> -       if (cpu_has_fpu)
> >> -               seq_puts(m, " fpu");
> >> -       if (cpu_has_lsx)
> >> -               seq_puts(m, " lsx");
> >> -       if (cpu_has_lasx)
> >> -               seq_puts(m, " lasx");
> >> -       if (cpu_has_crc32)
> >> -               seq_puts(m, " crc32");
> >> -       if (cpu_has_complex)
> >> -               seq_puts(m, " complex");
> >> -       if (cpu_has_crypto)
> >> -               seq_puts(m, " crypto");
> >> -       if (cpu_has_ptw)
> >> -               seq_puts(m, " ptw");
> >> -       if (cpu_has_lspw)
> >> -               seq_puts(m, " lspw");
> >> -       if (cpu_has_lvz)
> >> -               seq_puts(m, " lvz");
> >> -       if (cpu_has_lbt_x86)
> >> -               seq_puts(m, " lbt_x86");
> >> -       if (cpu_has_lbt_arm)
> >> -               seq_puts(m, " lbt_arm");
> >> -       if (cpu_has_lbt_mips)
> >> -               seq_puts(m, " lbt_mips");
> >> +       for (i = 0; i < ARRAY_SIZE(hwcap_str); i++)
> >> +               if (elf_hwcap & (1 << i))
> >> +                       seq_printf(m, " %s", hwcap_str[i]);
> >>          seq_puts(m, "\n");
> >>
> >>          seq_printf(m, "Hardware Watchpoint\t: %s", str_yes_no(cpu_has_watch));
> >> --
> >> 2.20.1
> >>

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2026-04-28 10:29 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-04-28  7:52 [PATCH] LoongArch: Refactor the Features output in show_cpuinfo() Qiang Ma
2026-04-28  9:37 ` Huacai Chen
2026-04-28 10:08   ` Qiang Ma
2026-04-28 10:30     ` Huacai Chen

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox