* [PATCH -next 0/3] arm64: Mark constants in .S files as data
@ 2022-09-22 13:04 Chen Zhongjin
2022-09-22 13:04 ` [PATCH -next 1/3] arm64: efi-header: Mark efi header " Chen Zhongjin
` (2 more replies)
0 siblings, 3 replies; 7+ messages in thread
From: Chen Zhongjin @ 2022-09-22 13:04 UTC (permalink / raw)
To: linux-kernel, linux-crypto, linux-arm-kernel
Cc: herbert, davem, catalin.marinas, will, broonie, ardb, maz,
mark.rutland, anshuman.khandual, chenzhongjin
There are some constant numbers insdide .S files which is mixed with
text sections. When tools are reading the ELF files they cannot
distinguish these constants out of normal instructions.
Mark these constants as data symbols by wrapping then with SYM_DATA
macro.
Chen Zhongjin (3):
arm64: efi-header: Mark efi header as data
arm64: head: Mark constants as data
arm64: crypto: Mark constant as data
arch/arm64/crypto/aes-neonbs-core.S | 14 +++++++-------
arch/arm64/crypto/poly1305-armv8.pl | 4 ++++
arch/arm64/crypto/polyval-ce-core.S | 7 +++----
arch/arm64/crypto/sha512-armv8.pl | 24 ++++++++++++++----------
arch/arm64/kernel/efi-header.S | 2 ++
arch/arm64/kernel/head.S | 6 ++++--
6 files changed, 34 insertions(+), 23 deletions(-)
--
2.17.1
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH -next 1/3] arm64: efi-header: Mark efi header as data
2022-09-22 13:04 [PATCH -next 0/3] arm64: Mark constants in .S files as data Chen Zhongjin
@ 2022-09-22 13:04 ` Chen Zhongjin
2022-09-22 13:13 ` Ard Biesheuvel
2022-09-22 13:04 ` [PATCH -next 2/3] arm64: head: Mark constants " Chen Zhongjin
2022-09-22 13:04 ` [PATCH -next 3/3] arm64: crypto: Mark constant " Chen Zhongjin
2 siblings, 1 reply; 7+ messages in thread
From: Chen Zhongjin @ 2022-09-22 13:04 UTC (permalink / raw)
To: linux-kernel, linux-crypto, linux-arm-kernel
Cc: herbert, davem, catalin.marinas, will, broonie, ardb, maz,
mark.rutland, anshuman.khandual, chenzhongjin
This file only contains a set of constants forming the efi header.
Make the constants part of data symbols by wrapping them with
SYM_DATA.
Signed-off-by: Julien Thierry <jthierry@redhat.com>
Signed-off-by: Chen Zhongjin <chenzhongjin@huawei.com>
Reviewed-by: Mark Brown <broonie@kernel.org>
---
| 2 ++
1 file changed, 2 insertions(+)
--git a/arch/arm64/kernel/efi-header.S b/arch/arm64/kernel/efi-header.S
index 28d8a5dca5f1..3eacd27ab761 100644
--- a/arch/arm64/kernel/efi-header.S
+++ b/arch/arm64/kernel/efi-header.S
@@ -28,6 +28,7 @@
.macro __EFI_PE_HEADER
#ifdef CONFIG_EFI
.set .Lpe_header_offset, . - .L_head
+SYM_DATA_START_LOCAL(arm64_efi_header)
.long PE_MAGIC
.short IMAGE_FILE_MACHINE_ARM64 // Machine
.short .Lsection_count // NumberOfSections
@@ -160,6 +161,7 @@
.balign SEGMENT_ALIGN
.Lefi_header_end:
+SYM_DATA_END_LABEL(arm64_efi_header, SYM_L_LOCAL, efi_header_end)
#else
.set .Lpe_header_offset, 0x0
#endif
--
2.17.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH -next 2/3] arm64: head: Mark constants as data
2022-09-22 13:04 [PATCH -next 0/3] arm64: Mark constants in .S files as data Chen Zhongjin
2022-09-22 13:04 ` [PATCH -next 1/3] arm64: efi-header: Mark efi header " Chen Zhongjin
@ 2022-09-22 13:04 ` Chen Zhongjin
2022-09-22 13:17 ` Ard Biesheuvel
2022-09-22 13:04 ` [PATCH -next 3/3] arm64: crypto: Mark constant " Chen Zhongjin
2 siblings, 1 reply; 7+ messages in thread
From: Chen Zhongjin @ 2022-09-22 13:04 UTC (permalink / raw)
To: linux-kernel, linux-crypto, linux-arm-kernel
Cc: herbert, davem, catalin.marinas, will, broonie, ardb, maz,
mark.rutland, anshuman.khandual, chenzhongjin
Add data annotations to constants part of the image header.
Signed-off-by: Julien Thierry <jthierry@redhat.com>
Signed-off-by: Chen Zhongjin <chenzhongjin@huawei.com>
Reviewed-by: Mark Brown <broonie@kernel.org>
---
arch/arm64/kernel/head.S | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/arch/arm64/kernel/head.S b/arch/arm64/kernel/head.S
index 814b6587ccb7..f298e88e2d23 100644
--- a/arch/arm64/kernel/head.S
+++ b/arch/arm64/kernel/head.S
@@ -57,9 +57,10 @@
/*
* DO NOT MODIFY. Image header expected by Linux boot-loaders.
*/
- efi_signature_nop // special NOP to identity as PE/COFF executable
+SYM_DATA_LOCAL(efi_nop, efi_signature_nop) // special NOP to identity as PE/COFF executable
b primary_entry // branch to kernel start, magic
- .quad 0 // Image load offset from start of RAM, little-endian
+SYM_DATA_LOCAL(_zero_reserved, .quad 0) // Image load offset from start of RAM, little-endian
+SYM_DATA_START_LOCAL(_arm64_common_header)
le64sym _kernel_size_le // Effective size of kernel image, little-endian
le64sym _kernel_flags_le // Informative flags, little-endian
.quad 0 // reserved
@@ -67,6 +68,7 @@
.quad 0 // reserved
.ascii ARM64_IMAGE_MAGIC // Magic number
.long .Lpe_header_offset // Offset to the PE header.
+SYM_DATA_END(_arm64_common_header)
__EFI_PE_HEADER
--
2.17.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH -next 3/3] arm64: crypto: Mark constant as data
2022-09-22 13:04 [PATCH -next 0/3] arm64: Mark constants in .S files as data Chen Zhongjin
2022-09-22 13:04 ` [PATCH -next 1/3] arm64: efi-header: Mark efi header " Chen Zhongjin
2022-09-22 13:04 ` [PATCH -next 2/3] arm64: head: Mark constants " Chen Zhongjin
@ 2022-09-22 13:04 ` Chen Zhongjin
2 siblings, 0 replies; 7+ messages in thread
From: Chen Zhongjin @ 2022-09-22 13:04 UTC (permalink / raw)
To: linux-kernel, linux-crypto, linux-arm-kernel
Cc: herbert, davem, catalin.marinas, will, broonie, ardb, maz,
mark.rutland, anshuman.khandual, chenzhongjin
Use SYM_DATA_* macros to annotate data bytes in the middle of .text
sections.
For local symbols, ".L" prefix needs to be dropped as the assembler
may exclude the symbols from the .o symbol table.
Signed-off-by: Julien Thierry <jthierry@redhat.com>
Signed-off-by: Chen Zhongjin <chenzhongjin@huawei.com>
Reviewed-by: Mark Brown <broonie@kernel.org>
---
arch/arm64/crypto/aes-neonbs-core.S | 14 +++++++-------
arch/arm64/crypto/poly1305-armv8.pl | 4 ++++
arch/arm64/crypto/polyval-ce-core.S | 7 +++----
arch/arm64/crypto/sha512-armv8.pl | 24 ++++++++++++++----------
4 files changed, 28 insertions(+), 21 deletions(-)
diff --git a/arch/arm64/crypto/aes-neonbs-core.S b/arch/arm64/crypto/aes-neonbs-core.S
index d427f4556b6e..fa161d1bf264 100644
--- a/arch/arm64/crypto/aes-neonbs-core.S
+++ b/arch/arm64/crypto/aes-neonbs-core.S
@@ -367,15 +367,15 @@
.align 6
-M0: .octa 0x0004080c0105090d02060a0e03070b0f
+SYM_DATA_LOCAL(M0, .octa 0x0004080c0105090d02060a0e03070b0f)
-M0SR: .octa 0x0004080c05090d010a0e02060f03070b
-SR: .octa 0x0f0e0d0c0a09080b0504070600030201
-SRM0: .octa 0x01060b0c0207080d0304090e00050a0f
+SYM_DATA_LOCAL(M0SR, .octa 0x0004080c05090d010a0e02060f03070b)
+SYM_DATA_LOCAL(SR, .octa 0x0f0e0d0c0a09080b0504070600030201)
+SYM_DATA_LOCAL(SRM0, .octa 0x01060b0c0207080d0304090e00050a0f)
-M0ISR: .octa 0x0004080c0d0105090a0e0206070b0f03
-ISR: .octa 0x0f0e0d0c080b0a090504070602010003
-ISRM0: .octa 0x0306090c00070a0d01040b0e0205080f
+SYM_DATA_LOCAL(M0ISR, .octa 0x0004080c0d0105090a0e0206070b0f03)
+SYM_DATA_LOCAL(ISR, .octa 0x0f0e0d0c080b0a090504070602010003)
+SYM_DATA_LOCAL(ISRM0, .octa 0x0306090c00070a0d01040b0e0205080f)
/*
* void aesbs_convert_key(u8 out[], u32 const rk[], int rounds)
diff --git a/arch/arm64/crypto/poly1305-armv8.pl b/arch/arm64/crypto/poly1305-armv8.pl
index cbc980fb02e3..f460f33c127a 100644
--- a/arch/arm64/crypto/poly1305-armv8.pl
+++ b/arch/arm64/crypto/poly1305-armv8.pl
@@ -47,6 +47,8 @@ my ($mac,$nonce)=($inp,$len);
my ($h0,$h1,$h2,$r0,$r1,$s1,$t0,$t1,$d0,$d1,$d2) = map("x$_",(4..14));
$code.=<<___;
+#include <linux/linkage.h>
+
#ifndef __KERNEL__
# include "arm_arch.h"
.extern OPENSSL_armcap_P
@@ -888,8 +890,10 @@ poly1305_blocks_neon:
.align 5
.Lzeros:
.long 0,0,0,0,0,0,0,0
+SYM_DATA_START_LOCAL(POLY1305_str)
.asciz "Poly1305 for ARMv8, CRYPTOGAMS by \@dot-asm"
.align 2
+SYM_DATA_END(POLY1305_str)
#if !defined(__KERNEL__) && !defined(_WIN64)
.comm OPENSSL_armcap_P,4,4
.hidden OPENSSL_armcap_P
diff --git a/arch/arm64/crypto/polyval-ce-core.S b/arch/arm64/crypto/polyval-ce-core.S
index b5326540d2e3..9026a787b0de 100644
--- a/arch/arm64/crypto/polyval-ce-core.S
+++ b/arch/arm64/crypto/polyval-ce-core.S
@@ -65,8 +65,7 @@ GSTAR .req v24
.arch armv8-a+crypto
.align 4
-.Lgstar:
- .quad 0xc200000000000000, 0xc200000000000000
+SYM_DATA_LOCAL(gstar, .quad 0xc200000000000000, 0xc200000000000000)
/*
* Computes the product of two 128-bit polynomials in X and Y and XORs the
@@ -309,7 +308,7 @@ GSTAR .req v24
* void pmull_polyval_mul(u8 *op1, const u8 *op2);
*/
SYM_FUNC_START(pmull_polyval_mul)
- adr TMP, .Lgstar
+ adr TMP, gstar
ld1 {GSTAR.2d}, [TMP]
ld1 {v0.16b}, [x0]
ld1 {v1.16b}, [x1]
@@ -334,7 +333,7 @@ SYM_FUNC_END(pmull_polyval_mul)
* size_t nblocks, u8 *accumulator);
*/
SYM_FUNC_START(pmull_polyval_update)
- adr TMP, .Lgstar
+ adr TMP, gstar
mov KEY_START, KEY_POWERS
ld1 {GSTAR.2d}, [TMP]
ld1 {SUM.16b}, [ACCUMULATOR]
diff --git a/arch/arm64/crypto/sha512-armv8.pl b/arch/arm64/crypto/sha512-armv8.pl
index 35ec9ae99fe1..1882c4110026 100644
--- a/arch/arm64/crypto/sha512-armv8.pl
+++ b/arch/arm64/crypto/sha512-armv8.pl
@@ -193,6 +193,8 @@ ___
}
$code.=<<___;
+#include <linux/linkage.h>
+
#ifndef __KERNEL__
# include "arm_arch.h"
#endif
@@ -208,11 +210,11 @@ ___
$code.=<<___ if ($SZ==4);
#ifndef __KERNEL__
# ifdef __ILP32__
- ldrsw x16,.LOPENSSL_armcap_P
+ ldrsw x16,OPENSSL_armcap_P_rel
# else
- ldr x16,.LOPENSSL_armcap_P
+ ldr x16,OPENSSL_armcap_P_rel
# endif
- adr x17,.LOPENSSL_armcap_P
+ adr x17,OPENSSL_armcap_P_rel
add x16,x16,x17
ldr w16,[x16]
tst w16,#ARMV8_SHA256
@@ -237,7 +239,7 @@ $code.=<<___;
ldp $E,$F,[$ctx,#4*$SZ]
add $num,$inp,$num,lsl#`log(16*$SZ)/log(2)` // end of input
ldp $G,$H,[$ctx,#6*$SZ]
- adr $Ktbl,.LK$BITS
+ adr $Ktbl,K$BITS
stp $ctx,$num,[x29,#96]
.Loop:
@@ -287,8 +289,7 @@ $code.=<<___;
.size $func,.-$func
.align 6
-.type .LK$BITS,%object
-.LK$BITS:
+SYM_DATA_START_LOCAL(K$BITS)
___
$code.=<<___ if ($SZ==8);
.quad 0x428a2f98d728ae22,0x7137449123ef65cd
@@ -353,18 +354,21 @@ $code.=<<___ if ($SZ==4);
.long 0 //terminator
___
$code.=<<___;
-.size .LK$BITS,.-.LK$BITS
+SYM_DATA_END(K$BITS)
#ifndef __KERNEL__
.align 3
-.LOPENSSL_armcap_P:
+SYM_DATA_START_LOCAL(OPENSSL_armcap_P_rel)
# ifdef __ILP32__
.long OPENSSL_armcap_P-.
# else
.quad OPENSSL_armcap_P-.
# endif
+SYM_DATA_END(OPENSSL_armcap_P_rel)
#endif
+SYM_DATA_START_LOCAL(OPENSSL_str)
.asciz "SHA$BITS block transform for ARMv8, CRYPTOGAMS by <appro\@openssl.org>"
.align 2
+SYM_DATA_END(OPENSSL_str)
___
if ($SZ==4) {
@@ -385,7 +389,7 @@ sha256_block_armv8:
add x29,sp,#0
ld1.32 {$ABCD,$EFGH},[$ctx]
- adr $Ktbl,.LK256
+ adr $Ktbl,K256
.Loop_hw:
ld1 {@MSG[0]-@MSG[3]},[$inp],#64
@@ -648,7 +652,7 @@ sha256_block_neon:
mov x29, sp
sub sp,sp,#16*4
- adr $Ktbl,.LK256
+ adr $Ktbl,K256
add $num,$inp,$num,lsl#6 // len to point at the end of inp
ld1.8 {@X[0]},[$inp], #16
--
2.17.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH -next 1/3] arm64: efi-header: Mark efi header as data
2022-09-22 13:04 ` [PATCH -next 1/3] arm64: efi-header: Mark efi header " Chen Zhongjin
@ 2022-09-22 13:13 ` Ard Biesheuvel
2022-09-22 14:25 ` Chen Zhongjin
0 siblings, 1 reply; 7+ messages in thread
From: Ard Biesheuvel @ 2022-09-22 13:13 UTC (permalink / raw)
To: Chen Zhongjin
Cc: linux-kernel, linux-crypto, linux-arm-kernel, herbert, davem,
catalin.marinas, will, broonie, maz, mark.rutland,
anshuman.khandual
On Thu, 22 Sept 2022 at 15:08, Chen Zhongjin <chenzhongjin@huawei.com> wrote:
>
> This file only contains a set of constants forming the efi header.
>
> Make the constants part of data symbols by wrapping them with
> SYM_DATA.
>
> Signed-off-by: Julien Thierry <jthierry@redhat.com>
> Signed-off-by: Chen Zhongjin <chenzhongjin@huawei.com>
> Reviewed-by: Mark Brown <broonie@kernel.org>
Why is this necessary? These are not emitted into a .text section, and
are not even covered by the kernel's mapping of memory. So the .L
prefixed labels are deliberate: it prevents the symbols from polluting
the symbol namespace with symbols pointing nowhere.
> ---
> arch/arm64/kernel/efi-header.S | 2 ++
> 1 file changed, 2 insertions(+)
>
> diff --git a/arch/arm64/kernel/efi-header.S b/arch/arm64/kernel/efi-header.S
> index 28d8a5dca5f1..3eacd27ab761 100644
> --- a/arch/arm64/kernel/efi-header.S
> +++ b/arch/arm64/kernel/efi-header.S
> @@ -28,6 +28,7 @@
> .macro __EFI_PE_HEADER
> #ifdef CONFIG_EFI
> .set .Lpe_header_offset, . - .L_head
> +SYM_DATA_START_LOCAL(arm64_efi_header)
> .long PE_MAGIC
> .short IMAGE_FILE_MACHINE_ARM64 // Machine
> .short .Lsection_count // NumberOfSections
> @@ -160,6 +161,7 @@
>
> .balign SEGMENT_ALIGN
> .Lefi_header_end:
> +SYM_DATA_END_LABEL(arm64_efi_header, SYM_L_LOCAL, efi_header_end)
> #else
> .set .Lpe_header_offset, 0x0
> #endif
> --
> 2.17.1
>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH -next 2/3] arm64: head: Mark constants as data
2022-09-22 13:04 ` [PATCH -next 2/3] arm64: head: Mark constants " Chen Zhongjin
@ 2022-09-22 13:17 ` Ard Biesheuvel
0 siblings, 0 replies; 7+ messages in thread
From: Ard Biesheuvel @ 2022-09-22 13:17 UTC (permalink / raw)
To: Chen Zhongjin
Cc: linux-kernel, linux-crypto, linux-arm-kernel, herbert, davem,
catalin.marinas, will, broonie, maz, mark.rutland,
anshuman.khandual
On Thu, 22 Sept 2022 at 15:08, Chen Zhongjin <chenzhongjin@huawei.com> wrote:
>
> Add data annotations to constants part of the image header.
>
> Signed-off-by: Julien Thierry <jthierry@redhat.com>
> Signed-off-by: Chen Zhongjin <chenzhongjin@huawei.com>
> Reviewed-by: Mark Brown <broonie@kernel.org>
> ---
> arch/arm64/kernel/head.S | 6 ++++--
> 1 file changed, 4 insertions(+), 2 deletions(-)
>
> diff --git a/arch/arm64/kernel/head.S b/arch/arm64/kernel/head.S
> index 814b6587ccb7..f298e88e2d23 100644
> --- a/arch/arm64/kernel/head.S
> +++ b/arch/arm64/kernel/head.S
> @@ -57,9 +57,10 @@
> /*
> * DO NOT MODIFY. Image header expected by Linux boot-loaders.
> */
> - efi_signature_nop // special NOP to identity as PE/COFF executable
> +SYM_DATA_LOCAL(efi_nop, efi_signature_nop) // special NOP to identity as PE/COFF executable
This is an instruction not data
> b primary_entry // branch to kernel start, magic
> - .quad 0 // Image load offset from start of RAM, little-endian
> +SYM_DATA_LOCAL(_zero_reserved, .quad 0) // Image load offset from start of RAM, little-endian
Why convert this quad? And why does it need a symbol?
> +SYM_DATA_START_LOCAL(_arm64_common_header)
> le64sym _kernel_size_le // Effective size of kernel image, little-endian
> le64sym _kernel_flags_le // Informative flags, little-endian
> .quad 0 // reserved
But not this one?
> @@ -67,6 +68,7 @@
> .quad 0 // reserved
> .ascii ARM64_IMAGE_MAGIC // Magic number
> .long .Lpe_header_offset // Offset to the PE header.
> +SYM_DATA_END(_arm64_common_header)
>
> __EFI_PE_HEADER
>
> --
> 2.17.1
>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH -next 1/3] arm64: efi-header: Mark efi header as data
2022-09-22 13:13 ` Ard Biesheuvel
@ 2022-09-22 14:25 ` Chen Zhongjin
0 siblings, 0 replies; 7+ messages in thread
From: Chen Zhongjin @ 2022-09-22 14:25 UTC (permalink / raw)
To: Ard Biesheuvel
Cc: linux-kernel, linux-crypto, linux-arm-kernel, herbert, davem,
catalin.marinas, will, broonie, maz, mark.rutland,
anshuman.khandual
Hi,
On 2022/9/22 21:13, Ard Biesheuvel wrote:
> On Thu, 22 Sept 2022 at 15:08, Chen Zhongjin <chenzhongjin@huawei.com> wrote:
>> This file only contains a set of constants forming the efi header.
>>
>> Make the constants part of data symbols by wrapping them with
>> SYM_DATA.
>>
>> Signed-off-by: Julien Thierry <jthierry@redhat.com>
>> Signed-off-by: Chen Zhongjin <chenzhongjin@huawei.com>
>> Reviewed-by: Mark Brown <broonie@kernel.org>
> Why is this necessary? These are not emitted into a .text section, and
> are not even covered by the kernel's mapping of memory. So the .L
> prefixed labels are deliberate: it prevents the symbols from polluting
> the symbol namespace with symbols pointing nowhere.
>
This is basically because when I'm developing objtool and these
constants will disrupts
the instruction decoding so I just mark them as x86 did.
I tried to sent this patch set is because now the objtool patch set is
growing huge so I
want to split some independent part. But now I found you are right that
this are
meaningless. They are not even inside vmlinux. I'll discard them.
Sorry for bothering and thanks for your advise and patient!
Best,
Chen
>> ---
>> arch/arm64/kernel/efi-header.S | 2 ++
>> 1 file changed, 2 insertions(+)
>>
>> diff --git a/arch/arm64/kernel/efi-header.S b/arch/arm64/kernel/efi-header.S
>> index 28d8a5dca5f1..3eacd27ab761 100644
>> --- a/arch/arm64/kernel/efi-header.S
>> +++ b/arch/arm64/kernel/efi-header.S
>> @@ -28,6 +28,7 @@
>> .macro __EFI_PE_HEADER
>> #ifdef CONFIG_EFI
>> .set .Lpe_header_offset, . - .L_head
>> +SYM_DATA_START_LOCAL(arm64_efi_header)
>> .long PE_MAGIC
>> .short IMAGE_FILE_MACHINE_ARM64 // Machine
>> .short .Lsection_count // NumberOfSections
>> @@ -160,6 +161,7 @@
>>
>> .balign SEGMENT_ALIGN
>> .Lefi_header_end:
>> +SYM_DATA_END_LABEL(arm64_efi_header, SYM_L_LOCAL, efi_header_end)
>> #else
>> .set .Lpe_header_offset, 0x0
>> #endif
>> --
>> 2.17.1
>>
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2022-09-22 14:26 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-09-22 13:04 [PATCH -next 0/3] arm64: Mark constants in .S files as data Chen Zhongjin
2022-09-22 13:04 ` [PATCH -next 1/3] arm64: efi-header: Mark efi header " Chen Zhongjin
2022-09-22 13:13 ` Ard Biesheuvel
2022-09-22 14:25 ` Chen Zhongjin
2022-09-22 13:04 ` [PATCH -next 2/3] arm64: head: Mark constants " Chen Zhongjin
2022-09-22 13:17 ` Ard Biesheuvel
2022-09-22 13:04 ` [PATCH -next 3/3] arm64: crypto: Mark constant " Chen Zhongjin
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).