[gem5-dev] Change in public/gem5[master]: config: Rework the SysPaths functions into functors.

2017-10-31 Thread Gabe Black (Gerrit)
Gabe Black has submitted this change and it was merged. (  
https://gem5-review.googlesource.com/5341 )


Change subject: config: Rework the SysPaths functions into functors.
..

config: Rework the SysPaths functions into functors.

These functions were already being treated as psuedo objects and had
properties assigned to them setting what their paths were. That's a bit
unusual and made it less obvious what the code was doing, but also
forced the "system" function to know what all the possible path
searching functions were so that they'd have their "path" property
initialized properly in a central location.

This change introduces a PathSearcFunc class which encapsulates the
mechanisms of the old code and makes it implicitly extensible so that
other path searching functions which might look in other directories
can be added in other places.

Change-Id: I7be28e51481a06ec83997677af99927709b18003
Reviewed-on: https://gem5-review.googlesource.com/5341
Reviewed-by: Andreas Sandberg 
Maintainer: Andreas Sandberg 
---
M configs/common/SysPaths.py
1 file changed, 28 insertions(+), 42 deletions(-)

Approvals:
  Andreas Sandberg: Looks good to me, approved; Looks good to me, approved



diff --git a/configs/common/SysPaths.py b/configs/common/SysPaths.py
index 316fd03..c012846 100644
--- a/configs/common/SysPaths.py
+++ b/configs/common/SysPaths.py
@@ -27,55 +27,41 @@
 # Authors: Ali Saidi

 import os, sys
-from os.path import join as joinpath
-from os import environ as env

 config_path = os.path.dirname(os.path.abspath(__file__))
 config_root = os.path.dirname(config_path)

-def searchpath(path, filename):
-for p in path:
-f = joinpath(p, filename)
-if os.path.exists(f):
-return f
-raise IOError, "Can't find file '%s' on path." % filename
+class PathSearchFunc(object):
+_sys_paths = None

-def disk(filename):
-system()
-return searchpath(disk.path, filename)
+def __init__(self, *subdirs):
+self._subdir = os.path.join(*subdirs)

-def binary(filename):
-system()
-return searchpath(binary.path, filename)
+def __call__(self, filename):
+if self._sys_paths is None:
+try:
+paths = os.environ['M5_PATH'].split(':')
+except KeyError:
+paths = [ '/dist/m5/system', '/n/poolfs/z/dist/m5/system' ]

-def script(filename):
-system()
-return searchpath(script.path, filename)
+# expand '~' and '~user' in paths
+paths = map(os.path.expanduser, paths)

-def system():
-if not system.path:
+# filter out non-existent directories
+paths = filter(os.path.isdir, paths)
+
+if not paths:
+raise IOError, "Can't find a path to system files."
+
+self._sys_paths = paths
+
+filepath = os.path.join(self._subdir, filename)
+paths = (os.path.join(p, filepath) for p in self._sys_paths)
 try:
-path = env['M5_PATH'].split(':')
-except KeyError:
-path = [ '/dist/m5/system', '/n/poolfs/z/dist/m5/system' ]
+return next(p for p in paths if os.path.exists(p))
+except StopIteration:
+raise IOError, "Can't find file '%s' on path." % filename

-# expand '~' and '~user' in paths
-path = map(os.path.expanduser, path)
-
-# filter out non-existent directories
-system.path = filter(os.path.isdir, path)
-
-if not system.path:
-raise IOError, "Can't find a path to system files."
-
-if not binary.path:
-binary.path = [joinpath(p, 'binaries') for p in system.path]
-if not disk.path:
-disk.path = [joinpath(p, 'disks') for p in system.path]
-if not script.path:
-script.path = [joinpath(config_root, 'boot')]
-
-system.path = None
-binary.path = None
-disk.path = None
-script.path = None
+disk = PathSearchFunc('disks')
+binary = PathSearchFunc('binaries')
+script = PathSearchFunc('boot')

--
To view, visit https://gem5-review.googlesource.com/5341
To unsubscribe, or for help writing mail filters, visit  
https://gem5-review.googlesource.com/settings


Gerrit-Project: public/gem5
Gerrit-Branch: master
Gerrit-MessageType: merged
Gerrit-Change-Id: I7be28e51481a06ec83997677af99927709b18003
Gerrit-Change-Number: 5341
Gerrit-PatchSet: 2
Gerrit-Owner: Gabe Black 
Gerrit-Assignee: Andreas Sandberg 
Gerrit-Reviewer: Andreas Sandberg 
Gerrit-Reviewer: Gabe Black 
___
gem5-dev mailing list
gem5-dev@gem5.org
http://m5sim.org/mailman/listinfo/gem5-dev

[gem5-dev] Change in public/gem5[master]: base: Introducing utility for writing raw data in png format

2017-10-31 Thread Giacomo Travaglini (Gerrit)
Giacomo Travaglini has submitted this change and it was merged. (  
https://gem5-review.googlesource.com/5181 )


Change subject: base: Introducing utility for writing raw data in png format
..

base: Introducing utility for writing raw data in png format

Originally it was possible to use a Bitmap writer class for dumping a
framebuffer snapshot in a .bmp file. This patch enables you to choose
another format.  In particular it implements the writing of PNG Images
using libpng library.  The latter has to be already installed in your
machine, otherwise gem5 will default to the Bitmap format.  This
configurable writer has been introduced in the VNC frame dumping mechanism,
which is storing changed frame buffers from the VNC server

Change-Id: Id7e5763c82235f1ce90381c8486b85a7cce734ce
Reviewed-by: Andreas Sandberg 
Reviewed-on: https://gem5-review.googlesource.com/5181
Reviewed-by: Jason Lowe-Power 
Maintainer: Andreas Sandberg 
---
M SConstruct
A src/base/Graphics.py
M src/base/SConscript
R src/base/bmpwriter.cc
R src/base/bmpwriter.hh
A src/base/imgwriter.cc
A src/base/imgwriter.hh
A src/base/pngwriter.cc
C src/base/pngwriter.hh
M src/base/vnc/Vnc.py
M src/base/vnc/vncinput.cc
M src/base/vnc/vncinput.hh
M src/base/vnc/vncserver.cc
M src/base/vnc/vncserver.hh
M src/dev/arm/hdlcd.hh
M src/dev/arm/pl111.hh
16 files changed, 509 insertions(+), 103 deletions(-)

Approvals:
  Jason Lowe-Power: Looks good to me, approved
  Andreas Sandberg: Looks good to me, approved



diff --git a/SConstruct b/SConstruct
index 95efb83..230232d 100755
--- a/SConstruct
+++ b/SConstruct
@@ -1,6 +1,6 @@
 # -*- mode:python -*-

-# Copyright (c) 2013, 2015, 2016 ARM Limited
+# Copyright (c) 2013, 2015-2017 ARM Limited
 # All rights reserved.
 #
 # The license below extends only to copyright in the software and shall
@@ -1134,6 +1134,14 @@
 print "Warning: Header file  not found."
 print " This host has no IEEE FP rounding mode control."

+# Check for  (libpng library needed if wanting to dump
+# frame buffer image in png format)
+have_png = conf.CheckHeader('png.h', '<>')
+if not have_png:
+print "Warning: Header file  not found."
+print " This host has no libpng library."
+print " Disabling support for PNG framebuffers."
+
 # Check if we should enable KVM-based hardware virtualization. The API
 # we rely on exists since version 2.6.36 of the kernel, but somehow
 # the KVM_API_VERSION does not reflect the change. We test for one of
@@ -1278,8 +1286,11 @@
  False),
 BoolVariable('USE_POSIX_CLOCK', 'Use POSIX Clocks', have_posix_clock),
 BoolVariable('USE_FENV', 'Use  IEEE mode control', have_fenv),
-BoolVariable('CP_ANNOTATE', 'Enable critical path annotation  
capability', False),
-BoolVariable('USE_KVM', 'Enable hardware virtualized (KVM) CPU  
models', have_kvm),

+BoolVariable('USE_PNG',  'Enable support for PNG images', have_png),
+BoolVariable('CP_ANNOTATE', 'Enable critical path annotation  
capability',

+ False),
+BoolVariable('USE_KVM', 'Enable hardware virtualized (KVM) CPU models',
+ have_kvm),
 BoolVariable('USE_TUNTAP',
  'Enable using a tap device to bridge to the host network',
  have_tuntap),
@@ -1293,7 +1304,8 @@
 # These variables get exported to #defines in config/*.hh (see  
src/SConscript).
 export_vars +=  
['USE_FENV', 'SS_COMPATIBLE_FP', 'TARGET_ISA', 'TARGET_GPU_ISA',

 'CP_ANNOTATE', 'USE_POSIX_CLOCK', 'USE_KVM', 'USE_TUNTAP',
-'PROTOCOL', 'HAVE_PROTOBUF', 'HAVE_PERF_ATTR_EXCLUDE_HOST']
+'PROTOCOL', 'HAVE_PROTOBUF', 'HAVE_PERF_ATTR_EXCLUDE_HOST',
+'USE_PNG']

 ###
 #
@@ -1486,6 +1498,14 @@
 print "Warning: No IEEE FP rounding mode control in", variant_dir  
+ "."
 print " FP results may deviate slightly from other  
platforms."


+if not have_png and env['USE_PNG']:
+print "Warning:  not available; " \
+  "forcing USE_PNG to False in", variant_dir + "."
+env['USE_PNG'] = False
+
+if env['USE_PNG']:
+env.Append(LIBS=['png'])
+
 if env['EFENCE']:
 env.Append(LIBS=['efence'])

diff --git a/src/base/Graphics.py b/src/base/Graphics.py
new file mode 100644
index 000..c42882e
--- /dev/null
+++ b/src/base/Graphics.py
@@ -0,0 +1,43 @@
+# Copyright (c) 2017 ARM Limited
+# All rights reserved
+#
+# The license below extends only to copyright in the software and shall
+# not be construed as granting a license to any other intellectual
+# property including but not limited to intellectual property relating
+# to a hardware implementation of the functionality of the software
+# licensed hereunder.  You may use the software subject to the 

[gem5-dev] Change in public/gem5[master]: vnc: Default image writer type set to Auto

2017-10-31 Thread Giacomo Travaglini (Gerrit)
Giacomo Travaglini has submitted this change and it was merged. (  
https://gem5-review.googlesource.com/5182 )


Change subject: vnc: Default image writer type set to Auto
..

vnc: Default image writer type set to Auto

This commit modifies the default behaviour of the vnc frame dumping
process: rather than using 'Bitmap' as a default parameter value, it is
using 'Auto'.  Auto parameter is letting gem5 to choose the most
efficient image format among the available ones.

Change-Id: I3c8e2b5a34a5925d24892880ac362dfe38de36e3
Reviewed-by: Andreas Sandberg 
Reviewed-on: https://gem5-review.googlesource.com/5182
Reviewed-by: Jason Lowe-Power 
Maintainer: Andreas Sandberg 
---
M src/base/vnc/Vnc.py
1 file changed, 1 insertion(+), 1 deletion(-)

Approvals:
  Jason Lowe-Power: Looks good to me, approved
  Andreas Sandberg: Looks good to me, approved



diff --git a/src/base/vnc/Vnc.py b/src/base/vnc/Vnc.py
index 0aed0dc..e440d10 100644
--- a/src/base/vnc/Vnc.py
+++ b/src/base/vnc/Vnc.py
@@ -45,7 +45,7 @@
 cxx_header = "base/vnc/vncinput.hh"
 frame_capture = Param.Bool(False, "capture changed frames to files")
 img_format = Param.ImageFormat(
-"Bitmap", "Format of the dumped Framebuffer"
+"Auto", "Format of the dumped Framebuffer"
 )

 class VncServer(VncInput):

--
To view, visit https://gem5-review.googlesource.com/5182
To unsubscribe, or for help writing mail filters, visit  
https://gem5-review.googlesource.com/settings


Gerrit-Project: public/gem5
Gerrit-Branch: master
Gerrit-MessageType: merged
Gerrit-Change-Id: I3c8e2b5a34a5925d24892880ac362dfe38de36e3
Gerrit-Change-Number: 5182
Gerrit-PatchSet: 3
Gerrit-Owner: Giacomo Travaglini 
Gerrit-Reviewer: Andreas Sandberg 
Gerrit-Reviewer: Gabe Black 
Gerrit-Reviewer: Giacomo Travaglini 
Gerrit-Reviewer: Jason Lowe-Power 
___
gem5-dev mailing list
gem5-dev@gem5.org
http://m5sim.org/mailman/listinfo/gem5-dev

[gem5-dev] Change in public/gem5[master]: dev: Using Configurable image writer in HDLcd

2017-10-31 Thread Giacomo Travaglini (Gerrit)
Giacomo Travaglini has submitted this change and it was merged. (  
https://gem5-review.googlesource.com/5183 )


Change subject: dev: Using Configurable image writer in HDLcd
..

dev: Using Configurable image writer in HDLcd

The fixed image writer (which was dumping .bmp images only) has been
replaced by the configurable one in HDLcd device.  Default format is
Auto, which gives gem5 the freedom to choose the format it prefers.

Change-Id: I0643266556bb10b43cdebd628f6daa2cd5e105dd
Reviewed-by: Andreas Sandberg 
Reviewed-on: https://gem5-review.googlesource.com/5183
Reviewed-by: Jason Lowe-Power 
Maintainer: Andreas Sandberg 
---
M src/dev/arm/RealView.py
M src/dev/arm/hdlcd.cc
M src/dev/arm/hdlcd.hh
3 files changed, 17 insertions(+), 6 deletions(-)

Approvals:
  Jason Lowe-Power: Looks good to me, approved
  Andreas Sandberg: Looks good to me, approved; Looks good to me, approved



diff --git a/src/dev/arm/RealView.py b/src/dev/arm/RealView.py
index 51aa1cf..08145bf 100644
--- a/src/dev/arm/RealView.py
+++ b/src/dev/arm/RealView.py
@@ -56,6 +56,7 @@
 from EnergyCtrl import EnergyCtrl
 from ClockDomain import SrcClockDomain
 from SubSystem import SubSystem
+from Graphics import ImageFormat

 # Platforms with KVM support should generally use in-kernel GIC
 # emulation. Use a GIC model that automatically switches between
@@ -298,7 +299,10 @@
 "selector order in some kernels")
 workaround_dma_line_count = Param.Bool(True, "Workaround incorrect "
"DMA line count (off by 1)")
-enable_capture = Param.Bool(True, "capture frame to  
system.framebuffer.bmp")

+enable_capture = Param.Bool(True, "capture frame to "
+  "system.framebuffer.{extension}")
+frame_format = Param.ImageFormat("Auto",
+ "image format of the captured frame")

 pixel_buffer_size = Param.MemorySize32("2kB", "Size of address range")

diff --git a/src/dev/arm/hdlcd.cc b/src/dev/arm/hdlcd.cc
index 98f2a3d..20dc7d4 100644
--- a/src/dev/arm/hdlcd.cc
+++ b/src/dev/arm/hdlcd.cc
@@ -47,6 +47,7 @@
 #include "debug/HDLcd.hh"
 #include "dev/arm/amba_device.hh"
 #include "dev/arm/base_gic.hh"
+#include "enums/ImageFormat.hh"
 #include "mem/packet.hh"
 #include "mem/packet_access.hh"
 #include "params/HDLcd.hh"
@@ -85,11 +86,13 @@

   virtRefreshEvent([this]{ virtRefresh(); }, name()),
   // Other
-  bmp(), pic(NULL), conv(PixelConverter::rgba_le),
+  imgFormat(p->frame_format), pic(NULL),  
conv(PixelConverter::rgba_le),

   pixelPump(*this, *p->pxl_clk, p->pixel_chunk)
 {
 if (vnc)
 vnc->setFrameBuffer();
+
+imgWriter = createImgWriter(imgFormat, );
 }

 HDLcd::~HDLcd()
@@ -572,13 +575,14 @@
 if (enableCapture) {
 if (!pic) {
 pic = simout.create(
-csprintf("%s.framebuffer.bmp", sys->name()),
+csprintf("%s.framebuffer.%s",
+ sys->name(), imgWriter->getImgExtension()),
 true);
 }

 assert(pic);
 pic->stream()->seekp(0);
-bmp.write(*pic->stream());
+imgWriter->write(*pic->stream());
 }
 }

diff --git a/src/dev/arm/hdlcd.hh b/src/dev/arm/hdlcd.hh
index dd52e20..f737710 100644
--- a/src/dev/arm/hdlcd.hh
+++ b/src/dev/arm/hdlcd.hh
@@ -79,8 +79,8 @@
 #include 
 #include 

-#include "base/bmpwriter.hh"
 #include "base/framebuffer.hh"
+#include "base/imgwriter.hh"
 #include "base/output.hh"
 #include "dev/arm/amba_device.hh"
 #include "dev/pixelpump.hh"
@@ -350,7 +350,10 @@
 EventFunctionWrapper virtRefreshEvent;

 /** Helper to write out bitmaps */
-BmpWriter bmp;
+std::unique_ptr imgWriter;
+
+/** Image Format */
+Enums::ImageFormat imgFormat;

 /** Picture of what the current frame buffer looks like */
 OutputStream *pic;

--
To view, visit https://gem5-review.googlesource.com/5183
To unsubscribe, or for help writing mail filters, visit  
https://gem5-review.googlesource.com/settings


Gerrit-Project: public/gem5
Gerrit-Branch: master
Gerrit-MessageType: merged
Gerrit-Change-Id: I0643266556bb10b43cdebd628f6daa2cd5e105dd
Gerrit-Change-Number: 5183
Gerrit-PatchSet: 3
Gerrit-Owner: Giacomo Travaglini 
Gerrit-Reviewer: Andreas Sandberg 
Gerrit-Reviewer: Giacomo Travaglini 
Gerrit-Reviewer: Jason Lowe-Power 
___
gem5-dev mailing list
gem5-dev@gem5.org
http://m5sim.org/mailman/listinfo/gem5-dev

[gem5-dev] Cron <m5test@zizzer> /z/m5/regression/do-regression quick

2017-10-31 Thread Cron Daemon
* 
build/RISCV/tests/opt/quick/se/02.insttest/riscv/linux-rv64m/simple-timing: 
FAILED!
* 
build/RISCV/tests/opt/quick/se/02.insttest/riscv/linux-rv64m/simple-timing-ruby:
 FAILED!
* 
build/RISCV/tests/opt/quick/se/02.insttest/riscv/linux-rv64f/simple-timing: 
FAILED!
* 
build/RISCV/tests/opt/quick/se/02.insttest/riscv/linux-rv64i/minor-timing: 
FAILED!
* 
build/RISCV/tests/opt/quick/se/02.insttest/riscv/linux-rv64f/simple-atomic: 
FAILED!
* 
build/RISCV/tests/opt/quick/se/02.insttest/riscv/linux-rv64a/minor-timing: 
FAILED!
* build/RISCV/tests/opt/quick/se/00.hello/riscv/linux/minor-timing: FAILED!
* 
build/RISCV/tests/opt/quick/se/02.insttest/riscv/linux-rv64c/simple-timing-ruby:
 FAILED!
* build/RISCV/tests/opt/quick/se/02.insttest/riscv/linux-rv64d/o3-timing: 
FAILED!
* build/RISCV/tests/opt/quick/se/00.hello/riscv/linux/o3-timing: FAILED!
* 
build/RISCV/tests/opt/quick/se/02.insttest/riscv/linux-rv64f/simple-timing-ruby:
 FAILED!
* 
build/RISCV/tests/opt/quick/se/02.insttest/riscv/linux-rv64f/minor-timing: 
FAILED!
* 
build/RISCV/tests/opt/quick/se/02.insttest/riscv/linux-rv64a/simple-atomic: 
FAILED!
* 
build/RISCV/tests/opt/quick/se/02.insttest/riscv/linux-rv64a/simple-timing-ruby:
 FAILED!
* build/RISCV/tests/opt/quick/se/02.insttest/riscv/linux-rv64a/o3-timing: 
FAILED!
* build/RISCV/tests/opt/quick/se/02.insttest/riscv/linux-rv64i/o3-timing: 
FAILED!
* 
build/RISCV/tests/opt/quick/se/02.insttest/riscv/linux-rv64c/simple-atomic: 
FAILED!
* 
build/RISCV/tests/opt/quick/se/02.insttest/riscv/linux-rv64d/simple-timing: 
FAILED!
* build/RISCV/tests/opt/quick/se/00.hello/riscv/linux/simple-timing-ruby: 
FAILED!
* build/RISCV/tests/opt/quick/se/02.insttest/riscv/linux-rv64f/o3-timing: 
FAILED!
* 
build/RISCV/tests/opt/quick/se/02.insttest/riscv/linux-rv64m/simple-atomic: 
FAILED!
* 
build/RISCV/tests/opt/quick/se/02.insttest/riscv/linux-rv64m/minor-timing: 
FAILED!
* build/RISCV/tests/opt/quick/se/00.hello/riscv/linux/simple-atomic: FAILED!
* 
build/RISCV/tests/opt/quick/se/02.insttest/riscv/linux-rv64i/simple-timing-ruby:
 FAILED!
* 
build/RISCV/tests/opt/quick/se/02.insttest/riscv/linux-rv64d/minor-timing: 
FAILED!
* 
build/RISCV/tests/opt/quick/se/02.insttest/riscv/linux-rv64d/simple-timing-ruby:
 FAILED!
* 
build/RISCV/tests/opt/quick/se/02.insttest/riscv/linux-rv64i/simple-atomic: 
FAILED!
* 
build/RISCV/tests/opt/quick/se/02.insttest/riscv/linux-rv64c/minor-timing: 
FAILED!
* build/RISCV/tests/opt/quick/se/00.hello/riscv/linux/simple-timing: FAILED!
* build/RISCV/tests/opt/quick/se/02.insttest/riscv/linux-rv64m/o3-timing: 
FAILED!
* 
build/RISCV/tests/opt/quick/se/02.insttest/riscv/linux-rv64a/simple-timing: 
FAILED!
* build/RISCV/tests/opt/quick/se/02.insttest/riscv/linux-rv64c/o3-timing: 
FAILED!
* 
build/RISCV/tests/opt/quick/se/02.insttest/riscv/linux-rv64c/simple-timing: 
FAILED!
* 
build/RISCV/tests/opt/quick/se/02.insttest/riscv/linux-rv64i/simple-timing: 
FAILED!
* 
build/RISCV/tests/opt/quick/se/02.insttest/riscv/linux-rv64d/simple-atomic: 
FAILED!
* build/ALPHA/tests/opt/quick/se/00.hello/alpha/linux/minor-timing: CHANGED!
* build/ARM/tests/opt/quick/se/00.hello/arm/linux/minor-timing: CHANGED!
* build/ARM/tests/opt/quick/se/00.hello/arm/linux/o3-timing: CHANGED!
* build/ARM/tests/opt/quick/se/00.hello/arm/linux/o3-timing-checker: 
CHANGED!
* build/ARM/tests/opt/quick/se/00.hello/arm/linux/simple-atomic: CHANGED!
* 
build/ARM/tests/opt/quick/se/00.hello/arm/linux/simple-atomic-dummychecker: 
CHANGED!
* build/ARM/tests/opt/quick/se/00.hello/arm/linux/simple-timing: CHANGED!
* 
build/ARM/tests/opt/quick/se/03.learning-gem5/arm/linux/learning-gem5-p1-simple:
 CHANGED!
* 
build/ARM/tests/opt/quick/se/03.learning-gem5/arm/linux/learning-gem5-p1-two-level:
 CHANGED!
* build/ARM/tests/opt/quick/se/10.mcf/arm/linux/simple-atomic: CHANGED!
* build/ARM/tests/opt/quick/se/50.vortex/arm/linux/simple-atomic: CHANGED!
* build/ARM/tests/opt/quick/se/10.mcf/arm/linux/simple-timing: CHANGED!
* build/ARM/tests/opt/quick/se/50.vortex/arm/linux/simple-timing: CHANGED!
* build/ARM/tests/opt/quick/se/70.twolf/arm/linux/simple-atomic: CHANGED!
* 
build/ARM/tests/opt/quick/fs/10.linux-boot/arm/linux/realview-simple-atomic: 
CHANGED!
* 
build/ARM/tests/opt/quick/fs/10.linux-boot/arm/linux/realview-simple-atomic-dual:
 CHANGED!
* build/ARM/tests/opt/quick/se/70.twolf/arm/linux/simple-timing: CHANGED!
* 
build/ARM/tests/opt/quick/fs/10.linux-boot/arm/linux/realview-simple-timing: 
CHANGED!
* 
build/ARM/tests/opt/quick/fs/10.linux-boot/arm/linux/realview-simple-timing-dual:
 CHANGED!
scons: `build/MIPS/tests/opt/quick/fs' is up to date.
scons: `build/NULL/tests/opt/quick/fs' is up to date.
scons: `build/NULL_MOESI_hammer/tests/opt/quick/fs' is up to date.
scons: