Print this page
6663 Driver timerfd not built on SPARC
Split |
Close |
Expand all |
Collapse all |
--- old/usr/src/uts/sparc/Makefile.sparc
+++ new/usr/src/uts/sparc/Makefile.sparc
1 1 #
2 2 # CDDL HEADER START
3 3 #
4 4 # The contents of this file are subject to the terms of the
5 5 # Common Development and Distribution License (the "License").
6 6 # You may not use this file except in compliance with the License.
7 7 #
8 8 # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 9 # or http://www.opensolaris.org/os/licensing.
10 10 # See the License for the specific language governing permissions
11 11 # and limitations under the License.
12 12 #
13 13 # When distributing Covered Code, include this CDDL HEADER in each
14 14 # file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 15 # If applicable, add the following below this CDDL HEADER, with the
↓ open down ↓ |
15 lines elided |
↑ open up ↑ |
16 16 # fields enclosed by brackets "[]" replaced with your own identifying
17 17 # information: Portions Copyright [yyyy] [name of copyright owner]
18 18 #
19 19 # CDDL HEADER END
20 20 #
21 21
22 22 # Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
23 23 # Copyright (c) 2013 Andrew Stormont. All rights reserved.
24 24 # Copyright (c) 2015, Joyent, Inc. All rights reserved.
25 25 # Copyright 2015 Nexenta Systems, Inc. All rights reserved.
26 +# Copyright 2016 Gary Mills
26 27
27 28
28 29 #
29 30 # This makefile contains the common definitions for all sparc
30 31 # implementation architecture independent modules.
31 32 #
32 33
33 34 #
34 35 # Define supported builds
35 36 #
36 37 DEF_BUILDS = $(DEF_BUILDS64)
37 38 ALL_BUILDS = $(ALL_BUILDS64)
38 39
39 40 #
40 41 # Everybody needs to know how to build modstubs.o and to locate unix.o.
41 42 # Note that unix.o must currently be selected from among the possible
42 43 # "implementation architectures". Note further, that unix.o is only
43 44 # used as an optional error check for undefines so (theoretically)
44 45 # any "implementation architectures" could be used. We choose sun4u
45 46 # because it is the reference port.
46 47 #
47 48 UNIX_DIR = $(UTSBASE)/sun4u/unix
48 49 GENLIB_DIR = $(UTSBASE)/sun4u/genunix
49 50 IPDRV_DIR = $(UTSBASE)/sparc/ip
50 51 MODSTUBS_DIR = $(UNIX_DIR)
51 52 DSF_DIR = $(UNIX_DIR)
52 53 LINTS_DIR = $(OBJS_DIR)
53 54 LINT_LIB_DIR = $(UTSBASE)/sparc/lint-libs/$(OBJS_DIR)
54 55
55 56 UNIX_O = $(UNIX_DIR)/$(OBJS_DIR)/unix.o
56 57 MODSTUBS_O = $(MODSTUBS_DIR)/$(OBJS_DIR)/modstubs.o
57 58 GENLIB = $(UTSBASE)/sun4u/lint-libs/$(OBJS_DIR)/libgenunix.so
58 59
59 60 LINT_LIB_32 = $(UTSBASE)/sun4u/lint-libs/$(OBJS_DIR)/llib-lunix.ln
60 61 GEN_LINT_LIB_32 = $(UTSBASE)/sun4u/lint-libs/$(OBJS_DIR)/llib-lgenunix.ln
61 62
62 63 LINT_LIB_64 = $(UTSBASE)/sun4u/lint-libs/$(OBJS_DIR)/llib-lunix.ln
63 64 GEN_LINT_LIB_64 = $(UTSBASE)/sun4u/lint-libs/$(OBJS_DIR)/llib-lgenunix.ln
64 65
65 66 LINT_LIB = $(LINT_LIB_$(CLASS))
66 67 GEN_LINT_LIB = $(GEN_LINT_LIB_$(CLASS))
67 68
68 69 LINT32_DIRS = $(LINT32_BUILDS:%=$(UTSBASE)/sparc/lint-libs/%)
69 70 LINT32_FILES = $(LINT32_DIRS:%=%/llib-l$(MODULE).ln)
70 71
71 72 LINT64_DIRS = $(LINT64_BUILDS:%=$(UTSBASE)/sparc/lint-libs/%)
72 73 LINT64_FILES = $(LINT64_DIRS:%=%/llib-l$(MODULE).ln)
73 74
74 75 #
75 76 # Include the makefiles which define build rule templates, the
76 77 # collection of files per module, and a few specific flags. Note
77 78 # that order is significant, just as with an include path. The
78 79 # first build rule template which matches the files name will be
79 80 # used. By including these in order from most machine dependent
80 81 # to most machine independent, we allow a machine dependent file
81 82 # to be used in preference over a machine independent version
82 83 # (Such as a machine specific optimization, which preserves the
83 84 # interfaces.)
84 85 #
85 86 include $(UTSBASE)/sparc/Makefile.files
86 87 include $(UTSBASE)/sparc/v9/Makefile.files
87 88 include $(UTSBASE)/sun/Makefile.files
88 89 include $(UTSBASE)/common/Makefile.files
89 90
90 91 #
91 92 # ----- TRANSITIONAL SECTION --------------------------------------------------
92 93 #
93 94
94 95 #
95 96 # Not everything which *should* be a module is a module yet. The
96 97 # following is a list of such objects which are currently part of
97 98 # genunix but which might someday become kmods. This must be
98 99 # defined before we include Makefile.uts, or else genunix's build
99 100 # won't be as parallel as we might like.
100 101 #
101 102 NOT_YET_KMODS = $(OLDPTY_OBJS) $(PTY_OBJS) $(VCONS_CONF_OBJS) $(MOD_OBJS)
102 103
103 104 #
104 105 # ----- END OF TRANSITIONAL SECTION -------------------------------------------
105 106 #
106 107 # Include machine independent rules. Note that this does not imply
107 108 # that the resulting module from rules in Makefile.uts is machine
108 109 # independent. Only that the build rules are machine independent.
109 110 #
110 111 include $(UTSBASE)/Makefile.uts
111 112
112 113 #
113 114 # machine specific optimization, override default in Makefile.master
114 115 #
115 116 XARCH_32 = -xarch=v8
116 117 XARCH_64 = -m64
117 118 XARCH = $(XARCH_$(CLASS))
118 119
119 120 COPTIMIZE_32 = -xO3
120 121 COPTIMIZE_64 = -xO3
121 122 COPTIMIZE = $(COPTIMIZE_$(CLASS))
122 123
123 124 CCMODE = -Xa
124 125
125 126 CFLAGS_32 = -xcg92
126 127 CFLAGS_64 = -xchip=ultra $(CCABS32) $(CCREGSYM)
127 128 CFLAGS = $(CFLAGS_$(CLASS))
128 129
129 130 CFLAGS += $(XARCH)
130 131 CFLAGS += $(COPTIMIZE)
131 132 CFLAGS += $(EXTRA_CFLAGS)
132 133 CFLAGS += $(XAOPT)
133 134 CFLAGS += $(INLINES) -D_ASM_INLINES
134 135 CFLAGS += $(CCMODE)
135 136 CFLAGS += $(SPACEFLAG)
136 137 CFLAGS += $(CERRWARN)
137 138 CFLAGS += $(CTF_FLAGS_$(CLASS))
138 139 CFLAGS += $(C99MODE)
139 140 CFLAGS += $(CCUNBOUND)
140 141 CFLAGS += $(CCSTATICSYM)
141 142 CFLAGS += $(CC32BITCALLERS)
142 143 CFLAGS += $(CCNOAUTOINLINE)
143 144 CFLAGS += $(IROPTFLAG)
144 145 CFLAGS += $(CGLOBALSTATIC)
145 146 CFLAGS += -xregs=no%float
146 147 CFLAGS += -xstrconst
147 148 CFLAGS += $(CSOURCEDEBUGFLAGS)
148 149 CFLAGS += $(CUSERFLAGS)
149 150
150 151 ASFLAGS += $(XARCH)
151 152
152 153 LINT_DEFS_32 =
153 154 LINT_DEFS_64 = -m64
154 155 LINT_DEFS += $(LINT_DEFS_$(CLASS))
155 156
156 157 #
157 158 # The following must be defined for all implementations:
158 159 #
159 160 # MODSTUBS: Module stubs source file.
160 161 #
161 162 MODSTUBS = $(UTSBASE)/sparc/ml/modstubs.s
162 163
163 164 #
164 165 # Define the actual specific platforms - obviously none.
165 166 #
166 167 MACHINE_DEFS =
167 168
168 169 #
169 170 # Debugging level
170 171 #
171 172 # Special knowledge of which special debugging options effect which
172 173 # file is used to optimize the build if these flags are changed.
173 174 #
174 175 # XXX: The above could possibly be done for more flags and files, but
175 176 # is left as an experiment to the interested reader. Be forewarned,
176 177 # that excessive use could lead to maintenance difficulties.
177 178 #
178 179 DEBUG_DEFS_OBJ32 =
179 180 DEBUG_DEFS_DBG32 = -DDEBUG
180 181 DEBUG_DEFS_OBJ64 =
181 182 DEBUG_DEFS_DBG64 = -DDEBUG
182 183 DEBUG_DEFS = $(DEBUG_DEFS_$(BUILD_TYPE))
183 184
184 185 DEBUG_COND_OBJ32 = $(POUND_SIGN)
185 186 DEBUG_COND_DBG32 =
186 187 DEBUG_COND_OBJ64 = $(POUND_SIGN)
187 188 DEBUG_COND_DBG64 =
188 189 IF_DEBUG_OBJ = $(DEBUG_COND_$(BUILD_TYPE))$(OBJS_DIR)/
189 190
190 191 $(IF_DEBUG_OBJ)syscall.o := DEBUG_DEFS += -DSYSCALLTRACE
191 192 $(IF_DEBUG_OBJ)clock.o := DEBUG_DEFS += -DKSLICE=1
192 193
193 194 # Comment these out if you don't want dispatcher lock statistics.
194 195
195 196 # $(IF_DEBUG_OBJ)disp_lock.o := DEBUG_DEFS += -DDISP_LOCK_STATS
196 197
197 198 #
198 199 # Collect the preprocessor definitions to be associated with *all*
199 200 # files.
200 201 #
201 202 ALL_DEFS = $(MACHINE_DEFS) $(DEBUG_DEFS) $(OPTION_DEFS)
202 203 #
203 204 #
204 205 # The kernels modules which are "implementation architecture"
205 206 # specific for this machine are enumerated below. Note that most
206 207 # of these modules must exist (in one form or another) for each
207 208 # architecture.
208 209 #
209 210 # Common Drivers (usually pseudo drivers) (/kernel/drv):
210 211 #
↓ open down ↓ |
175 lines elided |
↑ open up ↑ |
211 212 DRV_KMODS += aggr arp audio bl blkdev bofi clone cn conskbd consms cpuid
212 213 DRV_KMODS += crypto cryptoadm devinfo dump
213 214 DRV_KMODS += dtrace fasttrap fbt lockstat profile sdt systrace dcpc
214 215 DRV_KMODS += fssnap icmp icmp6 ip ip6 ipnet ipsecah
215 216 DRV_KMODS += ipsecesp iptun iwscn keysock kmdb kstat ksyms llc1
216 217 DRV_KMODS += lofi
217 218 DRV_KMODS += log logindmux kssl mm nca physmem pm poll pool
218 219 DRV_KMODS += pseudo ptc ptm pts ptsl ramdisk random rsm rts sad
219 220 DRV_KMODS += simnet softmac sppp sppptun sy sysevent sysmsg
220 221 DRV_KMODS += spdsock
221 -DRV_KMODS += tcp tcp6 tl tnf ttymux udp udp6 wc winlock zcons
222 +DRV_KMODS += tcp tcp6 timerfd tl tnf ttymux udp udp6 wc winlock zcons
222 223 DRV_KMODS += ippctl
223 224 DRV_KMODS += dld
224 225 DRV_KMODS += ipd
225 226 DRV_KMODS += ipf
226 227 DRV_KMODS += rpcib
227 228 DRV_KMODS += dlpistub
228 229 DRV_KMODS += vnic
229 230 DRV_KMODS += xge
230 231 DRV_KMODS += rds
231 232 DRV_KMODS += rdsv3
232 233 DRV_KMODS += chxge
233 234 DRV_KMODS += smbsrv
234 235 DRV_KMODS += vscan
235 236 DRV_KMODS += nsmb
236 237 DRV_KMODS += fm
237 238 DRV_KMODS += nulldriver
238 239 DRV_KMODS += bridge trill
239 240 DRV_KMODS += bpf
240 241 DRV_KMODS += dca
241 242 DRV_KMODS += eventfd
242 243 DRV_KMODS += signalfd
243 244
244 245 #
245 246 # Hardware Drivers in common space
246 247 #
247 248
248 249 DRV_KMODS += afe
249 250 DRV_KMODS += audio1575
250 251 DRV_KMODS += audioens
251 252 DRV_KMODS += audiols
252 253 DRV_KMODS += audiop16x
253 254 DRV_KMODS += audiopci
254 255 DRV_KMODS += audiots
255 256 DRV_KMODS += bnxe
256 257 DRV_KMODS += e1000g
257 258 DRV_KMODS += efe
258 259 DRV_KMODS += hxge
259 260 DRV_KMODS += mxfe
260 261 DRV_KMODS += rge
261 262 DRV_KMODS += rtls
262 263 DRV_KMODS += sfe
263 264 DRV_KMODS += aac
264 265 DRV_KMODS += igb
265 266 DRV_KMODS += ixgbe
266 267 DRV_KMODS += vr
267 268 DRV_KMODS += mr_sas
268 269 DRV_KMODS += yge
269 270
270 271 #
271 272 # Machine Specific Driver Modules (/kernel/drv):
272 273 #
273 274 DRV_KMODS += audiocs
274 275 DRV_KMODS += bge dmfe eri fas hme qfe
275 276 DRV_KMODS += openeepr options sd ses st
276 277 DRV_KMODS += ssd
277 278 DRV_KMODS += ecpp
278 279 DRV_KMODS += hid hubd ehci ohci uhci usb_mid usb_ia scsa2usb usbprn ugen
279 280 DRV_KMODS += usbser usbsacm usbsksp usbsprl
280 281 DRV_KMODS += usb_as usb_ac
281 282 DRV_KMODS += usbskel
282 283 DRV_KMODS += usbvc
283 284 DRV_KMODS += usbftdi
284 285 DRV_KMODS += usbecm
285 286 DRV_KMODS += hci1394 av1394 scsa1394 dcam1394
286 287 DRV_KMODS += sbp2
287 288 DRV_KMODS += ib ibp eibnx eoib rdsib sdp iser daplt hermon tavor sol_ucma sol_uverbs
288 289 DRV_KMODS += sol_umad
289 290 DRV_KMODS += pci_pci pcieb pcieb_bcm
290 291 DRV_KMODS += i8042 kb8042 mouse8042
291 292 DRV_KMODS += fcode
292 293 DRV_KMODS += mpt_sas
293 294 DRV_KMODS += socal
294 295 DRV_KMODS += sgen
295 296 DRV_KMODS += myri10ge
296 297 DRV_KMODS += smp
297 298 DRV_KMODS += dad
298 299 DRV_KMODS += scsi_vhci
299 300 DRV_KMODS += fcp
300 301 DRV_KMODS += fcip
301 302 DRV_KMODS += fcsm
302 303 DRV_KMODS += fp
303 304 DRV_KMODS += qlc
304 305 DRV_KMODS += qlge
305 306 DRV_KMODS += stmf
306 307 DRV_KMODS += stmf_sbd
307 308 DRV_KMODS += fct
308 309 DRV_KMODS += fcoe
309 310 DRV_KMODS += fcoet
310 311 DRV_KMODS += fcoei
311 312 DRV_KMODS += qlt
312 313 DRV_KMODS += iscsit
313 314 DRV_KMODS += pppt
314 315 DRV_KMODS += ncall nsctl sdbc nskern sv
315 316 DRV_KMODS += ii rdc rdcsrv rdcstub
316 317 DRV_KMODS += iscsi
317 318 DRV_KMODS += emlxs
318 319 DRV_KMODS += oce
319 320 DRV_KMODS += srpt
320 321 DRV_KMODS += pmcs
321 322 DRV_KMODS += pmcs8001fw
322 323
323 324 #
324 325 # I/O framework test drivers
325 326 #
326 327 DRV_KMODS += pshot
327 328 DRV_KMODS += gen_drv
328 329 DRV_KMODS += tvhci tphci tclient
329 330 DRV_KMODS += emul64
330 331
331 332 #
332 333 # PCMCIA specific module(s)
333 334 #
334 335 DRV_KMODS += pcs
335 336 MISC_KMODS += busra cardbus dada pcmcia
336 337 DRV_KMODS += pcic
337 338
338 339 # Add lvm
339 340 #
340 341 DRV_KMODS += md
341 342 MISC_KMODS += md_mirror md_stripe md_hotspares md_raid md_trans md_notify
342 343 MISC_KMODS += md_sp
343 344
344 345 #
345 346 # Exec Class Modules (/kernel/exec):
346 347 #
347 348 EXEC_KMODS += aoutexec elfexec intpexec shbinexec javaexec
348 349
349 350 #
350 351 # Scheduling Class Modules (/kernel/sched):
351 352 #
352 353 SCHED_KMODS += RT TS RT_DPTBL TS_DPTBL IA FSS FX FX_DPTBL SDC
353 354
354 355 #
355 356 # File System Modules (/kernel/fs):
356 357 #
357 358 FS_KMODS += dev devfs fdfs fifofs hsfs lofs namefs nfs pcfs tmpfs zfs
358 359 FS_KMODS += zut specfs udfs ufs autofs procfs sockfs mntfs
359 360 FS_KMODS += ctfs objfs sharefs dcfs smbfs bootfs
360 361
361 362 #
362 363 # Streams Modules (/kernel/strmod):
363 364 #
364 365 STRMOD_KMODS += bufmod connld dedump ldterm ms pckt pfmod
365 366 STRMOD_KMODS += pipemod ptem redirmod rpcmod rlmod telmod timod
366 367 STRMOD_KMODS += spppasyn spppcomp
367 368 STRMOD_KMODS += tirdwr ttcompat
368 369 STRMOD_KMODS += usbkbm usbms usbwcm usb_ah
369 370 STRMOD_KMODS += drcompat
370 371 STRMOD_KMODS += cryptmod
371 372 STRMOD_KMODS += vuid3ps2
372 373
373 374 #
374 375 # 'System' Modules (/kernel/sys):
375 376 #
376 377 SYS_KMODS += c2audit
377 378 SYS_KMODS += exacctsys
378 379 SYS_KMODS += inst_sync kaio msgsys semsys shmsys sysacct pipe
379 380 SYS_KMODS += doorfs pset acctctl portfs
380 381
381 382 #
382 383 # 'User' Modules (/kernel/misc):
383 384 #
384 385 MISC_KMODS += ac97
385 386 MISC_KMODS += bignum
386 387 MISC_KMODS += consconfig gld ipc nfs_dlboot nfssrv scsi
387 388 MISC_KMODS += strplumb swapgeneric tlimod
388 389 MISC_KMODS += rpcsec rpcsec_gss kgssapi kmech_dummy
389 390 MISC_KMODS += kmech_krb5
390 391 MISC_KMODS += fssnap_if
391 392 MISC_KMODS += hidparser kbtrans usba usba10 usbs49_fw
392 393 MISC_KMODS += s1394
393 394 MISC_KMODS += hpcsvc pcihp
394 395 MISC_KMODS += rsmops
395 396 MISC_KMODS += kcf
396 397 MISC_KMODS += ksocket
397 398 MISC_KMODS += ibcm
398 399 MISC_KMODS += ibdm
399 400 MISC_KMODS += ibdma
400 401 MISC_KMODS += ibmf
401 402 MISC_KMODS += ibtl
402 403 MISC_KMODS += sol_ofs
403 404 MISC_KMODS += idm
404 405 MISC_KMODS += idmap
405 406 MISC_KMODS += hook
406 407 MISC_KMODS += neti
407 408 MISC_KMODS += ctf
408 409 MISC_KMODS += mac dls
409 410 MISC_KMODS += cmlb
410 411 MISC_KMODS += tem
411 412 MISC_KMODS += pcicfg fcodem fcpci
412 413 MISC_KMODS += scsi_vhci_f_sym scsi_vhci_f_tpgs scsi_vhci_f_asym_sun
413 414 MISC_KMODS += scsi_vhci_f_sym_hds
414 415 MISC_KMODS += scsi_vhci_f_tape scsi_vhci_f_tpgs_tape
415 416 MISC_KMODS += fctl
416 417 MISC_KMODS += emlxs_fw
417 418 MISC_KMODS += qlc_fw_2200
418 419 MISC_KMODS += qlc_fw_2300
419 420 MISC_KMODS += qlc_fw_2400
420 421 MISC_KMODS += qlc_fw_2500
421 422 MISC_KMODS += qlc_fw_6322
422 423 MISC_KMODS += qlc_fw_8100
423 424 MISC_KMODS += spuni
424 425 MISC_KMODS += mii
425 426
426 427 MISC_KMODS += klmmod klmops
427 428
428 429 #
429 430 # Software Cryptographic Providers (/kernel/crypto):
430 431 #
431 432 CRYPTO_KMODS += aes
432 433 CRYPTO_KMODS += arcfour
433 434 CRYPTO_KMODS += blowfish
434 435 CRYPTO_KMODS += des
435 436 CRYPTO_KMODS += ecc
436 437 CRYPTO_KMODS += edonr
437 438 CRYPTO_KMODS += md4
438 439 CRYPTO_KMODS += md5
439 440 CRYPTO_KMODS += rsa
440 441 CRYPTO_KMODS += sha1
441 442 CRYPTO_KMODS += sha2
442 443 CRYPTO_KMODS += skein
443 444 CRYPTO_KMODS += swrand
444 445
445 446 #
446 447 # IP Policy Modules (/kernel/ipp):
447 448 #
448 449 IPP_KMODS += dlcosmk
449 450 IPP_KMODS += flowacct
450 451 IPP_KMODS += ipgpc
451 452 IPP_KMODS += dscpmk
452 453 IPP_KMODS += tokenmt
453 454 IPP_KMODS += tswtclmt
454 455
455 456 #
456 457 # 'Dacf' modules (/kernel/dacf)
457 458 DACF_KMODS += consconfig_dacf
458 459
459 460 #
460 461 # SVVS Testing Modules (/kernel/strmod):
461 462 #
462 463 # These are streams and driver modules which are not to be
463 464 # delivered with a released system. However, during development
464 465 # it is convenient to build and install the SVVS kernel modules.
465 466 #
466 467 SVVS_KMODS += lmodb lmode lmodr lmodt svvslo tidg tivc tmux
467 468
468 469 #
469 470 # Modules eXcluded from the product:
470 471 #
471 472 XMODS +=
472 473
473 474 #
474 475 # 'Dacf' Modules (/kernel/dacf):
475 476 #
476 477 DACF_KMODS += net_dacf
477 478
478 479 #
479 480 # MAC-Type Plugin Modules (/kernel/mac)
480 481 #
481 482 MAC_KMODS += mac_6to4
482 483 MAC_KMODS += mac_ether
483 484 MAC_KMODS += mac_ipv4
484 485 MAC_KMODS += mac_ipv6
485 486 MAC_KMODS += mac_wifi
486 487 MAC_KMODS += mac_ib
487 488
488 489 #
489 490 # socketmod (kernel/socketmod)
490 491 #
491 492 SOCKET_KMODS += sockpfp
492 493 SOCKET_KMODS += socksctp
493 494 SOCKET_KMODS += socksdp
494 495 SOCKET_KMODS += sockrds
495 496 SOCKET_KMODS += ksslf
496 497
497 498 #
498 499 # kiconv modules (/kernel/kiconv):
499 500 #
500 501 KICONV_KMODS += kiconv_emea kiconv_ja kiconv_ko kiconv_sc kiconv_tc
501 502
502 503 #
503 504 # Ensure that the variable member of the cpu_t (cpu_m) is defined
504 505 # for the lint builds so as not to cause lint errors during the
505 506 # global cross check.
506 507 #
507 508 $(LINTFLAGSUPPRESS)LINTFLAGS += -D_MACHDEP -I$(UTSBASE)/sun4 \
508 509 -I$(UTSBASE)/sun4u -I$(UTSBASE)/sfmmu
↓ open down ↓ |
277 lines elided |
↑ open up ↑ |
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX