Keyboard Shortcuts
Likes
- H390-Vm
- Messages
Search
This group is for all folks running the original IBM VM/370 Release 6 operating system (or later (e.g. VMTCE (Community Edition)) on Hercules. Like the other early IBM operating systems this version has always been in the public domain and so can be freely distributed. The base version as supplied by IBM is lacking in many facilities. IBM solved this by providing additional extension products which were licensed and so are not available. There are however many user enhancements available which can be installed. In addition, in order to get users up and running quickly updated "releases" of VM/370 included the most popular updates are available for download, so novices can start to learn VM without having to delve into the system internals. It is intended that this wiki will provide information on the base release and these updates.
The available versions are here :-
?
?
Re: Program Interrupts (signals)
Harold, HX is a CMS command... "Use?the?HX?command?to?stop the execution of?any CMS?or?CMS/DOS command?or program, close?any?open?files?or I/O devices,?and?return?to?the?CMS command?environment.? 1. HX?clears all file definitions?made?via tne?FILEDEF?or?DLBL commands,?including those entered with the?PERM?option.
Page 213-214 Joe On Sat, Apr 25, 2020 at 10:16 AM Harold Grovesteen <h.grovsteen@...> wrote: On Sat, 2020-04-25 at 09:45 -0500, Joe Monk wrote: |
Re: Program Interrupts (signals)
On Sat, 2020-04-25 at 09:45 -0500, Joe Monk wrote:
"This is back to front.? HX is recognised while processing anI am sure those of you in the know, just assume everyone knows. But, I see HX mentioned without differentiating whether this is a CP command or CMS command. Can someone clear that up for me, please, and anyone else somewhat confused by what this does? Thanks, Harold Grovesteen |
Re: Program Interrupts (signals)
Can't everything said above be true? DMSCIT contains the console interrupt service routine. When processing an attention interrupt, it checks if a HX command has been entered and if so it sets a flag (the KXWANT bit in KXFLAG), checks some other stuff and returns. The flag is checked by DMSITS and optionally DMSITI and if it is set, a call is made to DMSABN to kill whatever is running. There is no going back after that. Regards, Peter Coghlan.
|
Re: Program Interrupts (signals)
"This is back to front.? HX is recognised while processing an interrupt from the console." I thought HX was an immediate ... so no going back to what we were doing? Joe On Sat, Apr 25, 2020 at 9:23 AM Peter Coghlan <groups@...> wrote: > |
Re: Program Interrupts (signals)
I'm not sure it's wierd. Necessary for certain requirements maybe. Not much argument there. This is back to front. HX is recognised while processing an interrupt from the console. What happens next is what happens in most sensible interrupt service routines, ie a flag is set to note that it happened and then we go back to doing whatever we were doing in the foreground. When it is convenient to do so (not in a tight loop while doing nothing else for example), the foreground task polls the flag and if it is set, takes action to clean up and exit. If you add unix signals into this mix, you are just moving part of the interrupt service routine into the application. All the called routine in the application does is set a flag and return. The foreground part of the application then polls the flag at a convenient time and if it is set takes action to clean up and exit. It is the same thing but only slighly different. There is a time and a place for polling and ways to do it right and ways to do it wrong. Interrogating the console every n microseconds to see if a HX has been issued is not a good way to do polling. Having an interrupt routine set a flag and acting on it when convenient is the right way to do it. And change the documentation to say that before version x HX did one thing and since version x it does something else and by the way, it is no longer possible to halt execution of programs written before version x? No thanks. How else is REXX or anything else going to detect at a time convenient to itself that a HI command has been issued except by looking at some flag? Why does it seem to make a big difference that the flag being checked has been set in the console interrupt service routine or in your own routine that you have registered with the operating system somehow? I wouldn't call it a hack. I'd call it a bad design decision. What would you do if the hardware already sticks non-address related stuff into that byte when certain instructions are executed or requires you to use that byte for something else entirely every time you want to do an I/O? After you have come back from firing someone or asking the hardare architects to do something they can't do without breaking existing functionality, you still have to come up with a way of getting to use more address bits while maintaining compatibility with large amounts of software that took the designers at their word that addresses would never exceed 24 bits and used that extra byte for something else. How would you do that? Especially when you've already fired your best software people and driven your hardware architects crazy by giving them contraditory design specifications? As far as I understand it, CMS was only supplied with VM in order to be able to maintain it, to rebuild the nucleus, to apply updates etc. It was never intended that users would actually use CMS to do real work because it was totally unsuitable for this. Does that make it easier to understand some of the limitations in CMS? OS emulation was there so that stuff already written for OS (the assembler for example) could easily be used on CMS without having to rewrite it from scratch for CMS. I can't figure out what the rest means. Regards, Peter Coghlan. |
Re: Program Interrupts (signals)
You keep talking about a migration... what migration? 31-bit addressing came around with the IBM 370 series of computers, in a new architecture called 370/XA. It was an evolution on the 370 line, not a migration... It was originally announced with the 308X series of processors (3081, 3083, 3084). To get a 3084, you first had to buy the 3081, then you could field upgrade it to a 3084. A 3084 was basically two tightly coupled 3081K, operating?as a single 4 processor machine. Then of course came the 3090. The reason XA is called an evolution is because it changed the I/O subsystem completely. We went from channel I/O to CHPID, i.e. from SIO to SSCH. The biggest change of course was multipath. For instance a 3830 SCU could now have 64MB of cache, with 4 independent paths to complete I/O operations (called dynamic pathing). Joe On Sat, Apr 25, 2020 at 8:31 AM adriansutherland67 <adrian@...> wrote: Exactly .... but if the high byte was clean and app developers religiously ignored assuming anything about addressability. Well ... the migration could have been seemless (ish). |
Re: Program Interrupts (signals)
BTW, you should note that every IBM 360 or 370 is a 32-bit machine. It is only the memory addressing that is 24 bits. The GPRs are all 32 bit, and most of the instructions are 32 bit. So, just because?the machine does not address 4GB of memory does not make it a non 32bit machine. Joe On Sat, Apr 25, 2020 at 8:10 AM adriansutherland67 <adrian@...> wrote: On Sat, Apr 25, 2020 at 01:03 PM, Joe Monk wrote: |
Re: Program Interrupts (signals)
So yes, thats right, the machine that gave birth to VM (back in those days it was called CP/67) had 32-bit addressing! Joe On Sat, Apr 25, 2020 at 8:03 AM Joe Monk via <joemonk64=[email protected]> wrote:
|
Re: Program Interrupts (signals)
"Just think how much easier it would have been to migrate to 32 (yes 32 bit)!" 32-bit was tried by IBM with the 360/67 and it was found there was no appetite for it in the market. If you want to see what it is all about, spin up hercules with?a BC mode PSW, with bits 4 and 5 of the PSW turned on, which indicates 32 bit addressing. There even was an OS IBM developed which supports 32 bit addressing called TSS/360. Joe On Sat, Apr 25, 2020 at 7:28 AM adriansutherland67 <adrian@...> wrote: What's a bit weird is the way IBM layered their hacks on hacks. And I am not trying to cause controversy because we all know what big corporations are like, and what mangers are like ... saving money but building up a technical debt. And we all know that (irritatingly) they are often right, and certainly I have buried some bodies! |
Re: Program Interrupts (signals)
What's a bit weird is the way IBM layered their hacks on hacks. And I am not trying to cause controversy because we all know what big corporations are like, and what mangers are like ... saving money but building up a technical debt. And we all know that (irritatingly) they are often right, and certainly I have buried some bodies!
In this case ... HX should have raised an interrupt which would have been manageable with one of the CMS interrupt macros. Instead weird polling. And then?REXX came along which (like us today) needed a way for clean interrupt for the interpretation. One answer would be to fix HX, and allow the interpretor to catch the interrupt. But no - another command HI, another flag to poll! The biggest hack was allowing the most significant byte of addresses to be used. Today, I would fire someone on the spot for doing that (or the equivalent) ... and the hardware architects should have made sure CPUs fired a machine abend if it ever found anything other than zero in that byte. Just think how much easier it would have been to migrate to 32 (yes 32 bit)! And to get a more sympathetic hearing from this forum. In a parallel universe IBM launched their PC computer with CMS on metal not DOS. There was some impact on the mainframe business but this was completely offset by new customers and use cases. OS emulation was there from day one and later CP was introduced as the processors got more powerful. SAA was important ... etc. |
Re: Program Interrupts (signals)
The HX suppression mod is a bit of a hack which abuses one of the batch flags. It is not a really awful hack but I think we should be able to do better. I'm not sure what exactly HI type behaviour is. I am guessing it is a way of having an EXEC or REXX program stop, clean up and exit in response to a HI immediate command which is processed similarly to a HX immediate command. Not me anyway. [snip] Is this "HI type behaviour"? If this is what is deisred, maybe this is what should be done rather than messing about with HX behaviour? It might be plausable to create a HI flag in the CMS nucleus, assuming this is what happens in later versions of CMS. Then BREXX (and EXEC) could check this flag each time it completes processing a statement (or each time it completes n statements) and clean up and exit if the flag is found to be set. Regards, Peter Coghlan. Thoughts? |
Re: Program Interrupts (signals)
After thought, and considering the HX suppression mod posted by Dave, and that intercepting HX would allow BREXX to have HI type behaviour, and that if a divide by zero requires a IPL you can blame/fix the source of the exception, I think the biggest priority is to attempt to intercept HX.
Therefore ... is anyone willing to take a look? I need a call to register an alternative HX handler. I.e. when CMS checks if an HX has bee issued (during an Io interrupt, or SVC call) instead of calling the default behaviour it calls the registered handler. I only need a single handler registration and can handle scenarios where there might be multiple clients in the master GCCLIB HX handler itself, if that makes sense. In short happy if it is basic and requires the handler to jump through hoops to work (for example if the handler needs to provide its own save area). It is envisaged that the handler would. - Provide a chance for the application to cleanup, - Exit the application, or? - Ignore the HX request. For BREXX as an example it would set a BREXX flag that would cause a clean exit at the next statement end. Thoughts? Adrian |
Re: memset help
Thank you everyone - to close this subject this is the code I am going to use.
I don't use this approach too often but I thought folks might be interested in seeing a non-standard GCC meld of C and Assembler. void* memset(void* s, int c, size_t sz) {
? if (!s) return 0;
? if (!sz) return s;
?
? /* MVCL uses register pairs so we have to force register assignment by gcc */
? register size_t src_addr __asm__("2") = s;? /* Source Addr to R4 */
? register size_t src_len_pad __asm__("3") = (size_t)(c & 0xff) << 24; /* Fill Char in high byte + 0 length */
? register size_t dest_addr __asm__("4") = s; /* Dest Addr to R4 */
? register size_t dest_len __asm__("5") = sz & 0x00ffffff; /* Dest Length to R5 */
?
? /* USe MVCL for memory move / set */
? __asm__("MVCL 4,2"
? ? ? ? ? :
? ? ? ? ? : "d" (src_addr), "d" (src_len_pad), "d" (dest_addr), "d" (dest_len)
? ? ? ? ?);
?
? return s; } |
Re: memset help
Well the results are in - apologies for the long email and not formatting into table - but you know how it is!
I declaring Peter the WINNER for providing the?MVCL code (although it was suggested by others) - well done all. Certainly passes the at least 100 times faster challenge by Dave :-) Some functional defects - and so I also note also that MVCL?has the advantage of being simple enough not to have defects ... And folks might be interested in the improvements made by the C optimiser. ****
?
Buffer 4,096 chars x 30,000 loops
C optimiser turned OFF
?
memset() functional test
Builtin memset()
C bytewise memset()
C wordwise 32 unaligned memset()
C duffs device memset()
A MVC memset()
A 16 STs memset()
Mismatch at 4079
Body Error in iteration 1
?... failed
A MVCL memset()
Tests completed
Ready; T=6.08/6.51 11:34:53
?
memset() performance test 1
Builtin memset()
Tests completed
Ready; T=35.78/35.79 11:35:33
?
memset() performance test 2
C bytewise memset()
Tests completed
Ready; T=43.94/43.95 11:36:18
?
memset() performance test 3
C wordwise 32 unaligned memset()
Tests completed
Ready; T=11.03/11.03 11:36:30
?
memset() performance test 4
C duffs device memset()
Tests completed
Ready; T=26.87/26.89 11:36:58
?
memset() performance test 5
A MVC memset()
Tests completed
Ready; T=0.10/0.10 11:36:58
?
memset() performance test 6
A 16 STs memset()
Tests completed
Ready; T=1.53/1.54 11:37:01
?
memset() performance test 7
A MVCL memset()
Tests completed
Ready; T=0.08/0.09 11:37:02
?
****
?
Buffer 100 chars X 300,000 loops
C optimiser turned OFF
?
memset() functional test
Builtin memset()
C bytewise memset()
C wordwise 32 unaligned memset()
C duffs device memset()
A MVC memset()
Mismatch at 99
Postscript Error in iteration 1
?... failed
A 16 STs memset()
Mismatch at 99
Postscript Error in iteration 1
?... failed
A MVCL memset()
Tests completed
?
memset() performance test 1
Builtin memset()
Tests completed
Ready; T=9.60/9.61 12:01:40
?
memset() performance test 2
C bytewise memset()
Tests completed
Ready; T=10.78/10.78 12:01:52
?
memset() performance test 3
C wordwise 32 unaligned memset()
Tests completed
Ready; T=3.60/3.60 12:01:56
?
memset() performance test 4
C duffs device memset()
Tests completed
Ready; T=6.09/6.10 12:02:03
?
memset() performance test 5
A MVC memset()
Tests completed
Ready; T=0.47/0.47 12:02:04
?
memset() performance test 6
A 16 STs memset()
Tests completed
Ready; T=0.38/0.38 12:02:05
?
memset() performance test 7
A MVCL memset()
Tests completed
Ready; T=0.44/0.44 12:02:06
?
****
?
Buffer 100,000 chars x 5,000 loops
C optimiser turned OFF
?
memset() functional test
Builtin memset()
C bytewise memset()
C wordwise 32 unaligned memset()
C duffs device memset()
A MVC memset()
Mismatch at 99
Postscript Error in iteration 1
?... failed
A 16 STs memset()
Mismatch at 99
Postscript Error in iteration 1
?... failed
A MVCL memset()
Tests completed
Ready; T=89.65/90.22 12:05:44
?
memset() performance test 1
Builtin memset()
Tests completed
Ready; T=173.65/173.72 12:08:39
?
memset() performance test 2
C bytewise memset()
Tests completed
Ready; T=182.83/182.89 12:11:43
?
memset() performance test 3
C wordwise 32 unaligned memset()
Tests completed
Ready; T=45.22/45.24 12:12:30
?
memset() performance test 4
C duffs device memset()
Tests completed
Ready; T=104.68/104.75 12:14:15
?
memset() performance test 5
A MVC memset()
Tests completed
Ready; T=0.24/0.24 12:14:16
?
memset() performance test 6
A 16 STs memset()
Tests completed
Ready; T=4.62/4.64 12:14:22
?
memset() performance test 7
A MVCL memset()
Tests completed
Ready; T=0.03/0.04 12:14:23
?
****
?
Buffer 4,096 chars x 30,000 loops
C optimiser turned ON
?
memset() functional test
Builtin memset()
C bytewise memset()
C wordwise 32 unaligned memset()
C duffs device memset()
A MVC memset()
A 16 STs memset()
Mismatch at 4095
Body Error in iteration 300
?... failed
A MVCL memset()
Tests completed
Ready; T=7.27/7.66 12:20:59
?
memset() performance test 1
Builtin memset()
Tests completed
Ready; T=35.10/35.11 12:21:35
?
memset() performance test 2
C bytewise memset()
Tests completed
Ready; T=9.38/9.39 12:21:45
?
memset() performance test 3
C wordwise 32 unaligned memset()
Tests completed
Ready; T=2.63/2.63 12:21:49
?
memset() performance test 4
C duffs device memset()
Tests completed
Ready; T=8.00/8.00 12:21:58
?
memset() performance test 5
A MVC memset()
Tests completed
Ready; T=0.07/0.08 12:21:59
?
memset() performance test 6
A 16 STs memset()
Tests completed
Ready; T=0.01/0.01 12:22:00
?
memset() performance test 7
A MVCL memset()
Tests completed
Ready; T=0.03/0.03 12:22:01
?
****
?
Buffer 100 chars X 300,000 loops
C optimiser turned ON
?
memset() functional test
Builtin memset()
C bytewise memset()
C wordwise 32 unaligned memset()
C duffs device memset()
A MVC memset()
Mismatch at 99
Postscript Error in iteration 1
?... failed
A 16 STs memset()
Mismatch at 99
Postscript Error in iteration 300
?... failed
A MVCL memset()
Tests completed
Ready; T=5.55/6.03 12:39:00
?
memset() performance test 1
Builtin memset()
Tests completed
Ready; T=9.22/9.22 12:39:10
?
memset() performance test 2
C bytewise memset()
Tests completed
Ready; T=2.82/2.82 12:39:13
?
memset() performance test 3
C wordwise 32 unaligned memset()
Tests completed
Ready; T=1.29/1.29 12:39:16
?
memset() performance test 4
C duffs device memset()
Tests completed
Ready; T=2.40/2.40 12:39:19
?
memset() performance test 5
A MVC memset()
Tests completed
Ready; T=0.34/0.34 12:39:20
?
memset() performance test 6
A 16 STs memset()
Tests completed
Ready; T=0.01/0.01 12:39:21
?
memset() performance test 7
A MVCL memset()
Tests completed
Ready; T=0.24/0.24 12:39:22
?
****
?
Buffer 100,000 chars x 5,000 loops
C optimiser turned ON
?
memset() functional test
Builtin memset()
C bytewise memset()
C wordwise 32 unaligned memset()
C duffs device memset()
A MVC memset()
Mismatch at 99
Postscript Error in iteration 1
?... failed
A 16 STs memset()
Mismatch at 99
Postscript Error in iteration 300
?... failed
A MVCL memset()
Tests completed
Ready; T=60.24/60.68 12:42:42
?
memset() performance test 1
Builtin memset()
Tests completed
Ready; T=164.75/164.84 12:45:28
?
memset() performance test 2
C bytewise memset()
Tests completed
Ready; T=41.58/41.59 12:46:10
?
memset() performance test 3
C wordwise 32 unaligned memset()
Tests completed
Ready; T=11.08/11.08 12:46:22
?
memset() performance test 4
C duffs device memset()
Tests completed
Ready; T=33.17/33.18 12:46:56
?
memset() performance test 5
A MVC memset()
Tests completed
Ready; T=0.19/0.19 12:46:57
?
memset() performance test 6
A 16 STs memset()
Tests completed
Ready; T=0.01/0.01 12:46:58
?
memset() performance test 7
A MVCL memset()
Tests completed
Ready; T=0.03/0.04 12:46:59
?
|
Re: Program Interrupts (signals)
¿ªÔÆÌåÓýMy take on this:a long poll wait time is not that bad, important is that the exec can stop without me forcing off the user a short poll time is wasteful, and we are not in the business of using HX all day, only when we need to on VM I have the experience of needing to wait for dirmaint, or to have to send CP WNG userid hello before a FORCE takes effect; a long poll time before a HX takes effect is OK. ¸é±ð²Ô¨¦.
|
Re: Program Interrupts (signals)
On Thu, Apr 23, 2020 at 12:13 PM, Dave Wade wrote:
I think that would be a challenge and you would either waste lot of time polling the flag, or risk running for a long time before detecting it.Indeed, I abhor polling - but isn't that how CMS itself does HX?
I too can poll on an I/O interrupt ... Is the challenge that the flag does not exist - or the worry about polling? |
Re: Program Interrupts (signals)
dave, i didnt?mean that CP would abend. i meant that the PIC would be thrown by CP. Sorry for the confusion. Joe On Thu, Apr 23, 2020 at 6:02 AM Dave Wade <dave.g4ugm@...> wrote:
|