Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
2c522955
Commit
2c522955
authored
Apr 23, 2002
by
David Mosberger
Browse files
Options
Browse Files
Download
Plain Diff
Merge wailua.hpl.hp.com:/bk/vanilla/linux-2.5
into wailua.hpl.hp.com:/bk/lia64/to-linus-2.5
parents
45fbecb1
25439a10
Changes
12
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
145 additions
and
1877 deletions
+145
-1877
arch/ia64/config.in
arch/ia64/config.in
+2
-1
arch/ia64/hp/common/sba_iommu.c
arch/ia64/hp/common/sba_iommu.c
+10
-1848
arch/ia64/hp/zx1/hpzx1_misc.c
arch/ia64/hp/zx1/hpzx1_misc.c
+7
-7
arch/ia64/kernel/acpi.c
arch/ia64/kernel/acpi.c
+93
-5
arch/ia64/kernel/iosapic.c
arch/ia64/kernel/iosapic.c
+7
-1
arch/ia64/kernel/traps.c
arch/ia64/kernel/traps.c
+4
-0
arch/ia64/lib/copy_page.S
arch/ia64/lib/copy_page.S
+6
-2
include/asm-ia64/acpi.h
include/asm-ia64/acpi.h
+1
-0
include/asm-ia64/page.h
include/asm-ia64/page.h
+1
-1
include/asm-ia64/siginfo.h
include/asm-ia64/siginfo.h
+2
-1
include/asm-ia64/sn/sn2/shub_md.h
include/asm-ia64/sn/sn2/shub_md.h
+9
-11
include/asm-ia64/system.h
include/asm-ia64/system.h
+3
-0
No files found.
arch/ia64/config.in
View file @
2c522955
...
@@ -83,7 +83,7 @@ fi
...
@@ -83,7 +83,7 @@ fi
define_bool CONFIG_KCORE_ELF y # On IA-64, we always want an ELF /proc/kcore.
define_bool CONFIG_KCORE_ELF y # On IA-64, we always want an ELF /proc/kcore.
bool 'SMP support' CONFIG_SMP
bool 'SMP support' CONFIG_SMP
tristate
'Support running of Linux/x86 binaries' CONFIG_IA32_SUPPORT
bool
'Support running of Linux/x86 binaries' CONFIG_IA32_SUPPORT
bool 'Performance monitor support' CONFIG_PERFMON
bool 'Performance monitor support' CONFIG_PERFMON
tristate '/proc/pal support' CONFIG_IA64_PALINFO
tristate '/proc/pal support' CONFIG_IA64_PALINFO
tristate '/proc/efi/vars support' CONFIG_EFI_VARS
tristate '/proc/efi/vars support' CONFIG_EFI_VARS
...
@@ -123,6 +123,7 @@ source drivers/block/Config.in
...
@@ -123,6 +123,7 @@ source drivers/block/Config.in
source drivers/ieee1394/Config.in
source drivers/ieee1394/Config.in
source drivers/message/i2o/Config.in
source drivers/message/i2o/Config.in
source drivers/md/Config.in
source drivers/md/Config.in
source drivers/message/fusion/Config.in
mainmenu_option next_comment
mainmenu_option next_comment
comment 'ATA/IDE/MFM/RLL support'
comment 'ATA/IDE/MFM/RLL support'
...
...
arch/ia64/hp/common/sba_iommu.c
View file @
2c522955
This diff is collapsed.
Click to expand it.
arch/ia64/hp/zx1/hpzx1_misc.c
View file @
2c522955
...
@@ -42,7 +42,7 @@ struct fake_pci_dev {
...
@@ -42,7 +42,7 @@ struct fake_pci_dev {
static
struct
fake_pci_dev
*
fake_pci_head
,
**
fake_pci_tail
=
&
fake_pci_head
;
static
struct
fake_pci_dev
*
fake_pci_head
,
**
fake_pci_tail
=
&
fake_pci_head
;
static
struct
pci_ops
orig_pci_ops
;
static
struct
pci_ops
*
orig_pci_ops
;
static
inline
struct
fake_pci_dev
*
static
inline
struct
fake_pci_dev
*
fake_pci_find_slot
(
unsigned
char
bus
,
unsigned
int
devfn
)
fake_pci_find_slot
(
unsigned
char
bus
,
unsigned
int
devfn
)
...
@@ -77,7 +77,7 @@ static int hp_cfg_read##sz (struct pci_dev *dev, int where, u##bits *value) \
...
@@ -77,7 +77,7 @@ static int hp_cfg_read##sz (struct pci_dev *dev, int where, u##bits *value) \
{ \
{ \
struct fake_pci_dev *fake_dev; \
struct fake_pci_dev *fake_dev; \
if (!(fake_dev = fake_pci_find_slot(dev->bus->number, dev->devfn))) \
if (!(fake_dev = fake_pci_find_slot(dev->bus->number, dev->devfn))) \
return orig_pci_ops
.
name(dev, where, value); \
return orig_pci_ops
->
name(dev, where, value); \
\
\
switch (where) { \
switch (where) { \
case PCI_COMMAND: \
case PCI_COMMAND: \
...
@@ -105,7 +105,7 @@ static int hp_cfg_write##sz (struct pci_dev *dev, int where, u##bits value) \
...
@@ -105,7 +105,7 @@ static int hp_cfg_write##sz (struct pci_dev *dev, int where, u##bits value) \
{ \
{ \
struct fake_pci_dev *fake_dev; \
struct fake_pci_dev *fake_dev; \
if (!(fake_dev = fake_pci_find_slot(dev->bus->number, dev->devfn))) \
if (!(fake_dev = fake_pci_find_slot(dev->bus->number, dev->devfn))) \
return orig_pci_ops
.
name(dev, where, value); \
return orig_pci_ops
->
name(dev, where, value); \
\
\
switch (where) { \
switch (where) { \
case PCI_BASE_ADDRESS_0: \
case PCI_BASE_ADDRESS_0: \
...
@@ -295,7 +295,7 @@ hpzx1_lba_probe(acpi_handle obj, u32 depth, void *context, void **ret)
...
@@ -295,7 +295,7 @@ hpzx1_lba_probe(acpi_handle obj, u32 depth, void *context, void **ret)
if
(
status
!=
AE_OK
)
if
(
status
!=
AE_OK
)
return
status
;
return
status
;
status
=
acpi_
cf_evaluate_method
(
obj
,
METHOD_NAME__BBN
,
&
busnum
);
status
=
acpi_
evaluate_integer
(
obj
,
METHOD_NAME__BBN
,
NULL
,
&
busnum
);
if
(
ACPI_FAILURE
(
status
))
{
if
(
ACPI_FAILURE
(
status
))
{
printk
(
KERN_ERR
PFX
"evaluate _BBN fail=0x%x
\n
"
,
status
);
printk
(
KERN_ERR
PFX
"evaluate _BBN fail=0x%x
\n
"
,
status
);
busnum
=
0
;
// no _BBN; stick it on bus 0
busnum
=
0
;
// no _BBN; stick it on bus 0
...
@@ -313,7 +313,7 @@ hpzx1_lba_probe(acpi_handle obj, u32 depth, void *context, void **ret)
...
@@ -313,7 +313,7 @@ hpzx1_lba_probe(acpi_handle obj, u32 depth, void *context, void **ret)
static
void
static
void
hpzx1_acpi_dev_init
(
void
)
hpzx1_acpi_dev_init
(
void
)
{
{
extern
struct
pci_ops
pci_conf
;
extern
struct
pci_ops
*
pci_root_ops
;
/*
/*
* Make fake PCI devices for the following hardware in the
* Make fake PCI devices for the following hardware in the
...
@@ -383,8 +383,8 @@ hpzx1_acpi_dev_init(void)
...
@@ -383,8 +383,8 @@ hpzx1_acpi_dev_init(void)
/*
/*
* Replace PCI ops, but only if we made fake devices.
* Replace PCI ops, but only if we made fake devices.
*/
*/
orig_pci_ops
=
pci_
conf
;
orig_pci_ops
=
pci_
root_ops
;
pci_
conf
=
hp_pci_conf
;
pci_
root_ops
=
&
hp_pci_conf
;
}
}
extern
void
sba_init
(
void
);
extern
void
sba_init
(
void
);
...
...
arch/ia64/kernel/acpi.c
View file @
2c522955
...
@@ -56,18 +56,43 @@ asm (".weak iosapic_version");
...
@@ -56,18 +56,43 @@ asm (".weak iosapic_version");
void
(
*
pm_idle
)
(
void
);
void
(
*
pm_idle
)
(
void
);
void
(
*
pm_power_off
)
(
void
);
void
(
*
pm_power_off
)
(
void
);
/*
* TBD: Should go away once we have an ACPI parser.
*/
const
char
*
const
char
*
acpi_get_sysname
(
void
)
acpi_get_sysname
(
void
)
{
{
#ifdef CONFIG_IA64_GENERIC
#ifdef CONFIG_IA64_GENERIC
return
"hpsim"
;
unsigned
long
rsdp_phys
=
0
;
struct
acpi20_table_rsdp
*
rsdp
;
struct
acpi_table_xsdt
*
xsdt
;
struct
acpi_table_header
*
hdr
;
if
((
0
!=
acpi_find_rsdp
(
&
rsdp_phys
))
||
!
rsdp_phys
)
{
printk
(
"ACPI 2.0 RSDP not found, default to
\"
dig
\"\n
"
);
return
"dig"
;
}
rsdp
=
(
struct
acpi20_table_rsdp
*
)
__va
(
rsdp_phys
);
if
(
strncmp
(
rsdp
->
signature
,
RSDP_SIG
,
sizeof
(
RSDP_SIG
)
-
1
))
{
printk
(
"ACPI 2.0 RSDP signature incorrect, default to
\"
dig
\"\n
"
);
return
"dig"
;
}
xsdt
=
(
struct
acpi_table_xsdt
*
)
__va
(
rsdp
->
xsdt_address
);
hdr
=
&
xsdt
->
header
;
if
(
strncmp
(
hdr
->
signature
,
XSDT_SIG
,
sizeof
(
XSDT_SIG
)
-
1
))
{
printk
(
"ACPI 2.0 XSDT signature incorrect, default to
\"
dig
\"\n
"
);
return
"dig"
;
}
if
(
!
strcmp
(
hdr
->
oem_id
,
"HP"
))
{
return
"hpzx1"
;
}
return
"dig"
;
#else
#else
# if defined (CONFIG_IA64_HP_SIM)
# if defined (CONFIG_IA64_HP_SIM)
return
"hpsim"
;
return
"hpsim"
;
# elif defined (CONFIG_IA64_HP_ZX1)
return
"hpzx1"
;
# elif defined (CONFIG_IA64_SGI_SN1)
# elif defined (CONFIG_IA64_SGI_SN1)
return
"sn1"
;
return
"sn1"
;
# elif defined (CONFIG_IA64_SGI_SN2)
# elif defined (CONFIG_IA64_SGI_SN2)
...
@@ -80,6 +105,69 @@ acpi_get_sysname (void)
...
@@ -80,6 +105,69 @@ acpi_get_sysname (void)
#endif
#endif
}
}
#ifdef CONFIG_ACPI
/**
* acpi_get_crs - Return the current resource settings for a device
* obj: A handle for this device
* buf: A buffer to be populated by this call.
*
* Pass a valid handle, typically obtained by walking the namespace and a
* pointer to an allocated buffer, and this function will fill in the buffer
* with a list of acpi_resource structures.
*/
acpi_status
acpi_get_crs
(
acpi_handle
obj
,
acpi_buffer
*
buf
)
{
acpi_status
result
;
buf
->
length
=
0
;
buf
->
pointer
=
NULL
;
result
=
acpi_get_current_resources
(
obj
,
buf
);
if
(
result
!=
AE_BUFFER_OVERFLOW
)
return
result
;
buf
->
pointer
=
kmalloc
(
buf
->
length
,
GFP_KERNEL
);
if
(
!
buf
->
pointer
)
return
-
ENOMEM
;
result
=
acpi_get_current_resources
(
obj
,
buf
);
return
result
;
}
acpi_resource
*
acpi_get_crs_next
(
acpi_buffer
*
buf
,
int
*
offset
)
{
acpi_resource
*
res
;
if
(
*
offset
>=
buf
->
length
)
return
NULL
;
res
=
buf
->
pointer
+
*
offset
;
*
offset
+=
res
->
length
;
return
res
;
}
acpi_resource_data
*
acpi_get_crs_type
(
acpi_buffer
*
buf
,
int
*
offset
,
int
type
)
{
for
(;;)
{
acpi_resource
*
res
=
acpi_get_crs_next
(
buf
,
offset
);
if
(
!
res
)
return
NULL
;
if
(
res
->
id
==
type
)
return
&
res
->
data
;
}
}
void
acpi_dispose_crs
(
acpi_buffer
*
buf
)
{
kfree
(
buf
->
pointer
);
}
#endif
/* CONFIG_ACPI */
#ifdef CONFIG_ACPI_BOOT
#ifdef CONFIG_ACPI_BOOT
#define ACPI_MAX_PLATFORM_IRQS 256
#define ACPI_MAX_PLATFORM_IRQS 256
...
...
arch/ia64/kernel/iosapic.c
View file @
2c522955
...
@@ -23,6 +23,7 @@
...
@@ -23,6 +23,7 @@
* iosapic_set_affinity(), initializations for
* iosapic_set_affinity(), initializations for
* /proc/irq/#/smp_affinity
* /proc/irq/#/smp_affinity
* 02/04/02 P. Diefenbaugh Cleaned up ACPI PCI IRQ routing.
* 02/04/02 P. Diefenbaugh Cleaned up ACPI PCI IRQ routing.
* 02/04/18 J.I. Lee bug fix in iosapic_init_pci_irq
*/
*/
/*
/*
* Here is what the interrupt logic between a PCI device and the CPU looks like:
* Here is what the interrupt logic between a PCI device and the CPU looks like:
...
@@ -70,7 +71,7 @@
...
@@ -70,7 +71,7 @@
#undef DEBUG_IRQ_ROUTING
#undef DEBUG_IRQ_ROUTING
#undef
OVERRIDE_DEBUG
#undef
OVERRIDE_DEBUG
static
spinlock_t
iosapic_lock
=
SPIN_LOCK_UNLOCKED
;
static
spinlock_t
iosapic_lock
=
SPIN_LOCK_UNLOCKED
;
...
@@ -676,6 +677,11 @@ iosapic_init_pci_irq (void)
...
@@ -676,6 +677,11 @@ iosapic_init_pci_irq (void)
pci_irq
.
route
[
i
].
bus
,
pci_irq
.
route
[
i
].
pci_id
>>
16
,
pci_irq
.
route
[
i
].
pin
,
pci_irq
.
route
[
i
].
bus
,
pci_irq
.
route
[
i
].
pci_id
>>
16
,
pci_irq
.
route
[
i
].
pin
,
iosapic_irq
[
vector
].
base_irq
+
iosapic_irq
[
vector
].
pin
,
vector
);
iosapic_irq
[
vector
].
base_irq
+
iosapic_irq
[
vector
].
pin
,
vector
);
#endif
#endif
/*
* Forget not to program the IOSAPIC RTE per ACPI _PRT
*/
set_rte
(
vector
,
(
ia64_get_lid
()
>>
16
)
&
0xffff
);
}
}
}
}
...
...
arch/ia64/kernel/traps.c
View file @
2c522955
...
@@ -186,6 +186,10 @@ ia64_bad_break (unsigned long break_num, struct pt_regs *regs)
...
@@ -186,6 +186,10 @@ ia64_bad_break (unsigned long break_num, struct pt_regs *regs)
sig
=
SIGSEGV
;
code
=
__SEGV_PSTKOVF
;
sig
=
SIGSEGV
;
code
=
__SEGV_PSTKOVF
;
break
;
break
;
case
0x3f000
...
0x3ffff
:
/* bundle-update in progress */
sig
=
SIGILL
;
code
=
__ILL_BNDMOD
;
break
;
default:
default:
if
(
break_num
<
0x40000
||
break_num
>
0x100000
)
if
(
break_num
<
0x40000
||
break_num
>
0x100000
)
die_if_kernel
(
"Bad break"
,
regs
,
break_num
);
die_if_kernel
(
"Bad break"
,
regs
,
break_num
);
...
...
arch/ia64/lib/copy_page.S
View file @
2c522955
...
@@ -30,6 +30,7 @@
...
@@ -30,6 +30,7 @@
#define tgt2 r23
#define tgt2 r23
#define srcf r24
#define srcf r24
#define tgtf r25
#define tgtf r25
#define tgt_last r26
#define Nrot ((8*PIPE_DEPTH+7)&~7)
#define Nrot ((8*PIPE_DEPTH+7)&~7)
...
@@ -55,18 +56,21 @@ GLOBAL_ENTRY(copy_page)
...
@@ -55,18 +56,21 @@ GLOBAL_ENTRY(copy_page)
mov
src1
=
in1
mov
src1
=
in1
adds
src2
=
8
,
in1
adds
src2
=
8
,
in1
mov
tgt_last
=
PAGE_SIZE
;;
;;
adds
tgt2
=
8
,
in0
adds
tgt2
=
8
,
in0
add
srcf
=
512
,
in1
add
srcf
=
512
,
in1
mov
ar
.
lc
=
lcount
mov
ar
.
lc
=
lcount
mov
tgt1
=
in0
mov
tgt1
=
in0
add
tgtf
=
512
,
in0
add
tgtf
=
512
,
in0
add
tgt_last
=
tgt_last
,
in0
;;
;;
1
:
1
:
(
p
[
0
])
ld8
t1
[
0
]=[
src1
],
16
(
p
[
0
])
ld8
t1
[
0
]=[
src1
],
16
(
EPI
)
st8
[
tgt1
]=
t1
[
PIPE_DEPTH
-
1
],
16
(
EPI
)
st8
[
tgt1
]=
t1
[
PIPE_DEPTH
-
1
],
16
(
p
[
0
])
ld8
t2
[
0
]=[
src2
],
16
(
p
[
0
])
ld8
t2
[
0
]=[
src2
],
16
(
EPI
)
st8
[
tgt2
]=
t2
[
PIPE_DEPTH
-
1
],
16
(
EPI
)
st8
[
tgt2
]=
t2
[
PIPE_DEPTH
-
1
],
16
cmp.ltu
p6
,
p0
=
tgtf
,
tgt_last
;;
;;
(
p
[
0
])
ld8
t3
[
0
]=[
src1
],
16
(
p
[
0
])
ld8
t3
[
0
]=[
src1
],
16
(
EPI
)
st8
[
tgt1
]=
t3
[
PIPE_DEPTH
-
1
],
16
(
EPI
)
st8
[
tgt1
]=
t3
[
PIPE_DEPTH
-
1
],
16
...
@@ -83,8 +87,8 @@ GLOBAL_ENTRY(copy_page)
...
@@ -83,8 +87,8 @@ GLOBAL_ENTRY(copy_page)
(
p
[
0
])
ld8
t8
[
0
]=[
src2
],
16
(
p
[
0
])
ld8
t8
[
0
]=[
src2
],
16
(
EPI
)
st8
[
tgt2
]=
t8
[
PIPE_DEPTH
-
1
],
16
(
EPI
)
st8
[
tgt2
]=
t8
[
PIPE_DEPTH
-
1
],
16
lfetch
[
srcf
],
64
(
p6
)
lfetch
[
srcf
],
64
lfetch
[
tgtf
],
64
(
p6
)
lfetch
[
tgtf
],
64
br.ctop.sptk.few
1
b
br.ctop.sptk.few
1
b
;;
;;
mov
pr
=
saved_pr
,
0xffffffffffff0000
//
restore
predicates
mov
pr
=
saved_pr
,
0xffffffffffff0000
//
restore
predicates
...
...
include/asm-ia64/acpi.h
View file @
2c522955
...
@@ -32,6 +32,7 @@
...
@@ -32,6 +32,7 @@
#define __acpi_map_table(phys_addr, size) __va(phys_addr)
#define __acpi_map_table(phys_addr, size) __va(phys_addr)
const
char
*
acpi_get_sysname
(
void
);
int
acpi_boot_init
(
char
*
cdline
);
int
acpi_boot_init
(
char
*
cdline
);
int
acpi_find_rsdp
(
unsigned
long
*
phys_addr
);
int
acpi_find_rsdp
(
unsigned
long
*
phys_addr
);
int
acpi_request_vector
(
u32
int_type
);
int
acpi_request_vector
(
u32
int_type
);
...
...
include/asm-ia64/page.h
View file @
2c522955
...
@@ -71,7 +71,7 @@ do { \
...
@@ -71,7 +71,7 @@ do { \
#ifdef CONFIG_IA64_GENERIC
#ifdef CONFIG_IA64_GENERIC
# include <asm/machvec.h>
# include <asm/machvec.h>
# define virt_to_page(kaddr) (mem_map + platform_map_nr(kaddr))
# define virt_to_page(kaddr) (mem_map + platform_map_nr(kaddr))
# define page_to_phys(page)
XXX fix me
# define page_to_phys(page)
((page - mem_map) << PAGE_SHIFT)
#elif defined (CONFIG_IA64_SGI_SN1)
#elif defined (CONFIG_IA64_SGI_SN1)
# ifndef CONFIG_DISCONTIGMEM
# ifndef CONFIG_DISCONTIGMEM
# define virt_to_page(kaddr) (mem_map + MAP_NR_DENSE(kaddr))
# define virt_to_page(kaddr) (mem_map + MAP_NR_DENSE(kaddr))
...
...
include/asm-ia64/siginfo.h
View file @
2c522955
...
@@ -154,7 +154,8 @@ typedef struct siginfo {
...
@@ -154,7 +154,8 @@ typedef struct siginfo {
#define ILL_BADSTK (__SI_FAULT|8)
/* internal stack error */
#define ILL_BADSTK (__SI_FAULT|8)
/* internal stack error */
#define ILL_BADIADDR (__SI_FAULT|9)
/* unimplemented instruction address */
#define ILL_BADIADDR (__SI_FAULT|9)
/* unimplemented instruction address */
#define __ILL_BREAK (__SI_FAULT|10)
/* illegal break */
#define __ILL_BREAK (__SI_FAULT|10)
/* illegal break */
#define NSIGILL 10
#define __ILL_BNDMOD (__SI_FAULT|11)
/* bundle-update (modification) in progress */
#define NSIGILL 11
/*
/*
* SIGFPE si_codes
* SIGFPE si_codes
...
...
include/asm-ia64/sn/sn2/shub_md.h
View file @
2c522955
/**************************************************************************
/*
* *
*
* Copyright (C) 2001 Silicon Graphics, Inc. All rights reserved. *
* This file is subject to the terms and conditions of the GNU General Public
* *
* License. See the file "COPYING" in the main directory of this archive
* These coded instructions, statements, and computer programs contain *
* for more details.
* unpublished proprietary information of Silicon Graphics, Inc., and *
*
* are protected by Federal copyright law. They may not be disclosed *
* Copyright (c) 2001, 2002 Silicon Graphics, Inc. All rights reserved.
* to third parties or copied or duplicated in any form, in whole or *
*/
* in part, without the prior written consent of Silicon Graphics, Inc. *
* *
**************************************************************************/
#ifndef _SHUB_MD_H
#ifndef _SHUB_MD_H
#define _SHUB_MD_H
#define _SHUB_MD_H
...
...
include/asm-ia64/system.h
View file @
2c522955
...
@@ -353,6 +353,9 @@ extern long __cmpxchg_called_with_bad_pointer(void);
...
@@ -353,6 +353,9 @@ extern long __cmpxchg_called_with_bad_pointer(void);
# define IS_IA32_PROCESS(regs) (ia64_psr(regs)->is != 0)
# define IS_IA32_PROCESS(regs) (ia64_psr(regs)->is != 0)
#else
#else
# define IS_IA32_PROCESS(regs) 0
# define IS_IA32_PROCESS(regs) 0
struct
task_struct
;
static
inline
void
ia32_save_state
(
struct
task_struct
*
t
__attribute__
((
unused
))){}
static
inline
void
ia32_load_state
(
struct
task_struct
*
t
__attribute__
((
unused
))){}
#endif
#endif
/*
/*
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment